From 9acc5907c788e9799d6f09d63ca01fe6509dab27 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 4 Sep 2025 14:49:17 +0200 Subject: [PATCH 1/2] [#1967] Fix collecting zone transfer stats --- backend/agent/prombind9exporter.go | 74 ++++++++++++++++--- backend/agent/prombind9exporter_test.go | 18 ++++- .../testdata/bind9-prom-server-stats.json | 11 ++- 3 files changed, 86 insertions(+), 17 deletions(-) diff --git a/backend/agent/prombind9exporter.go b/backend/agent/prombind9exporter.go index a3f6e98d2..15dd14ab5 100644 --- a/backend/agent/prombind9exporter.go +++ b/backend/agent/prombind9exporter.go @@ -49,6 +49,7 @@ type PromBind9ExporterStats struct { IncomingQueries map[string]float64 IncomingRequests map[string]float64 NsStats map[string]float64 + ZoneStats map[string]float64 TaskMgr map[string]float64 TrafficStats map[string]PromBind9TrafficStats Views map[string]PromBind9ViewStats @@ -355,21 +356,46 @@ func NewPromBind9Exporter(host string, port int, appMonitor AppMonitor, httpClie "Total number of available worker threads.", nil, nil) - // zone_transfer_failure_total - serverStatsDesc["XfrFail"] = prometheus.NewDesc( - prometheus.BuildFQName(namespace, "", "zone_transfer_failure_total"), - "Number of failed zone transfers.", - nil, nil) // zone_transfer_rejected_total serverStatsDesc["XfrRej"] = prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "zone_transfer_rejected_total"), "Number of rejected zone transfers.", nil, nil) + // zone_transfer_requests_done + serverStatsDesc["XfrReqDone"] = prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "zone_transfer_requests_done"), + "Number of requested and completed zone transfers.", + nil, nil) // zone_transfer_success_total serverStatsDesc["XfrSuccess"] = prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "zone_transfer_success_total"), "Number of successful zone transfers.", nil, nil) + // zone_transfer_failure_total + serverStatsDesc["XfrFail"] = prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "zone_transfer_failure_total"), + "Number of failed zone transfers.", + nil, nil) + // zone_transfer_requests_ipv4 + serverStatsDesc["AXFRReqv4"] = prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "zone_transfer_requests_ipv4"), + "Number of requested IPv4 zone transfers.", + nil, nil) + // zone_transfer_requests_ipv6 + serverStatsDesc["AXFRReqv6"] = prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "zone_transfer_requests_ipv6"), + "Number of requested IPv6 zone transfers.", + nil, nil) + // zone_transfer_incremental_requests_ipv4 + serverStatsDesc["IXFRReqv4"] = prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "zone_transfer_incremental_requests_ipv4"), + "Number of requested IPv4 incremental zone transfers.", + nil, nil) + // zone_transfer_incremental_requests_ipv6 + serverStatsDesc["IXFRReqv6"] = prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "zone_transfer_incremental_requests_ipv6"), + "Number of requested IPv6 incremental zone transfers.", + nil, nil) pbe.serverStatsDesc = serverStatsDesc pbe.trafficStatsDesc = trafficStatsDesc @@ -709,11 +735,10 @@ func (pbe *PromBind9Exporter) Collect(ch chan<- prometheus.Metric) { prometheus.GaugeValue, value) } - // zone_transfer_failure_total // zone_transfer_rejected_total - // zone_transfer_success_total - xfrStats := []string{"XfrFail", "XfrRej", "XfrSuccess"} - for _, label := range xfrStats { + // zone_transfer_requests_done + nsXfrStats := []string{"XfrReqDone", "XfrRej"} + for _, label := range nsXfrStats { value, ok = pbe.stats.NsStats[label] if !ok { value = 0 @@ -723,6 +748,23 @@ func (pbe *PromBind9Exporter) Collect(ch chan<- prometheus.Metric) { prometheus.CounterValue, value) } + // zone_transfer_success_total + // zone_transfer_failure_total + // zone_transfer_requests_ipv4 + // zone_transfer_requests_ipv6 + // zone_transfer_incremental_requests_ipv4 + // zone_transfer_incremental_requests_ipv6 + zoneXfrStats := []string{"XfrSuccess", "XfrFail", "AXFRReqv4", "AXFRReqv6", "IXFRReqv4", "IXFRReqv6"} + for _, label := range zoneXfrStats { + value, ok = pbe.stats.ZoneStats[label] + if !ok { + value = 0 + } + ch <- prometheus.MustNewConstMetric( + pbe.serverStatsDesc[label], + prometheus.CounterValue, value) + } + // Traffic metrics. // traffic_incoming_requests_udp4_size_{bucket,count,sum} @@ -1108,14 +1150,24 @@ func (pbe *PromBind9Exporter) setDaemonStats(stats map[string]any) (ret error) { // query_errors_total // query_recursion_total // recursive_clients - // zone_transfer_failure_total // zone_transfer_rejected_total - // zone_transfer_success_total + // zone_transfer_requests_done pbe.stats.NsStats, err = pbe.scrapeServerStat(stats, "nsstats") if err != nil { return pkgerrors.Errorf("problem parsing 'nsstats': %+v", err) } + // zone_transfer_success_total + // zone_transfer_failure_total + // zone_transfer_requests_ipv4 + // zone_transfer_requests_ipv6 + // zone_transfer_incremental_requests_ipv4 + // zone_transfer_incremental_requests_ipv6 + pbe.stats.ZoneStats, err = pbe.scrapeServerStat(stats, "zonestats") + if err != nil { + return pkgerrors.Errorf("problem parsing 'zonestats': %+v", err) + } + // tasks_running // worker_threads pbe.stats.TaskMgr, err = pbe.scrapeServerStat(stats, "taskmgr") diff --git a/backend/agent/prombind9exporter_test.go b/backend/agent/prombind9exporter_test.go index 353b28a34..7ac5cdaa1 100644 --- a/backend/agent/prombind9exporter_test.go +++ b/backend/agent/prombind9exporter_test.go @@ -59,7 +59,7 @@ func TestNewPromBind9ExporterBasic(t *testing.T) { require.Equal(t, 42, pbe.Port) require.NotNil(t, pbe.HTTPClient) require.NotNil(t, pbe.HTTPServer) - require.Len(t, pbe.serverStatsDesc, 20) + require.Len(t, pbe.serverStatsDesc, 25) require.Len(t, pbe.viewStatsDesc, 18) } @@ -281,10 +281,20 @@ func TestPromBind9ExporterStart(t *testing.T) { require.Zero(t, buckets[math.Inf(0)]) require.Nil(t, err) - // zone_transfer_failure_total - require.EqualValues(t, 2.0, pbe.stats.NsStats["XfrFail"]) // zone_transfer_rejected_total require.EqualValues(t, 11.0, pbe.stats.NsStats["XfrRej"]) + // zone_transfer_requests_done + require.EqualValues(t, 37.0, pbe.stats.NsStats["XfrReqDone"]) // zone_transfer_success_total - require.EqualValues(t, 22.0, pbe.stats.NsStats["XfrSuccess"]) + require.EqualValues(t, 22.0, pbe.stats.ZoneStats["XfrSuccess"]) + // zone_transfer_failure_total + require.EqualValues(t, 4.0, pbe.stats.ZoneStats["XfrFail"]) + // zone_transfer_requests_ipv4 + require.EqualValues(t, 6.0, pbe.stats.ZoneStats["AXFRReqv4"]) + // zone_transfer_requests_ipv6 + require.EqualValues(t, 10.0, pbe.stats.ZoneStats["AXFRReqv6"]) + // zone_transfer_incremental_requests_ipv4 + require.EqualValues(t, 5.0, pbe.stats.ZoneStats["IXFRReqv4"]) + // zone_transfer_incremental_requests_ipv6 + require.EqualValues(t, 4.0, pbe.stats.ZoneStats["IXFRReqv6"]) } diff --git a/backend/agent/testdata/bind9-prom-server-stats.json b/backend/agent/testdata/bind9-prom-server-stats.json index d9e328bee..10fc4dc02 100644 --- a/backend/agent/testdata/bind9-prom-server-stats.json +++ b/backend/agent/testdata/bind9-prom-server-stats.json @@ -30,9 +30,16 @@ "QrySuccess": 111, "QryUDP": 404, "QryTCP": 303, - "XfrFail": 2, "XfrRej": 11, - "XfrSuccess": 22 + "XfrReqDone": 37 + }, + "zonestats": { + "XfrSuccess": 22, + "XfrFail": 4, + "AXFRReqv4": 6, + "AXFRReqv6": 10, + "IXFRReqv4": 5, + "IXFRReqv6": 4 }, "taskmgr": { "tasks-running": 1, From 040c89fbe23916c520ab358ba11781c3d1633990 Mon Sep 17 00:00:00 2001 From: Marcin Siodelski Date: Thu, 4 Sep 2025 14:54:04 +0200 Subject: [PATCH 2/2] [#1967] Added ChangeLog for #1967 --- ...ect-stat-channel-json-locations-in-prometheus-export.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 changelog_unreleased/1967-bind-statistics-gathered-using-incorrect-stat-channel-json-locations-in-prometheus-export.md diff --git a/changelog_unreleased/1967-bind-statistics-gathered-using-incorrect-stat-channel-json-locations-in-prometheus-export.md b/changelog_unreleased/1967-bind-statistics-gathered-using-incorrect-stat-channel-json-locations-in-prometheus-export.md new file mode 100644 index 000000000..97251cb56 --- /dev/null +++ b/changelog_unreleased/1967-bind-statistics-gathered-using-incorrect-stat-channel-json-locations-in-prometheus-export.md @@ -0,0 +1,7 @@ +[bug] marcin + + Fix collecting and exporting some of the BIND 9 statistics + pertaining to zone transfers. Exporting new statistics to + Prometheus: XfrReqDone, AXFRReqv4, AXFRReqv6, IXFRReqv4, + IXFRReqv6. + (Gitlab #1967)