From c48b9917b05ea98c50c375ebb4aa32d56fb09c9d Mon Sep 17 00:00:00 2001 From: Jim Strang <47609385+jimstrang@users.noreply.github.com> Date: Sat, 9 May 2026 08:07:25 -0400 Subject: [PATCH] fix(promunifi): avoid descriptor collision on unpoller_device_uptime_seconds descIntegrationDevice was registered with namespace prefix "unpoller_device_", producing "unpoller_device_uptime_seconds" with labels {device_id} and a different help string than the existing descDevice() metric of the same FQDN (labels {type, site_name, name, source, tag}, help "Device Uptime"). Prometheus MustRegister panics on inconsistent descriptors for the same fully-qualified name, causing v3.0.0 to crashloop on startup whenever the Prometheus output was enabled. Move the Integration/v1 device metrics under a dedicated "integration_device_" name prefix, matching the convention used by the other Integration/v1 collectors added in the same release (e.g. wifi_broadcast_*, acl_rule_*, mclag_domain_*, pending_device_*), where the bare namespace prefix is passed in and the type prefix is baked into each metric name string. Affected metric renames: unpoller_device_uptime_seconds -> unpoller_integration_device_uptime_seconds unpoller_device_cpu_utilization_pct -> unpoller_integration_device_cpu_utilization_pct unpoller_device_memory_utilization_pct -> unpoller_integration_device_memory_utilization_pct unpoller_device_load_average_{1,5,15}min -> unpoller_integration_device_load_average_{1,5,15}min unpoller_device_radio_tx_retries_pct -> unpoller_integration_device_radio_tx_retries_pct unpoller_device_uplink_{rx,tx}_rate_bps -> unpoller_integration_device_uplink_{rx,tx}_rate_bps Fixes #1002 Fixes #1004 --- pkg/promunifi/collector.go | 2 +- pkg/promunifi/integration_devices.go | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pkg/promunifi/collector.go b/pkg/promunifi/collector.go index a3cacf75..fec7061c 100644 --- a/pkg/promunifi/collector.go +++ b/pkg/promunifi/collector.go @@ -244,7 +244,7 @@ func (u *promUnifi) Run(c poller.Collect) error { u.Topology = descTopology(u.Namespace + "_") u.PortAnomaly = descPortAnomaly(u.Namespace + "_") u.VPNMesh = descVPNMesh(u.Namespace + "_") - u.IntegrationDevice = descIntegrationDevice(u.Namespace + "_device_") + u.IntegrationDevice = descIntegrationDevice(u.Namespace + "_") u.WANStatus = descWANStatus(u.Namespace + "_") u.PortForward = descPortForward(u.Namespace + "_") u.SSLCertificate = descSSLCertificate(u.Namespace + "_") diff --git a/pkg/promunifi/integration_devices.go b/pkg/promunifi/integration_devices.go index 81490855..78232a9a 100644 --- a/pkg/promunifi/integration_devices.go +++ b/pkg/promunifi/integration_devices.go @@ -25,15 +25,15 @@ func descIntegrationDevice(ns string) *integrationDevice { uplinkLabels := []string{"device_id", "uplink_index"} return &integrationDevice{ - CPUUtilizationPct: prometheus.NewDesc(ns+"cpu_utilization_pct", "Device CPU utilization percentage (Integration/v1)", labels, nil), - MemoryUtilizationPct: prometheus.NewDesc(ns+"memory_utilization_pct", "Device memory utilization percentage (Integration/v1)", labels, nil), - LoadAverage1Min: prometheus.NewDesc(ns+"load_average_1min", "Device 1-minute load average (Integration/v1)", labels, nil), - LoadAverage5Min: prometheus.NewDesc(ns+"load_average_5min", "Device 5-minute load average (Integration/v1)", labels, nil), - LoadAverage15Min: prometheus.NewDesc(ns+"load_average_15min", "Device 15-minute load average (Integration/v1)", labels, nil), - UptimeSec: prometheus.NewDesc(ns+"uptime_seconds", "Device uptime in seconds (Integration/v1)", labels, nil), - RadioTxRetriesPct: prometheus.NewDesc(ns+"radio_tx_retries_pct", "Per-radio TX retry percentage (Integration/v1)", radioLabels, nil), - UplinkRxRateBps: prometheus.NewDesc(ns+"uplink_rx_rate_bps", "Per-uplink receive rate in bps (Integration/v1)", uplinkLabels, nil), - UplinkTxRateBps: prometheus.NewDesc(ns+"uplink_tx_rate_bps", "Per-uplink transmit rate in bps (Integration/v1)", uplinkLabels, nil), + CPUUtilizationPct: prometheus.NewDesc(ns+"integration_device_cpu_utilization_pct", "Device CPU utilization percentage (Integration/v1)", labels, nil), + MemoryUtilizationPct: prometheus.NewDesc(ns+"integration_device_memory_utilization_pct", "Device memory utilization percentage (Integration/v1)", labels, nil), + LoadAverage1Min: prometheus.NewDesc(ns+"integration_device_load_average_1min", "Device 1-minute load average (Integration/v1)", labels, nil), + LoadAverage5Min: prometheus.NewDesc(ns+"integration_device_load_average_5min", "Device 5-minute load average (Integration/v1)", labels, nil), + LoadAverage15Min: prometheus.NewDesc(ns+"integration_device_load_average_15min", "Device 15-minute load average (Integration/v1)", labels, nil), + UptimeSec: prometheus.NewDesc(ns+"integration_device_uptime_seconds", "Device uptime in seconds (Integration/v1)", labels, nil), + RadioTxRetriesPct: prometheus.NewDesc(ns+"integration_device_radio_tx_retries_pct", "Per-radio TX retry percentage (Integration/v1)", radioLabels, nil), + UplinkRxRateBps: prometheus.NewDesc(ns+"integration_device_uplink_rx_rate_bps", "Per-uplink receive rate in bps (Integration/v1)", uplinkLabels, nil), + UplinkTxRateBps: prometheus.NewDesc(ns+"integration_device_uplink_tx_rate_bps", "Per-uplink transmit rate in bps (Integration/v1)", uplinkLabels, nil), } }