mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-03-07 02:56:35 +00:00
chore: Remove registry based perfdata collector (#1742)
Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
766
internal/collector/mssql/mssql_access_methods.go
Normal file
766
internal/collector/mssql/mssql_access_methods.go
Normal 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()
|
||||
}
|
||||
}
|
||||
204
internal/collector/mssql/mssql_availability_replica.go
Normal file
204
internal/collector/mssql/mssql_availability_replica.go
Normal 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()
|
||||
}
|
||||
}
|
||||
426
internal/collector/mssql/mssql_buffer_manager.go
Normal file
426
internal/collector/mssql/mssql_buffer_manager.go
Normal 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()
|
||||
}
|
||||
}
|
||||
826
internal/collector/mssql/mssql_database.go
Normal file
826
internal/collector/mssql/mssql_database.go
Normal 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()
|
||||
}
|
||||
}
|
||||
443
internal/collector/mssql/mssql_database_replica.go
Normal file
443
internal/collector/mssql/mssql_database_replica.go
Normal 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()
|
||||
}
|
||||
}
|
||||
446
internal/collector/mssql/mssql_general_statistics.go
Normal file
446
internal/collector/mssql/mssql_general_statistics.go
Normal 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()
|
||||
}
|
||||
}
|
||||
187
internal/collector/mssql/mssql_locks.go
Normal file
187
internal/collector/mssql/mssql_locks.go
Normal 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()
|
||||
}
|
||||
}
|
||||
381
internal/collector/mssql/mssql_memory_manager.go
Normal file
381
internal/collector/mssql/mssql_memory_manager.go
Normal 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()
|
||||
}
|
||||
}
|
||||
76
internal/collector/mssql/mssql_sql_errors.go
Normal file
76
internal/collector/mssql/mssql_sql_errors.go
Normal 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()
|
||||
}
|
||||
}
|
||||
237
internal/collector/mssql/mssql_sql_stats.go
Normal file
237
internal/collector/mssql/mssql_sql_stats.go
Normal 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()
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
271
internal/collector/mssql/mssql_transactions.go
Normal file
271
internal/collector/mssql/mssql_transactions.go
Normal 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()
|
||||
}
|
||||
}
|
||||
251
internal/collector/mssql/mssql_wait_stats.go
Normal file
251
internal/collector/mssql/mssql_wait_stats.go
Normal 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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user