Rethink struct for newly added metrics, adapt and add tests
Signed-off-by: Arianna Vespri <arianna.vespri@yahoo.it>
This commit is contained in:
parent
5d64fb7625
commit
17b306559d
|
@ -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) {
|
||||
return func(o *internal.GoCollectorOptions) {
|
||||
o.DisableRuntimeEnvVarsMetrics = true
|
||||
|
|
|
@ -54,10 +54,11 @@ func TestGoCollectorMarshalling(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestWithGoCollectorMemStatsMetricsDisabled(t *testing.T) {
|
||||
func TestWithBaseMetricsOnly(t *testing.T) {
|
||||
reg := prometheus.NewRegistry()
|
||||
reg.MustRegister(NewGoCollector(
|
||||
WithGoCollectorMemStatsMetricsDisabled(),
|
||||
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
|
||||
))
|
||||
result, err := reg.Gather()
|
||||
if err != nil {
|
||||
|
@ -116,6 +117,7 @@ func TestGoCollectorAllowList(t *testing.T) {
|
|||
reg.MustRegister(NewGoCollector(
|
||||
WithGoCollectorMemStatsMetricsDisabled(),
|
||||
WithGoCollectorRuntimeMetrics(test.rules...),
|
||||
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
|
||||
))
|
||||
result, err := reg.Gather()
|
||||
if err != nil {
|
||||
|
@ -170,6 +172,7 @@ func TestGoCollectorDenyList(t *testing.T) {
|
|||
reg.MustRegister(NewGoCollector(
|
||||
WithGoCollectorMemStatsMetricsDisabled(),
|
||||
WithoutGoCollectorRuntimeMetrics(test.matchers...),
|
||||
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
|
||||
))
|
||||
result, err := reg.Gather()
|
||||
if err != nil {
|
||||
|
@ -213,6 +216,7 @@ func ExampleGoCollector_WithAdvancedGoMetrics() {
|
|||
},
|
||||
),
|
||||
WithoutGoCollectorRuntimeMetrics(regexp.MustCompile("^/gc/.*")),
|
||||
WithGoCollectorRuntimeEnvVarsMetricsDisabled(),
|
||||
))
|
||||
|
||||
http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
|
||||
|
|
|
@ -289,8 +289,7 @@ func goRuntimeEnvVarsMetrics() runtimeEnvVarsMetrics {
|
|||
"Value of GOGC (percentage).",
|
||||
nil, nil,
|
||||
),
|
||||
eval: float64(readRunMetrSample("/gc/gogc:percent")[0].Value.Uint64()),
|
||||
valType: GaugeValue,
|
||||
origMetricName: "/gc/gogc:percent",
|
||||
},
|
||||
{
|
||||
desc: NewDesc(
|
||||
|
@ -298,8 +297,7 @@ func goRuntimeEnvVarsMetrics() runtimeEnvVarsMetrics {
|
|||
"Value of GOMEMLIMIT (bytes).",
|
||||
nil, nil,
|
||||
),
|
||||
eval: float64(readRunMetrSample("/gc/gomemlimit:bytes")[0].Value.Uint64()),
|
||||
valType: GaugeValue,
|
||||
origMetricName: "/gc/gomemlimit:bytes",
|
||||
},
|
||||
{
|
||||
desc: NewDesc(
|
||||
|
@ -307,21 +305,19 @@ func goRuntimeEnvVarsMetrics() runtimeEnvVarsMetrics {
|
|||
"Value of GOMAXPROCS, i.e number of usable threads.",
|
||||
nil, nil,
|
||||
),
|
||||
eval: float64(runtime.NumCPU()),
|
||||
valType: GaugeValue,
|
||||
origMetricName: "/sched/gomaxprocs:threads",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type runtimeEnvVarsMetrics []struct { // how to call this struct?
|
||||
desc *Desc
|
||||
eval float64
|
||||
valType ValueType
|
||||
type runtimeEnvVarsMetrics []struct { // I couldn't come up with a better name. Any suggestions?
|
||||
desc *Desc
|
||||
origMetricName string
|
||||
}
|
||||
|
||||
func readRunMetrSample(metricName string) []runmetr.Sample {
|
||||
sample := make([]runmetr.Sample, 1)
|
||||
sample[0].Name = metricName
|
||||
runmetr.Read(sample)
|
||||
return sample
|
||||
func readRunMetrSampleBuf(metricName string) []runmetr.Sample {
|
||||
sampleBuf := make([]runmetr.Sample, 1)
|
||||
sampleBuf[0].Name = metricName
|
||||
runmetr.Read(sampleBuf)
|
||||
return sampleBuf
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ var rmNamesForMemStatsMetrics = []string{
|
|||
goMemoryClassesOtherBytes,
|
||||
}
|
||||
|
||||
var rmNamesForEnvVarsMetrics = []string{ // how to call them???
|
||||
var rmNamesForEnvVarsMetrics = []string{ // how to name this var???
|
||||
goGCGogcPercent,
|
||||
goGCMemLimit,
|
||||
goSchedMaxProcs,
|
||||
|
@ -389,6 +389,12 @@ func (c *goCollector) Collect(ch chan<- Metric) {
|
|||
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
|
||||
|
|
|
@ -74,6 +74,13 @@ func addExpectedRuntimeMetrics(metrics map[string]struct{}) map[string]struct{}
|
|||
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) {
|
||||
for _, tcase := range []struct {
|
||||
opts internal.GoCollectorOptions
|
||||
|
@ -81,18 +88,27 @@ func TestGoCollector_ExposedMetrics(t *testing.T) {
|
|||
}{
|
||||
{
|
||||
opts: internal.GoCollectorOptions{
|
||||
DisableMemStatsLikeMetrics: true,
|
||||
DisableMemStatsLikeMetrics: true,
|
||||
DisableRuntimeEnvVarsMetrics: true,
|
||||
},
|
||||
expectedFQNameSet: expectedBaseMetrics(),
|
||||
},
|
||||
{
|
||||
// Default, only MemStats.
|
||||
// Default, only Memstats and RuntimeEnvVars.
|
||||
expectedFQNameSet: addExpectedEnvVarsMetrics(addExpectedRuntimeMemStats(expectedBaseMetrics())),
|
||||
},
|
||||
{
|
||||
// Only MemStats.
|
||||
opts: internal.GoCollectorOptions{
|
||||
DisableRuntimeEnvVarsMetrics: true,
|
||||
},
|
||||
expectedFQNameSet: addExpectedRuntimeMemStats(expectedBaseMetrics()),
|
||||
},
|
||||
{
|
||||
// Get all runtime/metrics without MemStats.
|
||||
// Get all runtime/metrics without MemStats nor RuntimeEnvVars.
|
||||
opts: internal.GoCollectorOptions{
|
||||
DisableMemStatsLikeMetrics: true,
|
||||
DisableMemStatsLikeMetrics: true,
|
||||
DisableRuntimeEnvVarsMetrics: true,
|
||||
RuntimeMetricRules: []internal.GoCollectorRule{
|
||||
{Matcher: regexp.MustCompile("/.*")},
|
||||
},
|
||||
|
@ -100,13 +116,20 @@ func TestGoCollector_ExposedMetrics(t *testing.T) {
|
|||
expectedFQNameSet: addExpectedRuntimeMetrics(expectedBaseMetrics()),
|
||||
},
|
||||
{
|
||||
// Get all runtime/metrics and MemStats.
|
||||
// Get all runtime/metrics, MemStats and RuntimeEnvVars.
|
||||
opts: internal.GoCollectorOptions{
|
||||
RuntimeMetricRules: []internal.GoCollectorRule{
|
||||
{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) {
|
||||
|
@ -229,6 +252,7 @@ func collectGoMetrics(t *testing.T, opts internal.GoCollectorOptions) []Metric {
|
|||
o.DisableMemStatsLikeMetrics = opts.DisableMemStatsLikeMetrics
|
||||
o.RuntimeMetricSumForHist = opts.RuntimeMetricSumForHist
|
||||
o.RuntimeMetricRules = opts.RuntimeMetricRules
|
||||
o.DisableRuntimeEnvVarsMetrics = opts.DisableRuntimeEnvVarsMetrics
|
||||
}).(*goCollector)
|
||||
|
||||
// Collect all metrics.
|
||||
|
|
Loading…
Reference in New Issue