diff --git a/internal/collector/mssql/mssql.go b/internal/collector/mssql/mssql.go index 1ff8013c..92c7b927 100644 --- a/internal/collector/mssql/mssql.go +++ b/internal/collector/mssql/mssql.go @@ -333,7 +333,7 @@ func (c *Collector) getMSSQLInstances() ([]mssqlInstance, error) { return nil, fmt.Errorf("couldn't get instance info: %w", err) } - instance, err := newMssqlInstance(instanceVersion) + instance, err := newMssqlInstance(instanceName, instanceVersion) if err != nil { return nil, err } @@ -348,14 +348,14 @@ func (c *Collector) getMSSQLInstances() ([]mssqlInstance, error) { // mssqlGetPerfObjectName returns the name of the Windows Performance // Counter object for the given SQL instance and Collector. -func (c *Collector) mssqlGetPerfObjectName(sqlInstance string, collector string) string { +func (c *Collector) mssqlGetPerfObjectName(sqlInstance mssqlInstance, collector string) string { sb := strings.Builder{} - if sqlInstance == "MSSQLSERVER" { + if sqlInstance.isFirstInstance { sb.WriteString("SQLServer:") } else { sb.WriteString("MSSQL$") - sb.WriteString(sqlInstance) + sb.WriteString(sqlInstance.name) sb.WriteString(":") } @@ -369,8 +369,8 @@ func (c *Collector) mssqlGetPerfObjectName(sqlInstance string, collector string) func (c *Collector) collect( ch chan<- prometheus.Metric, collector string, - perfDataCollectors map[string]*pdh.Collector, - collectFn func(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error, + perfDataCollectors map[mssqlInstance]*pdh.Collector, + collectFn func(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error, ) error { errs := make([]error, 0, len(perfDataCollectors)) @@ -386,11 +386,11 @@ func (c *Collector) collect( errs = append(errs, err) success = 0.0 - c.logger.LogAttrs(ctx, slog.LevelDebug, fmt.Sprintf("mssql class collector %s for instance %s failed after %s", collector, sqlInstance, duration), + c.logger.LogAttrs(ctx, slog.LevelDebug, fmt.Sprintf("mssql class collector %s for instance %s failed after %s", collector, sqlInstance.name, duration), slog.Any("err", err), ) } else { - c.logger.LogAttrs(ctx, slog.LevelDebug, fmt.Sprintf("mssql class collector %s for instance %s succeeded after %s", collector, sqlInstance, duration)) + c.logger.LogAttrs(ctx, slog.LevelDebug, fmt.Sprintf("mssql class collector %s for instance %s succeeded after %s", collector, sqlInstance.name, duration)) } if collector == "" { @@ -401,13 +401,13 @@ func (c *Collector) collect( c.mssqlScrapeDurationDesc, prometheus.GaugeValue, duration.Seconds(), - collector, sqlInstance, + collector, sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.mssqlScrapeSuccessDesc, prometheus.GaugeValue, success, - collector, sqlInstance, + collector, sqlInstance.name, ) } diff --git a/internal/collector/mssql/mssql_access_methods.go b/internal/collector/mssql/mssql_access_methods.go index 0d9a7b68..c90a526c 100644 --- a/internal/collector/mssql/mssql_access_methods.go +++ b/internal/collector/mssql/mssql_access_methods.go @@ -25,7 +25,7 @@ import ( ) type collectorAccessMethods struct { - accessMethodsPerfDataCollectors map[string]*pdh.Collector + accessMethodsPerfDataCollectors map[mssqlInstance]*pdh.Collector accessMethodsPerfDataObject []perfDataCounterValuesAccessMethods accessMethodsAUcleanupbatches *prometheus.Desc @@ -124,11 +124,11 @@ type perfDataCounterValuesAccessMethods struct { func (c *Collector) buildAccessMethods() error { var err error - c.accessMethodsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.accessMethodsPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.accessMethodsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesAccessMethods](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Access Methods"), nil) + c.accessMethodsPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesAccessMethods](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Access Methods"), nil) if err != nil { errs = append(errs, fmt.Errorf("failed to create AccessMethods collector for instance %s: %w", sqlInstance.name, err)) } @@ -407,7 +407,7 @@ func (c *Collector) collectAccessMethods(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorAccessMethods, c.accessMethodsPerfDataCollectors, c.collectAccessMethodsInstance) } -func (c *Collector) collectAccessMethodsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectAccessMethodsInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.accessMethodsPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"), err) @@ -417,308 +417,308 @@ func (c *Collector) collectAccessMethodsInstance(ch chan<- prometheus.Metric, sq c.accessMethodsAUcleanupbatches, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsAUCleanupbatchesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsAUcleanups, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsAUCleanupsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsByReferenceLobCreateCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsByReferenceLobCreateCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsByReferenceLobUseCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsByReferenceLobUseCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsCountLobReadahead, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsCountLobReadahead, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsCountPullInRow, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsCountPullInRow, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsCountPushOffRow, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsCountPushOffRow, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsDeferreddroppedAUs, prometheus.GaugeValue, c.accessMethodsPerfDataObject[0].AccessMethodsDeferredDroppedAUs, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsDeferredDroppedrowsets, prometheus.GaugeValue, c.accessMethodsPerfDataObject[0].AccessMethodsDeferredDroppedRowsets, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsDroppedrowsetcleanups, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsDroppedRowsetCleanupsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsDroppedrowsetsskipped, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsDroppedRowsetsSkippedPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsExtentDeallocations, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsExtentDeallocationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsExtentsAllocated, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsExtentsAllocatedPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsFailedAUcleanupbatches, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsFailedAUCleanupBatchesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsFailedleafpagecookie, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsFailedLeafPageCookie, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsFailedtreepagecookie, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsFailedTreePageCookie, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsForwardedRecords, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsForwardedRecordsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsFreeSpacePageFetches, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsFreeSpacePageFetchesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsFreeSpaceScans, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsFreeSpaceScansPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsFullScans, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsFullScansPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsIndexSearches, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsIndexSearchesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsInSysXactwaits, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsInSysXactWaitsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsLobHandleCreateCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsLobHandleCreateCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsLobHandleDestroyCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsLobHandleDestroyCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsLobSSProviderCreateCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsLobSSProviderCreateCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsLobSSProviderDestroyCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsLobSSProviderDestroyCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsLobSSProviderTruncationCount, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsLobSSProviderTruncationCount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsMixedPageAllocations, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsMixedPageAllocationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsPageCompressionAttempts, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsPageCompressionAttemptsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsPageDeallocations, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsPageDeallocationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsPagesAllocated, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsPagesAllocatedPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsPagesCompressed, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsPagesCompressedPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsPageSplits, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsPageSplitsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsProbeScans, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsProbeScansPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsRangeScans, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsRangeScansPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsScanPointRevalidations, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsScanPointRevalidationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsSkippedGhostedRecords, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsSkippedGhostedRecordsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsTableLockEscalations, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsTableLockEscalationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsUsedleafpagecookie, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsUsedLeafPageCookie, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsUsedtreepagecookie, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsUsedTreePageCookie, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsWorkfilesCreated, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsWorkfilesCreatedPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsWorktablesCreated, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsWorktablesCreatedPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsWorktablesFromCacheHits, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsWorktablesFromCacheRatio, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.accessMethodsWorktablesFromCacheLookups, prometheus.CounterValue, c.accessMethodsPerfDataObject[0].AccessMethodsWorktablesFromCacheRatioBase, - sqlInstance, + sqlInstance.name, ) return nil diff --git a/internal/collector/mssql/mssql_availability_replica.go b/internal/collector/mssql/mssql_availability_replica.go index 3451625a..17546657 100644 --- a/internal/collector/mssql/mssql_availability_replica.go +++ b/internal/collector/mssql/mssql_availability_replica.go @@ -26,7 +26,7 @@ import ( ) type collectorAvailabilityReplica struct { - availabilityReplicaPerfDataCollectors map[string]*pdh.Collector + availabilityReplicaPerfDataCollectors map[mssqlInstance]*pdh.Collector availabilityReplicaPerfDataObject []perfDataCounterValuesAvailabilityReplica availReplicaBytesReceivedFromReplica *prometheus.Desc @@ -57,11 +57,11 @@ type perfDataCounterValuesAvailabilityReplica struct { func (c *Collector) buildAvailabilityReplica() error { var err error - c.availabilityReplicaPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.availabilityReplicaPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.availabilityReplicaPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesAvailabilityReplica](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Availability Replica"), pdh.InstancesAll) + c.availabilityReplicaPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesAvailabilityReplica](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Availability Replica collector for instance %s: %w", sqlInstance.name, err)) } @@ -130,7 +130,7 @@ func (c *Collector) collectAvailabilityReplica(ch chan<- prometheus.Metric) erro return c.collect(ch, subCollectorAvailabilityReplica, c.availabilityReplicaPerfDataCollectors, c.collectAvailabilityReplicaInstance) } -func (c *Collector) collectAvailabilityReplicaInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectAvailabilityReplicaInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.availabilityReplicaPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), err) @@ -141,63 +141,63 @@ func (c *Collector) collectAvailabilityReplicaInstance(ch chan<- prometheus.Metr c.availReplicaBytesReceivedFromReplica, prometheus.CounterValue, data.AvailReplicaBytesReceivedFromReplicaPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaBytesSentToReplica, prometheus.CounterValue, data.AvailReplicaBytesSentToReplicaPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaBytesSentToTransport, prometheus.CounterValue, data.AvailReplicaBytesSentToTransportPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaFlowControl, prometheus.CounterValue, data.AvailReplicaFlowControlPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaFlowControlTimeMS, prometheus.CounterValue, utils.MilliSecToSec(data.AvailReplicaFlowControlTimeMSPerSec), - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaReceivesFromReplica, prometheus.CounterValue, data.AvailReplicaReceivesFromReplicaPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaResentMessages, prometheus.CounterValue, data.AvailReplicaResentMessagesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaSendsToReplica, prometheus.CounterValue, data.AvailReplicaSendsToReplicaPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.availReplicaSendsToTransport, prometheus.CounterValue, data.AvailReplicaSendsToTransportPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } diff --git a/internal/collector/mssql/mssql_buffer_manager.go b/internal/collector/mssql/mssql_buffer_manager.go index e378738c..2c040d9f 100644 --- a/internal/collector/mssql/mssql_buffer_manager.go +++ b/internal/collector/mssql/mssql_buffer_manager.go @@ -25,7 +25,7 @@ import ( ) type collectorBufferManager struct { - bufManPerfDataCollectors map[string]*pdh.Collector + bufManPerfDataCollectors map[mssqlInstance]*pdh.Collector bufManPerfDataObject []perfDataCounterValuesBufMan bufManBackgroundwriterpages *prometheus.Desc @@ -82,11 +82,11 @@ type perfDataCounterValuesBufMan struct { func (c *Collector) buildBufferManager() error { var err error - c.bufManPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.bufManPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.bufManPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesBufMan](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Buffer Manager"), nil) + c.bufManPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesBufMan](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Buffer Manager"), nil) if err != nil { errs = append(errs, fmt.Errorf("failed to create Buffer Manager collector for instance %s: %w", sqlInstance.name, err)) } @@ -238,7 +238,7 @@ func (c *Collector) collectBufferManager(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorBufferManager, c.bufManPerfDataCollectors, c.collectBufferManagerInstance) } -func (c *Collector) collectBufferManagerInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectBufferManagerInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.bufManPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Buffer Manager"), err) @@ -249,161 +249,161 @@ func (c *Collector) collectBufferManagerInstance(ch chan<- prometheus.Metric, sq c.bufManBackgroundwriterpages, prometheus.CounterValue, data.BufManBackgroundWriterPagesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManBuffercachehits, prometheus.GaugeValue, data.BufManBufferCacheHitRatio, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManBuffercachelookups, prometheus.GaugeValue, data.BufManBufferCacheHitRatioBase, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManCheckpointpages, prometheus.CounterValue, data.BufManCheckpointPagesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManDatabasepages, prometheus.GaugeValue, data.BufManDatabasePages, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionallocatedpages, prometheus.GaugeValue, data.BufManExtensionAllocatedPages, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionfreepages, prometheus.GaugeValue, data.BufManExtensionFreePages, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensioninuseaspercentage, prometheus.GaugeValue, data.BufManExtensionInUseAsPercentage, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionoutstandingIOcounter, prometheus.GaugeValue, data.BufManExtensionOutstandingIOCounter, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionpageevictions, prometheus.CounterValue, data.BufManExtensionPageEvictionsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionpagereads, prometheus.CounterValue, data.BufManExtensionPageReadsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionpageunreferencedtime, prometheus.GaugeValue, data.BufManExtensionPageUnreferencedTime, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManExtensionpagewrites, prometheus.CounterValue, data.BufManExtensionPageWritesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManFreeliststalls, prometheus.CounterValue, data.BufManFreeListStallsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManIntegralControllerSlope, prometheus.GaugeValue, data.BufManIntegralControllerSlope, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManLazywrites, prometheus.CounterValue, data.BufManLazyWritesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManPagelifeexpectancy, prometheus.GaugeValue, data.BufManPageLifeExpectancy, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManPagelookups, prometheus.CounterValue, data.BufManPageLookupsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManPagereads, prometheus.CounterValue, data.BufManPageReadsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManPagewrites, prometheus.CounterValue, data.BufManPageWritesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManReadaheadpages, prometheus.CounterValue, data.BufManReadaheadPagesPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManReadaheadtime, prometheus.CounterValue, data.BufManReadaheadTimePerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.bufManTargetpages, prometheus.GaugeValue, data.BufManTargetPages, - sqlInstance, + sqlInstance.name, ) } diff --git a/internal/collector/mssql/mssql_database.go b/internal/collector/mssql/mssql_database.go index a1cda523..eaf05267 100644 --- a/internal/collector/mssql/mssql_database.go +++ b/internal/collector/mssql/mssql_database.go @@ -25,8 +25,8 @@ import ( ) type collectorDatabases struct { - databasesPerfDataCollectors map[string]*pdh.Collector - databasesPerfDataCollectors2019 map[string]*pdh.Collector + databasesPerfDataCollectors map[mssqlInstance]*pdh.Collector + databasesPerfDataCollectors2019 map[mssqlInstance]*pdh.Collector databasesPerfDataObject []perfDataCounterValuesDatabases databasesPerfDataObject2019 []perfDataCounterValuesDatabases2019 @@ -141,18 +141,18 @@ type perfDataCounterValuesDatabases2019 struct { func (c *Collector) buildDatabases() error { var err error - c.databasesPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) - c.databasesPerfDataCollectors2019 = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.databasesPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) + c.databasesPerfDataCollectors2019 = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.databasesPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesDatabases](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Databases"), pdh.InstancesAll) + c.databasesPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesDatabases](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Databases"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Databases collector for instance %s: %w", sqlInstance.name, err)) } if sqlInstance.isVersionGreaterOrEqualThan(serverVersion2019) { - c.databasesPerfDataCollectors2019[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesDatabases2019](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Databases"), pdh.InstancesAll) + c.databasesPerfDataCollectors2019[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesDatabases2019](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Databases"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Databases 2019 collector for instance %s: %w", sqlInstance.name, err)) } @@ -458,7 +458,7 @@ func (c *Collector) collectDatabases(ch chan<- prometheus.Metric) error { ) } -func (c *Collector) collectDatabasesInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectDatabasesInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.databasesPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Databases"), err) @@ -469,336 +469,336 @@ func (c *Collector) collectDatabasesInstance(ch chan<- prometheus.Metric, sqlIns c.databasesActiveTransactions, prometheus.GaugeValue, data.DatabasesActiveTransactions, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesBackupPerRestoreThroughput, prometheus.CounterValue, data.DatabasesBackupPerRestoreThroughputPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesBulkCopyRows, prometheus.CounterValue, data.DatabasesBulkCopyRowsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesBulkCopyThroughput, prometheus.CounterValue, data.DatabasesBulkCopyThroughputPerSec*1024, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesCommitTableEntries, prometheus.GaugeValue, data.DatabasesCommitTableEntries, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesDataFilesSizeKB, prometheus.GaugeValue, data.DatabasesDataFilesSizeKB*1024, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesDBCCLogicalScanBytes, prometheus.CounterValue, data.DatabasesDBCCLogicalScanBytesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesGroupCommitTime, prometheus.CounterValue, data.DatabasesGroupCommitTimePerSec/1000000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogBytesFlushed, prometheus.CounterValue, data.DatabasesLogBytesFlushedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogCacheHits, prometheus.GaugeValue, data.DatabasesLogCacheHitRatio, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogCacheLookups, prometheus.GaugeValue, data.DatabasesLogCacheHitRatioBase, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogCacheReads, prometheus.CounterValue, data.DatabasesLogCacheReadsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogFilesSizeKB, prometheus.GaugeValue, data.DatabasesLogFilesSizeKB*1024, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogFilesUsedSizeKB, prometheus.GaugeValue, data.DatabasesLogFilesUsedSizeKB*1024, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogFlushes, prometheus.CounterValue, data.DatabasesLogFlushesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogFlushWaits, prometheus.CounterValue, data.DatabasesLogFlushWaitsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogFlushWaitTime, prometheus.GaugeValue, data.DatabasesLogFlushWaitTime/1000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogFlushWriteTimeMS, prometheus.GaugeValue, data.DatabasesLogFlushWriteTimeMS/1000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogGrowths, prometheus.GaugeValue, data.DatabasesLogGrowths, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolCacheMisses, prometheus.CounterValue, data.DatabasesLogPoolCacheMissesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolDiskReads, prometheus.CounterValue, data.DatabasesLogPoolDiskReadsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolHashDeletes, prometheus.CounterValue, data.DatabasesLogPoolHashDeletesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolHashInserts, prometheus.CounterValue, data.DatabasesLogPoolHashInsertsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolInvalidHashEntry, prometheus.CounterValue, data.DatabasesLogPoolInvalidHashEntryPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolLogScanPushes, prometheus.CounterValue, data.DatabasesLogPoolLogScanPushesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolLogWriterPushes, prometheus.CounterValue, data.DatabasesLogPoolLogWriterPushesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolPushEmptyFreePool, prometheus.CounterValue, data.DatabasesLogPoolPushEmptyFreePoolPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolPushLowMemory, prometheus.CounterValue, data.DatabasesLogPoolPushLowMemoryPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolPushNoFreeBuffer, prometheus.CounterValue, data.DatabasesLogPoolPushNoFreeBufferPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolReqBehindTrunc, prometheus.CounterValue, data.DatabasesLogPoolReqBehindTruncPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolRequestsOldVLF, prometheus.CounterValue, data.DatabasesLogPoolRequestsOldVLFPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolRequests, prometheus.CounterValue, data.DatabasesLogPoolRequestsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolTotalActiveLogSize, prometheus.GaugeValue, data.DatabasesLogPoolTotalActiveLogSize, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogPoolTotalSharedPoolSize, prometheus.GaugeValue, data.DatabasesLogPoolTotalSharedPoolSize, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogShrinks, prometheus.GaugeValue, data.DatabasesLogShrinks, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesLogTruncations, prometheus.GaugeValue, data.DatabasesLogTruncations, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesPercentLogUsed, prometheus.GaugeValue, data.DatabasesPercentLogUsed, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesReplPendingXacts, prometheus.GaugeValue, data.DatabasesReplPendingXacts, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesReplTransRate, prometheus.CounterValue, data.DatabasesReplTransRate, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesShrinkDataMovementBytes, prometheus.CounterValue, data.DatabasesShrinkDataMovementBytesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesTrackedTransactions, prometheus.CounterValue, data.DatabasesTrackedTransactionsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesTransactions, prometheus.CounterValue, data.DatabasesTransactionsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesWriteTransactions, prometheus.CounterValue, data.DatabasesWriteTransactionsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesXTPControllerDLCLatencyPerFetch, prometheus.GaugeValue, data.DatabasesXTPControllerDLCLatencyPerFetch, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesXTPControllerDLCPeakLatency, prometheus.GaugeValue, data.DatabasesXTPControllerDLCPeakLatency*1000000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesXTPControllerLogProcessed, prometheus.CounterValue, data.DatabasesXTPControllerLogProcessedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.databasesXTPMemoryUsedKB, prometheus.GaugeValue, data.DatabasesXTPMemoryUsedKB*1024, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } return nil } -func (c *Collector) collectDatabasesInstance2019(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectDatabasesInstance2019(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.databasesPerfDataObject2019) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Databases"), err) @@ -809,7 +809,7 @@ func (c *Collector) collectDatabasesInstance2019(ch chan<- prometheus.Metric, sq c.databasesActiveParallelRedoThreads, prometheus.GaugeValue, data.DatabasesActiveParallelRedoThreads, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } diff --git a/internal/collector/mssql/mssql_database_replica.go b/internal/collector/mssql/mssql_database_replica.go index c91a53cc..3d5d0f90 100644 --- a/internal/collector/mssql/mssql_database_replica.go +++ b/internal/collector/mssql/mssql_database_replica.go @@ -25,7 +25,7 @@ import ( ) type collectorDatabaseReplica struct { - dbReplicaPerfDataCollectors map[string]*pdh.Collector + dbReplicaPerfDataCollectors map[mssqlInstance]*pdh.Collector dbReplicaPerfDataObject []perfDataCounterValuesDBReplica dbReplicaDatabaseFlowControlDelay *prometheus.Desc @@ -86,11 +86,11 @@ type perfDataCounterValuesDBReplica struct { func (c *Collector) buildDatabaseReplica() error { var err error - c.dbReplicaPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.dbReplicaPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.dbReplicaPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesDBReplica](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Database Replica"), pdh.InstancesAll) + c.dbReplicaPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesDBReplica](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Database Replica collector for instance %s: %w", sqlInstance.name, err)) } @@ -249,7 +249,7 @@ func (c *Collector) collectDatabaseReplica(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorDatabaseReplica, c.dbReplicaPerfDataCollectors, c.collectDatabaseReplicaInstance) } -func (c *Collector) collectDatabaseReplicaInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectDatabaseReplicaInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.dbReplicaPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), err) @@ -260,168 +260,168 @@ func (c *Collector) collectDatabaseReplicaInstance(ch chan<- prometheus.Metric, c.dbReplicaDatabaseFlowControlDelay, prometheus.GaugeValue, data.DbReplicaDatabaseFlowControlDelay, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaDatabaseFlowControls, prometheus.CounterValue, data.DbReplicaDatabaseFlowControlsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaFileBytesReceived, prometheus.CounterValue, data.DbReplicaFileBytesReceivedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaGroupCommits, prometheus.CounterValue, data.DbReplicaGroupCommitsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaGroupCommitTime, prometheus.GaugeValue, data.DbReplicaGroupCommitTime, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogApplyPendingQueue, prometheus.GaugeValue, data.DbReplicaLogApplyPendingQueue, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogApplyReadyQueue, prometheus.GaugeValue, data.DbReplicaLogApplyReadyQueue, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogBytesCompressed, prometheus.CounterValue, data.DbReplicaLogBytesCompressedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogBytesDecompressed, prometheus.CounterValue, data.DbReplicaLogBytesDecompressedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogBytesReceived, prometheus.CounterValue, data.DbReplicaLogBytesReceivedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogCompressionCachehits, prometheus.CounterValue, data.DbReplicaLogCompressionCacheHitsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogCompressionCachemisses, prometheus.CounterValue, data.DbReplicaLogCompressionCacheMissesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogCompressions, prometheus.CounterValue, data.DbReplicaLogCompressionsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogDecompressions, prometheus.CounterValue, data.DbReplicaLogDecompressionsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogremainingforundo, prometheus.GaugeValue, data.DbReplicaLogRemainingForUndo, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaLogSendQueue, prometheus.GaugeValue, data.DbReplicaLogSendQueue, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaMirroredWritetransactions, prometheus.CounterValue, data.DbReplicaMirroredWriteTransactionsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaRecoveryQueue, prometheus.GaugeValue, data.DbReplicaRecoveryQueue, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaRedoblocked, prometheus.CounterValue, data.DbReplicaRedoBlockedPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaRedoBytesRemaining, prometheus.GaugeValue, data.DbReplicaRedoBytesRemaining, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaRedoneBytes, prometheus.CounterValue, data.DbReplicaRedoneBytesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaRedones, prometheus.CounterValue, data.DbReplicaRedonesPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaTotalLogrequiringundo, prometheus.GaugeValue, data.DbReplicaTotalLogRequiringUndo, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.dbReplicaTransactionDelay, prometheus.GaugeValue, data.DbReplicaTransactionDelay/1000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } diff --git a/internal/collector/mssql/mssql_general_statistics.go b/internal/collector/mssql/mssql_general_statistics.go index 3ed9b6c3..96229923 100644 --- a/internal/collector/mssql/mssql_general_statistics.go +++ b/internal/collector/mssql/mssql_general_statistics.go @@ -25,7 +25,7 @@ import ( ) type collectorGeneralStatistics struct { - genStatsPerfDataCollectors map[string]*pdh.Collector + genStatsPerfDataCollectors map[mssqlInstance]*pdh.Collector genStatsPerfDataObject []perfDataCounterValuesGenStats genStatsActiveTempTables *prometheus.Desc @@ -84,11 +84,11 @@ type perfDataCounterValuesGenStats struct { func (c *Collector) buildGeneralStatistics() error { var err error - c.genStatsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.genStatsPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.genStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesGenStats](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "General Statistics"), nil) + c.genStatsPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesGenStats](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), nil) if err != nil { errs = append(errs, fmt.Errorf("failed to create General Statistics collector for instance %s: %w", sqlInstance.name, err)) } @@ -247,7 +247,7 @@ func (c *Collector) collectGeneralStatistics(ch chan<- prometheus.Metric) error return c.collect(ch, subCollectorGeneralStatistics, c.genStatsPerfDataCollectors, c.collectGeneralStatisticsInstance) } -func (c *Collector) collectGeneralStatisticsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectGeneralStatisticsInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.genStatsPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), err) @@ -257,168 +257,168 @@ func (c *Collector) collectGeneralStatisticsInstance(ch chan<- prometheus.Metric c.genStatsActiveTempTables, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsActiveTempTables, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsConnectionReset, prometheus.CounterValue, c.genStatsPerfDataObject[0].GenStatsConnectionResetPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsEventNotificationsDelayedDrop, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsEventNotificationsDelayedDrop, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsHTTPAuthenticatedRequests, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsHTTPAuthenticatedRequests, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsLogicalConnections, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsLogicalConnections, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsLogins, prometheus.CounterValue, c.genStatsPerfDataObject[0].GenStatsLoginsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsLogouts, prometheus.CounterValue, c.genStatsPerfDataObject[0].GenStatsLogoutsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsMarsDeadlocks, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsMarsDeadlocks, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsNonAtomicYieldRate, prometheus.CounterValue, c.genStatsPerfDataObject[0].GenStatsNonatomicYieldRate, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsProcessesBlocked, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsProcessesBlocked, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSOAPEmptyRequests, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSOAPEmptyRequests, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSOAPMethodInvocations, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSOAPMethodInvocations, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSOAPSessionInitiateRequests, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSOAPSessionInitiateRequests, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSOAPSessionTerminateRequests, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSOAPSessionTerminateRequests, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSOAPSQLRequests, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSOAPSQLRequests, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSOAPWSDLRequests, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSOAPWSDLRequests, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsSQLTraceIOProviderLockWaits, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsSQLTraceIOProviderLockWaits, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsTempDBRecoveryUnitID, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsTempdbRecoveryUnitID, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsTempDBrowSetID, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsTempdbRowsetID, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsTempTablesCreationRate, prometheus.CounterValue, c.genStatsPerfDataObject[0].GenStatsTempTablesCreationRate, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsTempTablesForDestruction, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsTempTablesForDestruction, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsTraceEventNotificationQueue, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsTraceEventNotificationQueue, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsTransactions, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsTransactions, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.genStatsUserConnections, prometheus.GaugeValue, c.genStatsPerfDataObject[0].GenStatsUserConnections, - sqlInstance, + sqlInstance.name, ) return nil diff --git a/internal/collector/mssql/mssql_locks.go b/internal/collector/mssql/mssql_locks.go index 8b06377b..5d31bb16 100644 --- a/internal/collector/mssql/mssql_locks.go +++ b/internal/collector/mssql/mssql_locks.go @@ -25,7 +25,7 @@ import ( ) type collectorLocks struct { - locksPerfDataCollectors map[string]*pdh.Collector + locksPerfDataCollectors map[mssqlInstance]*pdh.Collector locksPerfDataObject []perfDataCounterValuesLocks // Win32_PerfRawData_{instance}_SQLServerLocks @@ -55,11 +55,11 @@ type perfDataCounterValuesLocks struct { func (c *Collector) buildLocks() error { var err error - c.locksPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.locksPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.locksPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesLocks](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Locks"), pdh.InstancesAll) + c.locksPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesLocks](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Locks"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance.name, err)) } @@ -121,7 +121,7 @@ func (c *Collector) collectLocks(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorLocks, c.locksPerfDataCollectors, c.collectLocksInstance) } -func (c *Collector) collectLocksInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectLocksInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.locksPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Locks"), err) @@ -132,56 +132,56 @@ func (c *Collector) collectLocksInstance(ch chan<- prometheus.Metric, sqlInstanc c.locksWaitTime, prometheus.GaugeValue, data.LocksAverageWaitTimeMS/1000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksCount, prometheus.GaugeValue, data.LocksAverageWaitTimeMSBase/1000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksLockRequests, prometheus.CounterValue, data.LocksLockRequestsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksLockTimeouts, prometheus.CounterValue, data.LocksLockTimeoutsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksLockTimeoutstimeout0, prometheus.CounterValue, data.LocksLockTimeoutsTimeout0PerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksLockWaits, prometheus.CounterValue, data.LocksLockWaitsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksLockWaitTimeMS, prometheus.GaugeValue, data.LocksLockWaitTimeMS/1000.0, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.locksNumberOfDeadlocks, prometheus.CounterValue, data.LocksNumberOfDeadlocksPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } diff --git a/internal/collector/mssql/mssql_memory_manager.go b/internal/collector/mssql/mssql_memory_manager.go index 6f1cf2ac..3573a9d5 100644 --- a/internal/collector/mssql/mssql_memory_manager.go +++ b/internal/collector/mssql/mssql_memory_manager.go @@ -25,7 +25,7 @@ import ( ) type collectorMemoryManager struct { - memMgrPerfDataCollectors map[string]*pdh.Collector + memMgrPerfDataCollectors map[mssqlInstance]*pdh.Collector memMgrPerfDataObject []perfDataCounterValuesMemMgr memMgrConnectionMemoryKB *prometheus.Desc @@ -76,11 +76,11 @@ type perfDataCounterValuesMemMgr struct { func (c *Collector) buildMemoryManager() error { var err error - c.memMgrPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.memMgrPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.memMgrPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesMemMgr](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Memory Manager"), pdh.InstancesAll) + c.memMgrPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesMemMgr](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Memory Manager collector for instance %s: %w", sqlInstance.name, err)) } @@ -214,7 +214,7 @@ func (c *Collector) collectMemoryManager(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorMemoryManager, c.memMgrPerfDataCollectors, c.collectMemoryManagerInstance) } -func (c *Collector) collectMemoryManagerInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectMemoryManagerInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.memMgrPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), err) @@ -224,140 +224,140 @@ func (c *Collector) collectMemoryManagerInstance(ch chan<- prometheus.Metric, sq c.memMgrConnectionMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrConnectionMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrDatabaseCacheMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrDatabaseCacheMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrExternalBenefitOfMemory, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrExternalBenefitOfMemory, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrFreeMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrFreeMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrGrantedWorkspaceMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrGrantedWorkspaceMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrLockBlocks, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrLockBlocks, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrLockBlocksAllocated, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrLockBlocksAllocated, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrLockMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrLockMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrLockOwnerBlocks, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrLockOwnerBlocks, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrLockOwnerBlocksAllocated, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrLockOwnerBlocksAllocated, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrLogPoolMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrLogPoolMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrMaximumWorkspaceMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrMaximumWorkspaceMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrMemoryGrantsOutstanding, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrMemoryGrantsOutstanding, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrMemoryGrantsPending, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrMemoryGrantsPending, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrOptimizerMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrOptimizerMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrReservedServerMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrReservedServerMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrSQLCacheMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrSQLCacheMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrStolenServerMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrStolenServerMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrTargetServerMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrTargetServerMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.memMgrTotalServerMemoryKB, prometheus.GaugeValue, c.memMgrPerfDataObject[0].MemMgrTotalServerMemoryKB*1024, - sqlInstance, + sqlInstance.name, ) return nil diff --git a/internal/collector/mssql/mssql_sql_errors.go b/internal/collector/mssql/mssql_sql_errors.go index 70c66af3..2dd66790 100644 --- a/internal/collector/mssql/mssql_sql_errors.go +++ b/internal/collector/mssql/mssql_sql_errors.go @@ -25,7 +25,7 @@ import ( ) type collectorSQLErrors struct { - sqlErrorsPerfDataCollectors map[string]*pdh.Collector + sqlErrorsPerfDataCollectors map[mssqlInstance]*pdh.Collector sqlErrorsPerfDataObject []perfDataCounterValuesSqlErrors // Win32_PerfRawData_{instance}_SQLServerSQLErrors @@ -41,11 +41,11 @@ type perfDataCounterValuesSqlErrors struct { func (c *Collector) buildSQLErrors() error { var err error - c.sqlErrorsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.sqlErrorsPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.sqlErrorsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesSqlErrors](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "SQL Errors"), pdh.InstancesAll) + c.sqlErrorsPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesSqlErrors](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create SQL Errors collector for instance %s: %w", sqlInstance.name, err)) } @@ -66,7 +66,7 @@ func (c *Collector) collectSQLErrors(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorSQLErrors, c.sqlErrorsPerfDataCollectors, c.collectSQLErrorsInstance) } -func (c *Collector) collectSQLErrorsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectSQLErrorsInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.sqlErrorsPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), err) @@ -77,7 +77,7 @@ func (c *Collector) collectSQLErrorsInstance(ch chan<- prometheus.Metric, sqlIns c.sqlErrorsTotal, prometheus.CounterValue, data.SqlErrorsErrorsPerSec, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } diff --git a/internal/collector/mssql/mssql_sql_stats.go b/internal/collector/mssql/mssql_sql_stats.go index 722fec17..6dd1152c 100644 --- a/internal/collector/mssql/mssql_sql_stats.go +++ b/internal/collector/mssql/mssql_sql_stats.go @@ -25,7 +25,7 @@ import ( ) type collectorSQLStats struct { - sqlStatsPerfDataCollectors map[string]*pdh.Collector + sqlStatsPerfDataCollectors map[mssqlInstance]*pdh.Collector sqlStatsPerfDataObject []perfDataCounterValuesSqlStats sqlStatsAutoParamAttempts *prometheus.Desc @@ -58,11 +58,11 @@ type perfDataCounterValuesSqlStats struct { func (c *Collector) buildSQLStats() error { var err error - c.sqlStatsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.sqlStatsPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.sqlStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesSqlStats](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "SQL Statistics"), nil) + c.sqlStatsPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesSqlStats](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), nil) if err != nil { errs = append(errs, fmt.Errorf("failed to create SQL Statistics collector for instance %s: %w", sqlInstance.name, err)) } @@ -142,7 +142,7 @@ func (c *Collector) collectSQLStats(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorSQLStats, c.sqlStatsPerfDataCollectors, c.collectSQLStatsInstance) } -func (c *Collector) collectSQLStatsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectSQLStatsInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.sqlStatsPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), err) @@ -152,77 +152,77 @@ func (c *Collector) collectSQLStatsInstance(ch chan<- prometheus.Metric, sqlInst c.sqlStatsAutoParamAttempts, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsAutoParamAttemptsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsBatchRequests, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsBatchRequestsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsFailedAutoParams, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsFailedAutoParamsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsForcedParameterizations, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsForcedParameterizationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsGuidedplanexecutions, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsGuidedplanexecutionsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsMisguidedplanexecutions, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsMisguidedplanexecutionsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsSafeAutoParams, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsSafeAutoParamsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsSQLAttentionrate, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsSQLAttentionrate, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsSQLCompilations, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsSQLCompilationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsSQLReCompilations, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsSQLReCompilationsPerSec, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.sqlStatsUnsafeAutoParams, prometheus.CounterValue, c.sqlStatsPerfDataObject[0].SqlStatsUnsafeAutoParamsPerSec, - sqlInstance, + sqlInstance.name, ) return nil diff --git a/internal/collector/mssql/mssql_transactions.go b/internal/collector/mssql/mssql_transactions.go index 21387575..c84f2b5c 100644 --- a/internal/collector/mssql/mssql_transactions.go +++ b/internal/collector/mssql/mssql_transactions.go @@ -25,7 +25,7 @@ import ( ) type collectorTransactions struct { - transactionsPerfDataCollectors map[string]*pdh.Collector + transactionsPerfDataCollectors map[mssqlInstance]*pdh.Collector transactionsPerfDataObject []perfDataCounterValuesTransactions transactionsTempDbFreeSpaceBytes *prometheus.Desc @@ -62,11 +62,11 @@ type perfDataCounterValuesTransactions struct { func (c *Collector) buildTransactions() error { var err error - c.transactionsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.transactionsPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.transactionsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesTransactions](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Transactions"), nil) + c.transactionsPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesTransactions](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), nil) if err != nil { errs = append(errs, fmt.Errorf("failed to create Transactions collector for instance %s: %w", sqlInstance.name, err)) } @@ -160,7 +160,7 @@ func (c *Collector) collectTransactions(ch chan<- prometheus.Metric) error { // Win32_PerfRawData_MSSQLSERVER_Transactions docs: // - https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-transactions-object -func (c *Collector) collectTransactionsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectTransactionsInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.transactionsPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), err) @@ -170,91 +170,91 @@ func (c *Collector) collectTransactionsInstance(ch chan<- prometheus.Metric, sql c.transactionsTempDbFreeSpaceBytes, prometheus.GaugeValue, c.transactionsPerfDataObject[0].TransactionsFreeSpaceintempdbKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsLongestTransactionRunningSeconds, prometheus.GaugeValue, c.transactionsPerfDataObject[0].TransactionsLongestTransactionRunningTime, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsNonSnapshotVersionActiveTotal, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsNonSnapshotVersionTransactions, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsSnapshotActiveTotal, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsSnapshotTransactions, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsActive, prometheus.GaugeValue, c.transactionsPerfDataObject[0].TransactionsTransactions, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsUpdateConflictsTotal, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsUpdateconflictratio, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsUpdateSnapshotActiveTotal, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsUpdateSnapshotTransactions, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsVersionCleanupRateBytes, prometheus.GaugeValue, c.transactionsPerfDataObject[0].TransactionsVersionCleanuprateKBPers*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsVersionGenerationRateBytes, prometheus.GaugeValue, c.transactionsPerfDataObject[0].TransactionsVersionGenerationrateKBPers*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsVersionStoreSizeBytes, prometheus.GaugeValue, c.transactionsPerfDataObject[0].TransactionsVersionStoreSizeKB*1024, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsVersionStoreUnits, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsVersionStoreunitcount, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsVersionStoreCreationUnits, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsVersionStoreunitcreation, - sqlInstance, + sqlInstance.name, ) ch <- prometheus.MustNewConstMetric( c.transactionsVersionStoreTruncationUnits, prometheus.CounterValue, c.transactionsPerfDataObject[0].TransactionsVersionStoreunittruncation, - sqlInstance, + sqlInstance.name, ) return nil diff --git a/internal/collector/mssql/mssql_wait_stats.go b/internal/collector/mssql/mssql_wait_stats.go index 90fa6550..f6855fe5 100644 --- a/internal/collector/mssql/mssql_wait_stats.go +++ b/internal/collector/mssql/mssql_wait_stats.go @@ -25,7 +25,7 @@ import ( ) type collectorWaitStats struct { - waitStatsPerfDataCollectors map[string]*pdh.Collector + waitStatsPerfDataCollectors map[mssqlInstance]*pdh.Collector waitStatsPerfDataObject []perfDataCounterValuesWaitStats waitStatsLockWaits *prometheus.Desc @@ -62,11 +62,11 @@ type perfDataCounterValuesWaitStats struct { func (c *Collector) buildWaitStats() error { var err error - c.waitStatsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances)) + c.waitStatsPerfDataCollectors = make(map[mssqlInstance]*pdh.Collector, len(c.mssqlInstances)) errs := make([]error, 0, len(c.mssqlInstances)) for _, sqlInstance := range c.mssqlInstances { - c.waitStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesWaitStats](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance.name, "Wait Statistics"), pdh.InstancesAll) + c.waitStatsPerfDataCollectors[sqlInstance], err = pdh.NewCollector[perfDataCounterValuesWaitStats](pdh.CounterTypeRaw, c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), pdh.InstancesAll) if err != nil { errs = append(errs, fmt.Errorf("failed to create Wait Statistics collector for instance %s: %w", sqlInstance.name, err)) } @@ -153,7 +153,7 @@ func (c *Collector) collectWaitStats(ch chan<- prometheus.Metric) error { return c.collect(ch, subCollectorWaitStats, c.waitStatsPerfDataCollectors, c.collectWaitStatsInstance) } -func (c *Collector) collectWaitStatsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error { +func (c *Collector) collectWaitStatsInstance(ch chan<- prometheus.Metric, sqlInstance mssqlInstance, perfDataCollector *pdh.Collector) error { err := perfDataCollector.Collect(&c.waitStatsPerfDataObject) if err != nil { return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), err) @@ -164,84 +164,84 @@ func (c *Collector) collectWaitStatsInstance(ch chan<- prometheus.Metric, sqlIns c.waitStatsLockWaits, prometheus.CounterValue, data.WaitStatsLockWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsMemoryGrantQueueWaits, prometheus.CounterValue, data.WaitStatsMemoryGrantQueueWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsThreadSafeMemoryObjectsWaits, prometheus.CounterValue, data.WaitStatsThreadSafeMemoryObjectsWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsLogWriteWaits, prometheus.CounterValue, data.WaitStatsLogWriteWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsLogBufferWaits, prometheus.CounterValue, data.WaitStatsLogBufferWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsNetworkIOWaits, prometheus.CounterValue, data.WaitStatsNetworkIOWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsPageIOLatchWaits, prometheus.CounterValue, data.WaitStatsPageIOLatchWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsPageLatchWaits, prometheus.CounterValue, data.WaitStatsPageLatchWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsNonPageLatchWaits, prometheus.CounterValue, data.WaitStatsNonpageLatchWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsWaitForTheWorkerWaits, prometheus.CounterValue, data.WaitStatsWaitForTheWorkerWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsWorkspaceSynchronizationWaits, prometheus.CounterValue, data.WaitStatsWorkspaceSynchronizationWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) ch <- prometheus.MustNewConstMetric( c.waitStatsTransactionOwnershipWaits, prometheus.CounterValue, data.WaitStatsTransactionOwnershipWaits, - sqlInstance, data.Name, + sqlInstance.name, data.Name, ) } diff --git a/internal/collector/mssql/types.go b/internal/collector/mssql/types.go index 0f246ca5..5dc4710b 100644 --- a/internal/collector/mssql/types.go +++ b/internal/collector/mssql/types.go @@ -8,13 +8,14 @@ import ( ) type mssqlInstance struct { - name string - majorVersion mssqlServerMajorVersion - patchVersion string - edition string + name string + majorVersion mssqlServerMajorVersion + patchVersion string + edition string + isFirstInstance bool } -func newMssqlInstance(name string) (mssqlInstance, error) { +func newMssqlInstance(key, name string) (mssqlInstance, error) { regKey := fmt.Sprintf(`Software\Microsoft\Microsoft SQL Server\%s\Setup`, name) k, err := registry.OpenKey(registry.LOCAL_MACHINE, regKey, registry.QUERY_VALUE) @@ -39,10 +40,11 @@ func newMssqlInstance(name string) (mssqlInstance, error) { _, name, _ = strings.Cut(name, ".") return mssqlInstance{ - edition: edition, - name: name, - majorVersion: newMajorVersion(patchVersion), - patchVersion: patchVersion, + edition: edition, + name: name, + majorVersion: newMajorVersion(patchVersion), + patchVersion: patchVersion, + isFirstInstance: key == "MSSQLSERVER", }, nil }