Break udp_queues into udp_{queues,drops_total}

This separates the gauges related to udp_queues and the counter
related to the total number of drops, but keeps them under the same
namespace.

Signed-off-by: Chris Cleeland <chris.cleeland@gmail.com>
This commit is contained in:
Chris Cleeland 2025-01-06 23:05:45 -06:00
parent 62b30d638f
commit 13f019f822
5 changed files with 31 additions and 21 deletions

View file

@ -158,7 +158,7 @@ thermal | Exposes thermal statistics like `pmset -g therm`. | Darwin
thermal\_zone | Exposes thermal zone & cooling device statistics from `/sys/class/thermal`. | Linux
time | Exposes the current system time. | _any_
timex | Exposes selected adjtimex(2) system call stats. | Linux
udp_queues | Exposes UDP total lengths of the rx_queue and tx_queue from `/proc/net/udp` and `/proc/net/udp6`. | Linux
udp | Exposes UDP statistics from `/proc/net/udp` and `/proc/net/udp6`. | Linux
uname | Exposes system information as provided by the uname system call. | Darwin, FreeBSD, Linux, OpenBSD
vmstat | Exposes statistics from `/proc/vmstat`. | Linux
watchdog | Exposes statistics from `/sys/class/watchdog` | Linux

View file

@ -2991,7 +2991,7 @@ node_scrape_collector_success{collector="tapestats"} 1
node_scrape_collector_success{collector="textfile"} 1
node_scrape_collector_success{collector="thermal_zone"} 1
node_scrape_collector_success{collector="time"} 1
node_scrape_collector_success{collector="udp_queues"} 1
node_scrape_collector_success{collector="udp"} 1
node_scrape_collector_success{collector="vmstat"} 1
node_scrape_collector_success{collector="watchdog"} 1
node_scrape_collector_success{collector="wifi"} 1
@ -3242,9 +3242,11 @@ node_time_clocksource_current_info{clocksource="tsc",device="0"} 1
# TYPE node_time_seconds gauge
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
# TYPE node_time_zone_offset_seconds gauge
# HELP node_udp_drops_total Total number of datagrams dropped.
# TYPE node_udp_drops_total counter
node_udp_drops_total{ip="v4"} 100
# HELP node_udp_queues Number of allocated memory in the kernel for UDP datagrams in bytes.
# TYPE node_udp_queues counter
node_udp_queues{ip="v4",queue="drops"} 100
# TYPE node_udp_queues gauge
node_udp_queues{ip="v4",queue="rx"} 0
node_udp_queues{ip="v4",queue="tx"} 21
# HELP node_vmstat_oom_kill /proc/vmstat information field oom_kill.

View file

@ -3013,7 +3013,7 @@ node_scrape_collector_success{collector="tapestats"} 1
node_scrape_collector_success{collector="textfile"} 1
node_scrape_collector_success{collector="thermal_zone"} 1
node_scrape_collector_success{collector="time"} 1
node_scrape_collector_success{collector="udp_queues"} 1
node_scrape_collector_success{collector="udp"} 1
node_scrape_collector_success{collector="vmstat"} 1
node_scrape_collector_success{collector="watchdog"} 1
node_scrape_collector_success{collector="wifi"} 1
@ -3264,9 +3264,11 @@ node_time_clocksource_current_info{clocksource="tsc",device="0"} 1
# TYPE node_time_seconds gauge
# HELP node_time_zone_offset_seconds System time zone offset in seconds.
# TYPE node_time_zone_offset_seconds gauge
# HELP node_udp_drops_total Total number of datagrams dropped.
# TYPE node_udp_drops_total counter
node_udp_drops_total{ip="v4"} 100
# HELP node_udp_queues Number of allocated memory in the kernel for UDP datagrams in bytes.
# TYPE node_udp_queues counter
node_udp_queues{ip="v4",queue="drops"} 100
# TYPE node_udp_queues gauge
node_udp_queues{ip="v4",queue="rx"} 0
node_udp_queues{ip="v4",queue="tx"} 21
# HELP node_vmstat_oom_kill /proc/vmstat information field oom_kill.

View file

@ -27,42 +27,48 @@ import (
)
type (
udpQueuesCollector struct {
udpCollector struct {
fs procfs.FS
desc *prometheus.Desc
queues *prometheus.Desc
drops *prometheus.Desc
logger *slog.Logger
}
)
func init() {
registerCollector("udp_queues", defaultEnabled, NewUDPqueuesCollector)
registerCollector("udp", defaultEnabled, NewUDPCollector)
}
// NewUDPqueuesCollector returns a new Collector exposing network udp queued bytes.
func NewUDPqueuesCollector(logger *slog.Logger) (Collector, error) {
func NewUDPCollector(logger *slog.Logger) (Collector, error) {
fs, err := procfs.NewFS(*procPath)
if err != nil {
return nil, fmt.Errorf("failed to open procfs: %w", err)
}
return &udpQueuesCollector{
return &udpCollector{
fs: fs,
desc: prometheus.NewDesc(
queues: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "udp", "queues"),
"Number of allocated memory in the kernel for UDP datagrams in bytes.",
[]string{"queue", "ip"}, nil,
),
drops: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "udp", "drops_total"),
"Total number of datagrams dropped.",
[]string{"ip"}, nil,
),
logger: logger,
}, nil
}
func (c *udpQueuesCollector) Update(ch chan<- prometheus.Metric) error {
func (c *udpCollector) Update(ch chan<- prometheus.Metric) error {
s4, errIPv4 := c.fs.NetUDPSummary()
if errIPv4 == nil {
ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s4.TxQueueLength), "tx", "v4")
ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s4.RxQueueLength), "rx", "v4")
ch <- prometheus.MustNewConstMetric(c.queues, prometheus.GaugeValue, float64(s4.TxQueueLength), "tx", "v4")
ch <- prometheus.MustNewConstMetric(c.queues, prometheus.GaugeValue, float64(s4.RxQueueLength), "rx", "v4")
if s4.Drops != nil {
ch <- prometheus.MustNewConstMetric(c.desc, prometheus.CounterValue, float64(*s4.Drops), "drops", "v4")
ch <- prometheus.MustNewConstMetric(c.drops, prometheus.CounterValue, float64(*s4.Drops), "v4")
}
} else {
if errors.Is(errIPv4, os.ErrNotExist) {
@ -74,10 +80,10 @@ func (c *udpQueuesCollector) Update(ch chan<- prometheus.Metric) error {
s6, errIPv6 := c.fs.NetUDP6Summary()
if errIPv6 == nil {
ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s6.TxQueueLength), "tx", "v6")
ch <- prometheus.MustNewConstMetric(c.desc, prometheus.GaugeValue, float64(s6.RxQueueLength), "rx", "v6")
ch <- prometheus.MustNewConstMetric(c.queues, prometheus.GaugeValue, float64(s6.TxQueueLength), "tx", "v6")
ch <- prometheus.MustNewConstMetric(c.queues, prometheus.GaugeValue, float64(s6.RxQueueLength), "rx", "v6")
if s6.Drops != nil {
ch <- prometheus.MustNewConstMetric(c.desc, prometheus.CounterValue, float64(*s6.Drops), "drops", "v6")
ch <- prometheus.MustNewConstMetric(c.drops, prometheus.CounterValue, float64(*s6.Drops), "v6")
}
} else {
if errors.Is(errIPv6, os.ErrNotExist) {

View file

@ -47,7 +47,7 @@ enabled_collectors=$(cat << COLLECTORS
sysctl
textfile
thermal_zone
udp_queues
udp
vmstat
watchdog
wifi