diff --git a/README.md b/README.md index ff5d27ea..31ee0528 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/collector/fixtures/e2e-64k-page-output.txt b/collector/fixtures/e2e-64k-page-output.txt index 7f4b17d2..d0a57cf3 100644 --- a/collector/fixtures/e2e-64k-page-output.txt +++ b/collector/fixtures/e2e-64k-page-output.txt @@ -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. diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 6dc8e7a8..bcec4f26 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -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. diff --git a/collector/udp_queues_linux.go b/collector/udp_queues_linux.go index 8d7cd690..c9f4eb9b 100644 --- a/collector/udp_queues_linux.go +++ b/collector/udp_queues_linux.go @@ -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) { diff --git a/end-to-end-test.sh b/end-to-end-test.sh index 35e4534e..0816951d 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -47,7 +47,7 @@ enabled_collectors=$(cat << COLLECTORS sysctl textfile thermal_zone - udp_queues + udp vmstat watchdog wifi