process: Use registry collector for V1 data (#1814)

Signed-off-by: Jan-Otto Kröpke <mail@jkroepke.de>
This commit is contained in:
Jan-Otto Kröpke
2024-12-21 22:58:47 +01:00
committed by GitHub
parent 39c929eefe
commit a9f8b3b722
158 changed files with 7793 additions and 7748 deletions

View File

@@ -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(

View File

@@ -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,
)

View File

@@ -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,
)
}

View File

@@ -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,
)
}

View File

@@ -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,
)
}

View File

@@ -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,
)
}

View File

@@ -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,
)

View File

@@ -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,
)
}

View File

@@ -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,
)

View File

@@ -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,
)
}

View File

@@ -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,
)

View File

@@ -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,
)

View File

@@ -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,
)
}