smb: extend smb share metrics (#1765)

Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2024-11-24 13:18:14 +01:00
committed by GitHub
parent 1ecc340659
commit e812584f27
67 changed files with 209 additions and 115 deletions

View File

@@ -265,7 +265,7 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("DirectoryServices", perfdata.InstanceAll, counters) c.perfDataCollector, err = perfdata.NewCollector("DirectoryServices", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create DirectoryServices collector: %w", err) return fmt.Errorf("failed to create DirectoryServices collector: %w", err)
} }

View File

@@ -70,7 +70,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("Certification Authority", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("Certification Authority", perfdata.InstancesAll, []string{
requestsPerSecond, requestsPerSecond,
requestProcessingTime, requestProcessingTime,
retrievalsPerSecond, retrievalsPerSecond,

View File

@@ -86,7 +86,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("Cache", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("Cache", perfdata.InstancesAll, []string{
asyncCopyReadsTotal, asyncCopyReadsTotal,
asyncDataMapsTotal, asyncDataMapsTotal,
asyncFastReadsTotal, asyncFastReadsTotal,
@@ -306,7 +306,7 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect Cache metrics: %w", err) return fmt.Errorf("failed to collect Cache metrics: %w", err)
} }
cacheData, ok := data[perfdata.EmptyInstance] cacheData, ok := data[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("perflib query for Cache returned empty result set") return errors.New("perflib query for Cache returned empty result set")

View File

@@ -78,7 +78,7 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
c.mu = sync.Mutex{} c.mu = sync.Mutex{}
c.perfDataCollector, err = perfdata.NewCollector("Processor Information", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("Processor Information", perfdata.InstancesAll, []string{
c1TimeSeconds, c1TimeSeconds,
c2TimeSeconds, c2TimeSeconds,
c3TimeSeconds, c3TimeSeconds,

View File

@@ -146,7 +146,7 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
var err error var err error
if slices.Contains(c.config.CollectorsEnabled, "connection") { if slices.Contains(c.config.CollectorsEnabled, "connection") {
c.perfDataCollectorConnection, err = perfdata.NewCollector("DFS Replication Connections", perfdata.InstanceAll, []string{ c.perfDataCollectorConnection, err = perfdata.NewCollector("DFS Replication Connections", perfdata.InstancesAll, []string{
bandwidthSavingsUsingDFSReplicationTotal, bandwidthSavingsUsingDFSReplicationTotal,
bytesReceivedTotal, bytesReceivedTotal,
compressedSizeOfFilesReceivedTotal, compressedSizeOfFilesReceivedTotal,
@@ -163,7 +163,7 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
} }
if slices.Contains(c.config.CollectorsEnabled, "folder") { if slices.Contains(c.config.CollectorsEnabled, "folder") {
c.perfDataCollectorFolder, err = perfdata.NewCollector("DFS Replicated Folders", perfdata.InstanceAll, []string{ c.perfDataCollectorFolder, err = perfdata.NewCollector("DFS Replicated Folders", perfdata.InstancesAll, []string{
bandwidthSavingsUsingDFSReplicationTotal, bandwidthSavingsUsingDFSReplicationTotal,
compressedSizeOfFilesReceivedTotal, compressedSizeOfFilesReceivedTotal,
conflictBytesCleanedUpTotal, conflictBytesCleanedUpTotal,
@@ -198,7 +198,7 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
} }
if slices.Contains(c.config.CollectorsEnabled, "volume") { if slices.Contains(c.config.CollectorsEnabled, "volume") {
c.perfDataCollectorVolume, err = perfdata.NewCollector("DFS Replication Service Volumes", perfdata.InstanceAll, []string{ c.perfDataCollectorVolume, err = perfdata.NewCollector("DFS Replication Service Volumes", perfdata.InstancesAll, []string{
databaseCommitsTotal, databaseCommitsTotal,
databaseLookupsTotal, databaseLookupsTotal,
usnJournalRecordsReadTotal, usnJournalRecordsReadTotal,

View File

@@ -273,7 +273,7 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect DHCP Server metrics: %w", err) return fmt.Errorf("failed to collect DHCP Server metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("perflib query for DHCP Server returned empty result set") return errors.New("perflib query for DHCP Server returned empty result set")
} }

View File

@@ -79,7 +79,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("DNS", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("DNS", perfdata.InstancesAll, []string{
axfrRequestReceived, axfrRequestReceived,
axfrRequestSent, axfrRequestSent,
axfrResponseReceived, axfrResponseReceived,
@@ -269,7 +269,7 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect DNS metrics: %w", err) return fmt.Errorf("failed to collect DNS metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("perflib query for DNS returned empty result set") return errors.New("perflib query for DNS returned empty result set")
} }

View File

@@ -26,7 +26,7 @@ func (c *Collector) buildActiveSync() error {
var err error var err error
c.perfDataCollectorActiveSync, err = perfdata.NewCollector("MSExchange ActiveSync", perfdata.InstanceAll, counters) c.perfDataCollectorActiveSync, err = perfdata.NewCollector("MSExchange ActiveSync", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange ActiveSync collector: %w", err) return fmt.Errorf("failed to create MSExchange ActiveSync collector: %w", err)
} }

View File

@@ -30,7 +30,7 @@ func (c *Collector) buildADAccessProcesses() error {
var err error var err error
c.perfDataCollectorADAccessProcesses, err = perfdata.NewCollector("MSExchange ADAccess Processes", perfdata.InstanceAll, counters) c.perfDataCollectorADAccessProcesses, err = perfdata.NewCollector("MSExchange ADAccess Processes", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange ADAccess Processes collector: %w", err) return fmt.Errorf("failed to create MSExchange ADAccess Processes collector: %w", err)
} }

View File

@@ -18,7 +18,7 @@ func (c *Collector) buildAutoDiscover() error {
var err error var err error
c.perfDataCollectorAutoDiscover, err = perfdata.NewCollector("MSExchange Autodiscover", perfdata.InstanceAll, counters) c.perfDataCollectorAutoDiscover, err = perfdata.NewCollector("MSExchange Autodiscover", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange Autodiscover collector: %w", err) return fmt.Errorf("failed to create MSExchange Autodiscover collector: %w", err)
} }

View File

@@ -18,7 +18,7 @@ func (c *Collector) buildAvailabilityService() error {
var err error var err error
c.perfDataCollectorAvailabilityService, err = perfdata.NewCollector("MSExchange Availability Service", perfdata.InstanceAll, counters) c.perfDataCollectorAvailabilityService, err = perfdata.NewCollector("MSExchange Availability Service", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange Availability Service collector: %w", err) return fmt.Errorf("failed to create MSExchange Availability Service collector: %w", err)
} }

View File

@@ -32,7 +32,7 @@ func (c *Collector) buildHTTPProxy() error {
var err error var err error
c.perfDataCollectorHttpProxy, err = perfdata.NewCollector("MSExchange HttpProxy", perfdata.InstanceAll, counters) c.perfDataCollectorHttpProxy, err = perfdata.NewCollector("MSExchange HttpProxy", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange HttpProxy collector: %w", err) return fmt.Errorf("failed to create MSExchange HttpProxy collector: %w", err)
} }

View File

@@ -22,7 +22,7 @@ func (c *Collector) buildMapiHttpEmsmdb() error {
var err error var err error
c.perfDataCollectorMapiHttpEmsmdb, err = perfdata.NewCollector("MSExchange MapiHttp Emsmdb", perfdata.InstanceAll, counters) c.perfDataCollectorMapiHttpEmsmdb, err = perfdata.NewCollector("MSExchange MapiHttp Emsmdb", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange MapiHttp Emsmdb: %w", err) return fmt.Errorf("failed to create MSExchange MapiHttp Emsmdb: %w", err)
} }

View File

@@ -24,7 +24,7 @@ func (c *Collector) buildOWA() error {
var err error var err error
c.perfDataCollectorOWA, err = perfdata.NewCollector("MSExchange OWA", perfdata.InstanceAll, counters) c.perfDataCollectorOWA, err = perfdata.NewCollector("MSExchange OWA", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange OWA collector: %w", err) return fmt.Errorf("failed to create MSExchange OWA collector: %w", err)
} }

View File

@@ -32,7 +32,7 @@ func (c *Collector) buildRPC() error {
var err error var err error
c.perfDataCollectorRpcClientAccess, err = perfdata.NewCollector("MSExchange RpcClientAccess", perfdata.InstanceAll, counters) c.perfDataCollectorRpcClientAccess, err = perfdata.NewCollector("MSExchange RpcClientAccess", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange RpcClientAccess collector: %w", err) return fmt.Errorf("failed to create MSExchange RpcClientAccess collector: %w", err)
} }

View File

@@ -58,7 +58,7 @@ func (c *Collector) buildTransportQueues() error {
var err error var err error
c.perfDataCollectorTransportQueues, err = perfdata.NewCollector("MSExchangeTransport Queues", perfdata.InstanceAll, counters) c.perfDataCollectorTransportQueues, err = perfdata.NewCollector("MSExchangeTransport Queues", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchangeTransport Queues collector: %w", err) return fmt.Errorf("failed to create MSExchangeTransport Queues collector: %w", err)
} }

View File

@@ -30,7 +30,7 @@ func (c *Collector) buildWorkloadManagementWorkloads() error {
var err error var err error
c.perfDataCollectorWorkloadManagementWorkloads, err = perfdata.NewCollector("MSExchange WorkloadManagement Workloads", perfdata.InstanceAll, counters) c.perfDataCollectorWorkloadManagementWorkloads, err = perfdata.NewCollector("MSExchange WorkloadManagement Workloads", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create MSExchange WorkloadManagement Workloads collector: %w", err) return fmt.Errorf("failed to create MSExchange WorkloadManagement Workloads collector: %w", err)
} }

View File

@@ -114,7 +114,7 @@ const (
func (c *Collector) buildDataStore() error { func (c *Collector) buildDataStore() error {
var err error var err error
c.perfDataCollectorDataStore, err = perfdata.NewCollector("Hyper-V DataStore", perfdata.InstanceAll, []string{ c.perfDataCollectorDataStore, err = perfdata.NewCollector("Hyper-V DataStore", perfdata.InstancesAll, []string{
dataStoreFragmentationRatio, dataStoreFragmentationRatio,
dataStoreSectorSize, dataStoreSectorSize,
dataStoreDataAlignment, dataStoreDataAlignment,

View File

@@ -30,7 +30,7 @@ func (c *Collector) buildDynamicMemoryBalancer() error {
var err error var err error
// https://learn.microsoft.com/en-us/archive/blogs/chrisavis/monitoring-dynamic-memory-in-windows-server-hyper-v-2012 // https://learn.microsoft.com/en-us/archive/blogs/chrisavis/monitoring-dynamic-memory-in-windows-server-hyper-v-2012
c.perfDataCollectorDynamicMemoryBalancer, err = perfdata.NewCollector("Hyper-V Dynamic Memory Balancer", perfdata.InstanceAll, []string{ c.perfDataCollectorDynamicMemoryBalancer, err = perfdata.NewCollector("Hyper-V Dynamic Memory Balancer", perfdata.InstancesAll, []string{
vmDynamicMemoryBalancerAvailableMemory, vmDynamicMemoryBalancerAvailableMemory,
vmDynamicMemoryBalancerAvailableMemoryForBalancing, vmDynamicMemoryBalancerAvailableMemoryForBalancing,
vmDynamicMemoryBalancerAveragePressure, vmDynamicMemoryBalancerAveragePressure,

View File

@@ -42,7 +42,7 @@ const (
func (c *Collector) buildDynamicMemoryVM() error { func (c *Collector) buildDynamicMemoryVM() error {
var err error var err error
c.perfDataCollectorDynamicMemoryVM, err = perfdata.NewCollector("Hyper-V Dynamic Memory VM", perfdata.InstanceAll, []string{ c.perfDataCollectorDynamicMemoryVM, err = perfdata.NewCollector("Hyper-V Dynamic Memory VM", perfdata.InstancesAll, []string{
vmMemoryAddedMemory, vmMemoryAddedMemory,
vmMemoryCurrentPressure, vmMemoryCurrentPressure,
vmMemoryGuestVisiblePhysicalMemory, vmMemoryGuestVisiblePhysicalMemory,

View File

@@ -32,7 +32,7 @@ const (
func (c *Collector) buildHypervisorLogicalProcessor() error { func (c *Collector) buildHypervisorLogicalProcessor() error {
var err error var err error
c.perfDataCollectorHypervisorLogicalProcessor, err = perfdata.NewCollector("Hyper-V Hypervisor Logical Processor", perfdata.InstanceAll, []string{ c.perfDataCollectorHypervisorLogicalProcessor, err = perfdata.NewCollector("Hyper-V Hypervisor Logical Processor", perfdata.InstancesAll, []string{
hypervisorLogicalProcessorGuestRunTimePercent, hypervisorLogicalProcessorGuestRunTimePercent,
hypervisorLogicalProcessorHypervisorRunTimePercent, hypervisorLogicalProcessorHypervisorRunTimePercent,
hypervisorLogicalProcessorTotalRunTimePercent, hypervisorLogicalProcessorTotalRunTimePercent,

View File

@@ -35,7 +35,7 @@ const (
func (c *Collector) buildHypervisorRootVirtualProcessor() error { func (c *Collector) buildHypervisorRootVirtualProcessor() error {
var err error var err error
c.perfDataCollectorHypervisorRootVirtualProcessor, err = perfdata.NewCollector("Hyper-V Hypervisor Root Virtual Processor", perfdata.InstanceAll, []string{ c.perfDataCollectorHypervisorRootVirtualProcessor, err = perfdata.NewCollector("Hyper-V Hypervisor Root Virtual Processor", perfdata.InstancesAll, []string{
hypervisorRootVirtualProcessorGuestIdleTimePercent, hypervisorRootVirtualProcessorGuestIdleTimePercent,
hypervisorRootVirtualProcessorGuestRunTimePercent, hypervisorRootVirtualProcessorGuestRunTimePercent,
hypervisorRootVirtualProcessorHypervisorRunTimePercent, hypervisorRootVirtualProcessorHypervisorRunTimePercent,

View File

@@ -35,7 +35,7 @@ const (
func (c *Collector) buildHypervisorVirtualProcessor() error { func (c *Collector) buildHypervisorVirtualProcessor() error {
var err error var err error
c.perfDataCollectorHypervisorVirtualProcessor, err = perfdata.NewCollector("Hyper-V Hypervisor Virtual Processor", perfdata.InstanceAll, []string{ c.perfDataCollectorHypervisorVirtualProcessor, err = perfdata.NewCollector("Hyper-V Hypervisor Virtual Processor", perfdata.InstancesAll, []string{
hypervisorVirtualProcessorGuestRunTimePercent, hypervisorVirtualProcessorGuestRunTimePercent,
hypervisorVirtualProcessorGuestIdleTimePercent, hypervisorVirtualProcessorGuestIdleTimePercent,
hypervisorVirtualProcessorHypervisorRunTimePercent, hypervisorVirtualProcessorHypervisorRunTimePercent,

View File

@@ -33,7 +33,7 @@ const (
func (c *Collector) buildLegacyNetworkAdapter() error { func (c *Collector) buildLegacyNetworkAdapter() error {
var err error var err error
c.perfDataCollectorLegacyNetworkAdapter, err = perfdata.NewCollector("Hyper-V Legacy Network Adapter", perfdata.InstanceAll, []string{ c.perfDataCollectorLegacyNetworkAdapter, err = perfdata.NewCollector("Hyper-V Legacy Network Adapter", perfdata.InstancesAll, []string{
legacyNetworkAdapterBytesDropped, legacyNetworkAdapterBytesDropped,
legacyNetworkAdapterBytesReceived, legacyNetworkAdapterBytesReceived,
legacyNetworkAdapterBytesSent, legacyNetworkAdapterBytesSent,

View File

@@ -51,7 +51,7 @@ func (c *Collector) collectVirtualMachineHealthSummary(ch chan<- prometheus.Metr
return fmt.Errorf("failed to collect Hyper-V Virtual Machine Health Summary metrics: %w", err) return fmt.Errorf("failed to collect Hyper-V Virtual Machine Health Summary metrics: %w", err)
} }
healthData, ok := data[perfdata.EmptyInstance] healthData, ok := data[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("no data returned for Hyper-V Virtual Machine Health Summary") return errors.New("no data returned for Hyper-V Virtual Machine Health Summary")
} }

View File

@@ -26,7 +26,7 @@ const (
func (c *Collector) buildVirtualMachineVidPartition() error { func (c *Collector) buildVirtualMachineVidPartition() error {
var err error var err error
c.perfDataCollectorVirtualMachineVidPartition, err = perfdata.NewCollector("Hyper-V VM Vid Partition", perfdata.InstanceAll, []string{ c.perfDataCollectorVirtualMachineVidPartition, err = perfdata.NewCollector("Hyper-V VM Vid Partition", perfdata.InstancesAll, []string{
physicalPagesAllocated, physicalPagesAllocated,
preferredNUMANodeIndex, preferredNUMANodeIndex,
remotePhysicalPages, remotePhysicalPages,

View File

@@ -33,7 +33,7 @@ const (
func (c *Collector) buildVirtualNetworkAdapter() error { func (c *Collector) buildVirtualNetworkAdapter() error {
var err error var err error
c.perfDataCollectorVirtualNetworkAdapter, err = perfdata.NewCollector("Hyper-V Virtual Network Adapter", perfdata.InstanceAll, []string{ c.perfDataCollectorVirtualNetworkAdapter, err = perfdata.NewCollector("Hyper-V Virtual Network Adapter", perfdata.InstancesAll, []string{
virtualNetworkAdapterBytesReceived, virtualNetworkAdapterBytesReceived,
virtualNetworkAdapterBytesSent, virtualNetworkAdapterBytesSent,
virtualNetworkAdapterDroppedPacketsIncoming, virtualNetworkAdapterDroppedPacketsIncoming,

View File

@@ -148,7 +148,7 @@ const (
func (c *Collector) buildVirtualNetworkAdapterDropReasons() error { func (c *Collector) buildVirtualNetworkAdapterDropReasons() error {
var err error var err error
c.perfDataCollectorVirtualNetworkAdapterDropReasons, err = perfdata.NewCollector("Hyper-V Virtual Network Adapter Drop Reasons", perfdata.InstanceAll, []string{ c.perfDataCollectorVirtualNetworkAdapterDropReasons, err = perfdata.NewCollector("Hyper-V Virtual Network Adapter Drop Reasons", perfdata.InstancesAll, []string{
virtualNetworkAdapterDropReasonsOutgoingNativeFwdingReq, virtualNetworkAdapterDropReasonsOutgoingNativeFwdingReq,
virtualNetworkAdapterDropReasonsIncomingNativeFwdingReq, virtualNetworkAdapterDropReasonsIncomingNativeFwdingReq,
virtualNetworkAdapterDropReasonsOutgoingMTUMismatch, virtualNetworkAdapterDropReasonsOutgoingMTUMismatch,

View File

@@ -55,7 +55,7 @@ const (
func (c *Collector) buildVirtualSMB() error { func (c *Collector) buildVirtualSMB() error {
var err error var err error
c.perfDataCollectorVirtualSMB, err = perfdata.NewCollector("Hyper-V Virtual SMB", perfdata.InstanceAll, []string{ c.perfDataCollectorVirtualSMB, err = perfdata.NewCollector("Hyper-V Virtual SMB", perfdata.InstancesAll, []string{
virtualSMBDirectMappedSections, virtualSMBDirectMappedSections,
virtualSMBDirectMappedPages, virtualSMBDirectMappedPages,
virtualSMBWriteBytesRDMA, virtualSMBWriteBytesRDMA,

View File

@@ -45,7 +45,7 @@ const (
func (c *Collector) buildVirtualStorageDevice() error { func (c *Collector) buildVirtualStorageDevice() error {
var err error var err error
c.perfDataCollectorVirtualStorageDevice, err = perfdata.NewCollector("Hyper-V Virtual Storage Device", perfdata.InstanceAll, []string{ c.perfDataCollectorVirtualStorageDevice, err = perfdata.NewCollector("Hyper-V Virtual Storage Device", perfdata.InstancesAll, []string{
virtualStorageDeviceErrorCount, virtualStorageDeviceErrorCount,
virtualStorageDeviceQueueLength, virtualStorageDeviceQueueLength,
virtualStorageDeviceReadBytes, virtualStorageDeviceReadBytes,

View File

@@ -62,7 +62,7 @@ const (
func (c *Collector) buildVirtualSwitch() error { func (c *Collector) buildVirtualSwitch() error {
var err error var err error
c.perfDataCollectorVirtualSwitch, err = perfdata.NewCollector("Hyper-V Virtual Switch", perfdata.InstanceAll, []string{ c.perfDataCollectorVirtualSwitch, err = perfdata.NewCollector("Hyper-V Virtual Switch", perfdata.InstancesAll, []string{
virtualSwitchBroadcastPacketsReceived, virtualSwitchBroadcastPacketsReceived,
virtualSwitchBroadcastPacketsSent, virtualSwitchBroadcastPacketsSent,
virtualSwitchBytes, virtualSwitchBytes,

View File

@@ -57,7 +57,7 @@ var applicationStates = map[uint32]string{
func (c *Collector) buildAppPoolWAS() error { func (c *Collector) buildAppPoolWAS() error {
var err error var err error
c.perfDataCollectorAppPoolWAS, err = perfdata.NewCollector("APP_POOL_WAS", perfdata.InstanceAll, []string{ c.perfDataCollectorAppPoolWAS, err = perfdata.NewCollector("APP_POOL_WAS", perfdata.InstancesAll, []string{
CurrentApplicationPoolState, CurrentApplicationPoolState,
CurrentApplicationPoolUptime, CurrentApplicationPoolUptime,
CurrentWorkerProcesses, CurrentWorkerProcesses,

View File

@@ -182,7 +182,7 @@ func (c *Collector) buildW3SVCW3WP() error {
var err error var err error
c.perfDataCollectorW3SVCW3WP, err = perfdata.NewCollector("W3SVC_W3WP", perfdata.InstanceAll, counters) c.perfDataCollectorW3SVCW3WP, err = perfdata.NewCollector("W3SVC_W3WP", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create W3SVC_W3WP collector: %w", err) return fmt.Errorf("failed to create W3SVC_W3WP collector: %w", err)
} }
@@ -432,8 +432,7 @@ func (c *Collector) collectW3SVCW3WP(ch chan<- prometheus.Metric) error {
pid := workerProcessNameExtractor.ReplaceAllString(name, "$1") pid := workerProcessNameExtractor.ReplaceAllString(name, "$1")
name := workerProcessNameExtractor.ReplaceAllString(name, "$2") name := workerProcessNameExtractor.ReplaceAllString(name, "$2")
if name == "" || name == "_Total" || if name == "" || c.config.AppExclude.MatchString(name) ||
c.config.AppExclude.MatchString(name) ||
!c.config.AppInclude.MatchString(name) { !c.config.AppInclude.MatchString(name) {
continue continue
} }

View File

@@ -80,7 +80,7 @@ const (
func (c *Collector) buildWebService() error { func (c *Collector) buildWebService() error {
var err error var err error
c.perfDataCollectorWebService, err = perfdata.NewCollector("Web Service", perfdata.InstanceAll, []string{ c.perfDataCollectorWebService, err = perfdata.NewCollector("Web Service", perfdata.InstancesAll, []string{
CurrentAnonymousUsers, CurrentAnonymousUsers,
CurrentBlockedAsyncIORequests, CurrentBlockedAsyncIORequests,
CurrentCGIRequests, CurrentCGIRequests,

View File

@@ -87,7 +87,7 @@ const (
func (c *Collector) buildWebServiceCache() error { func (c *Collector) buildWebServiceCache() error {
var err error var err error
c.perfDataCollectorWebService, err = perfdata.NewCollector("Web Service Cache", perfdata.InstanceAll, []string{ c.perfDataCollectorWebService, err = perfdata.NewCollector("Web Service Cache", perfdata.InstancesAll, []string{
ServiceCacheActiveFlushedEntries, ServiceCacheActiveFlushedEntries,
ServiceCacheCurrentFileCacheMemoryUsage, ServiceCacheCurrentFileCacheMemoryUsage,
ServiceCacheMaximumFileCacheMemoryUsage, ServiceCacheMaximumFileCacheMemoryUsage,

View File

@@ -136,7 +136,7 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("LogicalDisk", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("LogicalDisk", perfdata.InstancesAll, []string{
currentDiskQueueLength, currentDiskQueueLength,
avgDiskReadQueueLength, avgDiskReadQueueLength,
avgDiskWriteQueueLength, avgDiskWriteQueueLength,

View File

@@ -134,7 +134,7 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("Memory", perfdata.InstanceAll, counters) c.perfDataCollector, err = perfdata.NewCollector("Memory", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Memory collector: %w", err) return fmt.Errorf("failed to create Memory collector: %w", err)
} }
@@ -414,7 +414,7 @@ func (c *Collector) collectPDH(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect Memory metrics: %w", err) return fmt.Errorf("failed to collect Memory metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("perflib query for Memory returned empty result set") return errors.New("perflib query for Memory returned empty result set")

View File

@@ -443,7 +443,7 @@ func (c *Collector) collectAccessMethodsInstance(ch chan<- prometheus.Metric, sq
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"), err) return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"), err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods")) return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"))
} }

View File

@@ -54,7 +54,7 @@ func (c *Collector) buildAvailabilityReplica() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.availabilityReplicaPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), perfdata.InstanceAll, counters) c.availabilityReplicaPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Availability Replica collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create Availability Replica collector for instance %s: %w", sqlInstance, err)
} }

View File

@@ -170,7 +170,7 @@ func (c *Collector) buildDatabases() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.databasesPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Databases"), perfdata.InstanceAll, counters) c.databasesPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Databases"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Databases collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create Databases collector for instance %s: %w", sqlInstance, err)
} }

View File

@@ -98,7 +98,7 @@ func (c *Collector) buildDatabaseReplica() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.dbReplicaPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), perfdata.InstanceAll, counters) c.dbReplicaPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Database Replica collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create Database Replica collector for instance %s: %w", sqlInstance, err)
} }

View File

@@ -263,7 +263,7 @@ func (c *Collector) collectGeneralStatisticsInstance(ch chan<- prometheus.Metric
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), err) return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics")) return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"))
} }

View File

@@ -51,7 +51,7 @@ func (c *Collector) buildLocks() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.locksPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Locks"), perfdata.InstanceAll, counters) c.locksPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Locks"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance, err)
} }

View File

@@ -86,7 +86,7 @@ func (c *Collector) buildMemoryManager() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.memMgrPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), perfdata.InstanceAll, counters) c.memMgrPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance, err)
} }
@@ -226,7 +226,7 @@ func (c *Collector) collectMemoryManagerInstance(ch chan<- prometheus.Metric, sq
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), err) return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager")) return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"))
} }

View File

@@ -30,7 +30,7 @@ func (c *Collector) buildSQLErrors() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.genStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), perfdata.InstanceAll, counters) c.genStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create SQL Errors collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create SQL Errors collector for instance %s: %w", sqlInstance, err)
} }

View File

@@ -145,7 +145,7 @@ func (c *Collector) collectSQLStatsInstance(ch chan<- prometheus.Metric, sqlInst
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), err) return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics")) return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"))
} }

View File

@@ -165,7 +165,7 @@ func (c *Collector) collectTransactionsInstance(ch chan<- prometheus.Metric, sql
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), err) return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "Transactions")) return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"))
} }

View File

@@ -62,7 +62,7 @@ func (c *Collector) buildWaitStats() error {
} }
for sqlInstance := range c.mssqlInstances { for sqlInstance := range c.mssqlInstances {
c.waitStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), perfdata.InstanceAll, counters) c.waitStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Wait Statistics collector for instance %s: %w", sqlInstance, err) return fmt.Errorf("failed to create Wait Statistics collector for instance %s: %w", sqlInstance, err)
} }

View File

@@ -144,7 +144,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("Network Interface", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("Network Interface", perfdata.InstancesAll, []string{
bytesReceivedPerSec, bytesReceivedPerSec,
bytesSentPerSec, bytesSentPerSec,
bytesTotalPerSec, bytesTotalPerSec,

View File

@@ -298,7 +298,7 @@ func (c *Collector) collectAccept(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect NPS Authentication Server metrics: %w", err) return fmt.Errorf("failed to collect NPS Authentication Server metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("perflib query for NPS Authentication Server returned empty result set") return errors.New("perflib query for NPS Authentication Server returned empty result set")
} }
@@ -390,7 +390,7 @@ func (c *Collector) collectAccounting(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect NPS Accounting Server metrics: %w", err) return fmt.Errorf("failed to collect NPS Accounting Server metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("perflib query for NPS Accounting Server returned empty result set") return errors.New("perflib query for NPS Accounting Server returned empty result set")
} }

View File

@@ -61,7 +61,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("Paging File", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("Paging File", perfdata.InstancesAll, []string{
usage, usage,
}) })
if err != nil { if err != nil {

View File

@@ -118,7 +118,7 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
for instance, counters := range data { for instance, counters := range data {
for counter, value := range counters { for counter, value := range counters {
var labels prometheus.Labels var labels prometheus.Labels
if instance != perfdata.EmptyInstance { if instance != perfdata.InstanceEmpty {
labels = prometheus.Labels{object.InstanceLabel: instance} labels = prometheus.Labels{object.InstanceLabel: instance}
} }

View File

@@ -129,7 +129,7 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("PhysicalDisk", perfdata.InstanceAll, counters) c.perfDataCollector, err = perfdata.NewCollector("PhysicalDisk", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create PhysicalDisk collector: %w", err) return fmt.Errorf("failed to create PhysicalDisk collector: %w", err)
} }

View File

@@ -180,11 +180,11 @@ func (c *Collector) Build(logger *slog.Logger, miSession *mi.Session) error {
workingSet, workingSet,
} }
c.perfDataCollector, err = perfdata.NewCollector("Process V2", perfdata.InstanceAll, counters) c.perfDataCollector, err = perfdata.NewCollector("Process V2", perfdata.InstancesAll, counters)
if errors.Is(err, perfdata.NewPdhError(perfdata.PdhCstatusNoObject)) { if errors.Is(err, perfdata.NewPdhError(perfdata.PdhCstatusNoObject)) {
counters[0] = idProcess counters[0] = idProcess
c.perfDataCollector, err = perfdata.NewCollector("Process", perfdata.InstanceAll, counters) c.perfDataCollector, err = perfdata.NewCollector("Process", perfdata.InstancesAll, counters)
} }
if err != nil { if err != nil {
@@ -324,9 +324,7 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
// Duplicate processes are suffixed #, and an index number. Remove those. // Duplicate processes are suffixed #, and an index number. Remove those.
name, _, _ = strings.Cut(name, "#") name, _, _ = strings.Cut(name, "#")
if name == "_Total" || if c.config.ProcessExclude.MatchString(name) || !c.config.ProcessInclude.MatchString(name) {
c.config.ProcessExclude.MatchString(name) ||
!c.config.ProcessInclude.MatchString(name) {
continue continue
} }

View File

@@ -88,7 +88,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(*slog.Logger, *mi.Session) error { func (c *Collector) Build(*slog.Logger, *mi.Session) error {
var err error var err error
c.perfDataCollectorNetwork, err = perfdata.NewCollector("RemoteFX Network", perfdata.InstanceAll, []string{ c.perfDataCollectorNetwork, err = perfdata.NewCollector("RemoteFX Network", perfdata.InstancesAll, []string{
BaseTCPRTT, BaseTCPRTT,
BaseUDPRTT, BaseUDPRTT,
CurrentTCPBandwidth, CurrentTCPBandwidth,
@@ -107,7 +107,7 @@ func (c *Collector) Build(*slog.Logger, *mi.Session) error {
return fmt.Errorf("failed to create RemoteFX Network collector: %w", err) return fmt.Errorf("failed to create RemoteFX Network collector: %w", err)
} }
c.perfDataCollectorGraphics, err = perfdata.NewCollector("RemoteFX Graphics", perfdata.InstanceAll, []string{ c.perfDataCollectorGraphics, err = perfdata.NewCollector("RemoteFX Graphics", perfdata.InstancesAll, []string{
AverageEncodingTime, AverageEncodingTime,
FrameQuality, FrameQuality,
FramesSkippedPerSecondInsufficientClientResources, FramesSkippedPerSecondInsufficientClientResources,

View File

@@ -5,4 +5,10 @@ package smb
const ( const (
currentOpenFileCount = "Current Open File Count" currentOpenFileCount = "Current Open File Count"
treeConnectCount = "Tree Connect Count" treeConnectCount = "Tree Connect Count"
receivedBytes = "Received Bytes/sec"
writeRequests = "Write Requests/sec"
readRequests = "Read Requests/sec"
metadataRequests = "Metadata Requests/sec"
sentBytes = "Sent Bytes/sec"
filesOpened = "Files Opened/sec"
) )

View File

@@ -3,7 +3,6 @@
package smb package smb
import ( import (
"errors"
"fmt" "fmt"
"log/slog" "log/slog"
@@ -27,6 +26,12 @@ type Collector struct {
treeConnectCount *prometheus.Desc treeConnectCount *prometheus.Desc
currentOpenFileCount *prometheus.Desc currentOpenFileCount *prometheus.Desc
receivedBytes *prometheus.Desc
writeRequests *prometheus.Desc
readRequests *prometheus.Desc
metadataRequests *prometheus.Desc
sentBytes *prometheus.Desc
filesOpened *prometheus.Desc
} }
func New(config *Config) *Collector { func New(config *Config) *Collector {
@@ -58,9 +63,15 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("SMB Server Shares", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("SMB Server Shares", perfdata.InstancesAll, []string{
currentOpenFileCount, currentOpenFileCount,
treeConnectCount, treeConnectCount,
receivedBytes,
writeRequests,
readRequests,
metadataRequests,
sentBytes,
filesOpened,
}) })
if err != nil { if err != nil {
return fmt.Errorf("failed to create SMB Server Shares collector: %w", err) return fmt.Errorf("failed to create SMB Server Shares collector: %w", err)
@@ -68,14 +79,50 @@ func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
c.currentOpenFileCount = prometheus.NewDesc( c.currentOpenFileCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_current_open_file_count"), prometheus.BuildFQName(types.Namespace, Name, "server_shares_current_open_file_count"),
"Current total count open files on the SMB Server", "Current total count open files on the SMB Server Share",
nil, []string{"share"},
nil, nil,
) )
c.treeConnectCount = prometheus.NewDesc( c.treeConnectCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_tree_connect_count"), prometheus.BuildFQName(types.Namespace, Name, "server_shares_tree_connect_count"),
"Count of user connections to the SMB Server", "Count of user connections to the SMB Server Share",
[]string{"share"},
nil, nil,
)
c.receivedBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_received_bytes_total"),
"Received bytes on the SMB Server Share",
[]string{"share"},
nil,
)
c.writeRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_write_requests_count"),
"Writes requests on the SMB Server Share",
[]string{"share"},
nil,
)
c.readRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_read_requests_count"),
"Read requests on the SMB Server Share",
[]string{"share"},
nil,
)
c.metadataRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_metadata_requests_count"),
"Metadata requests on the SMB Server Share",
[]string{"share"},
nil,
)
c.sentBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_sent_bytes_total"),
"Sent bytes on the SMB Server Share",
[]string{"share"},
nil,
)
c.filesOpened = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "server_shares_filed_opened_count"),
"Files opened on the SMB Server Share",
[]string{"share"},
nil, nil,
) )
@@ -89,22 +136,63 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect SMB Server Shares metrics: %w", err) return fmt.Errorf("failed to collect SMB Server Shares metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] for share, data := range perfData {
if !ok { ch <- prometheus.MustNewConstMetric(
return errors.New("query for SMB Server Shares returned empty result set") c.currentOpenFileCount,
prometheus.CounterValue,
data[currentOpenFileCount].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.treeConnectCount,
prometheus.CounterValue,
data[treeConnectCount].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.receivedBytes,
prometheus.CounterValue,
data[receivedBytes].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.writeRequests,
prometheus.GaugeValue,
data[writeRequests].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.readRequests,
prometheus.GaugeValue,
data[readRequests].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.metadataRequests,
prometheus.GaugeValue,
data[metadataRequests].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.sentBytes,
prometheus.CounterValue,
data[sentBytes].FirstValue,
share,
)
ch <- prometheus.MustNewConstMetric(
c.filesOpened,
prometheus.GaugeValue,
data[filesOpened].FirstValue,
share,
)
} }
ch <- prometheus.MustNewConstMetric(
c.currentOpenFileCount,
prometheus.CounterValue,
data[currentOpenFileCount].FirstValue,
)
ch <- prometheus.MustNewConstMetric(
c.treeConnectCount,
prometheus.CounterValue,
data[treeConnectCount].FirstValue,
)
return nil return nil
} }

View File

@@ -78,7 +78,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("SMB Client Shares", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("SMB Client Shares", perfdata.InstancesAll, []string{
AvgDataQueueLength, AvgDataQueueLength,
AvgReadQueueLength, AvgReadQueueLength,
AvgSecPerRead, AvgSecPerRead,

View File

@@ -144,7 +144,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollector, err = perfdata.NewCollector("SMTP Server", perfdata.InstanceAll, []string{ c.perfDataCollector, err = perfdata.NewCollector("SMTP Server", perfdata.InstancesAll, []string{
badmailedMessagesBadPickupFileTotal, badmailedMessagesBadPickupFileTotal,
badmailedMessagesGeneralFailureTotal, badmailedMessagesGeneralFailureTotal,
badmailedMessagesHopCountExceededTotal, badmailedMessagesHopCountExceededTotal,

View File

@@ -139,7 +139,7 @@ func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect System metrics: %w", err) return fmt.Errorf("failed to collect System metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("query for System returned empty result set") return errors.New("query for System returned empty result set")
} }

View File

@@ -215,22 +215,22 @@ func (c *Collector) collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect TCPv4 metrics: %w", err) return fmt.Errorf("failed to collect TCPv4 metrics: %w", err)
} }
if _, ok := data[perfdata.EmptyInstance]; !ok { if _, ok := data[perfdata.InstanceEmpty]; !ok {
return errors.New("no data for TCPv4") return errors.New("no data for TCPv4")
} }
c.writeTCPCounters(ch, data[perfdata.EmptyInstance], []string{"ipv4"}) c.writeTCPCounters(ch, data[perfdata.InstanceEmpty], []string{"ipv4"})
data, err = c.perfDataCollector6.Collect() data, err = c.perfDataCollector6.Collect()
if err != nil { if err != nil {
return fmt.Errorf("failed to collect TCPv6 metrics: %w", err) return fmt.Errorf("failed to collect TCPv6 metrics: %w", err)
} }
if _, ok := data[perfdata.EmptyInstance]; !ok { if _, ok := data[perfdata.InstanceEmpty]; !ok {
return errors.New("no data for TCPv6") return errors.New("no data for TCPv6")
} }
c.writeTCPCounters(ch, data[perfdata.EmptyInstance], []string{"ipv6"}) c.writeTCPCounters(ch, data[perfdata.InstanceEmpty], []string{"ipv6"})
return nil return nil
} }

View File

@@ -142,7 +142,7 @@ func (c *Collector) Build(logger *slog.Logger, miSession *mi.Session) error {
var err error var err error
c.perfDataCollectorTerminalServicesSession, err = perfdata.NewCollector("Terminal Services Session", perfdata.InstanceAll, counters) c.perfDataCollectorTerminalServicesSession, err = perfdata.NewCollector("Terminal Services Session", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Terminal Services Session collector: %w", err) return fmt.Errorf("failed to create Terminal Services Session collector: %w", err)
} }
@@ -158,7 +158,7 @@ func (c *Collector) Build(logger *slog.Logger, miSession *mi.Session) error {
var err error var err error
c.perfDataCollectorBroker, err = perfdata.NewCollector("Remote Desktop Connection Broker Counterset", perfdata.InstanceAll, counters) c.perfDataCollectorBroker, err = perfdata.NewCollector("Remote Desktop Connection Broker Counterset", perfdata.InstancesAll, counters)
if err != nil { if err != nil {
return fmt.Errorf("failed to create Remote Desktop Connection Broker Counterset collector: %w", err) return fmt.Errorf("failed to create Remote Desktop Connection Broker Counterset collector: %w", err)
} }
@@ -413,7 +413,7 @@ func (c *Collector) collectCollectionBrokerPerformanceCounter(ch chan<- promethe
return fmt.Errorf("failed to collect Remote Desktop Connection Broker Counterset metrics: %w", err) return fmt.Errorf("failed to collect Remote Desktop Connection Broker Counterset metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("query for Remote Desktop Connection Broker Counterset returned empty result set") return errors.New("query for Remote Desktop Connection Broker Counterset returned empty result set")
} }

View File

@@ -227,7 +227,7 @@ func (c *Collector) collectNTP(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect VM Memory metrics: %w", err) return fmt.Errorf("failed to collect VM Memory metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("query for Windows Time Service returned empty result set") return errors.New("query for Windows Time Service returned empty result set")
} }

View File

@@ -124,22 +124,22 @@ func (c *Collector) collect(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect UDPv4 metrics: %w", err) return fmt.Errorf("failed to collect UDPv4 metrics: %w", err)
} }
if _, ok := data[perfdata.EmptyInstance]; !ok { if _, ok := data[perfdata.InstanceEmpty]; !ok {
return errors.New("no data for UDPv4") return errors.New("no data for UDPv4")
} }
c.writeUDPCounters(ch, data[perfdata.EmptyInstance], []string{"ipv4"}) c.writeUDPCounters(ch, data[perfdata.InstanceEmpty], []string{"ipv4"})
data, err = c.perfDataCollector6.Collect() data, err = c.perfDataCollector6.Collect()
if err != nil { if err != nil {
return fmt.Errorf("failed to collect UDPv6 metrics: %w", err) return fmt.Errorf("failed to collect UDPv6 metrics: %w", err)
} }
if _, ok := data[perfdata.EmptyInstance]; !ok { if _, ok := data[perfdata.InstanceEmpty]; !ok {
return errors.New("no data for UDPv6") return errors.New("no data for UDPv6")
} }
c.writeUDPCounters(ch, data[perfdata.EmptyInstance], []string{"ipv6"}) c.writeUDPCounters(ch, data[perfdata.InstanceEmpty], []string{"ipv6"})
return nil return nil
} }

View File

@@ -79,7 +79,7 @@ func (c *Collector) Close() error {
func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error { func (c *Collector) Build(_ *slog.Logger, _ *mi.Session) error {
var err error var err error
c.perfDataCollectorCPU, err = perfdata.NewCollector("VM Processor", perfdata.InstanceTotal, []string{ c.perfDataCollectorCPU, err = perfdata.NewCollector("VM Processor", perfdata.InstancesTotal, []string{
cpuLimitMHz, cpuLimitMHz,
cpuReservationMHz, cpuReservationMHz,
cpuShares, cpuShares,
@@ -251,7 +251,7 @@ func (c *Collector) collectMem(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect VM Memory metrics: %w", err) return fmt.Errorf("failed to collect VM Memory metrics: %w", err)
} }
data, ok := perfData[perfdata.EmptyInstance] data, ok := perfData[perfdata.InstanceEmpty]
if !ok { if !ok {
return errors.New("query for VM Memory returned empty result set") return errors.New("query for VM Memory returned empty result set")
} }
@@ -337,7 +337,7 @@ func (c *Collector) collectCpu(ch chan<- prometheus.Metric) error {
return fmt.Errorf("failed to collect VM Memory metrics: %w", err) return fmt.Errorf("failed to collect VM Memory metrics: %w", err)
} }
data, ok := perfData["_Total"] data, ok := perfData[perfdata.InstanceTotal]
if !ok { if !ok {
return errors.New("query for VM CPU returned empty result set") return errors.New("query for VM CPU returned empty result set")
} }

View File

@@ -15,8 +15,8 @@ import (
) )
var ( var (
InstanceAll = []string{"*"} InstancesAll = []string{"*"}
InstanceTotal = []string{"_Total"} InstancesTotal = []string{InstanceTotal}
) )
type Collector struct { type Collector struct {
@@ -43,14 +43,14 @@ func NewCollector(object string, instances []string, counters []string) (*Collec
} }
if len(instances) == 0 { if len(instances) == 0 {
instances = []string{EmptyInstance} instances = []string{InstanceEmpty}
} }
collector := &Collector{ collector := &Collector{
object: object, object: object,
counters: make(map[string]Counter, len(counters)), counters: make(map[string]Counter, len(counters)),
handle: handle, handle: handle,
totalCounterRequested: slices.Contains(instances, "_Total"), totalCounterRequested: slices.Contains(instances, InstanceTotal),
mu: sync.RWMutex{}, mu: sync.RWMutex{},
} }
@@ -186,12 +186,12 @@ func (c *Collector) Collect() (map[string]map[string]CounterValues, error) {
for _, item := range items { for _, item := range items {
if item.RawValue.CStatus == PdhCstatusValidData || item.RawValue.CStatus == PdhCstatusNewData { if item.RawValue.CStatus == PdhCstatusValidData || item.RawValue.CStatus == PdhCstatusNewData {
instanceName := windows.UTF16PtrToString(item.SzName) instanceName := windows.UTF16PtrToString(item.SzName)
if strings.HasSuffix(instanceName, "_Total") && !c.totalCounterRequested { if strings.HasSuffix(instanceName, InstanceTotal) && !c.totalCounterRequested {
continue continue
} }
if instanceName == "" || instanceName == "*" { if instanceName == "" || instanceName == "*" {
instanceName = EmptyInstance instanceName = InstanceEmpty
} }
if _, ok := data[instanceName]; !ok { if _, ok := data[instanceName]; !ok {
@@ -239,7 +239,7 @@ func (c *Collector) Close() {
func formatCounterPath(object, instance, counterName string) string { func formatCounterPath(object, instance, counterName string) string {
var counterPath string var counterPath string
if instance == EmptyInstance { if instance == InstanceEmpty {
counterPath = fmt.Sprintf(`\%s\%s`, object, counterName) counterPath = fmt.Sprintf(`\%s\%s`, object, counterName)
} else { } else {
counterPath = fmt.Sprintf(`\%s(%s)\%s`, object, instance, counterName) counterPath = fmt.Sprintf(`\%s(%s)\%s`, object, instance, counterName)

View File

@@ -4,7 +4,10 @@ package perfdata
import "github.com/prometheus/client_golang/prometheus" import "github.com/prometheus/client_golang/prometheus"
const EmptyInstance = "------" const (
InstanceEmpty = "------"
InstanceTotal = "_Total"
)
type CounterValues struct { type CounterValues struct {
Type prometheus.ValueType Type prometheus.ValueType