diff --git a/internal/collector/exchange/exchange.go b/internal/collector/exchange/exchange.go index ee51e52a..e82e637b 100644 --- a/internal/collector/exchange/exchange.go +++ b/internal/collector/exchange/exchange.go @@ -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() }, }, } diff --git a/internal/collector/hyperv/hyperv.go b/internal/collector/hyperv/hyperv.go index e221e304..b64e570f 100644 --- a/internal/collector/hyperv/hyperv.go +++ b/internal/collector/hyperv/hyperv.go @@ -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, diff --git a/internal/collector/hyperv/hyperv_test.go b/internal/collector/hyperv/hyperv_test.go index f38abb4a..b60038d9 100644 --- a/internal/collector/hyperv/hyperv_test.go +++ b/internal/collector/hyperv/hyperv_test.go @@ -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) +}