diff --git a/bind_exporter.go b/bind_exporter.go index 7f89374..eb42b2a 100644 --- a/bind_exporter.go +++ b/bind_exporter.go @@ -208,6 +208,12 @@ var ( nil, nil, ), } + // serverMetricGauges lists the serverMetricStats entries that report a + // current value rather than a running total. BIND reports them in the same + // statistics counters as the totals, so they have to be typed explicitly. + serverMetricGauges = map[string]struct{}{ + "RecursClients": {}, + } tasksRunning = prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "tasks_running"), "Number of running tasks.", @@ -280,7 +286,7 @@ func (c *serverCollector) Collect(ch chan<- prometheus.Metric) { } if desc, ok := serverMetricStats[s.Name]; ok { ch <- prometheus.MustNewConstMetric( - desc, prometheus.CounterValue, float64(s.Counter), + desc, serverMetricValueType(s.Name), float64(s.Counter), ) } } @@ -292,12 +298,21 @@ func (c *serverCollector) Collect(ch chan<- prometheus.Metric) { for _, s := range c.stats.Server.ZoneStatistics { if desc, ok := serverMetricStats[s.Name]; ok { ch <- prometheus.MustNewConstMetric( - desc, prometheus.CounterValue, float64(s.Counter), + desc, serverMetricValueType(s.Name), float64(s.Counter), ) } } } +// serverMetricValueType reports the value type to use for a serverMetricStats +// entry. +func serverMetricValueType(name string) prometheus.ValueType { + if _, ok := serverMetricGauges[name]; ok { + return prometheus.GaugeValue + } + return prometheus.CounterValue +} + type viewCollector struct { logger *slog.Logger stats *bind.Statistics diff --git a/bind_exporter_test.go b/bind_exporter_test.go index 868d0b2..9250ff8 100644 --- a/bind_exporter_test.go +++ b/bind_exporter_test.go @@ -40,6 +40,8 @@ var ( `bind_zone_transfer_success_total 25`, `bind_zone_transfer_failure_total 1`, `bind_recursive_clients 76`, + // Current recursive clients is a gauge, not a counter. + `# TYPE bind_recursive_clients gauge`, `bind_config_time_seconds 1.626325868e+09`, `bind_response_rcodes_total{rcode="NOERROR"} 989812`, `bind_response_rcodes_total{rcode="NXDOMAIN"} 33958`,