chore: Remove registry based perfdata collector (#1742)

Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2024-11-17 21:51:12 +01:00
committed by GitHub
parent 6206b695c6
commit e6a15d4ec4
213 changed files with 8079 additions and 12405 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,766 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorAccessMethods struct {
accessMethodsPerfDataCollectors map[string]*perfdata.Collector
accessMethodsAUcleanupbatches *prometheus.Desc
accessMethodsAUcleanups *prometheus.Desc
accessMethodsByReferenceLobCreateCount *prometheus.Desc
accessMethodsByReferenceLobUseCount *prometheus.Desc
accessMethodsCountLobReadahead *prometheus.Desc
accessMethodsCountPullInRow *prometheus.Desc
accessMethodsCountPushOffRow *prometheus.Desc
accessMethodsDeferreddroppedAUs *prometheus.Desc
accessMethodsDeferredDroppedrowsets *prometheus.Desc
accessMethodsDroppedrowsetcleanups *prometheus.Desc
accessMethodsDroppedrowsetsskipped *prometheus.Desc
accessMethodsExtentDeallocations *prometheus.Desc
accessMethodsExtentsAllocated *prometheus.Desc
accessMethodsFailedAUcleanupbatches *prometheus.Desc
accessMethodsFailedleafpagecookie *prometheus.Desc
accessMethodsFailedtreepagecookie *prometheus.Desc
accessMethodsForwardedRecords *prometheus.Desc
accessMethodsFreeSpacePageFetches *prometheus.Desc
accessMethodsFreeSpaceScans *prometheus.Desc
accessMethodsFullScans *prometheus.Desc
accessMethodsIndexSearches *prometheus.Desc
accessMethodsInSysXactwaits *prometheus.Desc
accessMethodsLobHandleCreateCount *prometheus.Desc
accessMethodsLobHandleDestroyCount *prometheus.Desc
accessMethodsLobSSProviderCreateCount *prometheus.Desc
accessMethodsLobSSProviderDestroyCount *prometheus.Desc
accessMethodsLobSSProviderTruncationCount *prometheus.Desc
accessMethodsMixedPageAllocations *prometheus.Desc
accessMethodsPageCompressionAttempts *prometheus.Desc
accessMethodsPageDeallocations *prometheus.Desc
accessMethodsPagesAllocated *prometheus.Desc
accessMethodsPagesCompressed *prometheus.Desc
accessMethodsPageSplits *prometheus.Desc
accessMethodsProbeScans *prometheus.Desc
accessMethodsRangeScans *prometheus.Desc
accessMethodsScanPointRevalidations *prometheus.Desc
accessMethodsSkippedGhostedRecords *prometheus.Desc
accessMethodsTableLockEscalations *prometheus.Desc
accessMethodsUsedleafpagecookie *prometheus.Desc
accessMethodsUsedtreepagecookie *prometheus.Desc
accessMethodsWorkfilesCreated *prometheus.Desc
accessMethodsWorktablesCreated *prometheus.Desc
accessMethodsWorktablesFromCacheHits *prometheus.Desc
accessMethodsWorktablesFromCacheLookups *prometheus.Desc
}
const (
accessMethodsAUCleanupbatchesPerSec = "AU cleanup batches/sec"
accessMethodsAUCleanupsPerSec = "AU cleanups/sec"
accessMethodsByReferenceLobCreateCount = "By-reference Lob Create Count"
accessMethodsByReferenceLobUseCount = "By-reference Lob Use Count"
accessMethodsCountLobReadahead = "Count Lob Readahead"
accessMethodsCountPullInRow = "Count Pull In Row"
accessMethodsCountPushOffRow = "Count Push Off Row"
accessMethodsDeferredDroppedAUs = "Deferred dropped AUs"
accessMethodsDeferredDroppedRowsets = "Deferred Dropped rowsets"
accessMethodsDroppedRowsetCleanupsPerSec = "Dropped rowset cleanups/sec"
accessMethodsDroppedRowsetsSkippedPerSec = "Dropped rowsets skipped/sec"
accessMethodsExtentDeallocationsPerSec = "Extent Deallocations/sec"
accessMethodsExtentsAllocatedPerSec = "Extents Allocated/sec"
accessMethodsFailedAUCleanupBatchesPerSec = "Failed AU cleanup batches/sec"
accessMethodsFailedLeafPageCookie = "Failed leaf page cookie"
accessMethodsFailedTreePageCookie = "Failed tree page cookie"
accessMethodsForwardedRecordsPerSec = "Forwarded Records/sec"
accessMethodsFreeSpacePageFetchesPerSec = "FreeSpace Page Fetches/sec"
accessMethodsFreeSpaceScansPerSec = "FreeSpace Scans/sec"
accessMethodsFullScansPerSec = "Full Scans/sec"
accessMethodsIndexSearchesPerSec = "Index Searches/sec"
accessMethodsInSysXactWaitsPerSec = "InSysXact waits/sec"
accessMethodsLobHandleCreateCount = "LobHandle Create Count"
accessMethodsLobHandleDestroyCount = "LobHandle Destroy Count"
accessMethodsLobSSProviderCreateCount = "LobSS Provider Create Count"
accessMethodsLobSSProviderDestroyCount = "LobSS Provider Destroy Count"
accessMethodsLobSSProviderTruncationCount = "LobSS Provider Truncation Count"
accessMethodsMixedPageAllocationsPerSec = "Mixed page allocations/sec"
accessMethodsPageCompressionAttemptsPerSec = "Page compression attempts/sec"
accessMethodsPageDeallocationsPerSec = "Page Deallocations/sec"
accessMethodsPagesAllocatedPerSec = "Pages Allocated/sec"
accessMethodsPagesCompressedPerSec = "Pages compressed/sec"
accessMethodsPageSplitsPerSec = "Page Splits/sec"
accessMethodsProbeScansPerSec = "Probe Scans/sec"
accessMethodsRangeScansPerSec = "Range Scans/sec"
accessMethodsScanPointRevalidationsPerSec = "Scan Point Revalidations/sec"
accessMethodsSkippedGhostedRecordsPerSec = "Skipped Ghosted Records/sec"
accessMethodsTableLockEscalationsPerSec = "Table Lock Escalations/sec"
accessMethodsUsedLeafPageCookie = "Used leaf page cookie"
accessMethodsUsedTreePageCookie = "Used tree page cookie"
accessMethodsWorkfilesCreatedPerSec = "Workfiles Created/sec"
accessMethodsWorktablesCreatedPerSec = "Worktables Created/sec"
accessMethodsWorktablesFromCacheRatio = "Worktables From Cache Ratio"
accessMethodsWorktablesFromCacheRatioBase = "Worktables From Cache Base"
)
func (c *Collector) buildAccessMethods() error {
var err error
c.accessMethodsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
accessMethodsAUCleanupbatchesPerSec,
accessMethodsAUCleanupsPerSec,
accessMethodsByReferenceLobCreateCount,
accessMethodsByReferenceLobUseCount,
accessMethodsCountLobReadahead,
accessMethodsCountPullInRow,
accessMethodsCountPushOffRow,
accessMethodsDeferredDroppedAUs,
accessMethodsDeferredDroppedRowsets,
accessMethodsDroppedRowsetCleanupsPerSec,
accessMethodsDroppedRowsetsSkippedPerSec,
accessMethodsExtentDeallocationsPerSec,
accessMethodsExtentsAllocatedPerSec,
accessMethodsFailedAUCleanupBatchesPerSec,
accessMethodsFailedLeafPageCookie,
accessMethodsFailedTreePageCookie,
accessMethodsForwardedRecordsPerSec,
accessMethodsFreeSpacePageFetchesPerSec,
accessMethodsFreeSpaceScansPerSec,
accessMethodsFullScansPerSec,
accessMethodsIndexSearchesPerSec,
accessMethodsInSysXactWaitsPerSec,
accessMethodsLobHandleCreateCount,
accessMethodsLobHandleDestroyCount,
accessMethodsLobSSProviderCreateCount,
accessMethodsLobSSProviderDestroyCount,
accessMethodsLobSSProviderTruncationCount,
accessMethodsMixedPageAllocationsPerSec,
accessMethodsPageCompressionAttemptsPerSec,
accessMethodsPageDeallocationsPerSec,
accessMethodsPagesAllocatedPerSec,
accessMethodsPagesCompressedPerSec,
accessMethodsPageSplitsPerSec,
accessMethodsProbeScansPerSec,
accessMethodsRangeScansPerSec,
accessMethodsScanPointRevalidationsPerSec,
accessMethodsSkippedGhostedRecordsPerSec,
accessMethodsTableLockEscalationsPerSec,
accessMethodsUsedLeafPageCookie,
accessMethodsUsedTreePageCookie,
accessMethodsWorkfilesCreatedPerSec,
accessMethodsWorktablesCreatedPerSec,
accessMethodsWorktablesFromCacheRatio,
accessMethodsWorktablesFromCacheRatioBase,
}
for sqlInstance := range c.mssqlInstances {
c.accessMethodsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Access Methods"), nil, counters)
if err != nil {
return fmt.Errorf("failed to create AccessMethods collector for instance %s: %w", sqlInstance, err)
}
}
// Win32_PerfRawData_{instance}_SQLServerAccessMethods
c.accessMethodsAUcleanupbatches = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_au_batch_cleanups"),
"(AccessMethods.AUcleanupbatches)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsAUcleanups = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_au_cleanups"),
"(AccessMethods.AUcleanups)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsByReferenceLobCreateCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_by_reference_lob_creates"),
"(AccessMethods.ByreferenceLobCreateCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsByReferenceLobUseCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_by_reference_lob_uses"),
"(AccessMethods.ByreferenceLobUseCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsCountLobReadahead = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_lob_read_aheads"),
"(AccessMethods.CountLobReadahead)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsCountPullInRow = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_column_value_pulls"),
"(AccessMethods.CountPullInRow)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsCountPushOffRow = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_column_value_pushes"),
"(AccessMethods.CountPushOffRow)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsDeferreddroppedAUs = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_deferred_dropped_aus"),
"(AccessMethods.DeferreddroppedAUs)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsDeferredDroppedrowsets = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_deferred_dropped_rowsets"),
"(AccessMethods.DeferredDroppedrowsets)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsDroppedrowsetcleanups = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_dropped_rowset_cleanups"),
"(AccessMethods.Droppedrowsetcleanups)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsDroppedrowsetsskipped = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_dropped_rowset_skips"),
"(AccessMethods.Droppedrowsetsskipped)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsExtentDeallocations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_extent_deallocations"),
"(AccessMethods.ExtentDeallocations)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsExtentsAllocated = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_extent_allocations"),
"(AccessMethods.ExtentsAllocated)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsFailedAUcleanupbatches = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_au_batch_cleanup_failures"),
"(AccessMethods.FailedAUcleanupbatches)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsFailedleafpagecookie = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_leaf_page_cookie_failures"),
"(AccessMethods.Failedleafpagecookie)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsFailedtreepagecookie = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_tree_page_cookie_failures"),
"(AccessMethods.Failedtreepagecookie)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsForwardedRecords = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_forwarded_records"),
"(AccessMethods.ForwardedRecords)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsFreeSpacePageFetches = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_free_space_page_fetches"),
"(AccessMethods.FreeSpacePageFetches)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsFreeSpaceScans = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_free_space_scans"),
"(AccessMethods.FreeSpaceScans)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsFullScans = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_full_scans"),
"(AccessMethods.FullScans)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsIndexSearches = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_index_searches"),
"(AccessMethods.IndexSearches)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsInSysXactwaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_insysxact_waits"),
"(AccessMethods.InSysXactwaits)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsLobHandleCreateCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_lob_handle_creates"),
"(AccessMethods.LobHandleCreateCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsLobHandleDestroyCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_lob_handle_destroys"),
"(AccessMethods.LobHandleDestroyCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsLobSSProviderCreateCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_lob_ss_provider_creates"),
"(AccessMethods.LobSSProviderCreateCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsLobSSProviderDestroyCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_lob_ss_provider_destroys"),
"(AccessMethods.LobSSProviderDestroyCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsLobSSProviderTruncationCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_lob_ss_provider_truncations"),
"(AccessMethods.LobSSProviderTruncationCount)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsMixedPageAllocations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_mixed_page_allocations"),
"(AccessMethods.MixedpageallocationsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsPageCompressionAttempts = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_page_compression_attempts"),
"(AccessMethods.PagecompressionattemptsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsPageDeallocations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_page_deallocations"),
"(AccessMethods.PageDeallocationsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsPagesAllocated = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_page_allocations"),
"(AccessMethods.PagesAllocatedPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsPagesCompressed = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_page_compressions"),
"(AccessMethods.PagescompressedPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsPageSplits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_page_splits"),
"(AccessMethods.PageSplitsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsProbeScans = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_probe_scans"),
"(AccessMethods.ProbeScansPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsRangeScans = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_range_scans"),
"(AccessMethods.RangeScansPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsScanPointRevalidations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_scan_point_revalidations"),
"(AccessMethods.ScanPointRevalidationsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsSkippedGhostedRecords = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_ghost_record_skips"),
"(AccessMethods.SkippedGhostedRecordsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsTableLockEscalations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_table_lock_escalations"),
"(AccessMethods.TableLockEscalationsPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsUsedleafpagecookie = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_leaf_page_cookie_uses"),
"(AccessMethods.Usedleafpagecookie)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsUsedtreepagecookie = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_tree_page_cookie_uses"),
"(AccessMethods.Usedtreepagecookie)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsWorkfilesCreated = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_workfile_creates"),
"(AccessMethods.WorkfilesCreatedPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsWorktablesCreated = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_worktables_creates"),
"(AccessMethods.WorktablesCreatedPersec)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsWorktablesFromCacheHits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_worktables_from_cache_hits"),
"(AccessMethods.WorktablesFromCacheRatio)",
[]string{"mssql_instance"},
nil,
)
c.accessMethodsWorktablesFromCacheLookups = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "accessmethods_worktables_from_cache_lookups"),
"(AccessMethods.WorktablesFromCacheRatio_Base)",
[]string{"mssql_instance"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"), err)
}
data, ok := perfData[perfdata.EmptyInstance]
if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"))
}
ch <- prometheus.MustNewConstMetric(
c.accessMethodsAUcleanupbatches,
prometheus.CounterValue,
data[accessMethodsAUCleanupbatchesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsAUcleanups,
prometheus.CounterValue,
data[accessMethodsAUCleanupsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsByReferenceLobCreateCount,
prometheus.CounterValue,
data[accessMethodsByReferenceLobCreateCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsByReferenceLobUseCount,
prometheus.CounterValue,
data[accessMethodsByReferenceLobUseCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsCountLobReadahead,
prometheus.CounterValue,
data[accessMethodsCountLobReadahead].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsCountPullInRow,
prometheus.CounterValue,
data[accessMethodsCountPullInRow].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsCountPushOffRow,
prometheus.CounterValue,
data[accessMethodsCountPushOffRow].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsDeferreddroppedAUs,
prometheus.GaugeValue,
data[accessMethodsDeferredDroppedAUs].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsDeferredDroppedrowsets,
prometheus.GaugeValue,
data[accessMethodsDeferredDroppedRowsets].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsDroppedrowsetcleanups,
prometheus.CounterValue,
data[accessMethodsDroppedRowsetCleanupsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsDroppedrowsetsskipped,
prometheus.CounterValue,
data[accessMethodsDroppedRowsetsSkippedPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsExtentDeallocations,
prometheus.CounterValue,
data[accessMethodsExtentDeallocationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsExtentsAllocated,
prometheus.CounterValue,
data[accessMethodsExtentsAllocatedPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsFailedAUcleanupbatches,
prometheus.CounterValue,
data[accessMethodsFailedAUCleanupBatchesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsFailedleafpagecookie,
prometheus.CounterValue,
data[accessMethodsFailedLeafPageCookie].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsFailedtreepagecookie,
prometheus.CounterValue,
data[accessMethodsFailedTreePageCookie].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsForwardedRecords,
prometheus.CounterValue,
data[accessMethodsForwardedRecordsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsFreeSpacePageFetches,
prometheus.CounterValue,
data[accessMethodsFreeSpacePageFetchesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsFreeSpaceScans,
prometheus.CounterValue,
data[accessMethodsFreeSpaceScansPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsFullScans,
prometheus.CounterValue,
data[accessMethodsFullScansPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsIndexSearches,
prometheus.CounterValue,
data[accessMethodsIndexSearchesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsInSysXactwaits,
prometheus.CounterValue,
data[accessMethodsInSysXactWaitsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsLobHandleCreateCount,
prometheus.CounterValue,
data[accessMethodsLobHandleCreateCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsLobHandleDestroyCount,
prometheus.CounterValue,
data[accessMethodsLobHandleDestroyCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsLobSSProviderCreateCount,
prometheus.CounterValue,
data[accessMethodsLobSSProviderCreateCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsLobSSProviderDestroyCount,
prometheus.CounterValue,
data[accessMethodsLobSSProviderDestroyCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsLobSSProviderTruncationCount,
prometheus.CounterValue,
data[accessMethodsLobSSProviderTruncationCount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsMixedPageAllocations,
prometheus.CounterValue,
data[accessMethodsMixedPageAllocationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsPageCompressionAttempts,
prometheus.CounterValue,
data[accessMethodsPageCompressionAttemptsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsPageDeallocations,
prometheus.CounterValue,
data[accessMethodsPageDeallocationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsPagesAllocated,
prometheus.CounterValue,
data[accessMethodsPagesAllocatedPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsPagesCompressed,
prometheus.CounterValue,
data[accessMethodsPagesCompressedPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsPageSplits,
prometheus.CounterValue,
data[accessMethodsPageSplitsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsProbeScans,
prometheus.CounterValue,
data[accessMethodsProbeScansPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsRangeScans,
prometheus.CounterValue,
data[accessMethodsRangeScansPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsScanPointRevalidations,
prometheus.CounterValue,
data[accessMethodsScanPointRevalidationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsSkippedGhostedRecords,
prometheus.CounterValue,
data[accessMethodsSkippedGhostedRecordsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsTableLockEscalations,
prometheus.CounterValue,
data[accessMethodsTableLockEscalationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsUsedleafpagecookie,
prometheus.CounterValue,
data[accessMethodsUsedLeafPageCookie].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsUsedtreepagecookie,
prometheus.CounterValue,
data[accessMethodsUsedTreePageCookie].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsWorkfilesCreated,
prometheus.CounterValue,
data[accessMethodsWorkfilesCreatedPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsWorktablesCreated,
prometheus.CounterValue,
data[accessMethodsWorktablesCreatedPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsWorktablesFromCacheHits,
prometheus.CounterValue,
data[accessMethodsWorktablesFromCacheRatio].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.accessMethodsWorktablesFromCacheLookups,
prometheus.CounterValue,
data[accessMethodsWorktablesFromCacheRatioBase].FirstValue,
sqlInstance,
)
return nil
}
func (c *Collector) closeAccessMethods() {
for _, perfDataCollector := range c.accessMethodsPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,204 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus-community/windows_exporter/internal/utils"
"github.com/prometheus/client_golang/prometheus"
)
type collectorAvailabilityReplica struct {
availabilityReplicaPerfDataCollectors map[string]*perfdata.Collector
availReplicaBytesReceivedFromReplica *prometheus.Desc
availReplicaBytesSentToReplica *prometheus.Desc
availReplicaBytesSentToTransport *prometheus.Desc
availReplicaFlowControl *prometheus.Desc
availReplicaFlowControlTimeMS *prometheus.Desc
availReplicaReceivesFromReplica *prometheus.Desc
availReplicaResentMessages *prometheus.Desc
availReplicaSendsToReplica *prometheus.Desc
availReplicaSendsToTransport *prometheus.Desc
}
const (
availReplicaBytesReceivedFromReplicaPerSec = "Bytes Received from Replica/sec"
availReplicaBytesSentToReplicaPerSec = "Bytes Sent to Replica/sec"
availReplicaBytesSentToTransportPerSec = "Bytes Sent to Transport/sec"
availReplicaFlowControlPerSec = "Flow Control/sec"
availReplicaFlowControlTimeMSPerSec = "Flow Control Time (ms/sec)"
availReplicaReceivesFromReplicaPerSec = "Receives from Replica/sec"
availReplicaResentMessagesPerSec = "Resent Messages/sec"
availReplicaSendsToReplicaPerSec = "Sends to Replica/sec"
availReplicaSendsToTransportPerSec = "Sends to Transport/sec"
)
func (c *Collector) buildAvailabilityReplica() error {
var err error
c.availabilityReplicaPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
availReplicaBytesReceivedFromReplicaPerSec,
availReplicaBytesSentToReplicaPerSec,
availReplicaBytesSentToTransportPerSec,
availReplicaFlowControlPerSec,
availReplicaFlowControlTimeMSPerSec,
availReplicaReceivesFromReplicaPerSec,
availReplicaResentMessagesPerSec,
availReplicaSendsToReplicaPerSec,
availReplicaSendsToTransportPerSec,
}
for sqlInstance := range c.mssqlInstances {
c.availabilityReplicaPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create Availability Replica collector for instance %s: %w", sqlInstance, err)
}
}
// Win32_PerfRawData_{instance}_SQLServerAvailabilityReplica
c.availReplicaBytesReceivedFromReplica = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_received_from_replica_bytes"),
"(AvailabilityReplica.BytesReceivedfromReplica)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaBytesSentToReplica = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_sent_to_replica_bytes"),
"(AvailabilityReplica.BytesSenttoReplica)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaBytesSentToTransport = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_sent_to_transport_bytes"),
"(AvailabilityReplica.BytesSenttoTransport)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaFlowControl = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_initiated_flow_controls"),
"(AvailabilityReplica.FlowControl)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaFlowControlTimeMS = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_flow_control_wait_seconds"),
"(AvailabilityReplica.FlowControlTimems)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaReceivesFromReplica = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_receives_from_replica"),
"(AvailabilityReplica.ReceivesfromReplica)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaResentMessages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_resent_messages"),
"(AvailabilityReplica.ResentMessages)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaSendsToReplica = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_sends_to_replica"),
"(AvailabilityReplica.SendstoReplica)",
[]string{"mssql_instance", "replica"},
nil,
)
c.availReplicaSendsToTransport = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "availreplica_sends_to_transport"),
"(AvailabilityReplica.SendstoTransport)",
[]string{"mssql_instance", "replica"},
nil,
)
return nil
}
func (c *Collector) collectAvailabilityReplica(ch chan<- prometheus.Metric) error {
return c.collect(ch, subCollectorAvailabilityReplica, c.availabilityReplicaPerfDataCollectors, c.collectAvailabilityReplicaInstance)
}
func (c *Collector) collectAvailabilityReplicaInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), err)
}
for replicaName, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.availReplicaBytesReceivedFromReplica,
prometheus.CounterValue,
data[availReplicaBytesReceivedFromReplicaPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaBytesSentToReplica,
prometheus.CounterValue,
data[availReplicaBytesSentToReplicaPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaBytesSentToTransport,
prometheus.CounterValue,
data[availReplicaBytesSentToTransportPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaFlowControl,
prometheus.CounterValue,
data[availReplicaFlowControlPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaFlowControlTimeMS,
prometheus.CounterValue,
utils.MilliSecToSec(data[availReplicaFlowControlTimeMSPerSec].FirstValue),
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaReceivesFromReplica,
prometheus.CounterValue,
data[availReplicaReceivesFromReplicaPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaResentMessages,
prometheus.CounterValue,
data[availReplicaResentMessagesPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaSendsToReplica,
prometheus.CounterValue,
data[availReplicaSendsToReplicaPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.availReplicaSendsToTransport,
prometheus.CounterValue,
data[availReplicaSendsToTransportPerSec].FirstValue,
sqlInstance, replicaName,
)
}
return nil
}
func (c *Collector) closeAvailabilityReplica() {
for _, perfDataCollector := range c.availabilityReplicaPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,426 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorBufferManager struct {
bufManPerfDataCollectors map[string]*perfdata.Collector
bufManBackgroundwriterpages *prometheus.Desc
bufManBuffercachehits *prometheus.Desc
bufManBuffercachelookups *prometheus.Desc
bufManCheckpointpages *prometheus.Desc
bufManDatabasepages *prometheus.Desc
bufManExtensionallocatedpages *prometheus.Desc
bufManExtensionfreepages *prometheus.Desc
bufManExtensioninuseaspercentage *prometheus.Desc
bufManExtensionoutstandingIOcounter *prometheus.Desc
bufManExtensionpageevictions *prometheus.Desc
bufManExtensionpagereads *prometheus.Desc
bufManExtensionpageunreferencedtime *prometheus.Desc
bufManExtensionpagewrites *prometheus.Desc
bufManFreeliststalls *prometheus.Desc
bufManIntegralControllerSlope *prometheus.Desc
bufManLazywrites *prometheus.Desc
bufManPagelifeexpectancy *prometheus.Desc
bufManPagelookups *prometheus.Desc
bufManPagereads *prometheus.Desc
bufManPagewrites *prometheus.Desc
bufManReadaheadpages *prometheus.Desc
bufManReadaheadtime *prometheus.Desc
bufManTargetpages *prometheus.Desc
}
const (
bufManBackgroundWriterPagesPerSec = "Background writer pages/sec"
bufManBufferCacheHitRatio = "Buffer cache hit ratio"
bufManBufferCacheHitRatioBase = "Buffer cache hit ratio base"
bufManCheckpointPagesPerSec = "Checkpoint pages/sec"
bufManDatabasePages = "Database pages"
bufManExtensionAllocatedPages = "Extension allocated pages"
bufManExtensionFreePages = "Extension free pages"
bufManExtensionInUseAsPercentage = "Extension in use as percentage"
bufManExtensionOutstandingIOCounter = "Extension outstanding IO counter"
bufManExtensionPageEvictionsPerSec = "Extension page evictions/sec"
bufManExtensionPageReadsPerSec = "Extension page reads/sec"
bufManExtensionPageUnreferencedTime = "Extension page unreferenced time"
bufManExtensionPageWritesPerSec = "Extension page writes/sec"
bufManFreeListStallsPerSec = "Free list stalls/sec"
bufManIntegralControllerSlope = "Integral Controller Slope"
bufManLazyWritesPerSec = "Lazy writes/sec"
bufManPageLifeExpectancy = "Page life expectancy"
bufManPageLookupsPerSec = "Page lookups/sec"
bufManPageReadsPerSec = "Page reads/sec"
bufManPageWritesPerSec = "Page writes/sec"
bufManReadaheadPagesPerSec = "Readahead pages/sec"
bufManReadaheadTimePerSec = "Readahead time/sec"
bufManTargetPages = "Target pages"
)
func (c *Collector) buildBufferManager() error {
var err error
c.bufManPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
bufManBackgroundWriterPagesPerSec,
bufManBufferCacheHitRatio,
bufManBufferCacheHitRatioBase,
bufManCheckpointPagesPerSec,
bufManDatabasePages,
bufManExtensionAllocatedPages,
bufManExtensionFreePages,
bufManExtensionInUseAsPercentage,
bufManExtensionOutstandingIOCounter,
bufManExtensionPageEvictionsPerSec,
bufManExtensionPageReadsPerSec,
bufManExtensionPageUnreferencedTime,
bufManExtensionPageWritesPerSec,
bufManFreeListStallsPerSec,
bufManIntegralControllerSlope,
bufManLazyWritesPerSec,
bufManPageLifeExpectancy,
bufManPageLookupsPerSec,
bufManPageReadsPerSec,
bufManPageWritesPerSec,
bufManReadaheadPagesPerSec,
bufManReadaheadTimePerSec,
bufManTargetPages,
}
for sqlInstance := range c.mssqlInstances {
c.bufManPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Buffer Manager"), nil, counters)
if err != nil {
return fmt.Errorf("failed to create Buffer Manager collector for instance %s: %w", sqlInstance, err)
}
}
c.bufManBackgroundwriterpages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_background_writer_pages"),
"(BufferManager.Backgroundwriterpages)",
[]string{"mssql_instance"},
nil,
)
c.bufManBuffercachehits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_buffer_cache_hits"),
"(BufferManager.Buffercachehitratio)",
[]string{"mssql_instance"},
nil,
)
c.bufManBuffercachelookups = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_buffer_cache_lookups"),
"(BufferManager.Buffercachehitratio_Base)",
[]string{"mssql_instance"},
nil,
)
c.bufManCheckpointpages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_checkpoint_pages"),
"(BufferManager.Checkpointpages)",
[]string{"mssql_instance"},
nil,
)
c.bufManDatabasepages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_database_pages"),
"(BufferManager.Databasepages)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionallocatedpages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_allocated_pages"),
"(BufferManager.Extensionallocatedpages)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionfreepages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_free_pages"),
"(BufferManager.Extensionfreepages)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensioninuseaspercentage = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_in_use_as_percentage"),
"(BufferManager.Extensioninuseaspercentage)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionoutstandingIOcounter = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_outstanding_io"),
"(BufferManager.ExtensionoutstandingIOcounter)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionpageevictions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_page_evictions"),
"(BufferManager.Extensionpageevictions)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionpagereads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_page_reads"),
"(BufferManager.Extensionpagereads)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionpageunreferencedtime = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_page_unreferenced_seconds"),
"(BufferManager.Extensionpageunreferencedtime)",
[]string{"mssql_instance"},
nil,
)
c.bufManExtensionpagewrites = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_extension_page_writes"),
"(BufferManager.Extensionpagewrites)",
[]string{"mssql_instance"},
nil,
)
c.bufManFreeliststalls = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_free_list_stalls"),
"(BufferManager.Freeliststalls)",
[]string{"mssql_instance"},
nil,
)
c.bufManIntegralControllerSlope = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_integral_controller_slope"),
"(BufferManager.IntegralControllerSlope)",
[]string{"mssql_instance"},
nil,
)
c.bufManLazywrites = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_lazywrites"),
"(BufferManager.Lazywrites)",
[]string{"mssql_instance"},
nil,
)
c.bufManPagelifeexpectancy = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_page_life_expectancy_seconds"),
"(BufferManager.Pagelifeexpectancy)",
[]string{"mssql_instance"},
nil,
)
c.bufManPagelookups = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_page_lookups"),
"(BufferManager.Pagelookups)",
[]string{"mssql_instance"},
nil,
)
c.bufManPagereads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_page_reads"),
"(BufferManager.Pagereads)",
[]string{"mssql_instance"},
nil,
)
c.bufManPagewrites = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_page_writes"),
"(BufferManager.Pagewrites)",
[]string{"mssql_instance"},
nil,
)
c.bufManReadaheadpages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_read_ahead_pages"),
"(BufferManager.Readaheadpages)",
[]string{"mssql_instance"},
nil,
)
c.bufManReadaheadtime = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_read_ahead_issuing_seconds"),
"(BufferManager.Readaheadtime)",
[]string{"mssql_instance"},
nil,
)
c.bufManTargetpages = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "bufman_target_pages"),
"(BufferManager.Targetpages)",
[]string{"mssql_instance"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Buffer Manager"), err)
}
for _, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.bufManBackgroundwriterpages,
prometheus.CounterValue,
data[bufManBackgroundWriterPagesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManBuffercachehits,
prometheus.GaugeValue,
data[bufManBufferCacheHitRatio].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManBuffercachelookups,
prometheus.GaugeValue,
data[bufManBufferCacheHitRatioBase].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManCheckpointpages,
prometheus.CounterValue,
data[bufManCheckpointPagesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManDatabasepages,
prometheus.GaugeValue,
data[bufManDatabasePages].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionallocatedpages,
prometheus.GaugeValue,
data[bufManExtensionAllocatedPages].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionfreepages,
prometheus.GaugeValue,
data[bufManExtensionFreePages].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensioninuseaspercentage,
prometheus.GaugeValue,
data[bufManExtensionInUseAsPercentage].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionoutstandingIOcounter,
prometheus.GaugeValue,
data[bufManExtensionOutstandingIOCounter].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionpageevictions,
prometheus.CounterValue,
data[bufManExtensionPageEvictionsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionpagereads,
prometheus.CounterValue,
data[bufManExtensionPageReadsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionpageunreferencedtime,
prometheus.GaugeValue,
data[bufManExtensionPageUnreferencedTime].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManExtensionpagewrites,
prometheus.CounterValue,
data[bufManExtensionPageWritesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManFreeliststalls,
prometheus.CounterValue,
data[bufManFreeListStallsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManIntegralControllerSlope,
prometheus.GaugeValue,
data[bufManIntegralControllerSlope].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManLazywrites,
prometheus.CounterValue,
data[bufManLazyWritesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManPagelifeexpectancy,
prometheus.GaugeValue,
data[bufManPageLifeExpectancy].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManPagelookups,
prometheus.CounterValue,
data[bufManPageLookupsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManPagereads,
prometheus.CounterValue,
data[bufManPageReadsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManPagewrites,
prometheus.CounterValue,
data[bufManPageWritesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManReadaheadpages,
prometheus.CounterValue,
data[bufManReadaheadPagesPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManReadaheadtime,
prometheus.CounterValue,
data[bufManReadaheadTimePerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.bufManTargetpages,
prometheus.GaugeValue,
data[bufManTargetPages].FirstValue,
sqlInstance,
)
}
return nil
}
func (c *Collector) closeBufferManager() {
for _, perfDataCollectors := range c.bufManPerfDataCollectors {
perfDataCollectors.Close()
}
}

View File

@@ -0,0 +1,826 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorDatabases struct {
databasesPerfDataCollectors map[string]*perfdata.Collector
databasesActiveParallelRedoThreads *prometheus.Desc
databasesActiveTransactions *prometheus.Desc
databasesBackupPerRestoreThroughput *prometheus.Desc
databasesBulkCopyRows *prometheus.Desc
databasesBulkCopyThroughput *prometheus.Desc
databasesCommitTableEntries *prometheus.Desc
databasesDataFilesSizeKB *prometheus.Desc
databasesDBCCLogicalScanBytes *prometheus.Desc
databasesGroupCommitTime *prometheus.Desc
databasesLogBytesFlushed *prometheus.Desc
databasesLogCacheHits *prometheus.Desc
databasesLogCacheLookups *prometheus.Desc
databasesLogCacheReads *prometheus.Desc
databasesLogFilesSizeKB *prometheus.Desc
databasesLogFilesUsedSizeKB *prometheus.Desc
databasesLogFlushes *prometheus.Desc
databasesLogFlushWaits *prometheus.Desc
databasesLogFlushWaitTime *prometheus.Desc
databasesLogFlushWriteTimeMS *prometheus.Desc
databasesLogGrowths *prometheus.Desc
databasesLogPoolCacheMisses *prometheus.Desc
databasesLogPoolDiskReads *prometheus.Desc
databasesLogPoolHashDeletes *prometheus.Desc
databasesLogPoolHashInserts *prometheus.Desc
databasesLogPoolInvalidHashEntry *prometheus.Desc
databasesLogPoolLogScanPushes *prometheus.Desc
databasesLogPoolLogWriterPushes *prometheus.Desc
databasesLogPoolPushEmptyFreePool *prometheus.Desc
databasesLogPoolPushLowMemory *prometheus.Desc
databasesLogPoolPushNoFreeBuffer *prometheus.Desc
databasesLogPoolReqBehindTrunc *prometheus.Desc
databasesLogPoolRequestsOldVLF *prometheus.Desc
databasesLogPoolRequests *prometheus.Desc
databasesLogPoolTotalActiveLogSize *prometheus.Desc
databasesLogPoolTotalSharedPoolSize *prometheus.Desc
databasesLogShrinks *prometheus.Desc
databasesLogTruncations *prometheus.Desc
databasesPercentLogUsed *prometheus.Desc
databasesReplPendingXacts *prometheus.Desc
databasesReplTransRate *prometheus.Desc
databasesShrinkDataMovementBytes *prometheus.Desc
databasesTrackedTransactions *prometheus.Desc
databasesTransactions *prometheus.Desc
databasesWriteTransactions *prometheus.Desc
databasesXTPControllerDLCLatencyPerFetch *prometheus.Desc
databasesXTPControllerDLCPeakLatency *prometheus.Desc
databasesXTPControllerLogProcessed *prometheus.Desc
databasesXTPMemoryUsedKB *prometheus.Desc
}
const (
databasesActiveParallelRedoThreads = "Active parallel redo threads"
databasesActiveTransactions = "Active Transactions"
databasesBackupPerRestoreThroughputPerSec = "Backup/Restore Throughput/sec"
databasesBulkCopyRowsPerSec = "Bulk Copy Rows/sec"
databasesBulkCopyThroughputPerSec = "Bulk Copy Throughput/sec"
databasesCommitTableEntries = "Commit table entries"
databasesDataFilesSizeKB = "Data File(s) Size (KB)"
databasesDBCCLogicalScanBytesPerSec = "DBCC Logical Scan Bytes/sec"
databasesGroupCommitTimePerSec = "Group Commit Time/sec"
databasesLogBytesFlushedPerSec = "Log Bytes Flushed/sec"
databasesLogCacheHitRatio = "Log Cache Hit Ratio"
databasesLogCacheHitRatioBase = "Log Cache Hit Ratio Base"
databasesLogCacheReadsPerSec = "Log Cache Reads/sec"
databasesLogFilesSizeKB = "Log File(s) Size (KB)"
databasesLogFilesUsedSizeKB = "Log File(s) Used Size (KB)"
databasesLogFlushesPerSec = "Log Flushes/sec"
databasesLogFlushWaitsPerSec = "Log Flush Waits/sec"
databasesLogFlushWaitTime = "Log Flush Wait Time"
databasesLogFlushWriteTimeMS = "Log Flush Write Time (ms)"
databasesLogGrowths = "Log Growths"
databasesLogPoolCacheMissesPerSec = "Log Pool Cache Misses/sec"
databasesLogPoolDiskReadsPerSec = "Log Pool Disk Reads/sec"
databasesLogPoolHashDeletesPerSec = "Log Pool Hash Deletes/sec"
databasesLogPoolHashInsertsPerSec = "Log Pool Hash Inserts/sec"
databasesLogPoolInvalidHashEntryPerSec = "Log Pool Invalid Hash Entry/sec"
databasesLogPoolLogScanPushesPerSec = "Log Pool Log Scan Pushes/sec"
databasesLogPoolLogWriterPushesPerSec = "Log Pool LogWriter Pushes/sec"
databasesLogPoolPushEmptyFreePoolPerSec = "Log Pool Push Empty FreePool/sec"
databasesLogPoolPushLowMemoryPerSec = "Log Pool Push Low Memory/sec"
databasesLogPoolPushNoFreeBufferPerSec = "Log Pool Push No Free Buffer/sec"
databasesLogPoolReqBehindTruncPerSec = "Log Pool Req. Behind Trunc/sec"
databasesLogPoolRequestsOldVLFPerSec = "Log Pool Requests Old VLF/sec"
databasesLogPoolRequestsPerSec = "Log Pool Requests/sec"
databasesLogPoolTotalActiveLogSize = "Log Pool Total Active Log Size"
databasesLogPoolTotalSharedPoolSize = "Log Pool Total Shared Pool Size"
databasesLogShrinks = "Log Shrinks"
databasesLogTruncations = "Log Truncations"
databasesPercentLogUsed = "Percent Log Used"
databasesReplPendingXacts = "Repl. Pending Xacts"
databasesReplTransRate = "Repl. Trans. Rate"
databasesShrinkDataMovementBytesPerSec = "Shrink Data Movement Bytes/sec"
databasesTrackedTransactionsPerSec = "Tracked transactions/sec"
databasesTransactionsPerSec = "Transactions/sec"
databasesWriteTransactionsPerSec = "Write Transactions/sec"
databasesXTPControllerDLCLatencyPerFetch = "XTP Controller DLC Latency/Fetch"
databasesXTPControllerDLCPeakLatency = "XTP Controller DLC Peak Latency"
databasesXTPControllerLogProcessedPerSec = "XTP Controller Log Processed/sec"
databasesXTPMemoryUsedKB = "XTP Memory Used (KB)"
)
func (c *Collector) buildDatabases() error {
var err error
c.databasesPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
databasesActiveParallelRedoThreads,
databasesActiveTransactions,
databasesBackupPerRestoreThroughputPerSec,
databasesBulkCopyRowsPerSec,
databasesBulkCopyThroughputPerSec,
databasesCommitTableEntries,
databasesDataFilesSizeKB,
databasesDBCCLogicalScanBytesPerSec,
databasesGroupCommitTimePerSec,
databasesLogBytesFlushedPerSec,
databasesLogCacheHitRatio,
databasesLogCacheHitRatioBase,
databasesLogCacheReadsPerSec,
databasesLogFilesSizeKB,
databasesLogFilesUsedSizeKB,
databasesLogFlushesPerSec,
databasesLogFlushWaitsPerSec,
databasesLogFlushWaitTime,
databasesLogFlushWriteTimeMS,
databasesLogGrowths,
databasesLogPoolCacheMissesPerSec,
databasesLogPoolDiskReadsPerSec,
databasesLogPoolHashDeletesPerSec,
databasesLogPoolHashInsertsPerSec,
databasesLogPoolInvalidHashEntryPerSec,
databasesLogPoolLogScanPushesPerSec,
databasesLogPoolLogWriterPushesPerSec,
databasesLogPoolPushEmptyFreePoolPerSec,
databasesLogPoolPushLowMemoryPerSec,
databasesLogPoolPushNoFreeBufferPerSec,
databasesLogPoolReqBehindTruncPerSec,
databasesLogPoolRequestsOldVLFPerSec,
databasesLogPoolRequestsPerSec,
databasesLogPoolTotalActiveLogSize,
databasesLogPoolTotalSharedPoolSize,
databasesLogShrinks,
databasesLogTruncations,
databasesPercentLogUsed,
databasesReplPendingXacts,
databasesReplTransRate,
databasesShrinkDataMovementBytesPerSec,
databasesTrackedTransactionsPerSec,
databasesTransactionsPerSec,
databasesWriteTransactionsPerSec,
databasesXTPControllerDLCLatencyPerFetch,
databasesXTPControllerDLCPeakLatency,
databasesXTPControllerLogProcessedPerSec,
databasesXTPMemoryUsedKB,
}
for sqlInstance := range c.mssqlInstances {
c.databasesPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Databases"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create Databases collector for instance %s: %w", sqlInstance, err)
}
}
c.databasesActiveParallelRedoThreads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_active_parallel_redo_threads"),
"(Databases.ActiveParallelredothreads)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesActiveTransactions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_active_transactions"),
"(Databases.ActiveTransactions)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesBackupPerRestoreThroughput = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_backup_restore_operations"),
"(Databases.BackupPerRestoreThroughput)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesBulkCopyRows = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_bulk_copy_rows"),
"(Databases.BulkCopyRows)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesBulkCopyThroughput = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_bulk_copy_bytes"),
"(Databases.BulkCopyThroughput)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesCommitTableEntries = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_commit_table_entries"),
"(Databases.Committableentries)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesDataFilesSizeKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_data_files_size_bytes"),
"(Databases.DataFilesSizeKB)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesDBCCLogicalScanBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_dbcc_logical_scan_bytes"),
"(Databases.DBCCLogicalScanBytes)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesGroupCommitTime = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_group_commit_stall_seconds"),
"(Databases.GroupCommitTime)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogBytesFlushed = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_flushed_bytes"),
"(Databases.LogBytesFlushed)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogCacheHits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_cache_hits"),
"(Databases.LogCacheHitRatio)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogCacheLookups = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_cache_lookups"),
"(Databases.LogCacheHitRatio_Base)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogCacheReads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_cache_reads"),
"(Databases.LogCacheReads)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogFilesSizeKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_files_size_bytes"),
"(Databases.LogFilesSizeKB)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogFilesUsedSizeKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_files_used_size_bytes"),
"(Databases.LogFilesUsedSizeKB)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogFlushes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_flushes"),
"(Databases.LogFlushes)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogFlushWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_flush_waits"),
"(Databases.LogFlushWaits)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogFlushWaitTime = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_flush_wait_seconds"),
"(Databases.LogFlushWaitTime)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogFlushWriteTimeMS = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_flush_write_seconds"),
"(Databases.LogFlushWriteTimems)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogGrowths = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_growths"),
"(Databases.LogGrowths)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolCacheMisses = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_cache_misses"),
"(Databases.LogPoolCacheMisses)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolDiskReads = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_disk_reads"),
"(Databases.LogPoolDiskReads)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolHashDeletes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_hash_deletes"),
"(Databases.LogPoolHashDeletes)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolHashInserts = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_hash_inserts"),
"(Databases.LogPoolHashInserts)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolInvalidHashEntry = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_invalid_hash_entries"),
"(Databases.LogPoolInvalidHashEntry)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolLogScanPushes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_log_scan_pushes"),
"(Databases.LogPoolLogScanPushes)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolLogWriterPushes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_log_writer_pushes"),
"(Databases.LogPoolLogWriterPushes)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolPushEmptyFreePool = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_empty_free_pool_pushes"),
"(Databases.LogPoolPushEmptyFreePool)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolPushLowMemory = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_low_memory_pushes"),
"(Databases.LogPoolPushLowMemory)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolPushNoFreeBuffer = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_no_free_buffer_pushes"),
"(Databases.LogPoolPushNoFreeBuffer)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolReqBehindTrunc = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_req_behind_trunc"),
"(Databases.LogPoolReqBehindTrunc)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolRequestsOldVLF = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_requests_old_vlf"),
"(Databases.LogPoolRequestsOldVLF)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_requests"),
"(Databases.LogPoolRequests)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolTotalActiveLogSize = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_total_active_log_bytes"),
"(Databases.LogPoolTotalActiveLogSize)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogPoolTotalSharedPoolSize = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_pool_total_shared_pool_bytes"),
"(Databases.LogPoolTotalSharedPoolSize)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogShrinks = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_shrinks"),
"(Databases.LogShrinks)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesLogTruncations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_truncations"),
"(Databases.LogTruncations)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesPercentLogUsed = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_log_used_percent"),
"(Databases.PercentLogUsed)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesReplPendingXacts = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_pending_repl_transactions"),
"(Databases.ReplPendingTransactions)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesReplTransRate = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_repl_transactions"),
"(Databases.ReplTranactions)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesShrinkDataMovementBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_shrink_data_movement_bytes"),
"(Databases.ShrinkDataMovementBytes)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesTrackedTransactions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_tracked_transactions"),
"(Databases.Trackedtransactions)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesTransactions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_transactions"),
"(Databases.Transactions)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesWriteTransactions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_write_transactions"),
"(Databases.WriteTransactions)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesXTPControllerDLCLatencyPerFetch = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_xtp_controller_dlc_fetch_latency_seconds"),
"(Databases.XTPControllerDLCLatencyPerFetch)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesXTPControllerDLCPeakLatency = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_xtp_controller_dlc_peak_latency_seconds"),
"(Databases.XTPControllerDLCPeakLatency)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesXTPControllerLogProcessed = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_xtp_controller_log_processed_bytes"),
"(Databases.XTPControllerLogProcessed)",
[]string{"mssql_instance", "database"},
nil,
)
c.databasesXTPMemoryUsedKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "databases_xtp_memory_used_bytes"),
"(Databases.XTPMemoryUsedKB)",
[]string{"mssql_instance", "database"},
nil,
)
return nil
}
func (c *Collector) collectDatabases(ch chan<- prometheus.Metric) error {
return c.collect(ch, subCollectorDatabases, c.databasesPerfDataCollectors, c.collectDatabasesInstance)
}
func (c *Collector) collectDatabasesInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Databases"), err)
}
for dbName, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.databasesActiveParallelRedoThreads,
prometheus.GaugeValue,
data[databasesActiveParallelRedoThreads].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesActiveTransactions,
prometheus.GaugeValue,
data[databasesActiveTransactions].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesBackupPerRestoreThroughput,
prometheus.CounterValue,
data[databasesBackupPerRestoreThroughputPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesBulkCopyRows,
prometheus.CounterValue,
data[databasesBulkCopyRowsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesBulkCopyThroughput,
prometheus.CounterValue,
data[databasesBulkCopyThroughputPerSec].FirstValue*1024,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesCommitTableEntries,
prometheus.GaugeValue,
data[databasesCommitTableEntries].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesDataFilesSizeKB,
prometheus.GaugeValue,
data[databasesDataFilesSizeKB].FirstValue*1024,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesDBCCLogicalScanBytes,
prometheus.CounterValue,
data[databasesDBCCLogicalScanBytesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesGroupCommitTime,
prometheus.CounterValue,
data[databasesGroupCommitTimePerSec].FirstValue/1000000.0,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogBytesFlushed,
prometheus.CounterValue,
data[databasesLogBytesFlushedPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogCacheHits,
prometheus.GaugeValue,
data[databasesLogCacheHitRatio].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogCacheLookups,
prometheus.GaugeValue,
data[databasesLogCacheHitRatioBase].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogCacheReads,
prometheus.CounterValue,
data[databasesLogCacheReadsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogFilesSizeKB,
prometheus.GaugeValue,
data[databasesLogFilesSizeKB].FirstValue*1024,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogFilesUsedSizeKB,
prometheus.GaugeValue,
data[databasesLogFilesUsedSizeKB].FirstValue*1024,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogFlushes,
prometheus.CounterValue,
data[databasesLogFlushesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogFlushWaits,
prometheus.CounterValue,
data[databasesLogFlushWaitsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogFlushWaitTime,
prometheus.GaugeValue,
data[databasesLogFlushWaitTime].FirstValue/1000.0,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogFlushWriteTimeMS,
prometheus.GaugeValue,
data[databasesLogFlushWriteTimeMS].FirstValue/1000.0,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogGrowths,
prometheus.GaugeValue,
data[databasesLogGrowths].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolCacheMisses,
prometheus.CounterValue,
data[databasesLogPoolCacheMissesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolDiskReads,
prometheus.CounterValue,
data[databasesLogPoolDiskReadsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolHashDeletes,
prometheus.CounterValue,
data[databasesLogPoolHashDeletesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolHashInserts,
prometheus.CounterValue,
data[databasesLogPoolHashInsertsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolInvalidHashEntry,
prometheus.CounterValue,
data[databasesLogPoolInvalidHashEntryPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolLogScanPushes,
prometheus.CounterValue,
data[databasesLogPoolLogScanPushesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolLogWriterPushes,
prometheus.CounterValue,
data[databasesLogPoolLogWriterPushesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolPushEmptyFreePool,
prometheus.CounterValue,
data[databasesLogPoolPushEmptyFreePoolPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolPushLowMemory,
prometheus.CounterValue,
data[databasesLogPoolPushLowMemoryPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolPushNoFreeBuffer,
prometheus.CounterValue,
data[databasesLogPoolPushNoFreeBufferPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolReqBehindTrunc,
prometheus.CounterValue,
data[databasesLogPoolReqBehindTruncPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolRequestsOldVLF,
prometheus.CounterValue,
data[databasesLogPoolRequestsOldVLFPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolRequests,
prometheus.CounterValue,
data[databasesLogPoolRequestsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolTotalActiveLogSize,
prometheus.GaugeValue,
data[databasesLogPoolTotalActiveLogSize].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogPoolTotalSharedPoolSize,
prometheus.GaugeValue,
data[databasesLogPoolTotalSharedPoolSize].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogShrinks,
prometheus.GaugeValue,
data[databasesLogShrinks].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesLogTruncations,
prometheus.GaugeValue,
data[databasesLogTruncations].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesPercentLogUsed,
prometheus.GaugeValue,
data[databasesPercentLogUsed].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesReplPendingXacts,
prometheus.GaugeValue,
data[databasesReplPendingXacts].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesReplTransRate,
prometheus.CounterValue,
data[databasesReplTransRate].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesShrinkDataMovementBytes,
prometheus.CounterValue,
data[databasesShrinkDataMovementBytesPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesTrackedTransactions,
prometheus.CounterValue,
data[databasesTrackedTransactionsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesTransactions,
prometheus.CounterValue,
data[databasesTransactionsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesWriteTransactions,
prometheus.CounterValue,
data[databasesWriteTransactionsPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesXTPControllerDLCLatencyPerFetch,
prometheus.GaugeValue,
data[databasesXTPControllerDLCLatencyPerFetch].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesXTPControllerDLCPeakLatency,
prometheus.GaugeValue,
data[databasesXTPControllerDLCPeakLatency].FirstValue*1000000.0,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesXTPControllerLogProcessed,
prometheus.CounterValue,
data[databasesXTPControllerLogProcessedPerSec].FirstValue,
sqlInstance, dbName,
)
ch <- prometheus.MustNewConstMetric(
c.databasesXTPMemoryUsedKB,
prometheus.GaugeValue,
data[databasesXTPMemoryUsedKB].FirstValue*1024,
sqlInstance, dbName,
)
}
return nil
}
func (c *Collector) closeDatabases() {
for _, collector := range c.databasesPerfDataCollectors {
collector.Close()
}
}

View File

@@ -0,0 +1,443 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorDatabaseReplica struct {
dbReplicaPerfDataCollectors map[string]*perfdata.Collector
dbReplicaDatabaseFlowControlDelay *prometheus.Desc
dbReplicaDatabaseFlowControls *prometheus.Desc
dbReplicaFileBytesReceived *prometheus.Desc
dbReplicaGroupCommits *prometheus.Desc
dbReplicaGroupCommitTime *prometheus.Desc
dbReplicaLogApplyPendingQueue *prometheus.Desc
dbReplicaLogApplyReadyQueue *prometheus.Desc
dbReplicaLogBytesCompressed *prometheus.Desc
dbReplicaLogBytesDecompressed *prometheus.Desc
dbReplicaLogBytesReceived *prometheus.Desc
dbReplicaLogCompressionCachehits *prometheus.Desc
dbReplicaLogCompressionCachemisses *prometheus.Desc
dbReplicaLogCompressions *prometheus.Desc
dbReplicaLogDecompressions *prometheus.Desc
dbReplicaLogremainingforundo *prometheus.Desc
dbReplicaLogSendQueue *prometheus.Desc
dbReplicaMirroredWritetransactions *prometheus.Desc
dbReplicaRecoveryQueue *prometheus.Desc
dbReplicaRedoblocked *prometheus.Desc
dbReplicaRedoBytesRemaining *prometheus.Desc
dbReplicaRedoneBytes *prometheus.Desc
dbReplicaRedones *prometheus.Desc
dbReplicaTotalLogrequiringundo *prometheus.Desc
dbReplicaTransactionDelay *prometheus.Desc
}
const (
dbReplicaDatabaseFlowControlDelay = "Database Flow Control Delay"
dbReplicaDatabaseFlowControlsPerSec = "Database Flow Controls/sec"
dbReplicaFileBytesReceivedPerSec = "File Bytes Received/sec"
dbReplicaGroupCommitsPerSec = "Group Commits/Sec"
dbReplicaGroupCommitTime = "Group Commit Time"
dbReplicaLogApplyPendingQueue = "Log Apply Pending Queue"
dbReplicaLogApplyReadyQueue = "Log Apply Ready Queue"
dbReplicaLogBytesCompressedPerSec = "Log Bytes Compressed/sec"
dbReplicaLogBytesDecompressedPerSec = "Log Bytes Decompressed/sec"
dbReplicaLogBytesReceivedPerSec = "Log Bytes Received/sec"
dbReplicaLogCompressionCacheHitsPerSec = "Log Compression Cache hits/sec"
dbReplicaLogCompressionCacheMissesPerSec = "Log Compression Cache misses/sec"
dbReplicaLogCompressionsPerSec = "Log Compressions/sec"
dbReplicaLogDecompressionsPerSec = "Log Decompressions/sec"
dbReplicaLogRemainingForUndo = "Log remaining for undo"
dbReplicaLogSendQueue = "Log Send Queue"
dbReplicaMirroredWriteTransactionsPerSec = "Mirrored Write Transactions/sec"
dbReplicaRecoveryQueue = "Recovery Queue"
dbReplicaRedoBlockedPerSec = "Redo blocked/sec"
dbReplicaRedoBytesRemaining = "Redo Bytes Remaining"
dbReplicaRedoneBytesPerSec = "Redone Bytes/sec"
dbReplicaRedonesPerSec = "Redones/sec"
dbReplicaTotalLogRequiringUndo = "Total Log requiring undo"
dbReplicaTransactionDelay = "Transaction Delay"
)
func (c *Collector) buildDatabaseReplica() error {
var err error
c.dbReplicaPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
dbReplicaDatabaseFlowControlDelay,
dbReplicaDatabaseFlowControlsPerSec,
dbReplicaFileBytesReceivedPerSec,
dbReplicaGroupCommitsPerSec,
dbReplicaGroupCommitTime,
dbReplicaLogApplyPendingQueue,
dbReplicaLogApplyReadyQueue,
dbReplicaLogBytesCompressedPerSec,
dbReplicaLogBytesDecompressedPerSec,
dbReplicaLogBytesReceivedPerSec,
dbReplicaLogCompressionCacheHitsPerSec,
dbReplicaLogCompressionCacheMissesPerSec,
dbReplicaLogCompressionsPerSec,
dbReplicaLogDecompressionsPerSec,
dbReplicaLogRemainingForUndo,
dbReplicaLogSendQueue,
dbReplicaMirroredWriteTransactionsPerSec,
dbReplicaRecoveryQueue,
dbReplicaRedoBlockedPerSec,
dbReplicaRedoBytesRemaining,
dbReplicaRedoneBytesPerSec,
dbReplicaRedonesPerSec,
dbReplicaTotalLogRequiringUndo,
dbReplicaTransactionDelay,
}
for sqlInstance := range c.mssqlInstances {
c.dbReplicaPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create Database Replica collector for instance %s: %w", sqlInstance, err)
}
}
// Win32_PerfRawData_{instance}_SQLServerDatabaseReplica
c.dbReplicaDatabaseFlowControlDelay = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_database_flow_control_wait_seconds"),
"(DatabaseReplica.DatabaseFlowControlDelay)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaDatabaseFlowControls = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_database_initiated_flow_controls"),
"(DatabaseReplica.DatabaseFlowControls)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaFileBytesReceived = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_received_file_bytes"),
"(DatabaseReplica.FileBytesReceived)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaGroupCommits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_group_commits"),
"(DatabaseReplica.GroupCommits)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaGroupCommitTime = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_group_commit_stall_seconds"),
"(DatabaseReplica.GroupCommitTime)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogApplyPendingQueue = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_apply_pending_queue"),
"(DatabaseReplica.LogApplyPendingQueue)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogApplyReadyQueue = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_apply_ready_queue"),
"(DatabaseReplica.LogApplyReadyQueue)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogBytesCompressed = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_compressed_bytes"),
"(DatabaseReplica.LogBytesCompressed)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogBytesDecompressed = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_decompressed_bytes"),
"(DatabaseReplica.LogBytesDecompressed)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogBytesReceived = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_received_bytes"),
"(DatabaseReplica.LogBytesReceived)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogCompressionCachehits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_compression_cachehits"),
"(DatabaseReplica.LogCompressionCachehits)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogCompressionCachemisses = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_compression_cachemisses"),
"(DatabaseReplica.LogCompressionCachemisses)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogCompressions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_compressions"),
"(DatabaseReplica.LogCompressions)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogDecompressions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_decompressions"),
"(DatabaseReplica.LogDecompressions)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogremainingforundo = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_remaining_for_undo"),
"(DatabaseReplica.Logremainingforundo)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaLogSendQueue = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_log_send_queue"),
"(DatabaseReplica.LogSendQueue)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaMirroredWritetransactions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_mirrored_write_transactions"),
"(DatabaseReplica.MirroredWriteTransactions)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaRecoveryQueue = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_recovery_queue_records"),
"(DatabaseReplica.RecoveryQueue)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaRedoblocked = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_redo_blocks"),
"(DatabaseReplica.Redoblocked)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaRedoBytesRemaining = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_redo_remaining_bytes"),
"(DatabaseReplica.RedoBytesRemaining)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaRedoneBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_redone_bytes"),
"(DatabaseReplica.RedoneBytes)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaRedones = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_redones"),
"(DatabaseReplica.Redones)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaTotalLogrequiringundo = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_total_log_requiring_undo"),
"(DatabaseReplica.TotalLogrequiringundo)",
[]string{"mssql_instance", "replica"},
nil,
)
c.dbReplicaTransactionDelay = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "dbreplica_transaction_delay_seconds"),
"(DatabaseReplica.TransactionDelay)",
[]string{"mssql_instance", "replica"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), err)
}
for replicaName, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.dbReplicaDatabaseFlowControlDelay,
prometheus.GaugeValue,
data[dbReplicaDatabaseFlowControlDelay].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaDatabaseFlowControls,
prometheus.CounterValue,
data[dbReplicaDatabaseFlowControlsPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaFileBytesReceived,
prometheus.CounterValue,
data[dbReplicaFileBytesReceivedPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaGroupCommits,
prometheus.CounterValue,
data[dbReplicaGroupCommitsPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaGroupCommitTime,
prometheus.GaugeValue,
data[dbReplicaGroupCommitTime].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogApplyPendingQueue,
prometheus.GaugeValue,
data[dbReplicaLogApplyPendingQueue].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogApplyReadyQueue,
prometheus.GaugeValue,
data[dbReplicaLogApplyReadyQueue].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogBytesCompressed,
prometheus.CounterValue,
data[dbReplicaLogBytesCompressedPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogBytesDecompressed,
prometheus.CounterValue,
data[dbReplicaLogBytesDecompressedPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogBytesReceived,
prometheus.CounterValue,
data[dbReplicaLogBytesReceivedPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogCompressionCachehits,
prometheus.CounterValue,
data[dbReplicaLogCompressionCacheHitsPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogCompressionCachemisses,
prometheus.CounterValue,
data[dbReplicaLogCompressionCacheMissesPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogCompressions,
prometheus.CounterValue,
data[dbReplicaLogCompressionsPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogDecompressions,
prometheus.CounterValue,
data[dbReplicaLogDecompressionsPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogremainingforundo,
prometheus.GaugeValue,
data[dbReplicaLogRemainingForUndo].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaLogSendQueue,
prometheus.GaugeValue,
data[dbReplicaLogSendQueue].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaMirroredWritetransactions,
prometheus.CounterValue,
data[dbReplicaMirroredWriteTransactionsPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaRecoveryQueue,
prometheus.GaugeValue,
data[dbReplicaRecoveryQueue].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaRedoblocked,
prometheus.CounterValue,
data[dbReplicaRedoBlockedPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaRedoBytesRemaining,
prometheus.GaugeValue,
data[dbReplicaRedoBytesRemaining].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaRedoneBytes,
prometheus.CounterValue,
data[dbReplicaRedoneBytesPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaRedones,
prometheus.CounterValue,
data[dbReplicaRedonesPerSec].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaTotalLogrequiringundo,
prometheus.GaugeValue,
data[dbReplicaTotalLogRequiringUndo].FirstValue,
sqlInstance, replicaName,
)
ch <- prometheus.MustNewConstMetric(
c.dbReplicaTransactionDelay,
prometheus.GaugeValue,
data[dbReplicaTransactionDelay].FirstValue/1000.0,
sqlInstance, replicaName,
)
}
return nil
}
func (c *Collector) closeDatabaseReplica() {
for _, collector := range c.dbReplicaPerfDataCollectors {
collector.Close()
}
}

View File

@@ -0,0 +1,446 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorGeneralStatistics struct {
genStatsPerfDataCollectors map[string]*perfdata.Collector
genStatsActiveTempTables *prometheus.Desc
genStatsConnectionReset *prometheus.Desc
genStatsEventNotificationsDelayedDrop *prometheus.Desc
genStatsHTTPAuthenticatedRequests *prometheus.Desc
genStatsLogicalConnections *prometheus.Desc
genStatsLogins *prometheus.Desc
genStatsLogouts *prometheus.Desc
genStatsMarsDeadlocks *prometheus.Desc
genStatsNonAtomicYieldRate *prometheus.Desc
genStatsProcessesBlocked *prometheus.Desc
genStatsSOAPEmptyRequests *prometheus.Desc
genStatsSOAPMethodInvocations *prometheus.Desc
genStatsSOAPSessionInitiateRequests *prometheus.Desc
genStatsSOAPSessionTerminateRequests *prometheus.Desc
genStatsSOAPSQLRequests *prometheus.Desc
genStatsSOAPWSDLRequests *prometheus.Desc
genStatsSQLTraceIOProviderLockWaits *prometheus.Desc
genStatsTempDBRecoveryUnitID *prometheus.Desc
genStatsTempDBrowSetID *prometheus.Desc
genStatsTempTablesCreationRate *prometheus.Desc
genStatsTempTablesForDestruction *prometheus.Desc
genStatsTraceEventNotificationQueue *prometheus.Desc
genStatsTransactions *prometheus.Desc
genStatsUserConnections *prometheus.Desc
}
const (
genStatsActiveTempTables = "Active Temp Tables"
genStatsConnectionResetPerSec = "Connection Reset/sec"
genStatsEventNotificationsDelayedDrop = "Event Notifications Delayed Drop"
genStatsHTTPAuthenticatedRequests = "HTTP Authenticated Requests"
genStatsLogicalConnections = "Logical Connections"
genStatsLoginsPerSec = "Logins/sec"
genStatsLogoutsPerSec = "Logouts/sec"
genStatsMarsDeadlocks = "Mars Deadlocks"
genStatsNonatomicYieldRate = "Non-atomic yield rate"
genStatsProcessesBlocked = "Processes blocked"
genStatsSOAPEmptyRequests = "SOAP Empty Requests"
genStatsSOAPMethodInvocations = "SOAP Method Invocations"
genStatsSOAPSessionInitiateRequests = "SOAP Session Initiate Requests"
genStatsSOAPSessionTerminateRequests = "SOAP Session Terminate Requests"
genStatsSOAPSQLRequests = "SOAP SQL Requests"
genStatsSOAPWSDLRequests = "SOAP WSDL Requests"
genStatsSQLTraceIOProviderLockWaits = "SQL Trace IO Provider Lock Waits"
genStatsTempdbRecoveryUnitID = "Tempdb recovery unit id"
genStatsTempdbRowsetID = "Tempdb rowset id"
genStatsTempTablesCreationRate = "Temp Tables Creation Rate"
genStatsTempTablesForDestruction = "Temp Tables For Destruction"
genStatsTraceEventNotificationQueue = "Trace Event Notification Queue"
genStatsTransactions = "Transactions"
genStatsUserConnections = "User Connections"
)
func (c *Collector) buildGeneralStatistics() error {
var err error
c.genStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
genStatsActiveTempTables,
genStatsConnectionResetPerSec,
genStatsEventNotificationsDelayedDrop,
genStatsHTTPAuthenticatedRequests,
genStatsLogicalConnections,
genStatsLoginsPerSec,
genStatsLogoutsPerSec,
genStatsMarsDeadlocks,
genStatsNonatomicYieldRate,
genStatsProcessesBlocked,
genStatsSOAPEmptyRequests,
genStatsSOAPMethodInvocations,
genStatsSOAPSessionInitiateRequests,
genStatsSOAPSessionTerminateRequests,
genStatsSOAPSQLRequests,
genStatsSOAPWSDLRequests,
genStatsSQLTraceIOProviderLockWaits,
genStatsTempdbRecoveryUnitID,
genStatsTempdbRowsetID,
genStatsTempTablesCreationRate,
genStatsTempTablesForDestruction,
genStatsTraceEventNotificationQueue,
genStatsTransactions,
genStatsUserConnections,
}
for sqlInstance := range c.mssqlInstances {
c.genStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), nil, counters)
if err != nil {
return fmt.Errorf("failed to create General Statistics collector for instance %s: %w", sqlInstance, err)
}
}
// Win32_PerfRawData_{instance}_SQLServerGeneralStatistics
c.genStatsActiveTempTables = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_active_temp_tables"),
"(GeneralStatistics.ActiveTempTables)",
[]string{"mssql_instance"},
nil,
)
c.genStatsConnectionReset = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_connection_resets"),
"(GeneralStatistics.ConnectionReset)",
[]string{"mssql_instance"},
nil,
)
c.genStatsEventNotificationsDelayedDrop = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_event_notifications_delayed_drop"),
"(GeneralStatistics.EventNotificationsDelayedDrop)",
[]string{"mssql_instance"},
nil,
)
c.genStatsHTTPAuthenticatedRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_http_authenticated_requests"),
"(GeneralStatistics.HTTPAuthenticatedRequests)",
[]string{"mssql_instance"},
nil,
)
c.genStatsLogicalConnections = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_logical_connections"),
"(GeneralStatistics.LogicalConnections)",
[]string{"mssql_instance"},
nil,
)
c.genStatsLogins = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_logins"),
"(GeneralStatistics.Logins)",
[]string{"mssql_instance"},
nil,
)
c.genStatsLogouts = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_logouts"),
"(GeneralStatistics.Logouts)",
[]string{"mssql_instance"},
nil,
)
c.genStatsMarsDeadlocks = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_mars_deadlocks"),
"(GeneralStatistics.MarsDeadlocks)",
[]string{"mssql_instance"},
nil,
)
c.genStatsNonAtomicYieldRate = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_non_atomic_yields"),
"(GeneralStatistics.Nonatomicyields)",
[]string{"mssql_instance"},
nil,
)
c.genStatsProcessesBlocked = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_blocked_processes"),
"(GeneralStatistics.Processesblocked)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSOAPEmptyRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_empty_requests"),
"(GeneralStatistics.SOAPEmptyRequests)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSOAPMethodInvocations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_method_invocations"),
"(GeneralStatistics.SOAPMethodInvocations)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSOAPSessionInitiateRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_session_initiate_requests"),
"(GeneralStatistics.SOAPSessionInitiateRequests)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSOAPSessionTerminateRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_session_terminate_requests"),
"(GeneralStatistics.SOAPSessionTerminateRequests)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSOAPSQLRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_soapsql_requests"),
"(GeneralStatistics.SOAPSQLRequests)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSOAPWSDLRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_soapwsdl_requests"),
"(GeneralStatistics.SOAPWSDLRequests)",
[]string{"mssql_instance"},
nil,
)
c.genStatsSQLTraceIOProviderLockWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_sql_trace_io_provider_lock_waits"),
"(GeneralStatistics.SQLTraceIOProviderLockWaits)",
[]string{"mssql_instance"},
nil,
)
c.genStatsTempDBRecoveryUnitID = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_tempdb_recovery_unit_ids_generated"),
"(GeneralStatistics.Tempdbrecoveryunitid)",
[]string{"mssql_instance"},
nil,
)
c.genStatsTempDBrowSetID = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_tempdb_rowset_ids_generated"),
"(GeneralStatistics.Tempdbrowsetid)",
[]string{"mssql_instance"},
nil,
)
c.genStatsTempTablesCreationRate = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_temp_tables_creations"),
"(GeneralStatistics.TempTablesCreations)",
[]string{"mssql_instance"},
nil,
)
c.genStatsTempTablesForDestruction = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_temp_tables_awaiting_destruction"),
"(GeneralStatistics.TempTablesForDestruction)",
[]string{"mssql_instance"},
nil,
)
c.genStatsTraceEventNotificationQueue = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_trace_event_notification_queue_size"),
"(GeneralStatistics.TraceEventNotificationQueue)",
[]string{"mssql_instance"},
nil,
)
c.genStatsTransactions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_transactions"),
"(GeneralStatistics.Transactions)",
[]string{"mssql_instance"},
nil,
)
c.genStatsUserConnections = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "genstats_user_connections"),
"(GeneralStatistics.UserConnections)",
[]string{"mssql_instance"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), err)
}
data, ok := perfData[perfdata.EmptyInstance]
if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"))
}
ch <- prometheus.MustNewConstMetric(
c.genStatsActiveTempTables,
prometheus.GaugeValue,
data[genStatsActiveTempTables].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsConnectionReset,
prometheus.CounterValue,
data[genStatsConnectionResetPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsEventNotificationsDelayedDrop,
prometheus.GaugeValue,
data[genStatsEventNotificationsDelayedDrop].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsHTTPAuthenticatedRequests,
prometheus.GaugeValue,
data[genStatsHTTPAuthenticatedRequests].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsLogicalConnections,
prometheus.GaugeValue,
data[genStatsLogicalConnections].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsLogins,
prometheus.CounterValue,
data[genStatsLoginsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsLogouts,
prometheus.CounterValue,
data[genStatsLogoutsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsMarsDeadlocks,
prometheus.GaugeValue,
data[genStatsMarsDeadlocks].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsNonAtomicYieldRate,
prometheus.CounterValue,
data[genStatsNonatomicYieldRate].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsProcessesBlocked,
prometheus.GaugeValue,
data[genStatsProcessesBlocked].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSOAPEmptyRequests,
prometheus.GaugeValue,
data[genStatsSOAPEmptyRequests].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSOAPMethodInvocations,
prometheus.GaugeValue,
data[genStatsSOAPMethodInvocations].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSOAPSessionInitiateRequests,
prometheus.GaugeValue,
data[genStatsSOAPSessionInitiateRequests].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSOAPSessionTerminateRequests,
prometheus.GaugeValue,
data[genStatsSOAPSessionTerminateRequests].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSOAPSQLRequests,
prometheus.GaugeValue,
data[genStatsSOAPSQLRequests].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSOAPWSDLRequests,
prometheus.GaugeValue,
data[genStatsSOAPWSDLRequests].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsSQLTraceIOProviderLockWaits,
prometheus.GaugeValue,
data[genStatsSQLTraceIOProviderLockWaits].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsTempDBRecoveryUnitID,
prometheus.GaugeValue,
data[genStatsTempdbRecoveryUnitID].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsTempDBrowSetID,
prometheus.GaugeValue,
data[genStatsTempdbRowsetID].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsTempTablesCreationRate,
prometheus.CounterValue,
data[genStatsTempTablesCreationRate].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsTempTablesForDestruction,
prometheus.GaugeValue,
data[genStatsTempTablesForDestruction].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsTraceEventNotificationQueue,
prometheus.GaugeValue,
data[genStatsTraceEventNotificationQueue].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsTransactions,
prometheus.GaugeValue,
data[genStatsTransactions].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.genStatsUserConnections,
prometheus.GaugeValue,
data[genStatsUserConnections].FirstValue,
sqlInstance,
)
return nil
}
func (c *Collector) closeGeneralStatistics() {
for _, perfDataCollector := range c.genStatsPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,187 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorLocks struct {
locksPerfDataCollectors map[string]*perfdata.Collector
// Win32_PerfRawData_{instance}_SQLServerLocks
locksWaitTime *prometheus.Desc
locksCount *prometheus.Desc
locksLockRequests *prometheus.Desc
locksLockTimeouts *prometheus.Desc
locksLockTimeoutstimeout0 *prometheus.Desc
locksLockWaits *prometheus.Desc
locksLockWaitTimeMS *prometheus.Desc
locksNumberOfDeadlocks *prometheus.Desc
}
const (
locksAverageWaitTimeMS = "Average Wait Time (ms)"
locksAverageWaitTimeMSBase = "Average Wait Time Base"
locksLockRequestsPerSec = "Lock Requests/sec"
locksLockTimeoutsPerSec = "Lock Timeouts/sec"
locksLockTimeoutsTimeout0PerSec = "Lock Timeouts (timeout > 0)/sec"
locksLockWaitsPerSec = "Lock Waits/sec"
locksLockWaitTimeMS = "Lock Wait Time (ms)"
locksNumberOfDeadlocksPerSec = "Number of Deadlocks/sec"
)
func (c *Collector) buildLocks() error {
var err error
c.locksPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
locksAverageWaitTimeMS,
locksAverageWaitTimeMSBase,
locksLockRequestsPerSec,
locksLockTimeoutsPerSec,
locksLockTimeoutsTimeout0PerSec,
locksLockWaitsPerSec,
locksLockWaitTimeMS,
locksNumberOfDeadlocksPerSec,
}
for sqlInstance := range c.mssqlInstances {
c.locksPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Locks"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance, err)
}
}
c.locksWaitTime = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_wait_time_seconds"),
"(Locks.AverageWaitTimems Total time in seconds which locks have been holding resources)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksCount = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_count"),
"(Locks.AverageWaitTimems_Base count of how often requests have run into locks)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksLockRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_lock_requests"),
"(Locks.LockRequests)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksLockTimeouts = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_lock_timeouts"),
"(Locks.LockTimeouts)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksLockTimeoutstimeout0 = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_lock_timeouts_excluding_NOWAIT"),
"(Locks.LockTimeoutstimeout0)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksLockWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_lock_waits"),
"(Locks.LockWaits)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksLockWaitTimeMS = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_lock_wait_seconds"),
"(Locks.LockWaitTimems)",
[]string{"mssql_instance", "resource"},
nil,
)
c.locksNumberOfDeadlocks = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "locks_deadlocks"),
"(Locks.NumberOfDeadlocks)",
[]string{"mssql_instance", "resource"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Locks"), err)
}
for lockResourceName, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.locksWaitTime,
prometheus.GaugeValue,
data[locksAverageWaitTimeMS].FirstValue/1000.0,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksCount,
prometheus.GaugeValue,
data[locksAverageWaitTimeMSBase].FirstValue/1000.0,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksLockRequests,
prometheus.CounterValue,
data[locksLockRequestsPerSec].FirstValue,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksLockTimeouts,
prometheus.CounterValue,
data[locksLockTimeoutsPerSec].FirstValue,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksLockTimeoutstimeout0,
prometheus.CounterValue,
data[locksLockTimeoutsTimeout0PerSec].FirstValue,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksLockWaits,
prometheus.CounterValue,
data[locksLockWaitsPerSec].FirstValue,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksLockWaitTimeMS,
prometheus.GaugeValue,
data[locksLockWaitTimeMS].FirstValue/1000.0,
sqlInstance, lockResourceName,
)
ch <- prometheus.MustNewConstMetric(
c.locksNumberOfDeadlocks,
prometheus.CounterValue,
data[locksNumberOfDeadlocksPerSec].FirstValue,
sqlInstance, lockResourceName,
)
}
return nil
}
func (c *Collector) closeLocks() {
for _, perfDataCollector := range c.locksPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,381 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorMemoryManager struct {
memMgrPerfDataCollectors map[string]*perfdata.Collector
memMgrConnectionMemoryKB *prometheus.Desc
memMgrDatabaseCacheMemoryKB *prometheus.Desc
memMgrExternalBenefitOfMemory *prometheus.Desc
memMgrFreeMemoryKB *prometheus.Desc
memMgrGrantedWorkspaceMemoryKB *prometheus.Desc
memMgrLockBlocks *prometheus.Desc
memMgrLockBlocksAllocated *prometheus.Desc
memMgrLockMemoryKB *prometheus.Desc
memMgrLockOwnerBlocks *prometheus.Desc
memMgrLockOwnerBlocksAllocated *prometheus.Desc
memMgrLogPoolMemoryKB *prometheus.Desc
memMgrMaximumWorkspaceMemoryKB *prometheus.Desc
memMgrMemoryGrantsOutstanding *prometheus.Desc
memMgrMemoryGrantsPending *prometheus.Desc
memMgrOptimizerMemoryKB *prometheus.Desc
memMgrReservedServerMemoryKB *prometheus.Desc
memMgrSQLCacheMemoryKB *prometheus.Desc
memMgrStolenServerMemoryKB *prometheus.Desc
memMgrTargetServerMemoryKB *prometheus.Desc
memMgrTotalServerMemoryKB *prometheus.Desc
}
const (
memMgrConnectionMemoryKB = "Connection Memory (KB)"
memMgrDatabaseCacheMemoryKB = "Database Cache Memory (KB)"
memMgrExternalBenefitOfMemory = "External benefit of memory"
memMgrFreeMemoryKB = "Free Memory (KB)"
memMgrGrantedWorkspaceMemoryKB = "Granted Workspace Memory (KB)"
memMgrLockBlocks = "Lock Blocks"
memMgrLockBlocksAllocated = "Lock Blocks Allocated"
memMgrLockMemoryKB = "Lock Memory (KB)"
memMgrLockOwnerBlocks = "Lock Owner Blocks"
memMgrLockOwnerBlocksAllocated = "Lock Owner Blocks Allocated"
memMgrLogPoolMemoryKB = "Log Pool Memory (KB)"
memMgrMaximumWorkspaceMemoryKB = "Maximum Workspace Memory (KB)"
memMgrMemoryGrantsOutstanding = "Memory Grants Outstanding"
memMgrMemoryGrantsPending = "Memory Grants Pending"
memMgrOptimizerMemoryKB = "Optimizer Memory (KB)"
memMgrReservedServerMemoryKB = "Reserved Server Memory (KB)"
memMgrSQLCacheMemoryKB = "SQL Cache Memory (KB)"
memMgrStolenServerMemoryKB = "Stolen Server Memory (KB)"
memMgrTargetServerMemoryKB = "Target Server Memory (KB)"
memMgrTotalServerMemoryKB = "Total Server Memory (KB)"
)
func (c *Collector) buildMemoryManager() error {
var err error
c.memMgrPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
memMgrConnectionMemoryKB,
memMgrDatabaseCacheMemoryKB,
memMgrExternalBenefitOfMemory,
memMgrFreeMemoryKB,
memMgrGrantedWorkspaceMemoryKB,
memMgrLockBlocks,
memMgrLockBlocksAllocated,
memMgrLockMemoryKB,
memMgrLockOwnerBlocks,
memMgrLockOwnerBlocksAllocated,
memMgrLogPoolMemoryKB,
memMgrMaximumWorkspaceMemoryKB,
memMgrMemoryGrantsOutstanding,
memMgrMemoryGrantsPending,
memMgrOptimizerMemoryKB,
memMgrReservedServerMemoryKB,
memMgrSQLCacheMemoryKB,
memMgrStolenServerMemoryKB,
memMgrTargetServerMemoryKB,
memMgrTotalServerMemoryKB,
}
for sqlInstance := range c.mssqlInstances {
c.memMgrPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance, err)
}
}
c.memMgrConnectionMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_connection_memory_bytes"),
"(MemoryManager.ConnectionMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrDatabaseCacheMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_database_cache_memory_bytes"),
"(MemoryManager.DatabaseCacheMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrExternalBenefitOfMemory = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_external_benefit_of_memory"),
"(MemoryManager.Externalbenefitofmemory)",
[]string{"mssql_instance"},
nil,
)
c.memMgrFreeMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_free_memory_bytes"),
"(MemoryManager.FreeMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrGrantedWorkspaceMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_granted_workspace_memory_bytes"),
"(MemoryManager.GrantedWorkspaceMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrLockBlocks = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_lock_blocks"),
"(MemoryManager.LockBlocks)",
[]string{"mssql_instance"},
nil,
)
c.memMgrLockBlocksAllocated = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_allocated_lock_blocks"),
"(MemoryManager.LockBlocksAllocated)",
[]string{"mssql_instance"},
nil,
)
c.memMgrLockMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_lock_memory_bytes"),
"(MemoryManager.LockMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrLockOwnerBlocks = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_lock_owner_blocks"),
"(MemoryManager.LockOwnerBlocks)",
[]string{"mssql_instance"},
nil,
)
c.memMgrLockOwnerBlocksAllocated = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_allocated_lock_owner_blocks"),
"(MemoryManager.LockOwnerBlocksAllocated)",
[]string{"mssql_instance"},
nil,
)
c.memMgrLogPoolMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_log_pool_memory_bytes"),
"(MemoryManager.LogPoolMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrMaximumWorkspaceMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_maximum_workspace_memory_bytes"),
"(MemoryManager.MaximumWorkspaceMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrMemoryGrantsOutstanding = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_outstanding_memory_grants"),
"(MemoryManager.MemoryGrantsOutstanding)",
[]string{"mssql_instance"},
nil,
)
c.memMgrMemoryGrantsPending = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_pending_memory_grants"),
"(MemoryManager.MemoryGrantsPending)",
[]string{"mssql_instance"},
nil,
)
c.memMgrOptimizerMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_optimizer_memory_bytes"),
"(MemoryManager.OptimizerMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrReservedServerMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_reserved_server_memory_bytes"),
"(MemoryManager.ReservedServerMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrSQLCacheMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_sql_cache_memory_bytes"),
"(MemoryManager.SQLCacheMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrStolenServerMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_stolen_server_memory_bytes"),
"(MemoryManager.StolenServerMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrTargetServerMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_target_server_memory_bytes"),
"(MemoryManager.TargetServerMemoryKB)",
[]string{"mssql_instance"},
nil,
)
c.memMgrTotalServerMemoryKB = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "memmgr_total_server_memory_bytes"),
"(MemoryManager.TotalServerMemoryKB)",
[]string{"mssql_instance"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), err)
}
data, ok := perfData[perfdata.EmptyInstance]
if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"))
}
ch <- prometheus.MustNewConstMetric(
c.memMgrConnectionMemoryKB,
prometheus.GaugeValue,
data[memMgrConnectionMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrDatabaseCacheMemoryKB,
prometheus.GaugeValue,
data[memMgrDatabaseCacheMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrExternalBenefitOfMemory,
prometheus.GaugeValue,
data[memMgrExternalBenefitOfMemory].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrFreeMemoryKB,
prometheus.GaugeValue,
data[memMgrFreeMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrGrantedWorkspaceMemoryKB,
prometheus.GaugeValue,
data[memMgrGrantedWorkspaceMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrLockBlocks,
prometheus.GaugeValue,
data[memMgrLockBlocks].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrLockBlocksAllocated,
prometheus.GaugeValue,
data[memMgrLockBlocksAllocated].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrLockMemoryKB,
prometheus.GaugeValue,
data[memMgrLockMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrLockOwnerBlocks,
prometheus.GaugeValue,
data[memMgrLockOwnerBlocks].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrLockOwnerBlocksAllocated,
prometheus.GaugeValue,
data[memMgrLockOwnerBlocksAllocated].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrLogPoolMemoryKB,
prometheus.GaugeValue,
data[memMgrLogPoolMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrMaximumWorkspaceMemoryKB,
prometheus.GaugeValue,
data[memMgrMaximumWorkspaceMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrMemoryGrantsOutstanding,
prometheus.GaugeValue,
data[memMgrMemoryGrantsOutstanding].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrMemoryGrantsPending,
prometheus.GaugeValue,
data[memMgrMemoryGrantsPending].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrOptimizerMemoryKB,
prometheus.GaugeValue,
data[memMgrOptimizerMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrReservedServerMemoryKB,
prometheus.GaugeValue,
data[memMgrReservedServerMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrSQLCacheMemoryKB,
prometheus.GaugeValue,
data[memMgrSQLCacheMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrStolenServerMemoryKB,
prometheus.GaugeValue,
data[memMgrStolenServerMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrTargetServerMemoryKB,
prometheus.GaugeValue,
data[memMgrTargetServerMemoryKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.memMgrTotalServerMemoryKB,
prometheus.GaugeValue,
data[memMgrTotalServerMemoryKB].FirstValue*1024,
sqlInstance,
)
return nil
}
func (c *Collector) closeMemoryManager() {
for _, perfDataCollector := range c.memMgrPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,76 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorSQLErrors struct {
sqlErrorsPerfDataCollectors map[string]*perfdata.Collector
// Win32_PerfRawData_{instance}_SQLServerSQLErrors
sqlErrorsTotal *prometheus.Desc
}
const (
sqlErrorsErrorsPerSec = "Errors/sec"
)
func (c *Collector) buildSQLErrors() error {
var err error
c.genStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
sqlErrorsErrorsPerSec,
}
for sqlInstance := range c.mssqlInstances {
c.genStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create SQL Errors collector for instance %s: %w", sqlInstance, err)
}
}
// Win32_PerfRawData_{instance}_SQLServerSQLErrors
c.sqlErrorsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sql_errors_total"),
"(SQLErrors.Total)",
[]string{"mssql_instance", "resource"},
nil,
)
return nil
}
func (c *Collector) collectSQLErrors(ch chan<- prometheus.Metric) error {
return c.collect(ch, subCollectorSQLErrors, c.dbReplicaPerfDataCollectors, c.collectSQLErrorsInstance)
}
func (c *Collector) collectSQLErrorsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), err)
}
for resource, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.sqlErrorsTotal,
prometheus.CounterValue,
data[sqlErrorsErrorsPerSec].FirstValue,
sqlInstance, resource,
)
}
return nil
}
func (c *Collector) closeSQLErrors() {
for _, perfDataCollector := range c.sqlErrorsPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,237 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorSQLStats struct {
sqlStatsPerfDataCollectors map[string]*perfdata.Collector
sqlStatsAutoParamAttempts *prometheus.Desc
sqlStatsBatchRequests *prometheus.Desc
sqlStatsFailedAutoParams *prometheus.Desc
sqlStatsForcedParameterizations *prometheus.Desc
sqlStatsGuidedplanexecutions *prometheus.Desc
sqlStatsMisguidedplanexecutions *prometheus.Desc
sqlStatsSafeAutoParams *prometheus.Desc
sqlStatsSQLAttentionrate *prometheus.Desc
sqlStatsSQLCompilations *prometheus.Desc
sqlStatsSQLReCompilations *prometheus.Desc
sqlStatsUnsafeAutoParams *prometheus.Desc
}
const (
sqlStatsAutoParamAttemptsPerSec = "Auto-Param Attempts/sec"
sqlStatsBatchRequestsPerSec = "Batch Requests/sec"
sqlStatsFailedAutoParamsPerSec = "Failed Auto-Params/sec"
sqlStatsForcedParameterizationsPerSec = "Forced Parameterizations/sec"
sqlStatsGuidedplanexecutionsPerSec = "Guided plan executions/sec"
sqlStatsMisguidedplanexecutionsPerSec = "Misguided plan executions/sec"
sqlStatsSafeAutoParamsPerSec = "Safe Auto-Params/sec"
sqlStatsSQLAttentionrate = "SQL Attention rate"
sqlStatsSQLCompilationsPerSec = "SQL Compilations/sec"
sqlStatsSQLReCompilationsPerSec = "SQL Re-Compilations/sec"
sqlStatsUnsafeAutoParamsPerSec = "Unsafe Auto-Params/sec"
)
func (c *Collector) buildSQLStats() error {
var err error
c.genStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
sqlStatsAutoParamAttemptsPerSec,
sqlStatsBatchRequestsPerSec,
sqlStatsFailedAutoParamsPerSec,
sqlStatsForcedParameterizationsPerSec,
sqlStatsGuidedplanexecutionsPerSec,
sqlStatsMisguidedplanexecutionsPerSec,
sqlStatsSafeAutoParamsPerSec,
sqlStatsSQLAttentionrate,
sqlStatsSQLCompilationsPerSec,
sqlStatsSQLReCompilationsPerSec,
sqlStatsUnsafeAutoParamsPerSec,
}
for sqlInstance := range c.mssqlInstances {
c.genStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), nil, counters)
if err != nil {
return fmt.Errorf("failed to create SQL Statistics collector for instance %s: %w", sqlInstance, err)
}
}
c.sqlStatsAutoParamAttempts = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_auto_parameterization_attempts"),
"(SQLStatistics.AutoParamAttempts)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsBatchRequests = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_batch_requests"),
"(SQLStatistics.BatchRequests)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsFailedAutoParams = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_failed_auto_parameterization_attempts"),
"(SQLStatistics.FailedAutoParams)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsForcedParameterizations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_forced_parameterizations"),
"(SQLStatistics.ForcedParameterizations)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsGuidedplanexecutions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_guided_plan_executions"),
"(SQLStatistics.Guidedplanexecutions)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsMisguidedplanexecutions = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_misguided_plan_executions"),
"(SQLStatistics.Misguidedplanexecutions)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsSafeAutoParams = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_safe_auto_parameterization_attempts"),
"(SQLStatistics.SafeAutoParams)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsSQLAttentionrate = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_sql_attentions"),
"(SQLStatistics.SQLAttentions)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsSQLCompilations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_sql_compilations"),
"(SQLStatistics.SQLCompilations)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsSQLReCompilations = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_sql_recompilations"),
"(SQLStatistics.SQLReCompilations)",
[]string{"mssql_instance"},
nil,
)
c.sqlStatsUnsafeAutoParams = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "sqlstats_unsafe_auto_parameterization_attempts"),
"(SQLStatistics.UnsafeAutoParams)",
[]string{"mssql_instance"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), err)
}
data, ok := perfData[perfdata.EmptyInstance]
if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"))
}
ch <- prometheus.MustNewConstMetric(
c.sqlStatsAutoParamAttempts,
prometheus.CounterValue,
data[sqlStatsAutoParamAttemptsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsBatchRequests,
prometheus.CounterValue,
data[sqlStatsBatchRequestsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsFailedAutoParams,
prometheus.CounterValue,
data[sqlStatsFailedAutoParamsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsForcedParameterizations,
prometheus.CounterValue,
data[sqlStatsForcedParameterizationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsGuidedplanexecutions,
prometheus.CounterValue,
data[sqlStatsGuidedplanexecutionsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsMisguidedplanexecutions,
prometheus.CounterValue,
data[sqlStatsMisguidedplanexecutionsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsSafeAutoParams,
prometheus.CounterValue,
data[sqlStatsSafeAutoParamsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsSQLAttentionrate,
prometheus.CounterValue,
data[sqlStatsSQLAttentionrate].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsSQLCompilations,
prometheus.CounterValue,
data[sqlStatsSQLCompilationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsSQLReCompilations,
prometheus.CounterValue,
data[sqlStatsSQLReCompilationsPerSec].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.sqlStatsUnsafeAutoParams,
prometheus.CounterValue,
data[sqlStatsUnsafeAutoParamsPerSec].FirstValue,
sqlInstance,
)
return nil
}
func (c *Collector) closeSQLStats() {
for _, perfDataCollector := range c.sqlStatsPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -1,10 +1,12 @@
//go:build windows
package mssql_test
import (
"testing"
"github.com/prometheus-community/windows_exporter/internal/collector/mssql"
"github.com/prometheus-community/windows_exporter/internal/testutils"
"github.com/prometheus-community/windows_exporter/internal/utils/testutils"
)
func BenchmarkCollector(b *testing.B) {

View File

@@ -0,0 +1,271 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorTransactions struct {
transactionsPerfDataCollectors map[string]*perfdata.Collector
transactionsTempDbFreeSpaceBytes *prometheus.Desc
transactionsLongestTransactionRunningSeconds *prometheus.Desc
transactionsNonSnapshotVersionActiveTotal *prometheus.Desc
transactionsSnapshotActiveTotal *prometheus.Desc
transactionsActive *prometheus.Desc
transactionsUpdateConflictsTotal *prometheus.Desc
transactionsUpdateSnapshotActiveTotal *prometheus.Desc
transactionsVersionCleanupRateBytes *prometheus.Desc
transactionsVersionGenerationRateBytes *prometheus.Desc
transactionsVersionStoreSizeBytes *prometheus.Desc
transactionsVersionStoreUnits *prometheus.Desc
transactionsVersionStoreCreationUnits *prometheus.Desc
transactionsVersionStoreTruncationUnits *prometheus.Desc
}
const (
transactionsFreeSpaceintempdbKB = "Free Space in tempdb (KB)"
transactionsLongestTransactionRunningTime = "Longest Transaction Running Time"
transactionsNonSnapshotVersionTransactions = "NonSnapshot Version Transactions"
transactionsSnapshotTransactions = "Snapshot Transactions"
transactionsTransactions = "Transactions"
transactionsUpdateconflictratio = "Update conflict ratio"
transactionsUpdateSnapshotTransactions = "Update Snapshot Transactions"
transactionsVersionCleanuprateKBPers = "Version Cleanup rate (KB/s)"
transactionsVersionGenerationrateKBPers = "Version Generation rate (KB/s)"
transactionsVersionStoreSizeKB = "Version Store Size (KB)"
transactionsVersionStoreunitcount = "Version Store unit count"
transactionsVersionStoreunitcreation = "Version Store unit creation"
transactionsVersionStoreunittruncation = "Version Store unit truncation"
)
func (c *Collector) buildTransactions() error {
var err error
c.transactionsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
transactionsFreeSpaceintempdbKB,
transactionsLongestTransactionRunningTime,
transactionsNonSnapshotVersionTransactions,
transactionsSnapshotTransactions,
transactionsTransactions,
transactionsUpdateconflictratio,
transactionsUpdateSnapshotTransactions,
transactionsVersionCleanuprateKBPers,
transactionsVersionGenerationrateKBPers,
transactionsVersionStoreSizeKB,
transactionsVersionStoreunitcount,
transactionsVersionStoreunitcreation,
transactionsVersionStoreunittruncation,
}
for sqlInstance := range c.mssqlInstances {
c.transactionsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), nil, counters)
if err != nil {
return fmt.Errorf("failed to create Transactions collector for instance %s: %w", sqlInstance, err)
}
}
c.transactionsTempDbFreeSpaceBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_tempdb_free_space_bytes"),
"(Transactions.FreeSpaceInTempDbKB)",
[]string{"mssql_instance"},
nil,
)
c.transactionsLongestTransactionRunningSeconds = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_longest_transaction_running_seconds"),
"(Transactions.LongestTransactionRunningTime)",
[]string{"mssql_instance"},
nil,
)
c.transactionsNonSnapshotVersionActiveTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_nonsnapshot_version_active_total"),
"(Transactions.NonSnapshotVersionTransactions)",
[]string{"mssql_instance"},
nil,
)
c.transactionsSnapshotActiveTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_snapshot_active_total"),
"(Transactions.SnapshotTransactions)",
[]string{"mssql_instance"},
nil,
)
c.transactionsActive = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_active"),
"(Transactions.Transactions)",
[]string{"mssql_instance"},
nil,
)
c.transactionsUpdateConflictsTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_update_conflicts_total"),
"(Transactions.UpdateConflictRatio)",
[]string{"mssql_instance"},
nil,
)
c.transactionsUpdateSnapshotActiveTotal = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_update_snapshot_active_total"),
"(Transactions.UpdateSnapshotTransactions)",
[]string{"mssql_instance"},
nil,
)
c.transactionsVersionCleanupRateBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_version_cleanup_rate_bytes"),
"(Transactions.VersionCleanupRateKBs)",
[]string{"mssql_instance"},
nil,
)
c.transactionsVersionGenerationRateBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_version_generation_rate_bytes"),
"(Transactions.VersionGenerationRateKBs)",
[]string{"mssql_instance"},
nil,
)
c.transactionsVersionStoreSizeBytes = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_version_store_size_bytes"),
"(Transactions.VersionStoreSizeKB)",
[]string{"mssql_instance"},
nil,
)
c.transactionsVersionStoreUnits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_version_store_units"),
"(Transactions.VersionStoreUnitCount)",
[]string{"mssql_instance"},
nil,
)
c.transactionsVersionStoreCreationUnits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_version_store_creation_units"),
"(Transactions.VersionStoreUnitCreation)",
[]string{"mssql_instance"},
nil,
)
c.transactionsVersionStoreTruncationUnits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "transactions_version_store_truncation_units"),
"(Transactions.VersionStoreUnitTruncation)",
[]string{"mssql_instance"},
nil,
)
return nil
}
func (c *Collector) collectTransactions(ch chan<- prometheus.Metric) error {
return c.collect(ch, subCollectorTransactions, c.transactionsPerfDataCollectors, c.collectTransactionsInstance)
}
// 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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), err)
}
data, ok := perfData[perfdata.EmptyInstance]
if !ok {
return fmt.Errorf("perflib query for %s returned empty result set", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"))
}
ch <- prometheus.MustNewConstMetric(
c.transactionsTempDbFreeSpaceBytes,
prometheus.GaugeValue,
data[transactionsFreeSpaceintempdbKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsLongestTransactionRunningSeconds,
prometheus.GaugeValue,
data[transactionsLongestTransactionRunningTime].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsNonSnapshotVersionActiveTotal,
prometheus.CounterValue,
data[transactionsNonSnapshotVersionTransactions].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsSnapshotActiveTotal,
prometheus.CounterValue,
data[transactionsSnapshotTransactions].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsActive,
prometheus.GaugeValue,
data[transactionsTransactions].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsUpdateConflictsTotal,
prometheus.CounterValue,
data[transactionsUpdateconflictratio].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsUpdateSnapshotActiveTotal,
prometheus.CounterValue,
data[transactionsUpdateSnapshotTransactions].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsVersionCleanupRateBytes,
prometheus.GaugeValue,
data[transactionsVersionCleanuprateKBPers].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsVersionGenerationRateBytes,
prometheus.GaugeValue,
data[transactionsVersionGenerationrateKBPers].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsVersionStoreSizeBytes,
prometheus.GaugeValue,
data[transactionsVersionStoreSizeKB].FirstValue*1024,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsVersionStoreUnits,
prometheus.CounterValue,
data[transactionsVersionStoreunitcount].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsVersionStoreCreationUnits,
prometheus.CounterValue,
data[transactionsVersionStoreunitcreation].FirstValue,
sqlInstance,
)
ch <- prometheus.MustNewConstMetric(
c.transactionsVersionStoreTruncationUnits,
prometheus.CounterValue,
data[transactionsVersionStoreunittruncation].FirstValue,
sqlInstance,
)
return nil
}
func (c *Collector) closeTransactions() {
for _, perfDataCollector := range c.transactionsPerfDataCollectors {
perfDataCollector.Close()
}
}

View File

@@ -0,0 +1,251 @@
//go:build windows
package mssql
import (
"fmt"
"github.com/prometheus-community/windows_exporter/internal/perfdata"
"github.com/prometheus-community/windows_exporter/internal/types"
"github.com/prometheus/client_golang/prometheus"
)
type collectorWaitStats struct {
waitStatsPerfDataCollectors map[string]*perfdata.Collector
waitStatsLockWaits *prometheus.Desc
waitStatsMemoryGrantQueueWaits *prometheus.Desc
waitStatsThreadSafeMemoryObjectsWaits *prometheus.Desc
waitStatsLogWriteWaits *prometheus.Desc
waitStatsLogBufferWaits *prometheus.Desc
waitStatsNetworkIOWaits *prometheus.Desc
waitStatsPageIOLatchWaits *prometheus.Desc
waitStatsPageLatchWaits *prometheus.Desc
waitStatsNonPageLatchWaits *prometheus.Desc
waitStatsWaitForTheWorkerWaits *prometheus.Desc
waitStatsWorkspaceSynchronizationWaits *prometheus.Desc
waitStatsTransactionOwnershipWaits *prometheus.Desc
}
const (
waitStatsLockWaits = "Lock waits"
waitStatsMemoryGrantQueueWaits = "Memory grant queue waits"
waitStatsThreadSafeMemoryObjectsWaits = "Thread-safe memory objects waits"
waitStatsLogWriteWaits = "Log write waits"
waitStatsLogBufferWaits = "Log buffer waits"
waitStatsNetworkIOWaits = "Network IO waits"
waitStatsPageIOLatchWaits = "Page IO latch waits"
waitStatsPageLatchWaits = "Page latch waits"
waitStatsNonpageLatchWaits = "Non-Page latch waits"
waitStatsWaitForTheWorkerWaits = "Wait for the worker"
waitStatsWorkspaceSynchronizationWaits = "Workspace synchronization waits"
waitStatsTransactionOwnershipWaits = "Transaction ownership waits"
)
func (c *Collector) buildWaitStats() error {
var err error
c.waitStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
counters := []string{
waitStatsLockWaits,
waitStatsMemoryGrantQueueWaits,
waitStatsThreadSafeMemoryObjectsWaits,
waitStatsLogWriteWaits,
waitStatsLogBufferWaits,
waitStatsNetworkIOWaits,
waitStatsPageIOLatchWaits,
waitStatsPageLatchWaits,
waitStatsNonpageLatchWaits,
waitStatsWaitForTheWorkerWaits,
waitStatsWorkspaceSynchronizationWaits,
waitStatsTransactionOwnershipWaits,
}
for sqlInstance := range c.mssqlInstances {
c.waitStatsPerfDataCollectors[sqlInstance], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), perfdata.InstanceAll, counters)
if err != nil {
return fmt.Errorf("failed to create Wait Statistics collector for instance %s: %w", sqlInstance, err)
}
}
c.waitStatsLockWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_lock_waits"),
"(WaitStats.LockWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsMemoryGrantQueueWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_memory_grant_queue_waits"),
"(WaitStats.MemoryGrantQueueWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsThreadSafeMemoryObjectsWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_thread_safe_memory_objects_waits"),
"(WaitStats.ThreadSafeMemoryObjectsWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsLogWriteWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_log_write_waits"),
"(WaitStats.LogWriteWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsLogBufferWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_log_buffer_waits"),
"(WaitStats.LogBufferWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsNetworkIOWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_network_io_waits"),
"(WaitStats.NetworkIOWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsPageIOLatchWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_page_io_latch_waits"),
"(WaitStats.PageIOLatchWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsPageLatchWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_page_latch_waits"),
"(WaitStats.PageLatchWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsNonPageLatchWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_nonpage_latch_waits"),
"(WaitStats.NonpageLatchWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsWaitForTheWorkerWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_wait_for_the_worker_waits"),
"(WaitStats.WaitForTheWorkerWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsWorkspaceSynchronizationWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_workspace_synchronization_waits"),
"(WaitStats.WorkspaceSynchronizationWaits)",
[]string{"mssql_instance", "item"},
nil,
)
c.waitStatsTransactionOwnershipWaits = prometheus.NewDesc(
prometheus.BuildFQName(types.Namespace, Name, "waitstats_transaction_ownership_waits"),
"(WaitStats.TransactionOwnershipWaits)",
[]string{"mssql_instance", "item"},
nil,
)
return nil
}
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 *perfdata.Collector) error {
perfData, err := perfDataCollector.Collect()
if err != nil {
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), err)
}
for item, data := range perfData {
ch <- prometheus.MustNewConstMetric(
c.waitStatsLockWaits,
prometheus.CounterValue,
data[waitStatsLockWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsMemoryGrantQueueWaits,
prometheus.CounterValue,
data[waitStatsMemoryGrantQueueWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsThreadSafeMemoryObjectsWaits,
prometheus.CounterValue,
data[waitStatsThreadSafeMemoryObjectsWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsLogWriteWaits,
prometheus.CounterValue,
data[waitStatsLogWriteWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsLogBufferWaits,
prometheus.CounterValue,
data[waitStatsLogBufferWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsNetworkIOWaits,
prometheus.CounterValue,
data[waitStatsNetworkIOWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsPageIOLatchWaits,
prometheus.CounterValue,
data[waitStatsPageIOLatchWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsPageLatchWaits,
prometheus.CounterValue,
data[waitStatsPageLatchWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsNonPageLatchWaits,
prometheus.CounterValue,
data[waitStatsNonpageLatchWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsWaitForTheWorkerWaits,
prometheus.CounterValue,
data[waitStatsWaitForTheWorkerWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsWorkspaceSynchronizationWaits,
prometheus.CounterValue,
data[waitStatsWorkspaceSynchronizationWaits].FirstValue,
sqlInstance, item,
)
ch <- prometheus.MustNewConstMetric(
c.waitStatsTransactionOwnershipWaits,
prometheus.CounterValue,
data[waitStatsTransactionOwnershipWaits].FirstValue,
sqlInstance, item,
)
}
return nil
}
func (c *Collector) closeWaitStats() {
for _, perfDataCollector := range c.waitStatsPerfDataCollectors {
perfDataCollector.Close()
}
}