fix: tcp, udp sample the IPv4 and IPv6 counters in one PDH query (#2684)

Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2026-10-11 18:36:26 +02:00
committed by GitHub
parent 6fd63e4767
commit a04d6df97f
6 changed files with 352 additions and 12 deletions
+15 -2
View File
@@ -60,6 +60,9 @@ var ConfigDefaults = Config{
type Collector struct {
config Config
// perfDataQuery samples the IPv4 and IPv6 objects together, so the
// collector waits only once for the other performance counter queries.
perfDataQuery *pdh.Query
perfDataCollector4 *pdh.Collector[perfDataCounterValues]
perfDataCollector6 *pdh.Collector[perfDataCounterValues]
perfDataObject4 []perfDataCounterValues
@@ -123,6 +126,7 @@ func (c *Collector) Close() error {
if slices.Contains(c.config.CollectorsEnabled, subCollectorMetrics) {
c.perfDataCollector4.Close()
c.perfDataCollector6.Close()
c.perfDataQuery.Close()
}
return nil
@@ -207,12 +211,17 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
if slices.Contains(c.config.CollectorsEnabled, subCollectorMetrics) {
var err error
c.perfDataCollector4, err = pdh.NewCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), pdh.CounterTypeRaw, "TCPv4", nil)
c.perfDataQuery, err = pdh.NewQuery()
if err != nil {
return fmt.Errorf("failed to open TCP performance counter query: %w", err)
}
c.perfDataCollector4, err = pdh.NewQueryCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), c.perfDataQuery, pdh.CounterTypeRaw, "TCPv4", nil)
if err != nil {
errs = append(errs, fmt.Errorf("failed to create TCPv4 collector: %w", err))
}
c.perfDataCollector6, err = pdh.NewCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), pdh.CounterTypeRaw, "TCPv6", nil)
c.perfDataCollector6, err = pdh.NewQueryCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), c.perfDataQuery, pdh.CounterTypeRaw, "TCPv6", nil)
if err != nil {
errs = append(errs, fmt.Errorf("failed to create TCPv6 collector: %w", err))
}
@@ -244,6 +253,10 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric, _ time.Duration) error
func (c *Collector) collect(ch chan<- prometheus.Metric) error {
errs := make([]error, 0)
if err := c.perfDataQuery.Collect(); err != nil {
return fmt.Errorf("failed to collect TCP metrics: %w", err)
}
if err := c.perfDataCollector4.Collect(&c.perfDataObject4); err != nil {
errs = append(errs, fmt.Errorf("failed to collect TCPv4 metrics. %w", err))
} else if len(c.perfDataObject4) == 0 {
+15 -2
View File
@@ -41,6 +41,9 @@ var ConfigDefaults = Config{}
type Collector struct {
config Config
// perfDataQuery samples the IPv4 and IPv6 objects together, so the
// collector waits only once for the other performance counter queries.
perfDataQuery *pdh.Query
perfDataCollector4 *pdh.Collector[perfDataCounterValues]
perfDataCollector6 *pdh.Collector[perfDataCounterValues]
perfDataObject4 []perfDataCounterValues
@@ -79,6 +82,7 @@ func (c *Collector) GetName() string {
func (c *Collector) Close() error {
c.perfDataCollector4.Close()
c.perfDataCollector6.Close()
c.perfDataQuery.Close()
return nil
}
@@ -113,12 +117,17 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
var err error
c.perfDataCollector4, err = pdh.NewCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), pdh.CounterTypeRaw, "UDPv4", nil)
c.perfDataQuery, err = pdh.NewQuery()
if err != nil {
return fmt.Errorf("failed to open UDP performance counter query: %w", err)
}
c.perfDataCollector4, err = pdh.NewQueryCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), c.perfDataQuery, pdh.CounterTypeRaw, "UDPv4", nil)
if err != nil {
errs = append(errs, fmt.Errorf("failed to create UDPv4 collector: %w", err))
}
c.perfDataCollector6, err = pdh.NewCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), pdh.CounterTypeRaw, "UDPv6", nil)
c.perfDataCollector6, err = pdh.NewQueryCollector[perfDataCounterValues](logger.With(slog.String("collector", Name)), c.perfDataQuery, pdh.CounterTypeRaw, "UDPv6", nil)
if err != nil {
errs = append(errs, fmt.Errorf("failed to create UDPv6 collector: %w", err))
}
@@ -133,6 +142,10 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric, _ time.Duration) error
}
func (c *Collector) collect(ch chan<- prometheus.Metric) error {
if err := c.perfDataQuery.Collect(); err != nil {
return fmt.Errorf("failed to collect UDP metrics: %w", err)
}
errs := make([]error, 0)
if err := c.perfDataCollector4.Collect(&c.perfDataObject4); err != nil {