hyperv: close PDH queries of sub-collectors on Close (#2539)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2026-10-08 11:15:28 +02:00
committed by GitHub
co-authored by Claude Opus 5.5
parent 9ed3e28d94
commit 3a7bac6fe8
3 changed files with 43 additions and 26 deletions
+10 -10
View File
@@ -183,52 +183,52 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
subCollectorADAccessProcesses: {
build: c.buildADAccessProcesses,
collect: c.collectADAccessProcesses,
close: c.perfDataCollectorADAccessProcesses.Close,
close: func() { c.perfDataCollectorADAccessProcesses.Close() },
},
subCollectorTransportQueues: {
build: c.buildTransportQueues,
collect: c.collectTransportQueues,
close: c.perfDataCollectorTransportQueues.Close,
close: func() { c.perfDataCollectorTransportQueues.Close() },
},
subCollectorHttpProxy: {
build: c.buildHTTPProxy,
collect: c.collectHTTPProxy,
close: c.perfDataCollectorHTTPProxy.Close,
close: func() { c.perfDataCollectorHTTPProxy.Close() },
},
subCollectorActiveSync: {
build: c.buildActiveSync,
collect: c.collectActiveSync,
close: c.perfDataCollectorActiveSync.Close,
close: func() { c.perfDataCollectorActiveSync.Close() },
},
subCollectorAvailabilityService: {
build: c.buildAvailabilityService,
collect: c.collectAvailabilityService,
close: c.perfDataCollectorAvailabilityService.Close,
close: func() { c.perfDataCollectorAvailabilityService.Close() },
},
subCollectorOutlookWebAccess: {
build: c.buildOWA,
collect: c.collectOWA,
close: c.perfDataCollectorOWA.Close,
close: func() { c.perfDataCollectorOWA.Close() },
},
subCollectorAutoDiscover: {
build: c.buildAutoDiscover,
collect: c.collectAutoDiscover,
close: c.perfDataCollectorAutoDiscover.Close,
close: func() { c.perfDataCollectorAutoDiscover.Close() },
},
subCollectorWorkloadManagement: {
build: c.buildWorkloadManagementWorkloads,
collect: c.collectWorkloadManagementWorkloads,
close: c.perfDataCollectorWorkloadManagementWorkloads.Close,
close: func() { c.perfDataCollectorWorkloadManagementWorkloads.Close() },
},
subCollectorRpcClientAccess: {
build: c.buildRpcClientAccess,
collect: c.collectRpcClientAccess,
close: c.perfDataCollectorRpcClientAccess.Close,
close: func() { c.perfDataCollectorRpcClientAccess.Close() },
},
subCollectorMapiHTTPEmsmdb: {
build: c.buildMapiHTTPEmsMDB,
collect: c.collectMapiHTTPEmsMDB,
close: c.perfDataCollectorMapiHTTPEmsMDB.Close,
close: func() { c.perfDataCollectorMapiHTTPEmsMDB.Close() },
},
}
+16 -16
View File
@@ -182,48 +182,48 @@ func (c *Collector) Build(logger *slog.Logger, miSession *mi.Session) error {
subCollectorDataStore: {
build: c.buildDataStore,
collect: c.collectDataStore,
close: c.perfDataCollectorDataStore.Close,
close: func() { c.perfDataCollectorDataStore.Close() },
minBuildNumber: osversion.LTSC2022,
},
subCollectorDynamicMemoryBalancer: {
build: c.buildDynamicMemoryBalancer,
collect: c.collectDynamicMemoryBalancer,
close: c.perfDataCollectorDynamicMemoryBalancer.Close,
close: func() { c.perfDataCollectorDynamicMemoryBalancer.Close() },
},
subCollectorDynamicMemoryVM: {
build: c.buildDynamicMemoryVM,
collect: c.collectDynamicMemoryVM,
close: c.perfDataCollectorDynamicMemoryVM.Close,
close: func() { c.perfDataCollectorDynamicMemoryVM.Close() },
},
subCollectorHost: {
build: c.buildHost,
collect: c.collectHost,
close: c.perfDataCollectorLogicalProcessor.Close,
close: func() { c.perfDataCollectorLogicalProcessor.Close() },
},
subCollectorHypervisorLogicalProcessor: {
build: c.buildHypervisorLogicalProcessor,
collect: c.collectHypervisorLogicalProcessor,
close: c.perfDataCollectorHypervisorLogicalProcessor.Close,
close: func() { c.perfDataCollectorHypervisorLogicalProcessor.Close() },
},
subCollectorHypervisorRootPartition: {
build: c.buildHypervisorRootPartition,
collect: c.collectHypervisorRootPartition,
close: c.perfDataCollectorHypervisorRootPartition.Close,
close: func() { c.perfDataCollectorHypervisorRootPartition.Close() },
},
subCollectorHypervisorRootVirtualProcessor: {
build: c.buildHypervisorRootVirtualProcessor,
collect: c.collectHypervisorRootVirtualProcessor,
close: c.perfDataCollectorHypervisorRootVirtualProcessor.Close,
close: func() { c.perfDataCollectorHypervisorRootVirtualProcessor.Close() },
},
subCollectorHypervisorVirtualProcessor: {
build: c.buildHypervisorVirtualProcessor,
collect: c.collectHypervisorVirtualProcessor,
close: c.perfDataCollectorHypervisorVirtualProcessor.Close,
close: func() { c.perfDataCollectorHypervisorVirtualProcessor.Close() },
},
subCollectorLegacyNetworkAdapter: {
build: c.buildLegacyNetworkAdapter,
collect: c.collectLegacyNetworkAdapter,
close: c.perfDataCollectorLegacyNetworkAdapter.Close,
close: func() { c.perfDataCollectorLegacyNetworkAdapter.Close() },
},
subCollectorReplicaVM: {
build: c.buildReplicaVM,
@@ -234,38 +234,38 @@ func (c *Collector) Build(logger *slog.Logger, miSession *mi.Session) error {
subCollectorVirtualMachineHealthSummary: {
build: c.buildVirtualMachineHealthSummary,
collect: c.collectVirtualMachineHealthSummary,
close: c.perfDataCollectorVirtualMachineHealthSummary.Close,
close: func() { c.perfDataCollectorVirtualMachineHealthSummary.Close() },
},
subCollectorVirtualMachineVidPartition: {
build: c.buildVirtualMachineVidPartition,
collect: c.collectVirtualMachineVidPartition,
close: c.perfDataCollectorVirtualMachineVidPartition.Close,
close: func() { c.perfDataCollectorVirtualMachineVidPartition.Close() },
},
subCollectorVirtualNetworkAdapter: {
build: c.buildVirtualNetworkAdapter,
collect: c.collectVirtualNetworkAdapter,
close: c.perfDataCollectorVirtualNetworkAdapter.Close,
close: func() { c.perfDataCollectorVirtualNetworkAdapter.Close() },
},
subCollectorVirtualNetworkAdapterDropReasons: {
build: c.buildVirtualNetworkAdapterDropReasons,
collect: c.collectVirtualNetworkAdapterDropReasons,
close: c.perfDataCollectorVirtualNetworkAdapterDropReasons.Close,
close: func() { c.perfDataCollectorVirtualNetworkAdapterDropReasons.Close() },
},
subCollectorVirtualSMB: {
build: c.buildVirtualSMB,
collect: c.collectVirtualSMB,
close: c.perfDataCollectorVirtualSMB.Close,
close: func() { c.perfDataCollectorVirtualSMB.Close() },
minBuildNumber: osversion.LTSC2022,
},
subCollectorVirtualStorageDevice: {
build: c.buildVirtualStorageDevice,
collect: c.collectVirtualStorageDevice,
close: c.perfDataCollectorVirtualStorageDevice.Close,
close: func() { c.perfDataCollectorVirtualStorageDevice.Close() },
},
subCollectorVirtualSwitch: {
build: c.buildVirtualSwitch,
collect: c.collectVirtualSwitch,
close: c.perfDataCollectorVirtualSwitch.Close,
close: func() { c.perfDataCollectorVirtualSwitch.Close() },
},
subCollectorWMIHealth: {
build: c.buildWMIHealth,
+17
View File
@@ -18,9 +18,12 @@
package hyperv_test
import (
"log/slog"
"testing"
"time"
"github.com/prometheus-community/windows_exporter/internal/collector/hyperv"
"github.com/prometheus-community/windows_exporter/internal/pdh"
"github.com/prometheus-community/windows_exporter/internal/utils/testutils"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/require"
@@ -45,3 +48,17 @@ func TestCollector(t *testing.T) {
require.InDelta(t, 1, metric.GetGauge().GetValue(), 0, "Hyper-V WMI health query failed")
}
}
// TestCloseReleasesQuery ensures Close releases the PDH queries of the sub-collectors.
func TestCloseReleasesQuery(t *testing.T) {
t.Parallel()
c := hyperv.New(&hyperv.Config{CollectorsEnabled: []string{"dynamic_memory_balancer"}})
require.NoError(t, c.Build(slog.New(slog.DiscardHandler), nil))
require.NoError(t, c.Close())
ch := make(chan prometheus.Metric, 100)
require.ErrorIs(t, c.Collect(ch, time.Second), pdh.ErrPerformanceCounterNotInitialized)
}