Rethink struct for newly added metrics, adapt and add tests

Signed-off-by: Arianna Vespri <arianna.vespri@yahoo.it>
This commit is contained in:
Arianna Vespri 2024-07-21 10:17:02 +02:00
parent 5d64fb7625
commit 17b306559d
5 changed files with 57 additions and 23 deletions

View File

@ -88,6 +88,10 @@ func WithGoCollectorMemStatsMetricsDisabled() func(options *internal.GoCollector
} }
} }
// WithGoCollectorRuntimeEnvVarsMetricsDisabled disables the following default metrics:
// go_gogc_percent
// go_gomemlimit
// go_gomaxprocs
func WithGoCollectorRuntimeEnvVarsMetricsDisabled() func(options *internal.GoCollectorOptions) { func WithGoCollectorRuntimeEnvVarsMetricsDisabled() func(options *internal.GoCollectorOptions) {
return func(o *internal.GoCollectorOptions) { return func(o *internal.GoCollectorOptions) {
o.DisableRuntimeEnvVarsMetrics = true o.DisableRuntimeEnvVarsMetrics = true

View File

@ -54,10 +54,11 @@ func TestGoCollectorMarshalling(t *testing.T) {
} }
} }
func TestWithGoCollectorMemStatsMetricsDisabled(t *testing.T) { func TestWithBaseMetricsOnly(t *testing.T) {
reg := prometheus.NewRegistry() reg := prometheus.NewRegistry()
reg.MustRegister(NewGoCollector( reg.MustRegister(NewGoCollector(
WithGoCollectorMemStatsMetricsDisabled(), WithGoCollectorMemStatsMetricsDisabled(),
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
)) ))
result, err := reg.Gather() result, err := reg.Gather()
if err != nil { if err != nil {
@ -116,6 +117,7 @@ func TestGoCollectorAllowList(t *testing.T) {
reg.MustRegister(NewGoCollector( reg.MustRegister(NewGoCollector(
WithGoCollectorMemStatsMetricsDisabled(), WithGoCollectorMemStatsMetricsDisabled(),
WithGoCollectorRuntimeMetrics(test.rules...), WithGoCollectorRuntimeMetrics(test.rules...),
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
)) ))
result, err := reg.Gather() result, err := reg.Gather()
if err != nil { if err != nil {
@ -170,6 +172,7 @@ func TestGoCollectorDenyList(t *testing.T) {
reg.MustRegister(NewGoCollector( reg.MustRegister(NewGoCollector(
WithGoCollectorMemStatsMetricsDisabled(), WithGoCollectorMemStatsMetricsDisabled(),
WithoutGoCollectorRuntimeMetrics(test.matchers...), WithoutGoCollectorRuntimeMetrics(test.matchers...),
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
)) ))
result, err := reg.Gather() result, err := reg.Gather()
if err != nil { if err != nil {
@ -213,6 +216,7 @@ func ExampleGoCollector_WithAdvancedGoMetrics() {
}, },
), ),
WithoutGoCollectorRuntimeMetrics(regexp.MustCompile("^/gc/.*")), WithoutGoCollectorRuntimeMetrics(regexp.MustCompile("^/gc/.*")),
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
)) ))
http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{})) http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))

View File

@ -289,8 +289,7 @@ func goRuntimeEnvVarsMetrics() runtimeEnvVarsMetrics {
"Value of GOGC (percentage).", "Value of GOGC (percentage).",
nil, nil, nil, nil,
), ),
eval: float64(readRunMetrSample("/gc/gogc:percent")[0].Value.Uint64()), origMetricName: "/gc/gogc:percent",
valType: GaugeValue,
}, },
{ {
desc: NewDesc( desc: NewDesc(
@ -298,8 +297,7 @@ func goRuntimeEnvVarsMetrics() runtimeEnvVarsMetrics {
"Value of GOMEMLIMIT (bytes).", "Value of GOMEMLIMIT (bytes).",
nil, nil, nil, nil,
), ),
eval: float64(readRunMetrSample("/gc/gomemlimit:bytes")[0].Value.Uint64()), origMetricName: "/gc/gomemlimit:bytes",
valType: GaugeValue,
}, },
{ {
desc: NewDesc( desc: NewDesc(
@ -307,21 +305,19 @@ func goRuntimeEnvVarsMetrics() runtimeEnvVarsMetrics {
"Value of GOMAXPROCS, i.e number of usable threads.", "Value of GOMAXPROCS, i.e number of usable threads.",
nil, nil, nil, nil,
), ),
eval: float64(runtime.NumCPU()), origMetricName: "/sched/gomaxprocs:threads",
valType: GaugeValue,
}, },
} }
} }
type runtimeEnvVarsMetrics []struct { // how to call this struct? type runtimeEnvVarsMetrics []struct { // I couldn't come up with a better name. Any suggestions?
desc *Desc desc *Desc
eval float64 origMetricName string
valType ValueType
} }
func readRunMetrSample(metricName string) []runmetr.Sample { func readRunMetrSampleBuf(metricName string) []runmetr.Sample {
sample := make([]runmetr.Sample, 1) sampleBuf := make([]runmetr.Sample, 1)
sample[0].Name = metricName sampleBuf[0].Name = metricName
runmetr.Read(sample) runmetr.Read(sampleBuf)
return sample return sampleBuf
} }

View File

@ -81,7 +81,7 @@ var rmNamesForMemStatsMetrics = []string{
goMemoryClassesOtherBytes, goMemoryClassesOtherBytes,
} }
var rmNamesForEnvVarsMetrics = []string{ // how to call them??? var rmNamesForEnvVarsMetrics = []string{ // how to name this var???
goGCGogcPercent, goGCGogcPercent,
goGCMemLimit, goGCMemLimit,
goSchedMaxProcs, goSchedMaxProcs,
@ -389,6 +389,12 @@ func (c *goCollector) Collect(ch chan<- Metric) {
ch <- MustNewConstMetric(i.desc, i.valType, i.eval(&ms)) ch <- MustNewConstMetric(i.desc, i.valType, i.eval(&ms))
} }
} }
if c.rmEnvVarMetricsEnabled {
for _, v := range c.rmEnvVarMetrics {
ch <- MustNewConstMetric(v.desc, GaugeValue, float64(readRunMetrSampleBuf(v.origMetricName)[0].Value.Uint64()))
}
}
} }
// unwrapScalarRMValue unwraps a runtime/metrics value that is assumed // unwrapScalarRMValue unwraps a runtime/metrics value that is assumed

View File

@ -74,6 +74,13 @@ func addExpectedRuntimeMetrics(metrics map[string]struct{}) map[string]struct{}
return metrics return metrics
} }
func addExpectedEnvVarsMetrics(metrics map[string]struct{}) map[string]struct{} {
for _, m := range goRuntimeEnvVarsMetrics() {
metrics[m.desc.fqName] = struct{}{}
}
return metrics
}
func TestGoCollector_ExposedMetrics(t *testing.T) { func TestGoCollector_ExposedMetrics(t *testing.T) {
for _, tcase := range []struct { for _, tcase := range []struct {
opts internal.GoCollectorOptions opts internal.GoCollectorOptions
@ -81,18 +88,27 @@ func TestGoCollector_ExposedMetrics(t *testing.T) {
}{ }{
{ {
opts: internal.GoCollectorOptions{ opts: internal.GoCollectorOptions{
DisableMemStatsLikeMetrics: true, DisableMemStatsLikeMetrics: true,
DisableRuntimeEnvVarsMetrics: true,
}, },
expectedFQNameSet: expectedBaseMetrics(), expectedFQNameSet: expectedBaseMetrics(),
}, },
{ {
// Default, only MemStats. // Default, only Memstats and RuntimeEnvVars.
expectedFQNameSet: addExpectedEnvVarsMetrics(addExpectedRuntimeMemStats(expectedBaseMetrics())),
},
{
// Only MemStats.
opts: internal.GoCollectorOptions{
DisableRuntimeEnvVarsMetrics: true,
},
expectedFQNameSet: addExpectedRuntimeMemStats(expectedBaseMetrics()), expectedFQNameSet: addExpectedRuntimeMemStats(expectedBaseMetrics()),
}, },
{ {
// Get all runtime/metrics without MemStats. // Get all runtime/metrics without MemStats nor RuntimeEnvVars.
opts: internal.GoCollectorOptions{ opts: internal.GoCollectorOptions{
DisableMemStatsLikeMetrics: true, DisableMemStatsLikeMetrics: true,
DisableRuntimeEnvVarsMetrics: true,
RuntimeMetricRules: []internal.GoCollectorRule{ RuntimeMetricRules: []internal.GoCollectorRule{
{Matcher: regexp.MustCompile("/.*")}, {Matcher: regexp.MustCompile("/.*")},
}, },
@ -100,13 +116,20 @@ func TestGoCollector_ExposedMetrics(t *testing.T) {
expectedFQNameSet: addExpectedRuntimeMetrics(expectedBaseMetrics()), expectedFQNameSet: addExpectedRuntimeMetrics(expectedBaseMetrics()),
}, },
{ {
// Get all runtime/metrics and MemStats. // Get all runtime/metrics, MemStats and RuntimeEnvVars.
opts: internal.GoCollectorOptions{ opts: internal.GoCollectorOptions{
RuntimeMetricRules: []internal.GoCollectorRule{ RuntimeMetricRules: []internal.GoCollectorRule{
{Matcher: regexp.MustCompile("/.*")}, {Matcher: regexp.MustCompile("/.*")},
}, },
}, },
expectedFQNameSet: addExpectedRuntimeMemStats(addExpectedRuntimeMetrics(expectedBaseMetrics())), expectedFQNameSet: addExpectedEnvVarsMetrics(addExpectedRuntimeMemStats(addExpectedRuntimeMetrics(expectedBaseMetrics()))),
},
{
// Only RuntimeEnvVars.
opts: internal.GoCollectorOptions{
DisableMemStatsLikeMetrics: true,
},
expectedFQNameSet: addExpectedEnvVarsMetrics(expectedBaseMetrics()),
}, },
} { } {
if ok := t.Run("", func(t *testing.T) { if ok := t.Run("", func(t *testing.T) {
@ -229,6 +252,7 @@ func collectGoMetrics(t *testing.T, opts internal.GoCollectorOptions) []Metric {
o.DisableMemStatsLikeMetrics = opts.DisableMemStatsLikeMetrics o.DisableMemStatsLikeMetrics = opts.DisableMemStatsLikeMetrics
o.RuntimeMetricSumForHist = opts.RuntimeMetricSumForHist o.RuntimeMetricSumForHist = opts.RuntimeMetricSumForHist
o.RuntimeMetricRules = opts.RuntimeMetricRules o.RuntimeMetricRules = opts.RuntimeMetricRules
o.DisableRuntimeEnvVarsMetrics = opts.DisableRuntimeEnvVarsMetrics
}).(*goCollector) }).(*goCollector)
// Collect all metrics. // Collect all metrics.