diff --git a/.circleci/config.yml b/.circleci/config.yml index 96b38cff..5122a8a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -57,7 +57,7 @@ jobs: fi if [[ -f "$(pwd)/.build/darwin-amd64/node_exporter" ]]; then - promu codesign "$(pwd)/.build/darwin-amd64/node_exporter" + promu codesign "$(pwd)/.build/darwin-amd64/node_exporter" fi - persist_to_workspace: root: . diff --git a/README.md b/README.md index 80a33469..f52ba5eb 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,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 4ff32889..637cc618 100644 --- a/collector/fixtures/e2e-64k-page-output.txt +++ b/collector/fixtures/e2e-64k-page-output.txt @@ -3007,7 +3007,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 @@ -3258,6 +3258,9 @@ 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 gauge node_udp_queues{ip="v4",queue="rx"} 0 diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 66178b2d..409495c2 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -3029,7 +3029,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 @@ -3280,6 +3280,9 @@ 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 gauge node_udp_queues{ip="v4",queue="rx"} 0 diff --git a/collector/udp_queues_linux.go b/collector/udp_queues_linux.go index 2923936e..c9f4eb9b 100644 --- a/collector/udp_queues_linux.go +++ b/collector/udp_queues_linux.go @@ -27,40 +27,49 @@ 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.drops, prometheus.CounterValue, float64(*s4.Drops), "v4") + } } else { if errors.Is(errIPv4, os.ErrNotExist) { c.logger.Debug("not collecting ipv4 based metrics") @@ -71,8 +80,11 @@ 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.drops, prometheus.CounterValue, float64(*s6.Drops), "v6") + } } else { if errors.Is(errIPv6, os.ErrNotExist) { c.logger.Debug("not collecting ipv6 based metrics") diff --git a/end-to-end-test.sh b/end-to-end-test.sh index 944bdc0e..f6280416 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -79,7 +79,7 @@ enabled_collectors=$(cat << COLLECTORS sysctl textfile thermal_zone - udp_queues + udp vmstat watchdog wifi