mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-10-20 19:49:03 +02:00
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:
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user