mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-03-10 04:26:35 +00:00
process: Use registry collector for V1 data (#1814)
Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
package mssql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
@@ -26,7 +27,7 @@ import (
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/prometheus-community/windows_exporter/internal/mi"
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"golang.org/x/sys/windows/registry"
|
||||
@@ -273,7 +274,7 @@ func (c *Collector) Build(logger *slog.Logger, _ *mi.Session) error {
|
||||
// to the provided prometheus Metric channel.
|
||||
func (c *Collector) Collect(ch chan<- prometheus.Metric) error {
|
||||
if len(c.mssqlInstances) == 0 {
|
||||
return fmt.Errorf("no SQL instances found: %w", perfdata.ErrNoData)
|
||||
return fmt.Errorf("no SQL instances found: %w", pdh.ErrNoData)
|
||||
}
|
||||
|
||||
errCh := make(chan error, len(c.collectorFns))
|
||||
@@ -368,26 +369,32 @@ func (c *Collector) mssqlGetPerfObjectName(sqlInstance string, collector string)
|
||||
func (c *Collector) collect(
|
||||
ch chan<- prometheus.Metric,
|
||||
collector string,
|
||||
perfDataCollectors map[string]*perfdata.Collector,
|
||||
collectFn func(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error,
|
||||
perfDataCollectors map[string]*pdh.Collector,
|
||||
collectFn func(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error,
|
||||
) error {
|
||||
errs := make([]error, 0, len(perfDataCollectors))
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
for sqlInstance, perfDataCollector := range perfDataCollectors {
|
||||
begin := time.Now()
|
||||
success := 1.0
|
||||
err := collectFn(ch, sqlInstance, perfDataCollector)
|
||||
duration := time.Since(begin)
|
||||
|
||||
if err != nil && !errors.Is(err, perfdata.ErrNoData) {
|
||||
if err != nil && !errors.Is(err, pdh.ErrNoData) {
|
||||
errs = append(errs, err)
|
||||
success = 0.0
|
||||
|
||||
c.logger.Debug(fmt.Sprintf("mssql class collector %s for instance %s failed after %s", collector, sqlInstance, duration),
|
||||
c.logger.LogAttrs(ctx, slog.LevelDebug, fmt.Sprintf("mssql class collector %s for instance %s failed after %s", collector, sqlInstance, duration),
|
||||
slog.Any("err", err),
|
||||
)
|
||||
} else {
|
||||
c.logger.Debug(fmt.Sprintf("mssql class collector %s for instance %s succeeded after %s", collector, sqlInstance, duration))
|
||||
c.logger.LogAttrs(ctx, slog.LevelDebug, fmt.Sprintf("mssql class collector %s for instance %s succeeded after %s", collector, sqlInstance, duration))
|
||||
}
|
||||
|
||||
if collector == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorAccessMethods struct {
|
||||
accessMethodsPerfDataCollectors map[string]*perfdata.Collector
|
||||
accessMethodsPerfDataCollectors map[string]*pdh.Collector
|
||||
accessMethodsPerfDataObject []perfDataCounterValuesAccessMethods
|
||||
|
||||
accessMethodsAUcleanupbatches *prometheus.Desc
|
||||
accessMethodsAUcleanups *prometheus.Desc
|
||||
@@ -73,107 +74,63 @@ type collectorAccessMethods struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesAccessMethods struct {
|
||||
AccessMethodsAUCleanupbatchesPerSec float64 `perfdata:"AU cleanup batches/sec"`
|
||||
AccessMethodsAUCleanupsPerSec float64 `perfdata:"AU cleanups/sec"`
|
||||
AccessMethodsByReferenceLobCreateCount float64 `perfdata:"By-reference Lob Create Count"`
|
||||
AccessMethodsByReferenceLobUseCount float64 `perfdata:"By-reference Lob Use Count"`
|
||||
AccessMethodsCountLobReadahead float64 `perfdata:"Count Lob Readahead"`
|
||||
AccessMethodsCountPullInRow float64 `perfdata:"Count Pull In Row"`
|
||||
AccessMethodsCountPushOffRow float64 `perfdata:"Count Push Off Row"`
|
||||
AccessMethodsDeferredDroppedAUs float64 `perfdata:"Deferred dropped AUs"`
|
||||
AccessMethodsDeferredDroppedRowsets float64 `perfdata:"Deferred Dropped rowsets"`
|
||||
AccessMethodsDroppedRowsetCleanupsPerSec float64 `perfdata:"Dropped rowset cleanups/sec"`
|
||||
AccessMethodsDroppedRowsetsSkippedPerSec float64 `perfdata:"Dropped rowsets skipped/sec"`
|
||||
AccessMethodsExtentDeallocationsPerSec float64 `perfdata:"Extent Deallocations/sec"`
|
||||
AccessMethodsExtentsAllocatedPerSec float64 `perfdata:"Extents Allocated/sec"`
|
||||
AccessMethodsFailedAUCleanupBatchesPerSec float64 `perfdata:"Failed AU cleanup batches/sec"`
|
||||
AccessMethodsFailedLeafPageCookie float64 `perfdata:"Failed leaf page cookie"`
|
||||
AccessMethodsFailedTreePageCookie float64 `perfdata:"Failed tree page cookie"`
|
||||
AccessMethodsForwardedRecordsPerSec float64 `perfdata:"Forwarded Records/sec"`
|
||||
AccessMethodsFreeSpacePageFetchesPerSec float64 `perfdata:"FreeSpace Page Fetches/sec"`
|
||||
AccessMethodsFreeSpaceScansPerSec float64 `perfdata:"FreeSpace Scans/sec"`
|
||||
AccessMethodsFullScansPerSec float64 `perfdata:"Full Scans/sec"`
|
||||
AccessMethodsIndexSearchesPerSec float64 `perfdata:"Index Searches/sec"`
|
||||
AccessMethodsInSysXactWaitsPerSec float64 `perfdata:"InSysXact waits/sec"`
|
||||
AccessMethodsLobHandleCreateCount float64 `perfdata:"LobHandle Create Count"`
|
||||
AccessMethodsLobHandleDestroyCount float64 `perfdata:"LobHandle Destroy Count"`
|
||||
AccessMethodsLobSSProviderCreateCount float64 `perfdata:"LobSS Provider Create Count"`
|
||||
AccessMethodsLobSSProviderDestroyCount float64 `perfdata:"LobSS Provider Destroy Count"`
|
||||
AccessMethodsLobSSProviderTruncationCount float64 `perfdata:"LobSS Provider Truncation Count"`
|
||||
AccessMethodsMixedPageAllocationsPerSec float64 `perfdata:"Mixed page allocations/sec"`
|
||||
AccessMethodsPageCompressionAttemptsPerSec float64 `perfdata:"Page compression attempts/sec"`
|
||||
AccessMethodsPageDeallocationsPerSec float64 `perfdata:"Page Deallocations/sec"`
|
||||
AccessMethodsPagesAllocatedPerSec float64 `perfdata:"Pages Allocated/sec"`
|
||||
AccessMethodsPagesCompressedPerSec float64 `perfdata:"Pages compressed/sec"`
|
||||
AccessMethodsPageSplitsPerSec float64 `perfdata:"Page Splits/sec"`
|
||||
AccessMethodsProbeScansPerSec float64 `perfdata:"Probe Scans/sec"`
|
||||
AccessMethodsRangeScansPerSec float64 `perfdata:"Range Scans/sec"`
|
||||
AccessMethodsScanPointRevalidationsPerSec float64 `perfdata:"Scan Point Revalidations/sec"`
|
||||
AccessMethodsSkippedGhostedRecordsPerSec float64 `perfdata:"Skipped Ghosted Records/sec"`
|
||||
AccessMethodsTableLockEscalationsPerSec float64 `perfdata:"Table Lock Escalations/sec"`
|
||||
AccessMethodsUsedLeafPageCookie float64 `perfdata:"Used leaf page cookie"`
|
||||
AccessMethodsUsedTreePageCookie float64 `perfdata:"Used tree page cookie"`
|
||||
AccessMethodsWorkfilesCreatedPerSec float64 `perfdata:"Workfiles Created/sec"`
|
||||
AccessMethodsWorktablesCreatedPerSec float64 `perfdata:"Worktables Created/sec"`
|
||||
AccessMethodsWorktablesFromCacheRatio float64 `perfdata:"Worktables From Cache Ratio"`
|
||||
AccessMethodsWorktablesFromCacheRatioBase float64 `perfdata:"Worktables From Cache Base,secondvalue"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildAccessMethods() error {
|
||||
var err error
|
||||
|
||||
c.accessMethodsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.accessMethodsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Access Methods"), nil, counters)
|
||||
c.accessMethodsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesAccessMethods](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Access Methods"), nil,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create AccessMethods collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -452,326 +409,317 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectAccessMethodsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.accessMethodsPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "AccessMethods"), err)
|
||||
}
|
||||
|
||||
data, ok := perfData[perfdata.InstanceEmpty]
|
||||
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,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsAUCleanupbatchesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsAUcleanups,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsAUCleanupsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsAUCleanupsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsByReferenceLobCreateCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsByReferenceLobCreateCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsByReferenceLobCreateCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsByReferenceLobUseCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsByReferenceLobUseCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsByReferenceLobUseCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsCountLobReadahead,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsCountLobReadahead].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsCountLobReadahead,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsCountPullInRow,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsCountPullInRow].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsCountPullInRow,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsCountPushOffRow,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsCountPushOffRow].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsCountPushOffRow,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsDeferreddroppedAUs,
|
||||
prometheus.GaugeValue,
|
||||
data[accessMethodsDeferredDroppedAUs].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsDeferredDroppedAUs,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsDeferredDroppedrowsets,
|
||||
prometheus.GaugeValue,
|
||||
data[accessMethodsDeferredDroppedRowsets].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsDeferredDroppedRowsets,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsDroppedrowsetcleanups,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsDroppedRowsetCleanupsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsDroppedRowsetCleanupsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsDroppedrowsetsskipped,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsDroppedRowsetsSkippedPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsDroppedRowsetsSkippedPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsExtentDeallocations,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsExtentDeallocationsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsExtentDeallocationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsExtentsAllocated,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsExtentsAllocatedPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsExtentsAllocatedPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsFailedAUcleanupbatches,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsFailedAUCleanupBatchesPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsFailedAUCleanupBatchesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsFailedleafpagecookie,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsFailedLeafPageCookie].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsFailedLeafPageCookie,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsFailedtreepagecookie,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsFailedTreePageCookie].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsFailedTreePageCookie,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsForwardedRecords,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsForwardedRecordsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsForwardedRecordsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsFreeSpacePageFetches,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsFreeSpacePageFetchesPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsFreeSpacePageFetchesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsFreeSpaceScans,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsFreeSpaceScansPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsFreeSpaceScansPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsFullScans,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsFullScansPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsFullScansPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsIndexSearches,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsIndexSearchesPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsIndexSearchesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsInSysXactwaits,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsInSysXactWaitsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsInSysXactWaitsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsLobHandleCreateCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsLobHandleCreateCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsLobHandleCreateCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsLobHandleDestroyCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsLobHandleDestroyCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsLobHandleDestroyCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsLobSSProviderCreateCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsLobSSProviderCreateCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsLobSSProviderCreateCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsLobSSProviderDestroyCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsLobSSProviderDestroyCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsLobSSProviderDestroyCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsLobSSProviderTruncationCount,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsLobSSProviderTruncationCount].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsLobSSProviderTruncationCount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsMixedPageAllocations,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsMixedPageAllocationsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsMixedPageAllocationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsPageCompressionAttempts,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsPageCompressionAttemptsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsPageCompressionAttemptsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsPageDeallocations,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsPageDeallocationsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsPageDeallocationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsPagesAllocated,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsPagesAllocatedPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsPagesAllocatedPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsPagesCompressed,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsPagesCompressedPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsPagesCompressedPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsPageSplits,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsPageSplitsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsPageSplitsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsProbeScans,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsProbeScansPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsProbeScansPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsRangeScans,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsRangeScansPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsRangeScansPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsScanPointRevalidations,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsScanPointRevalidationsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsScanPointRevalidationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsSkippedGhostedRecords,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsSkippedGhostedRecordsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsSkippedGhostedRecordsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsTableLockEscalations,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsTableLockEscalationsPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsTableLockEscalationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsUsedleafpagecookie,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsUsedLeafPageCookie].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsUsedLeafPageCookie,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsUsedtreepagecookie,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsUsedTreePageCookie].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsUsedTreePageCookie,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsWorkfilesCreated,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsWorkfilesCreatedPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsWorkfilesCreatedPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsWorktablesCreated,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsWorktablesCreatedPerSec].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsWorktablesCreatedPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsWorktablesFromCacheHits,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsWorktablesFromCacheRatio].FirstValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsWorktablesFromCacheRatio,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.accessMethodsWorktablesFromCacheLookups,
|
||||
prometheus.CounterValue,
|
||||
data[accessMethodsWorktablesFromCacheRatioBase].SecondValue,
|
||||
c.accessMethodsPerfDataObject[0].AccessMethodsWorktablesFromCacheRatioBase,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
|
||||
@@ -19,14 +19,15 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"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
|
||||
availabilityReplicaPerfDataCollectors map[string]*pdh.Collector
|
||||
availabilityReplicaPerfDataObject []perfDataCounterValuesAvailabilityReplica
|
||||
|
||||
availReplicaBytesReceivedFromReplica *prometheus.Desc
|
||||
availReplicaBytesSentToReplica *prometheus.Desc
|
||||
@@ -39,37 +40,30 @@ type collectorAvailabilityReplica struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesAvailabilityReplica struct {
|
||||
Name string
|
||||
|
||||
AvailReplicaBytesReceivedFromReplicaPerSec float64 `perfdata:"Bytes Received from Replica/sec"`
|
||||
AvailReplicaBytesSentToReplicaPerSec float64 `perfdata:"Bytes Sent to Replica/sec"`
|
||||
AvailReplicaBytesSentToTransportPerSec float64 `perfdata:"Bytes Sent to Transport/sec"`
|
||||
AvailReplicaFlowControlPerSec float64 `perfdata:"Flow Control/sec"`
|
||||
AvailReplicaFlowControlTimeMSPerSec float64 `perfdata:"Flow Control Time (ms/sec)"`
|
||||
AvailReplicaReceivesFromReplicaPerSec float64 `perfdata:"Receives from Replica/sec"`
|
||||
AvailReplicaResentMessagesPerSec float64 `perfdata:"Resent Messages/sec"`
|
||||
AvailReplicaSendsToReplicaPerSec float64 `perfdata:"Sends to Replica/sec"`
|
||||
AvailReplicaSendsToTransportPerSec float64 `perfdata:"Sends to Transport/sec"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildAvailabilityReplica() error {
|
||||
var err error
|
||||
|
||||
c.availabilityReplicaPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.availabilityReplicaPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, len(c.mssqlInstances))
|
||||
counters := []string{
|
||||
availReplicaBytesReceivedFromReplicaPerSec,
|
||||
availReplicaBytesSentToReplicaPerSec,
|
||||
availReplicaBytesSentToTransportPerSec,
|
||||
availReplicaFlowControlPerSec,
|
||||
availReplicaFlowControlTimeMSPerSec,
|
||||
availReplicaReceivesFromReplicaPerSec,
|
||||
availReplicaResentMessagesPerSec,
|
||||
availReplicaSendsToReplicaPerSec,
|
||||
availReplicaSendsToTransportPerSec,
|
||||
}
|
||||
|
||||
for _, sqlInstance := range c.mssqlInstances {
|
||||
c.availabilityReplicaPerfDataCollectors[sqlInstance.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Availability Replica"), perfdata.InstancesAll, counters)
|
||||
c.availabilityReplicaPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesAvailabilityReplica](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Availability Replica"), pdh.InstancesAll,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Availability Replica collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -138,78 +132,74 @@ func (c *Collector) collectAvailabilityReplica(ch chan<- prometheus.Metric) erro
|
||||
return c.collect(ch, subCollectorAvailabilityReplica, c.availabilityReplicaPerfDataCollectors, c.collectAvailabilityReplicaInstance)
|
||||
}
|
||||
|
||||
func (c *Collector) collectAvailabilityReplicaInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectAvailabilityReplicaInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.availabilityReplicaPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Availability Replica"), err)
|
||||
}
|
||||
|
||||
for replicaName, data := range perfData {
|
||||
for _, data := range c.availabilityReplicaPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaBytesReceivedFromReplica,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaBytesReceivedFromReplicaPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaBytesReceivedFromReplicaPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaBytesSentToReplica,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaBytesSentToReplicaPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaBytesSentToReplicaPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaBytesSentToTransport,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaBytesSentToTransportPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaBytesSentToTransportPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaFlowControl,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaFlowControlPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaFlowControlPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaFlowControlTimeMS,
|
||||
prometheus.CounterValue,
|
||||
utils.MilliSecToSec(data[availReplicaFlowControlTimeMSPerSec].FirstValue),
|
||||
sqlInstance, replicaName,
|
||||
utils.MilliSecToSec(data.AvailReplicaFlowControlTimeMSPerSec),
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaReceivesFromReplica,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaReceivesFromReplicaPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaReceivesFromReplicaPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaResentMessages,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaResentMessagesPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaResentMessagesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaSendsToReplica,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaSendsToReplicaPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaSendsToReplicaPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.availReplicaSendsToTransport,
|
||||
prometheus.CounterValue,
|
||||
data[availReplicaSendsToTransportPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.AvailReplicaSendsToTransportPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorBufferManager struct {
|
||||
bufManPerfDataCollectors map[string]*perfdata.Collector
|
||||
bufManPerfDataCollectors map[string]*pdh.Collector
|
||||
bufManPerfDataObject []perfDataCounterValuesBufMan
|
||||
|
||||
bufManBackgroundwriterpages *prometheus.Desc
|
||||
bufManBuffercachehits *prometheus.Desc
|
||||
@@ -52,65 +53,42 @@ type collectorBufferManager struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesBufMan struct {
|
||||
BufManBackgroundWriterPagesPerSec float64 `perfdata:"Background writer pages/sec"`
|
||||
BufManBufferCacheHitRatio float64 `perfdata:"Buffer cache hit ratio"`
|
||||
BufManBufferCacheHitRatioBase float64 `perfdata:"Buffer cache hit ratio base,secondvalue"`
|
||||
BufManCheckpointPagesPerSec float64 `perfdata:"Checkpoint pages/sec"`
|
||||
BufManDatabasePages float64 `perfdata:"Database pages"`
|
||||
BufManExtensionAllocatedPages float64 `perfdata:"Extension allocated pages"`
|
||||
BufManExtensionFreePages float64 `perfdata:"Extension free pages"`
|
||||
BufManExtensionInUseAsPercentage float64 `perfdata:"Extension in use as percentage"`
|
||||
BufManExtensionOutstandingIOCounter float64 `perfdata:"Extension outstanding IO counter"`
|
||||
BufManExtensionPageEvictionsPerSec float64 `perfdata:"Extension page evictions/sec"`
|
||||
BufManExtensionPageReadsPerSec float64 `perfdata:"Extension page reads/sec"`
|
||||
BufManExtensionPageUnreferencedTime float64 `perfdata:"Extension page unreferenced time"`
|
||||
BufManExtensionPageWritesPerSec float64 `perfdata:"Extension page writes/sec"`
|
||||
BufManFreeListStallsPerSec float64 `perfdata:"Free list stalls/sec"`
|
||||
BufManIntegralControllerSlope float64 `perfdata:"Integral Controller Slope"`
|
||||
BufManLazyWritesPerSec float64 `perfdata:"Lazy writes/sec"`
|
||||
BufManPageLifeExpectancy float64 `perfdata:"Page life expectancy"`
|
||||
BufManPageLookupsPerSec float64 `perfdata:"Page lookups/sec"`
|
||||
BufManPageReadsPerSec float64 `perfdata:"Page reads/sec"`
|
||||
BufManPageWritesPerSec float64 `perfdata:"Page writes/sec"`
|
||||
BufManReadaheadPagesPerSec float64 `perfdata:"Readahead pages/sec"`
|
||||
BufManReadaheadTimePerSec float64 `perfdata:"Readahead time/sec"`
|
||||
BufManTargetPages float64 `perfdata:"Target pages"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildBufferManager() error {
|
||||
var err error
|
||||
|
||||
c.bufManPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.bufManPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Buffer Manager"), nil, counters)
|
||||
c.bufManPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesBufMan](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Buffer Manager"), nil,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Buffer Manager collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -262,175 +240,171 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectBufferManagerInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.bufManPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Buffer Manager"), err)
|
||||
}
|
||||
|
||||
for _, data := range perfData {
|
||||
for _, data := range c.bufManPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManBackgroundwriterpages,
|
||||
prometheus.CounterValue,
|
||||
data[bufManBackgroundWriterPagesPerSec].FirstValue,
|
||||
data.BufManBackgroundWriterPagesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManBuffercachehits,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManBufferCacheHitRatio].FirstValue,
|
||||
data.BufManBufferCacheHitRatio,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManBuffercachelookups,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManBufferCacheHitRatioBase].SecondValue,
|
||||
data.BufManBufferCacheHitRatioBase,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManCheckpointpages,
|
||||
prometheus.CounterValue,
|
||||
data[bufManCheckpointPagesPerSec].FirstValue,
|
||||
data.BufManCheckpointPagesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManDatabasepages,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManDatabasePages].FirstValue,
|
||||
data.BufManDatabasePages,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionallocatedpages,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManExtensionAllocatedPages].FirstValue,
|
||||
data.BufManExtensionAllocatedPages,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionfreepages,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManExtensionFreePages].FirstValue,
|
||||
data.BufManExtensionFreePages,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensioninuseaspercentage,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManExtensionInUseAsPercentage].FirstValue,
|
||||
data.BufManExtensionInUseAsPercentage,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionoutstandingIOcounter,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManExtensionOutstandingIOCounter].FirstValue,
|
||||
data.BufManExtensionOutstandingIOCounter,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionpageevictions,
|
||||
prometheus.CounterValue,
|
||||
data[bufManExtensionPageEvictionsPerSec].FirstValue,
|
||||
data.BufManExtensionPageEvictionsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionpagereads,
|
||||
prometheus.CounterValue,
|
||||
data[bufManExtensionPageReadsPerSec].FirstValue,
|
||||
data.BufManExtensionPageReadsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionpageunreferencedtime,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManExtensionPageUnreferencedTime].FirstValue,
|
||||
data.BufManExtensionPageUnreferencedTime,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManExtensionpagewrites,
|
||||
prometheus.CounterValue,
|
||||
data[bufManExtensionPageWritesPerSec].FirstValue,
|
||||
data.BufManExtensionPageWritesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManFreeliststalls,
|
||||
prometheus.CounterValue,
|
||||
data[bufManFreeListStallsPerSec].FirstValue,
|
||||
data.BufManFreeListStallsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManIntegralControllerSlope,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManIntegralControllerSlope].FirstValue,
|
||||
data.BufManIntegralControllerSlope,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManLazywrites,
|
||||
prometheus.CounterValue,
|
||||
data[bufManLazyWritesPerSec].FirstValue,
|
||||
data.BufManLazyWritesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManPagelifeexpectancy,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManPageLifeExpectancy].FirstValue,
|
||||
data.BufManPageLifeExpectancy,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManPagelookups,
|
||||
prometheus.CounterValue,
|
||||
data[bufManPageLookupsPerSec].FirstValue,
|
||||
data.BufManPageLookupsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManPagereads,
|
||||
prometheus.CounterValue,
|
||||
data[bufManPageReadsPerSec].FirstValue,
|
||||
data.BufManPageReadsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManPagewrites,
|
||||
prometheus.CounterValue,
|
||||
data[bufManPageWritesPerSec].FirstValue,
|
||||
data.BufManPageWritesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManReadaheadpages,
|
||||
prometheus.CounterValue,
|
||||
data[bufManReadaheadPagesPerSec].FirstValue,
|
||||
data.BufManReadaheadPagesPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManReadaheadtime,
|
||||
prometheus.CounterValue,
|
||||
data[bufManReadaheadTimePerSec].FirstValue,
|
||||
data.BufManReadaheadTimePerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.bufManTargetpages,
|
||||
prometheus.GaugeValue,
|
||||
data[bufManTargetPages].FirstValue,
|
||||
data.BufManTargetPages,
|
||||
sqlInstance,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -19,13 +19,16 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorDatabases struct {
|
||||
databasesPerfDataCollectors map[string]*perfdata.Collector
|
||||
databasesPerfDataCollectors map[string]*pdh.Collector
|
||||
databasesPerfDataCollectors2019 map[string]*pdh.Collector
|
||||
databasesPerfDataObject []perfDataCounterValuesDatabases
|
||||
databasesPerfDataObject2019 []perfDataCounterValuesDatabases2019
|
||||
|
||||
databasesActiveParallelRedoThreads *prometheus.Desc
|
||||
databasesActiveTransactions *prometheus.Desc
|
||||
@@ -77,121 +80,83 @@ type collectorDatabases struct {
|
||||
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)"
|
||||
)
|
||||
type perfDataCounterValuesDatabases struct {
|
||||
Name string
|
||||
|
||||
DatabasesActiveTransactions float64 `perfdata:"Active Transactions"`
|
||||
DatabasesBackupPerRestoreThroughputPerSec float64 `perfdata:"Backup/Restore Throughput/sec"`
|
||||
DatabasesBulkCopyRowsPerSec float64 `perfdata:"Bulk Copy Rows/sec"`
|
||||
DatabasesBulkCopyThroughputPerSec float64 `perfdata:"Bulk Copy Throughput/sec"`
|
||||
DatabasesCommitTableEntries float64 `perfdata:"Commit table entries"`
|
||||
DatabasesDataFilesSizeKB float64 `perfdata:"Data File(s) Size (KB)"`
|
||||
DatabasesDBCCLogicalScanBytesPerSec float64 `perfdata:"DBCC Logical Scan Bytes/sec"`
|
||||
DatabasesGroupCommitTimePerSec float64 `perfdata:"Group Commit Time/sec"`
|
||||
DatabasesLogBytesFlushedPerSec float64 `perfdata:"Log Bytes Flushed/sec"`
|
||||
DatabasesLogCacheHitRatio float64 `perfdata:"Log Cache Hit Ratio"`
|
||||
DatabasesLogCacheHitRatioBase float64 `perfdata:"Log Cache Hit Ratio Base,secondvalue"`
|
||||
DatabasesLogCacheReadsPerSec float64 `perfdata:"Log Cache Reads/sec"`
|
||||
DatabasesLogFilesSizeKB float64 `perfdata:"Log File(s) Size (KB)"`
|
||||
DatabasesLogFilesUsedSizeKB float64 `perfdata:"Log File(s) Used Size (KB)"`
|
||||
DatabasesLogFlushesPerSec float64 `perfdata:"Log Flushes/sec"`
|
||||
DatabasesLogFlushWaitsPerSec float64 `perfdata:"Log Flush Waits/sec"`
|
||||
DatabasesLogFlushWaitTime float64 `perfdata:"Log Flush Wait Time"`
|
||||
DatabasesLogFlushWriteTimeMS float64 `perfdata:"Log Flush Write Time (ms)"`
|
||||
DatabasesLogGrowths float64 `perfdata:"Log Growths"`
|
||||
DatabasesLogPoolCacheMissesPerSec float64 `perfdata:"Log Pool Cache Misses/sec"`
|
||||
DatabasesLogPoolDiskReadsPerSec float64 `perfdata:"Log Pool Disk Reads/sec"`
|
||||
DatabasesLogPoolHashDeletesPerSec float64 `perfdata:"Log Pool Hash Deletes/sec"`
|
||||
DatabasesLogPoolHashInsertsPerSec float64 `perfdata:"Log Pool Hash Inserts/sec"`
|
||||
DatabasesLogPoolInvalidHashEntryPerSec float64 `perfdata:"Log Pool Invalid Hash Entry/sec"`
|
||||
DatabasesLogPoolLogScanPushesPerSec float64 `perfdata:"Log Pool Log Scan Pushes/sec"`
|
||||
DatabasesLogPoolLogWriterPushesPerSec float64 `perfdata:"Log Pool LogWriter Pushes/sec"`
|
||||
DatabasesLogPoolPushEmptyFreePoolPerSec float64 `perfdata:"Log Pool Push Empty FreePool/sec"`
|
||||
DatabasesLogPoolPushLowMemoryPerSec float64 `perfdata:"Log Pool Push Low Memory/sec"`
|
||||
DatabasesLogPoolPushNoFreeBufferPerSec float64 `perfdata:"Log Pool Push No Free Buffer/sec"`
|
||||
DatabasesLogPoolReqBehindTruncPerSec float64 `perfdata:"Log Pool Req. Behind Trunc/sec"`
|
||||
DatabasesLogPoolRequestsOldVLFPerSec float64 `perfdata:"Log Pool Requests Old VLF/sec"`
|
||||
DatabasesLogPoolRequestsPerSec float64 `perfdata:"Log Pool Requests/sec"`
|
||||
DatabasesLogPoolTotalActiveLogSize float64 `perfdata:"Log Pool Total Active Log Size"`
|
||||
DatabasesLogPoolTotalSharedPoolSize float64 `perfdata:"Log Pool Total Shared Pool Size"`
|
||||
DatabasesLogShrinks float64 `perfdata:"Log Shrinks"`
|
||||
DatabasesLogTruncations float64 `perfdata:"Log Truncations"`
|
||||
DatabasesPercentLogUsed float64 `perfdata:"Percent Log Used"`
|
||||
DatabasesReplPendingXacts float64 `perfdata:"Repl. Pending Xacts"`
|
||||
DatabasesReplTransRate float64 `perfdata:"Repl. Trans. Rate"`
|
||||
DatabasesShrinkDataMovementBytesPerSec float64 `perfdata:"Shrink Data Movement Bytes/sec"`
|
||||
DatabasesTrackedTransactionsPerSec float64 `perfdata:"Tracked transactions/sec"`
|
||||
DatabasesTransactionsPerSec float64 `perfdata:"Transactions/sec"`
|
||||
DatabasesWriteTransactionsPerSec float64 `perfdata:"Write Transactions/sec"`
|
||||
DatabasesXTPControllerDLCLatencyPerFetch float64 `perfdata:"XTP Controller DLC Latency/Fetch"`
|
||||
DatabasesXTPControllerDLCPeakLatency float64 `perfdata:"XTP Controller DLC Peak Latency"`
|
||||
DatabasesXTPControllerLogProcessedPerSec float64 `perfdata:"XTP Controller Log Processed/sec"`
|
||||
DatabasesXTPMemoryUsedKB float64 `perfdata:"XTP Memory Used (KB)"`
|
||||
}
|
||||
|
||||
type perfDataCounterValuesDatabases2019 struct {
|
||||
Name string
|
||||
|
||||
DatabasesActiveParallelRedoThreads float64 `perfdata:"Active parallel redo threads"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildDatabases() error {
|
||||
var err error
|
||||
|
||||
c.databasesPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.databasesPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
c.databasesPerfDataCollectors2019 = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, len(c.mssqlInstances))
|
||||
counters := []string{
|
||||
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 {
|
||||
if sqlInstance.isVersionGreaterOrEqualThan(serverVersion2019) {
|
||||
counters = append(counters, databasesActiveParallelRedoThreads)
|
||||
}
|
||||
|
||||
c.databasesPerfDataCollectors[sqlInstance.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Databases"), perfdata.InstancesAll, counters)
|
||||
c.databasesPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesDatabases](c.mssqlGetPerfObjectName(sqlInstance.name, "Databases"), pdh.InstancesAll)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Databases collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
|
||||
if sqlInstance.isVersionGreaterOrEqualThan(serverVersion2019) {
|
||||
c.databasesPerfDataCollectors2019[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesDatabases2019](c.mssqlGetPerfObjectName(sqlInstance.name, "Databases"), pdh.InstancesAll)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Databases 2019 collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
c.databasesActiveParallelRedoThreads = prometheus.NewDesc(
|
||||
@@ -487,356 +452,364 @@ func (c *Collector) buildDatabases() error {
|
||||
}
|
||||
|
||||
func (c *Collector) collectDatabases(ch chan<- prometheus.Metric) error {
|
||||
return c.collect(ch, subCollectorDatabases, c.databasesPerfDataCollectors, c.collectDatabasesInstance)
|
||||
return errors.Join(
|
||||
c.collect(ch, subCollectorDatabases, c.databasesPerfDataCollectors, c.collectDatabasesInstance),
|
||||
c.collect(ch, "", c.databasesPerfDataCollectors2019, c.collectDatabasesInstance2019),
|
||||
)
|
||||
}
|
||||
|
||||
func (c *Collector) collectDatabasesInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectDatabasesInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.databasesPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Databases"), err)
|
||||
}
|
||||
|
||||
for dbName, data := range perfData {
|
||||
if counter, ok := data[databasesActiveParallelRedoThreads]; ok {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesActiveParallelRedoThreads,
|
||||
prometheus.GaugeValue,
|
||||
counter.FirstValue,
|
||||
sqlInstance, dbName,
|
||||
)
|
||||
}
|
||||
|
||||
for _, data := range c.databasesPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesActiveTransactions,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesActiveTransactions].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesActiveTransactions,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesBackupPerRestoreThroughput,
|
||||
prometheus.CounterValue,
|
||||
data[databasesBackupPerRestoreThroughputPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesBackupPerRestoreThroughputPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesBulkCopyRows,
|
||||
prometheus.CounterValue,
|
||||
data[databasesBulkCopyRowsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesBulkCopyRowsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesBulkCopyThroughput,
|
||||
prometheus.CounterValue,
|
||||
data[databasesBulkCopyThroughputPerSec].FirstValue*1024,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesBulkCopyThroughputPerSec*1024,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesCommitTableEntries,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesCommitTableEntries].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesCommitTableEntries,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesDataFilesSizeKB,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesDataFilesSizeKB].FirstValue*1024,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesDataFilesSizeKB*1024,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesDBCCLogicalScanBytes,
|
||||
prometheus.CounterValue,
|
||||
data[databasesDBCCLogicalScanBytesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesDBCCLogicalScanBytesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesGroupCommitTime,
|
||||
prometheus.CounterValue,
|
||||
data[databasesGroupCommitTimePerSec].FirstValue/1000000.0,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesGroupCommitTimePerSec/1000000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogBytesFlushed,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogBytesFlushedPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogBytesFlushedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogCacheHits,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogCacheHitRatio].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogCacheHitRatio,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogCacheLookups,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogCacheHitRatioBase].SecondValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogCacheHitRatioBase,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogCacheReads,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogCacheReadsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogCacheReadsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogFilesSizeKB,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogFilesSizeKB].FirstValue*1024,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogFilesSizeKB*1024,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogFilesUsedSizeKB,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogFilesUsedSizeKB].FirstValue*1024,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogFilesUsedSizeKB*1024,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogFlushes,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogFlushesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogFlushesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogFlushWaits,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogFlushWaitsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogFlushWaitsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogFlushWaitTime,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogFlushWaitTime].FirstValue/1000.0,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogFlushWaitTime/1000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogFlushWriteTimeMS,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogFlushWriteTimeMS].FirstValue/1000.0,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogFlushWriteTimeMS/1000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogGrowths,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogGrowths].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogGrowths,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolCacheMisses,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolCacheMissesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolCacheMissesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolDiskReads,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolDiskReadsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolDiskReadsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolHashDeletes,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolHashDeletesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolHashDeletesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolHashInserts,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolHashInsertsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolHashInsertsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolInvalidHashEntry,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolInvalidHashEntryPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolInvalidHashEntryPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolLogScanPushes,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolLogScanPushesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolLogScanPushesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolLogWriterPushes,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolLogWriterPushesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolLogWriterPushesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolPushEmptyFreePool,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolPushEmptyFreePoolPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolPushEmptyFreePoolPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolPushLowMemory,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolPushLowMemoryPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolPushLowMemoryPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolPushNoFreeBuffer,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolPushNoFreeBufferPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolPushNoFreeBufferPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolReqBehindTrunc,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolReqBehindTruncPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolReqBehindTruncPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolRequestsOldVLF,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolRequestsOldVLFPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolRequestsOldVLFPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolRequests,
|
||||
prometheus.CounterValue,
|
||||
data[databasesLogPoolRequestsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolRequestsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolTotalActiveLogSize,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogPoolTotalActiveLogSize].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolTotalActiveLogSize,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogPoolTotalSharedPoolSize,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogPoolTotalSharedPoolSize].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogPoolTotalSharedPoolSize,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogShrinks,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogShrinks].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogShrinks,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesLogTruncations,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesLogTruncations].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesLogTruncations,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesPercentLogUsed,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesPercentLogUsed].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesPercentLogUsed,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesReplPendingXacts,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesReplPendingXacts].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesReplPendingXacts,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesReplTransRate,
|
||||
prometheus.CounterValue,
|
||||
data[databasesReplTransRate].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesReplTransRate,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesShrinkDataMovementBytes,
|
||||
prometheus.CounterValue,
|
||||
data[databasesShrinkDataMovementBytesPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesShrinkDataMovementBytesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesTrackedTransactions,
|
||||
prometheus.CounterValue,
|
||||
data[databasesTrackedTransactionsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesTrackedTransactionsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesTransactions,
|
||||
prometheus.CounterValue,
|
||||
data[databasesTransactionsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesTransactionsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesWriteTransactions,
|
||||
prometheus.CounterValue,
|
||||
data[databasesWriteTransactionsPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesWriteTransactionsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesXTPControllerDLCLatencyPerFetch,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesXTPControllerDLCLatencyPerFetch].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesXTPControllerDLCLatencyPerFetch,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesXTPControllerDLCPeakLatency,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesXTPControllerDLCPeakLatency].FirstValue*1000000.0,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesXTPControllerDLCPeakLatency*1000000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesXTPControllerLogProcessed,
|
||||
prometheus.CounterValue,
|
||||
data[databasesXTPControllerLogProcessedPerSec].FirstValue,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesXTPControllerLogProcessedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesXTPMemoryUsedKB,
|
||||
prometheus.GaugeValue,
|
||||
data[databasesXTPMemoryUsedKB].FirstValue*1024,
|
||||
sqlInstance, dbName,
|
||||
data.DatabasesXTPMemoryUsedKB*1024,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Collector) collectDatabasesInstance2019(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.databasesPerfDataObject2019)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Databases"), err)
|
||||
}
|
||||
|
||||
for _, data := range c.databasesPerfDataObject2019 {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.databasesActiveParallelRedoThreads,
|
||||
prometheus.GaugeValue,
|
||||
data.DatabasesActiveParallelRedoThreads,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorDatabaseReplica struct {
|
||||
dbReplicaPerfDataCollectors map[string]*perfdata.Collector
|
||||
dbReplicaPerfDataCollectors map[string]*pdh.Collector
|
||||
dbReplicaPerfDataObject []perfDataCounterValuesDBReplica
|
||||
|
||||
dbReplicaDatabaseFlowControlDelay *prometheus.Desc
|
||||
dbReplicaDatabaseFlowControls *prometheus.Desc
|
||||
@@ -53,67 +54,45 @@ type collectorDatabaseReplica struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesDBReplica struct {
|
||||
Name string
|
||||
|
||||
DbReplicaDatabaseFlowControlDelay float64 `perfdata:"Database Flow Control Delay"`
|
||||
DbReplicaDatabaseFlowControlsPerSec float64 `perfdata:"Database Flow Controls/sec"`
|
||||
DbReplicaFileBytesReceivedPerSec float64 `perfdata:"File Bytes Received/sec"`
|
||||
DbReplicaGroupCommitsPerSec float64 `perfdata:"Group Commits/Sec"`
|
||||
DbReplicaGroupCommitTime float64 `perfdata:"Group Commit Time"`
|
||||
DbReplicaLogApplyPendingQueue float64 `perfdata:"Log Apply Pending Queue"`
|
||||
DbReplicaLogApplyReadyQueue float64 `perfdata:"Log Apply Ready Queue"`
|
||||
DbReplicaLogBytesCompressedPerSec float64 `perfdata:"Log Bytes Compressed/sec"`
|
||||
DbReplicaLogBytesDecompressedPerSec float64 `perfdata:"Log Bytes Decompressed/sec"`
|
||||
DbReplicaLogBytesReceivedPerSec float64 `perfdata:"Log Bytes Received/sec"`
|
||||
DbReplicaLogCompressionCacheHitsPerSec float64 `perfdata:"Log Compression Cache hits/sec"`
|
||||
DbReplicaLogCompressionCacheMissesPerSec float64 `perfdata:"Log Compression Cache misses/sec"`
|
||||
DbReplicaLogCompressionsPerSec float64 `perfdata:"Log Compressions/sec"`
|
||||
DbReplicaLogDecompressionsPerSec float64 `perfdata:"Log Decompressions/sec"`
|
||||
DbReplicaLogRemainingForUndo float64 `perfdata:"Log remaining for undo"`
|
||||
DbReplicaLogSendQueue float64 `perfdata:"Log Send Queue"`
|
||||
DbReplicaMirroredWriteTransactionsPerSec float64 `perfdata:"Mirrored Write Transactions/sec"`
|
||||
DbReplicaRecoveryQueue float64 `perfdata:"Recovery Queue"`
|
||||
DbReplicaRedoBlockedPerSec float64 `perfdata:"Redo blocked/sec"`
|
||||
DbReplicaRedoBytesRemaining float64 `perfdata:"Redo Bytes Remaining"`
|
||||
DbReplicaRedoneBytesPerSec float64 `perfdata:"Redone Bytes/sec"`
|
||||
DbReplicaRedonesPerSec float64 `perfdata:"Redones/sec"`
|
||||
DbReplicaTotalLogRequiringUndo float64 `perfdata:"Total Log requiring undo"`
|
||||
DbReplicaTransactionDelay float64 `perfdata:"Transaction Delay"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildDatabaseReplica() error {
|
||||
var err error
|
||||
|
||||
c.dbReplicaPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.dbReplicaPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Database Replica"), perfdata.InstancesAll, counters)
|
||||
c.dbReplicaPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesDBReplica](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Database Replica"), pdh.InstancesAll,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Database Replica collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -272,183 +251,179 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectDatabaseReplicaInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.dbReplicaPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Database Replica"), err)
|
||||
}
|
||||
|
||||
for replicaName, data := range perfData {
|
||||
for _, data := range c.dbReplicaPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaDatabaseFlowControlDelay,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaDatabaseFlowControlDelay].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaDatabaseFlowControlDelay,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaDatabaseFlowControls,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaDatabaseFlowControlsPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaDatabaseFlowControlsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaFileBytesReceived,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaFileBytesReceivedPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaFileBytesReceivedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaGroupCommits,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaGroupCommitsPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaGroupCommitsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaGroupCommitTime,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaGroupCommitTime].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaGroupCommitTime,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogApplyPendingQueue,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaLogApplyPendingQueue].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogApplyPendingQueue,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogApplyReadyQueue,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaLogApplyReadyQueue].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogApplyReadyQueue,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogBytesCompressed,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogBytesCompressedPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogBytesCompressedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogBytesDecompressed,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogBytesDecompressedPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogBytesDecompressedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogBytesReceived,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogBytesReceivedPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogBytesReceivedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogCompressionCachehits,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogCompressionCacheHitsPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogCompressionCacheHitsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogCompressionCachemisses,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogCompressionCacheMissesPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogCompressionCacheMissesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogCompressions,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogCompressionsPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogCompressionsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogDecompressions,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaLogDecompressionsPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogDecompressionsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogremainingforundo,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaLogRemainingForUndo].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogRemainingForUndo,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaLogSendQueue,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaLogSendQueue].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaLogSendQueue,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaMirroredWritetransactions,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaMirroredWriteTransactionsPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaMirroredWriteTransactionsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaRecoveryQueue,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaRecoveryQueue].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaRecoveryQueue,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaRedoblocked,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaRedoBlockedPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaRedoBlockedPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaRedoBytesRemaining,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaRedoBytesRemaining].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaRedoBytesRemaining,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaRedoneBytes,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaRedoneBytesPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaRedoneBytesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaRedones,
|
||||
prometheus.CounterValue,
|
||||
data[dbReplicaRedonesPerSec].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaRedonesPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaTotalLogrequiringundo,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaTotalLogRequiringUndo].FirstValue,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaTotalLogRequiringUndo,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.dbReplicaTransactionDelay,
|
||||
prometheus.GaugeValue,
|
||||
data[dbReplicaTransactionDelay].FirstValue/1000.0,
|
||||
sqlInstance, replicaName,
|
||||
data.DbReplicaTransactionDelay/1000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorGeneralStatistics struct {
|
||||
genStatsPerfDataCollectors map[string]*perfdata.Collector
|
||||
genStatsPerfDataCollectors map[string]*pdh.Collector
|
||||
genStatsPerfDataObject []perfDataCounterValuesGenStats
|
||||
|
||||
genStatsActiveTempTables *prometheus.Desc
|
||||
genStatsConnectionReset *prometheus.Desc
|
||||
@@ -53,67 +54,43 @@ type collectorGeneralStatistics struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesGenStats struct {
|
||||
GenStatsActiveTempTables float64 `perfdata:"Active Temp Tables"`
|
||||
GenStatsConnectionResetPerSec float64 `perfdata:"Connection Reset/sec"`
|
||||
GenStatsEventNotificationsDelayedDrop float64 `perfdata:"Event Notifications Delayed Drop"`
|
||||
GenStatsHTTPAuthenticatedRequests float64 `perfdata:"HTTP Authenticated Requests"`
|
||||
GenStatsLogicalConnections float64 `perfdata:"Logical Connections"`
|
||||
GenStatsLoginsPerSec float64 `perfdata:"Logins/sec"`
|
||||
GenStatsLogoutsPerSec float64 `perfdata:"Logouts/sec"`
|
||||
GenStatsMarsDeadlocks float64 `perfdata:"Mars Deadlocks"`
|
||||
GenStatsNonatomicYieldRate float64 `perfdata:"Non-atomic yield rate"`
|
||||
GenStatsProcessesBlocked float64 `perfdata:"Processes blocked"`
|
||||
GenStatsSOAPEmptyRequests float64 `perfdata:"SOAP Empty Requests"`
|
||||
GenStatsSOAPMethodInvocations float64 `perfdata:"SOAP Method Invocations"`
|
||||
GenStatsSOAPSessionInitiateRequests float64 `perfdata:"SOAP Session Initiate Requests"`
|
||||
GenStatsSOAPSessionTerminateRequests float64 `perfdata:"SOAP Session Terminate Requests"`
|
||||
GenStatsSOAPSQLRequests float64 `perfdata:"SOAP SQL Requests"`
|
||||
GenStatsSOAPWSDLRequests float64 `perfdata:"SOAP WSDL Requests"`
|
||||
GenStatsSQLTraceIOProviderLockWaits float64 `perfdata:"SQL Trace IO Provider Lock Waits"`
|
||||
GenStatsTempdbRecoveryUnitID float64 `perfdata:"Tempdb recovery unit id"`
|
||||
GenStatsTempdbRowsetID float64 `perfdata:"Tempdb rowset id"`
|
||||
GenStatsTempTablesCreationRate float64 `perfdata:"Temp Tables Creation Rate"`
|
||||
GenStatsTempTablesForDestruction float64 `perfdata:"Temp Tables For Destruction"`
|
||||
GenStatsTraceEventNotificationQueue float64 `perfdata:"Trace Event Notification Queue"`
|
||||
GenStatsTransactions float64 `perfdata:"Transactions"`
|
||||
GenStatsUserConnections float64 `perfdata:"User Connections"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildGeneralStatistics() error {
|
||||
var err error
|
||||
|
||||
c.genStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.genStatsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "General Statistics"), nil, counters)
|
||||
c.genStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesGenStats](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "General Statistics"), nil,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create General Statistics collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -272,186 +249,177 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectGeneralStatisticsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.genStatsPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "General Statistics"), err)
|
||||
}
|
||||
|
||||
data, ok := perfData[perfdata.InstanceEmpty]
|
||||
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,
|
||||
c.genStatsPerfDataObject[0].GenStatsActiveTempTables,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsConnectionReset,
|
||||
prometheus.CounterValue,
|
||||
data[genStatsConnectionResetPerSec].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsConnectionResetPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsEventNotificationsDelayedDrop,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsEventNotificationsDelayedDrop].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsEventNotificationsDelayedDrop,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsHTTPAuthenticatedRequests,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsHTTPAuthenticatedRequests].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsHTTPAuthenticatedRequests,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsLogicalConnections,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsLogicalConnections].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsLogicalConnections,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsLogins,
|
||||
prometheus.CounterValue,
|
||||
data[genStatsLoginsPerSec].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsLoginsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsLogouts,
|
||||
prometheus.CounterValue,
|
||||
data[genStatsLogoutsPerSec].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsLogoutsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsMarsDeadlocks,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsMarsDeadlocks].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsMarsDeadlocks,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsNonAtomicYieldRate,
|
||||
prometheus.CounterValue,
|
||||
data[genStatsNonatomicYieldRate].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsNonatomicYieldRate,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsProcessesBlocked,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsProcessesBlocked].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsProcessesBlocked,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSOAPEmptyRequests,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSOAPEmptyRequests].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSOAPEmptyRequests,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSOAPMethodInvocations,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSOAPMethodInvocations].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSOAPMethodInvocations,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSOAPSessionInitiateRequests,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSOAPSessionInitiateRequests].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSOAPSessionInitiateRequests,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSOAPSessionTerminateRequests,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSOAPSessionTerminateRequests].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSOAPSessionTerminateRequests,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSOAPSQLRequests,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSOAPSQLRequests].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSOAPSQLRequests,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSOAPWSDLRequests,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSOAPWSDLRequests].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSOAPWSDLRequests,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsSQLTraceIOProviderLockWaits,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsSQLTraceIOProviderLockWaits].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsSQLTraceIOProviderLockWaits,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsTempDBRecoveryUnitID,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsTempdbRecoveryUnitID].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsTempdbRecoveryUnitID,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsTempDBrowSetID,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsTempdbRowsetID].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsTempdbRowsetID,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsTempTablesCreationRate,
|
||||
prometheus.CounterValue,
|
||||
data[genStatsTempTablesCreationRate].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsTempTablesCreationRate,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsTempTablesForDestruction,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsTempTablesForDestruction].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsTempTablesForDestruction,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsTraceEventNotificationQueue,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsTraceEventNotificationQueue].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsTraceEventNotificationQueue,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsTransactions,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsTransactions].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsTransactions,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.genStatsUserConnections,
|
||||
prometheus.GaugeValue,
|
||||
data[genStatsUserConnections].FirstValue,
|
||||
c.genStatsPerfDataObject[0].GenStatsUserConnections,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorLocks struct {
|
||||
locksPerfDataCollectors map[string]*perfdata.Collector
|
||||
locksPerfDataCollectors map[string]*pdh.Collector
|
||||
locksPerfDataObject []perfDataCounterValuesLocks
|
||||
|
||||
// Win32_PerfRawData_{instance}_SQLServerLocks
|
||||
locksWaitTime *prometheus.Desc
|
||||
@@ -38,35 +39,29 @@ type collectorLocks struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesLocks struct {
|
||||
Name string
|
||||
|
||||
LocksAverageWaitTimeMS float64 `perfdata:"Average Wait Time (ms)"`
|
||||
LocksAverageWaitTimeMSBase float64 `perfdata:"Average Wait Time Base,secondvalue"`
|
||||
LocksLockRequestsPerSec float64 `perfdata:"Lock Requests/sec"`
|
||||
LocksLockTimeoutsPerSec float64 `perfdata:"Lock Timeouts/sec"`
|
||||
LocksLockTimeoutsTimeout0PerSec float64 `perfdata:"Lock Timeouts (timeout > 0)/sec"`
|
||||
LocksLockWaitsPerSec float64 `perfdata:"Lock Waits/sec"`
|
||||
LocksLockWaitTimeMS float64 `perfdata:"Lock Wait Time (ms)"`
|
||||
LocksNumberOfDeadlocksPerSec float64 `perfdata:"Number of Deadlocks/sec"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildLocks() error {
|
||||
var err error
|
||||
|
||||
c.locksPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.locksPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, len(c.mssqlInstances))
|
||||
counters := []string{
|
||||
locksAverageWaitTimeMS,
|
||||
locksAverageWaitTimeMSBase,
|
||||
locksLockRequestsPerSec,
|
||||
locksLockTimeoutsPerSec,
|
||||
locksLockTimeoutsTimeout0PerSec,
|
||||
locksLockWaitsPerSec,
|
||||
locksLockWaitTimeMS,
|
||||
locksNumberOfDeadlocksPerSec,
|
||||
}
|
||||
|
||||
for _, sqlInstance := range c.mssqlInstances {
|
||||
c.locksPerfDataCollectors[sqlInstance.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Locks"), perfdata.InstancesAll, counters)
|
||||
c.locksPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesLocks](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Locks"), pdh.InstancesAll,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Locks collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -128,71 +123,67 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectLocksInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.locksPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Locks"), err)
|
||||
}
|
||||
|
||||
for lockResourceName, data := range perfData {
|
||||
for _, data := range c.locksPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksWaitTime,
|
||||
prometheus.GaugeValue,
|
||||
data[locksAverageWaitTimeMS].FirstValue/1000.0,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksAverageWaitTimeMS/1000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksCount,
|
||||
prometheus.GaugeValue,
|
||||
data[locksAverageWaitTimeMSBase].SecondValue/1000.0,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksAverageWaitTimeMSBase/1000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksLockRequests,
|
||||
prometheus.CounterValue,
|
||||
data[locksLockRequestsPerSec].FirstValue,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksLockRequestsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksLockTimeouts,
|
||||
prometheus.CounterValue,
|
||||
data[locksLockTimeoutsPerSec].FirstValue,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksLockTimeoutsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksLockTimeoutstimeout0,
|
||||
prometheus.CounterValue,
|
||||
data[locksLockTimeoutsTimeout0PerSec].FirstValue,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksLockTimeoutsTimeout0PerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksLockWaits,
|
||||
prometheus.CounterValue,
|
||||
data[locksLockWaitsPerSec].FirstValue,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksLockWaitsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksLockWaitTimeMS,
|
||||
prometheus.GaugeValue,
|
||||
data[locksLockWaitTimeMS].FirstValue/1000.0,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksLockWaitTimeMS/1000.0,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.locksNumberOfDeadlocks,
|
||||
prometheus.CounterValue,
|
||||
data[locksNumberOfDeadlocksPerSec].FirstValue,
|
||||
sqlInstance, lockResourceName,
|
||||
data.LocksNumberOfDeadlocksPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorMemoryManager struct {
|
||||
memMgrPerfDataCollectors map[string]*perfdata.Collector
|
||||
memMgrPerfDataCollectors map[string]*pdh.Collector
|
||||
memMgrPerfDataObject []perfDataCounterValuesMemMgr
|
||||
|
||||
memMgrConnectionMemoryKB *prometheus.Desc
|
||||
memMgrDatabaseCacheMemoryKB *prometheus.Desc
|
||||
@@ -49,59 +50,39 @@ type collectorMemoryManager struct {
|
||||
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)"
|
||||
)
|
||||
type perfDataCounterValuesMemMgr struct {
|
||||
MemMgrConnectionMemoryKB float64 `perfdata:"Connection Memory (KB)"`
|
||||
MemMgrDatabaseCacheMemoryKB float64 `perfdata:"Database Cache Memory (KB)"`
|
||||
MemMgrExternalBenefitOfMemory float64 `perfdata:"External benefit of memory"`
|
||||
MemMgrFreeMemoryKB float64 `perfdata:"Free Memory (KB)"`
|
||||
MemMgrGrantedWorkspaceMemoryKB float64 `perfdata:"Granted Workspace Memory (KB)"`
|
||||
MemMgrLockBlocks float64 `perfdata:"Lock Blocks"`
|
||||
MemMgrLockBlocksAllocated float64 `perfdata:"Lock Blocks Allocated"`
|
||||
MemMgrLockMemoryKB float64 `perfdata:"Lock Memory (KB)"`
|
||||
MemMgrLockOwnerBlocks float64 `perfdata:"Lock Owner Blocks"`
|
||||
MemMgrLockOwnerBlocksAllocated float64 `perfdata:"Lock Owner Blocks Allocated"`
|
||||
MemMgrLogPoolMemoryKB float64 `perfdata:"Log Pool Memory (KB)"`
|
||||
MemMgrMaximumWorkspaceMemoryKB float64 `perfdata:"Maximum Workspace Memory (KB)"`
|
||||
MemMgrMemoryGrantsOutstanding float64 `perfdata:"Memory Grants Outstanding"`
|
||||
MemMgrMemoryGrantsPending float64 `perfdata:"Memory Grants Pending"`
|
||||
MemMgrOptimizerMemoryKB float64 `perfdata:"Optimizer Memory (KB)"`
|
||||
MemMgrReservedServerMemoryKB float64 `perfdata:"Reserved Server Memory (KB)"`
|
||||
MemMgrSQLCacheMemoryKB float64 `perfdata:"SQL Cache Memory (KB)"`
|
||||
MemMgrStolenServerMemoryKB float64 `perfdata:"Stolen Server Memory (KB)"`
|
||||
MemMgrTargetServerMemoryKB float64 `perfdata:"Target Server Memory (KB)"`
|
||||
MemMgrTotalServerMemoryKB float64 `perfdata:"Total Server Memory (KB)"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildMemoryManager() error {
|
||||
var err error
|
||||
|
||||
c.memMgrPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.memMgrPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Memory Manager"), perfdata.InstancesAll, counters)
|
||||
c.memMgrPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesMemMgr](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Memory Manager"), pdh.InstancesAll,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Memory Manager collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -235,158 +216,149 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectMemoryManagerInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.memMgrPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Memory Manager"), err)
|
||||
}
|
||||
|
||||
data, ok := perfData[perfdata.InstanceEmpty]
|
||||
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,
|
||||
c.memMgrPerfDataObject[0].MemMgrConnectionMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrDatabaseCacheMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrDatabaseCacheMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrDatabaseCacheMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrExternalBenefitOfMemory,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrExternalBenefitOfMemory].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrExternalBenefitOfMemory,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrFreeMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrFreeMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrFreeMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrGrantedWorkspaceMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrGrantedWorkspaceMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrGrantedWorkspaceMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrLockBlocks,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrLockBlocks].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrLockBlocks,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrLockBlocksAllocated,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrLockBlocksAllocated].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrLockBlocksAllocated,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrLockMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrLockMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrLockMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrLockOwnerBlocks,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrLockOwnerBlocks].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrLockOwnerBlocks,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrLockOwnerBlocksAllocated,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrLockOwnerBlocksAllocated].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrLockOwnerBlocksAllocated,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrLogPoolMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrLogPoolMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrLogPoolMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrMaximumWorkspaceMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrMaximumWorkspaceMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrMaximumWorkspaceMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrMemoryGrantsOutstanding,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrMemoryGrantsOutstanding].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrMemoryGrantsOutstanding,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrMemoryGrantsPending,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrMemoryGrantsPending].FirstValue,
|
||||
c.memMgrPerfDataObject[0].MemMgrMemoryGrantsPending,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrOptimizerMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrOptimizerMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrOptimizerMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrReservedServerMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrReservedServerMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrReservedServerMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrSQLCacheMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrSQLCacheMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrSQLCacheMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrStolenServerMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrStolenServerMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrStolenServerMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrTargetServerMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrTargetServerMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrTargetServerMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.memMgrTotalServerMemoryKB,
|
||||
prometheus.GaugeValue,
|
||||
data[memMgrTotalServerMemoryKB].FirstValue*1024,
|
||||
c.memMgrPerfDataObject[0].MemMgrTotalServerMemoryKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
|
||||
@@ -19,33 +19,35 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorSQLErrors struct {
|
||||
sqlErrorsPerfDataCollectors map[string]*perfdata.Collector
|
||||
sqlErrorsPerfDataCollectors map[string]*pdh.Collector
|
||||
sqlErrorsPerfDataObject []perfDataCounterValuesSqlErrors
|
||||
|
||||
// Win32_PerfRawData_{instance}_SQLServerSQLErrors
|
||||
sqlErrorsTotal *prometheus.Desc
|
||||
}
|
||||
|
||||
const (
|
||||
sqlErrorsErrorsPerSec = "Errors/sec"
|
||||
)
|
||||
type perfDataCounterValuesSqlErrors struct {
|
||||
Name string
|
||||
|
||||
SqlErrorsErrorsPerSec float64 `perfdata:"Errors/sec"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildSQLErrors() error {
|
||||
var err error
|
||||
|
||||
c.sqlErrorsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.sqlErrorsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, len(c.mssqlInstances))
|
||||
counters := []string{
|
||||
sqlErrorsErrorsPerSec,
|
||||
}
|
||||
|
||||
for _, sqlInstance := range c.mssqlInstances {
|
||||
c.sqlErrorsPerfDataCollectors[sqlInstance.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "SQL Errors"), perfdata.InstancesAll, counters)
|
||||
c.sqlErrorsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesSqlErrors](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "SQL Errors"), pdh.InstancesAll,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create SQL Errors collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -66,22 +68,18 @@ func (c *Collector) collectSQLErrors(ch chan<- prometheus.Metric) error {
|
||||
return c.collect(ch, subCollectorSQLErrors, c.sqlErrorsPerfDataCollectors, c.collectSQLErrorsInstance)
|
||||
}
|
||||
|
||||
func (c *Collector) collectSQLErrorsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectSQLErrorsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.sqlErrorsPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Errors"), err)
|
||||
}
|
||||
|
||||
for resource, data := range perfData {
|
||||
for _, data := range c.sqlErrorsPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlErrorsTotal,
|
||||
prometheus.CounterValue,
|
||||
data[sqlErrorsErrorsPerSec].FirstValue,
|
||||
sqlInstance, resource,
|
||||
data.SqlErrorsErrorsPerSec,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorSQLStats struct {
|
||||
sqlStatsPerfDataCollectors map[string]*perfdata.Collector
|
||||
sqlStatsPerfDataCollectors map[string]*pdh.Collector
|
||||
sqlStatsPerfDataObject []perfDataCounterValuesSqlStats
|
||||
|
||||
sqlStatsAutoParamAttempts *prometheus.Desc
|
||||
sqlStatsBatchRequests *prometheus.Desc
|
||||
@@ -40,41 +41,30 @@ type collectorSQLStats struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesSqlStats struct {
|
||||
SqlStatsAutoParamAttemptsPerSec float64 `perfdata:"Auto-Param Attempts/sec"`
|
||||
SqlStatsBatchRequestsPerSec float64 `perfdata:"Batch Requests/sec"`
|
||||
SqlStatsFailedAutoParamsPerSec float64 `perfdata:"Failed Auto-Params/sec"`
|
||||
SqlStatsForcedParameterizationsPerSec float64 `perfdata:"Forced Parameterizations/sec"`
|
||||
SqlStatsGuidedplanexecutionsPerSec float64 `perfdata:"Guided plan executions/sec"`
|
||||
SqlStatsMisguidedplanexecutionsPerSec float64 `perfdata:"Misguided plan executions/sec"`
|
||||
SqlStatsSafeAutoParamsPerSec float64 `perfdata:"Safe Auto-Params/sec"`
|
||||
SqlStatsSQLAttentionrate float64 `perfdata:"SQL Attention rate"`
|
||||
SqlStatsSQLCompilationsPerSec float64 `perfdata:"SQL Compilations/sec"`
|
||||
SqlStatsSQLReCompilationsPerSec float64 `perfdata:"SQL Re-Compilations/sec"`
|
||||
SqlStatsUnsafeAutoParamsPerSec float64 `perfdata:"Unsafe Auto-Params/sec"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildSQLStats() error {
|
||||
var err error
|
||||
|
||||
c.sqlStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.sqlStatsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, len(c.mssqlInstances))
|
||||
counters := []string{
|
||||
sqlStatsAutoParamAttemptsPerSec,
|
||||
sqlStatsBatchRequestsPerSec,
|
||||
sqlStatsFailedAutoParamsPerSec,
|
||||
sqlStatsForcedParameterizationsPerSec,
|
||||
sqlStatsGuidedplanexecutionsPerSec,
|
||||
sqlStatsMisguidedplanexecutionsPerSec,
|
||||
sqlStatsSafeAutoParamsPerSec,
|
||||
sqlStatsSQLAttentionrate,
|
||||
sqlStatsSQLCompilationsPerSec,
|
||||
sqlStatsSQLReCompilationsPerSec,
|
||||
sqlStatsUnsafeAutoParamsPerSec,
|
||||
}
|
||||
|
||||
for _, sqlInstance := range c.mssqlInstances {
|
||||
c.sqlStatsPerfDataCollectors[sqlInstance.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "SQL Statistics"), nil, counters)
|
||||
c.sqlStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesSqlStats](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "SQL Statistics"), nil,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create SQL Statistics collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -154,95 +144,86 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectSQLStatsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.sqlStatsPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "SQL Statistics"), err)
|
||||
}
|
||||
|
||||
data, ok := perfData[perfdata.InstanceEmpty]
|
||||
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,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsAutoParamAttemptsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsBatchRequests,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsBatchRequestsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsBatchRequestsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsFailedAutoParams,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsFailedAutoParamsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsFailedAutoParamsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsForcedParameterizations,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsForcedParameterizationsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsForcedParameterizationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsGuidedplanexecutions,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsGuidedplanexecutionsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsGuidedplanexecutionsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsMisguidedplanexecutions,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsMisguidedplanexecutionsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsMisguidedplanexecutionsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsSafeAutoParams,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsSafeAutoParamsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsSafeAutoParamsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsSQLAttentionrate,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsSQLAttentionrate].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsSQLAttentionrate,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsSQLCompilations,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsSQLCompilationsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsSQLCompilationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsSQLReCompilations,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsSQLReCompilationsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsSQLReCompilationsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.sqlStatsUnsafeAutoParams,
|
||||
prometheus.CounterValue,
|
||||
data[sqlStatsUnsafeAutoParamsPerSec].FirstValue,
|
||||
c.sqlStatsPerfDataObject[0].SqlStatsUnsafeAutoParamsPerSec,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorTransactions struct {
|
||||
transactionsPerfDataCollectors map[string]*perfdata.Collector
|
||||
transactionsPerfDataCollectors map[string]*pdh.Collector
|
||||
transactionsPerfDataObject []perfDataCounterValuesTransactions
|
||||
|
||||
transactionsTempDbFreeSpaceBytes *prometheus.Desc
|
||||
transactionsLongestTransactionRunningSeconds *prometheus.Desc
|
||||
@@ -42,45 +43,32 @@ type collectorTransactions struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesTransactions struct {
|
||||
TransactionsFreeSpaceintempdbKB float64 `perfdata:"Free Space in tempdb (KB)"`
|
||||
TransactionsLongestTransactionRunningTime float64 `perfdata:"Longest Transaction Running Time"`
|
||||
TransactionsNonSnapshotVersionTransactions float64 `perfdata:"NonSnapshot Version Transactions"`
|
||||
TransactionsSnapshotTransactions float64 `perfdata:"Snapshot Transactions"`
|
||||
TransactionsTransactions float64 `perfdata:"Transactions"`
|
||||
TransactionsUpdateconflictratio float64 `perfdata:"Update conflict ratio"`
|
||||
TransactionsUpdateSnapshotTransactions float64 `perfdata:"Update Snapshot Transactions"`
|
||||
TransactionsVersionCleanuprateKBPers float64 `perfdata:"Version Cleanup rate (KB/s)"`
|
||||
TransactionsVersionGenerationrateKBPers float64 `perfdata:"Version Generation rate (KB/s)"`
|
||||
TransactionsVersionStoreSizeKB float64 `perfdata:"Version Store Size (KB)"`
|
||||
TransactionsVersionStoreunitcount float64 `perfdata:"Version Store unit count"`
|
||||
TransactionsVersionStoreunitcreation float64 `perfdata:"Version Store unit creation"`
|
||||
TransactionsVersionStoreunittruncation float64 `perfdata:"Version Store unit truncation"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildTransactions() error {
|
||||
var err error
|
||||
|
||||
c.transactionsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.transactionsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Transactions"), nil, counters)
|
||||
c.transactionsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesTransactions](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Transactions"), nil,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Transactions collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -174,109 +162,100 @@ func (c *Collector) collectTransactions(ch chan<- prometheus.Metric) error {
|
||||
|
||||
// Win32_PerfRawData_MSSQLSERVER_Transactions docs:
|
||||
// - https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-transactions-object
|
||||
func (c *Collector) collectTransactionsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *perfdata.Collector) error {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectTransactionsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.transactionsPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Transactions"), err)
|
||||
}
|
||||
|
||||
data, ok := perfData[perfdata.InstanceEmpty]
|
||||
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,
|
||||
c.transactionsPerfDataObject[0].TransactionsFreeSpaceintempdbKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsLongestTransactionRunningSeconds,
|
||||
prometheus.GaugeValue,
|
||||
data[transactionsLongestTransactionRunningTime].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsLongestTransactionRunningTime,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsNonSnapshotVersionActiveTotal,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsNonSnapshotVersionTransactions].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsNonSnapshotVersionTransactions,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsSnapshotActiveTotal,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsSnapshotTransactions].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsSnapshotTransactions,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsActive,
|
||||
prometheus.GaugeValue,
|
||||
data[transactionsTransactions].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsTransactions,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsUpdateConflictsTotal,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsUpdateconflictratio].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsUpdateconflictratio,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsUpdateSnapshotActiveTotal,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsUpdateSnapshotTransactions].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsUpdateSnapshotTransactions,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsVersionCleanupRateBytes,
|
||||
prometheus.GaugeValue,
|
||||
data[transactionsVersionCleanuprateKBPers].FirstValue*1024,
|
||||
c.transactionsPerfDataObject[0].TransactionsVersionCleanuprateKBPers*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsVersionGenerationRateBytes,
|
||||
prometheus.GaugeValue,
|
||||
data[transactionsVersionGenerationrateKBPers].FirstValue*1024,
|
||||
c.transactionsPerfDataObject[0].TransactionsVersionGenerationrateKBPers*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsVersionStoreSizeBytes,
|
||||
prometheus.GaugeValue,
|
||||
data[transactionsVersionStoreSizeKB].FirstValue*1024,
|
||||
c.transactionsPerfDataObject[0].TransactionsVersionStoreSizeKB*1024,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsVersionStoreUnits,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsVersionStoreunitcount].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsVersionStoreunitcount,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsVersionStoreCreationUnits,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsVersionStoreunitcreation].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsVersionStoreunitcreation,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.transactionsVersionStoreTruncationUnits,
|
||||
prometheus.CounterValue,
|
||||
data[transactionsVersionStoreunittruncation].FirstValue,
|
||||
c.transactionsPerfDataObject[0].TransactionsVersionStoreunittruncation,
|
||||
sqlInstance,
|
||||
)
|
||||
|
||||
|
||||
@@ -19,13 +19,14 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/prometheus-community/windows_exporter/internal/perfdata"
|
||||
"github.com/prometheus-community/windows_exporter/internal/pdh"
|
||||
"github.com/prometheus-community/windows_exporter/internal/types"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
)
|
||||
|
||||
type collectorWaitStats struct {
|
||||
waitStatsPerfDataCollectors map[string]*perfdata.Collector
|
||||
waitStatsPerfDataCollectors map[string]*pdh.Collector
|
||||
waitStatsPerfDataObject []perfDataCounterValuesWaitStats
|
||||
|
||||
waitStatsLockWaits *prometheus.Desc
|
||||
waitStatsMemoryGrantQueueWaits *prometheus.Desc
|
||||
@@ -41,43 +42,33 @@ type collectorWaitStats struct {
|
||||
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"
|
||||
)
|
||||
type perfDataCounterValuesWaitStats struct {
|
||||
Name string
|
||||
|
||||
WaitStatsLockWaits float64 `perfdata:"Lock waits"`
|
||||
WaitStatsMemoryGrantQueueWaits float64 `perfdata:"Memory grant queue waits"`
|
||||
WaitStatsThreadSafeMemoryObjectsWaits float64 `perfdata:"Thread-safe memory objects waits"`
|
||||
WaitStatsLogWriteWaits float64 `perfdata:"Log write waits"`
|
||||
WaitStatsLogBufferWaits float64 `perfdata:"Log buffer waits"`
|
||||
WaitStatsNetworkIOWaits float64 `perfdata:"Network IO waits"`
|
||||
WaitStatsPageIOLatchWaits float64 `perfdata:"Page IO latch waits"`
|
||||
WaitStatsPageLatchWaits float64 `perfdata:"Page latch waits"`
|
||||
WaitStatsNonpageLatchWaits float64 `perfdata:"Non-Page latch waits"`
|
||||
WaitStatsWaitForTheWorkerWaits float64 `perfdata:"Wait for the worker"`
|
||||
WaitStatsWorkspaceSynchronizationWaits float64 `perfdata:"Workspace synchronization waits"`
|
||||
WaitStatsTransactionOwnershipWaits float64 `perfdata:"Transaction ownership waits"`
|
||||
}
|
||||
|
||||
func (c *Collector) buildWaitStats() error {
|
||||
var err error
|
||||
|
||||
c.waitStatsPerfDataCollectors = make(map[string]*perfdata.Collector, len(c.mssqlInstances))
|
||||
c.waitStatsPerfDataCollectors = make(map[string]*pdh.Collector, len(c.mssqlInstances))
|
||||
errs := make([]error, 0, 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.name], err = perfdata.NewCollector(c.mssqlGetPerfObjectName(sqlInstance.name, "Wait Statistics"), perfdata.InstancesAll, counters)
|
||||
c.waitStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesWaitStats](
|
||||
c.mssqlGetPerfObjectName(sqlInstance.name, "Wait Statistics"), pdh.InstancesAll,
|
||||
)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Errorf("failed to create Wait Statistics collector for instance %s: %w", sqlInstance.name, err))
|
||||
}
|
||||
@@ -164,99 +155,95 @@ 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 {
|
||||
if perfDataCollector == nil {
|
||||
return types.ErrCollectorNotInitialized
|
||||
}
|
||||
|
||||
perfData, err := perfDataCollector.Collect()
|
||||
func (c *Collector) collectWaitStatsInstance(ch chan<- prometheus.Metric, sqlInstance string, perfDataCollector *pdh.Collector) error {
|
||||
err := perfDataCollector.Collect(&c.waitStatsPerfDataObject)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to collect %s metrics: %w", c.mssqlGetPerfObjectName(sqlInstance, "Wait Statistics"), err)
|
||||
}
|
||||
|
||||
for item, data := range perfData {
|
||||
for _, data := range c.waitStatsPerfDataObject {
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsLockWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsLockWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsLockWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsMemoryGrantQueueWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsMemoryGrantQueueWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsMemoryGrantQueueWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsThreadSafeMemoryObjectsWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsThreadSafeMemoryObjectsWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsThreadSafeMemoryObjectsWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsLogWriteWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsLogWriteWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsLogWriteWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsLogBufferWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsLogBufferWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsLogBufferWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsNetworkIOWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsNetworkIOWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsNetworkIOWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsPageIOLatchWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsPageIOLatchWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsPageIOLatchWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsPageLatchWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsPageLatchWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsPageLatchWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsNonPageLatchWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsNonpageLatchWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsNonpageLatchWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsWaitForTheWorkerWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsWaitForTheWorkerWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsWaitForTheWorkerWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsWorkspaceSynchronizationWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsWorkspaceSynchronizationWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsWorkspaceSynchronizationWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
|
||||
ch <- prometheus.MustNewConstMetric(
|
||||
c.waitStatsTransactionOwnershipWaits,
|
||||
prometheus.CounterValue,
|
||||
data[waitStatsTransactionOwnershipWaits].FirstValue,
|
||||
sqlInstance, item,
|
||||
data.WaitStatsTransactionOwnershipWaits,
|
||||
sqlInstance, data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user