diff --git a/collector/mssql.go b/collector/mssql.go index 71f1bd2c..25db71a5 100644 --- a/collector/mssql.go +++ b/collector/mssql.go @@ -179,7 +179,8 @@ type MSSQLCollector struct { AccessMethodsUsedtreepagecookie *prometheus.Desc AccessMethodsWorkfilesCreated *prometheus.Desc AccessMethodsWorktablesCreated *prometheus.Desc - AccessMethodsWorktablesFromCacheRatio *prometheus.Desc + AccessMethodsWorktablesFromCacheHits *prometheus.Desc + AccessMethodsWorktablesFromCacheLookups *prometheus.Desc // Win32_PerfRawData_{instance}_SQLServerAvailabilityReplica AvailReplicaBytesReceivedfromReplica *prometheus.Desc @@ -194,7 +195,8 @@ type MSSQLCollector struct { // Win32_PerfRawData_{instance}_SQLServerBufferManager BufManBackgroundwriterpages *prometheus.Desc - BufManBuffercachehitratio *prometheus.Desc + BufManBuffercachehits *prometheus.Desc + BufManBuffercachelookups *prometheus.Desc BufManCheckpointpages *prometheus.Desc BufManDatabasepages *prometheus.Desc BufManExtensionallocatedpages *prometheus.Desc @@ -252,7 +254,8 @@ type MSSQLCollector struct { DatabasesDBCCLogicalScanBytes *prometheus.Desc DatabasesGroupCommitTime *prometheus.Desc DatabasesLogBytesFlushed *prometheus.Desc - DatabasesLogCacheHitRatio *prometheus.Desc + DatabasesLogCacheHits *prometheus.Desc + DatabasesLogCacheLookups *prometheus.Desc DatabasesLogCacheReads *prometheus.Desc DatabasesLogFilesSizeKB *prometheus.Desc DatabasesLogFilesUsedSizeKB *prometheus.Desc @@ -317,7 +320,8 @@ type MSSQLCollector struct { GenStatsUserConnections *prometheus.Desc // Win32_PerfRawData_{instance}_SQLServerLocks - LocksAverageWaitTimems *prometheus.Desc + LocksWaitTime *prometheus.Desc + LocksCount *prometheus.Desc LocksLockRequests *prometheus.Desc LocksLockTimeouts *prometheus.Desc LocksLockTimeoutstimeout0 *prometheus.Desc @@ -656,12 +660,18 @@ func NewMSSQLCollector() (Collector, error) { []string{"instance"}, nil, ), - AccessMethodsWorktablesFromCacheRatio: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, subsystem, "accessmethods_worktables_from_cache_ratio"), + AccessMethodsWorktablesFromCacheHits: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "accessmethods_worktables_from_cache_hits"), "(AccessMethods.WorktablesFromCacheRatio)", []string{"instance"}, nil, ), + AccessMethodsWorktablesFromCacheLookups: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "accessmethods_worktables_from_cache_lookups"), + "(AccessMethods.WorktablesFromCacheRatio_Base)", + []string{"instance"}, + nil, + ), // Win32_PerfRawData_{instance}_SQLServerAvailabilityReplica AvailReplicaBytesReceivedfromReplica: prometheus.NewDesc( @@ -726,12 +736,18 @@ func NewMSSQLCollector() (Collector, error) { []string{"instance"}, nil, ), - BufManBuffercachehitratio: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, subsystem, "bufman_buffer_cache_hit_ratio"), + BufManBuffercachehits: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "bufman_buffer_cache_hits"), "(BufferManager.Buffercachehitratio)", []string{"instance"}, nil, ), + BufManBuffercachelookups: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "bufman_buffer_cache_lookups"), + "(BufferManager.Buffercachehitratio_Base)", + []string{"instance"}, + nil, + ), BufManCheckpointpages: prometheus.NewDesc( prometheus.BuildFQName(Namespace, subsystem, "bufman_checkpoint_pages"), "(BufferManager.Checkpointpages)", @@ -1054,12 +1070,18 @@ func NewMSSQLCollector() (Collector, error) { []string{"instance", "database"}, nil, ), - DatabasesLogCacheHitRatio: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, subsystem, "databases_log_cache_hit_ratio"), + DatabasesLogCacheHits: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "databases_log_cache_hits"), "(Databases.LogCacheHitRatio)", []string{"instance", "database"}, nil, ), + DatabasesLogCacheLookups: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "databases_log_cache_lookups"), + "(Databases.LogCacheHitRatio_Base)", + []string{"instance", "database"}, + nil, + ), DatabasesLogCacheReads: prometheus.NewDesc( prometheus.BuildFQName(Namespace, subsystem, "databases_log_cache_reads"), "(Databases.LogCacheReads)", @@ -1424,9 +1446,15 @@ func NewMSSQLCollector() (Collector, error) { ), // Win32_PerfRawData_{instance}_SQLServerLocks - LocksAverageWaitTimems: prometheus.NewDesc( - prometheus.BuildFQName(Namespace, subsystem, "locks_average_wait_seconds"), - "(Locks.AverageWaitTimems)", + LocksWaitTime: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "locks_wait_time_seconds"), + "(Locks.AverageWaitTimems Total time in seconds which locks have been holding resources)", + []string{"instance", "resource"}, + nil, + ), + LocksCount: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "locks_count"), + "(Locks.AverageWaitTimems_Base count of how often requests have run into locks)", []string{"instance", "resource"}, nil, ), @@ -1863,6 +1891,7 @@ type win32PerfRawDataSQLServerAccessMethods struct { WorkfilesCreatedPersec uint64 WorktablesCreatedPersec uint64 WorktablesFromCacheRatio uint64 + WorktablesFromCacheRatio_Base uint64 } func (c *MSSQLCollector) collectAccessMethods(ch chan<- prometheus.Metric, sqlInstance string) (*prometheus.Desc, error) { @@ -2175,11 +2204,18 @@ func (c *MSSQLCollector) collectAccessMethods(ch chan<- prometheus.Metric, sqlIn ) ch <- prometheus.MustNewConstMetric( - c.AccessMethodsWorktablesFromCacheRatio, + c.AccessMethodsWorktablesFromCacheHits, prometheus.CounterValue, float64(v.WorktablesFromCacheRatio), sqlInstance, ) + + ch <- prometheus.MustNewConstMetric( + c.AccessMethodsWorktablesFromCacheLookups, + prometheus.CounterValue, + float64(v.WorktablesFromCacheRatio_Base), + sqlInstance, + ) return nil, nil } @@ -2282,6 +2318,7 @@ func (c *MSSQLCollector) collectAvailabilityReplica(ch chan<- prometheus.Metric, type win32PerfRawDataSQLServerBufferManager struct { BackgroundwriterpagesPersec uint64 Buffercachehitratio uint64 + Buffercachehitratio_Base uint64 CheckpointpagesPersec uint64 Databasepages uint64 Extensionallocatedpages uint64 @@ -2327,12 +2364,19 @@ func (c *MSSQLCollector) collectBufferManager(ch chan<- prometheus.Metric, sqlIn ) ch <- prometheus.MustNewConstMetric( - c.BufManBuffercachehitratio, + c.BufManBuffercachehits, prometheus.GaugeValue, float64(v.Buffercachehitratio), sqlInstance, ) + ch <- prometheus.MustNewConstMetric( + c.BufManBuffercachelookups, + prometheus.GaugeValue, + float64(v.Buffercachehitratio_Base), + sqlInstance, + ) + ch <- prometheus.MustNewConstMetric( c.BufManCheckpointpages, prometheus.CounterValue, @@ -2704,6 +2748,7 @@ type win32PerfRawDataSQLServerDatabases struct { GroupCommitTimePersec uint64 LogBytesFlushedPersec uint64 LogCacheHitRatio uint64 + LogCacheHitRatio_Base uint64 LogCacheReadsPersec uint64 LogFilesSizeKB uint64 LogFilesUsedSizeKB uint64 @@ -2819,12 +2864,19 @@ func (c *MSSQLCollector) collectDatabases(ch chan<- prometheus.Metric, sqlInstan ) ch <- prometheus.MustNewConstMetric( - c.DatabasesLogCacheHitRatio, + c.DatabasesLogCacheHits, prometheus.GaugeValue, float64(v.LogCacheHitRatio), sqlInstance, dbName, ) + ch <- prometheus.MustNewConstMetric( + c.DatabasesLogCacheLookups, + prometheus.GaugeValue, + float64(v.LogCacheHitRatio_Base), + sqlInstance, dbName, + ) + ch <- prometheus.MustNewConstMetric( c.DatabasesLogCacheReads, prometheus.CounterValue, @@ -3299,6 +3351,7 @@ func (c *MSSQLCollector) collectGeneralStatistics(ch chan<- prometheus.Metric, s type win32PerfRawDataSQLServerLocks struct { Name string AverageWaitTimems uint64 + AverageWaitTimems_Base uint64 LockRequestsPersec uint64 LockTimeoutsPersec uint64 LockTimeoutstimeout0Persec uint64 @@ -3321,12 +3374,19 @@ func (c *MSSQLCollector) collectLocks(ch chan<- prometheus.Metric, sqlInstance s lockResourceName := v.Name ch <- prometheus.MustNewConstMetric( - c.LocksAverageWaitTimems, + c.LocksWaitTime, prometheus.GaugeValue, float64(v.AverageWaitTimems)/1000.0, sqlInstance, lockResourceName, ) + ch <- prometheus.MustNewConstMetric( + c.LocksCount, + prometheus.GaugeValue, + float64(v.AverageWaitTimems_Base)/1000.0, + sqlInstance, lockResourceName, + ) + ch <- prometheus.MustNewConstMetric( c.LocksLockRequests, prometheus.CounterValue, diff --git a/docs/collector.mssql.md b/docs/collector.mssql.md index 51856aa5..b645c7ad 100644 --- a/docs/collector.mssql.md +++ b/docs/collector.mssql.md @@ -249,7 +249,27 @@ Name | Description | Type | Labels _This collector does not yet have explained examples, we would appreciate your help adding them!_ ## Useful queries -_This collector does not yet have any useful queries added, we would appreciate your help adding them!_ + +### Buffer Cache Hit Ratio + +When you read the counter in perfmon you will get the the percentage pages found in the buffer cache. This percentage is calculated internally based on the total number of cache hits divided by the total number of cache lookups over the last few thousand page accesses. +This collector retrieves the two internal values separately. In order to calculate the Buffer Cache Hit Ratio in PromQL. + +``` +wmi_mssql_bufman_buffer_cache_hits{instance="host:9182", exported_instance="MSSQLSERVER"} / +wmi_mssql_bufman_buffer_cache_lookups{instance="host:9182", exported_instance="MSSQLSERVER"} +``` + +This principal can be used for following metrics too: +- AccessMethodsWorktablesFromCacheHitRatio + - accessmethods_worktables_from_cache_hits + - accessmethods_worktables_from_cache_lookups +- LogCacheHitRatio + - databases_log_cache_hits + - databases_log_cache_lookups +- AverageLockWaitTime + - locks_wait_time_seconds + - locks_count ## Alerting examples _This collector does not yet have alerting examples, we would appreciate your help adding them!_