mirror of
https://github.com/prometheus-community/windows_exporter.git
synced 2026-02-08 05:56:37 +00:00
432 lines
15 KiB
Go
432 lines
15 KiB
Go
// Copyright 2024 The Prometheus Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
//go:build windows
|
|
|
|
package mssql
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"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]*pdh.Collector
|
|
genStatsPerfDataObject []perfDataCounterValuesGenStats
|
|
|
|
genStatsActiveTempTables *prometheus.Desc
|
|
genStatsConnectionReset *prometheus.Desc
|
|
genStatsEventNotificationsDelayedDrop *prometheus.Desc
|
|
genStatsHTTPAuthenticatedRequests *prometheus.Desc
|
|
genStatsLogicalConnections *prometheus.Desc
|
|
genStatsLogins *prometheus.Desc
|
|
genStatsLogouts *prometheus.Desc
|
|
genStatsMarsDeadlocks *prometheus.Desc
|
|
genStatsNonAtomicYieldRate *prometheus.Desc
|
|
genStatsProcessesBlocked *prometheus.Desc
|
|
genStatsSOAPEmptyRequests *prometheus.Desc
|
|
genStatsSOAPMethodInvocations *prometheus.Desc
|
|
genStatsSOAPSessionInitiateRequests *prometheus.Desc
|
|
genStatsSOAPSessionTerminateRequests *prometheus.Desc
|
|
genStatsSOAPSQLRequests *prometheus.Desc
|
|
genStatsSOAPWSDLRequests *prometheus.Desc
|
|
genStatsSQLTraceIOProviderLockWaits *prometheus.Desc
|
|
genStatsTempDBRecoveryUnitID *prometheus.Desc
|
|
genStatsTempDBrowSetID *prometheus.Desc
|
|
genStatsTempTablesCreationRate *prometheus.Desc
|
|
genStatsTempTablesForDestruction *prometheus.Desc
|
|
genStatsTraceEventNotificationQueue *prometheus.Desc
|
|
genStatsTransactions *prometheus.Desc
|
|
genStatsUserConnections *prometheus.Desc
|
|
}
|
|
|
|
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]*pdh.Collector, len(c.mssqlInstances))
|
|
errs := make([]error, 0, len(c.mssqlInstances))
|
|
|
|
for _, sqlInstance := range c.mssqlInstances {
|
|
c.genStatsPerfDataCollectors[sqlInstance.name], err = pdh.NewCollector[perfDataCounterValuesGenStats](pdh.CounterTypeRaw, 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))
|
|
}
|
|
}
|
|
|
|
// Win32_PerfRawData_{instance}_SQLServerGeneralStatistics
|
|
c.genStatsActiveTempTables = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_active_temp_tables"),
|
|
"(GeneralStatistics.ActiveTempTables)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsConnectionReset = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_connection_resets"),
|
|
"(GeneralStatistics.ConnectionReset)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsEventNotificationsDelayedDrop = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_event_notifications_delayed_drop"),
|
|
"(GeneralStatistics.EventNotificationsDelayedDrop)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsHTTPAuthenticatedRequests = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_http_authenticated_requests"),
|
|
"(GeneralStatistics.HTTPAuthenticatedRequests)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsLogicalConnections = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_logical_connections"),
|
|
"(GeneralStatistics.LogicalConnections)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsLogins = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_logins"),
|
|
"(GeneralStatistics.Logins)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsLogouts = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_logouts"),
|
|
"(GeneralStatistics.Logouts)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsMarsDeadlocks = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_mars_deadlocks"),
|
|
"(GeneralStatistics.MarsDeadlocks)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsNonAtomicYieldRate = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_non_atomic_yields"),
|
|
"(GeneralStatistics.Nonatomicyields)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsProcessesBlocked = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_blocked_processes"),
|
|
"(GeneralStatistics.Processesblocked)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSOAPEmptyRequests = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_empty_requests"),
|
|
"(GeneralStatistics.SOAPEmptyRequests)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSOAPMethodInvocations = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_method_invocations"),
|
|
"(GeneralStatistics.SOAPMethodInvocations)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSOAPSessionInitiateRequests = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_session_initiate_requests"),
|
|
"(GeneralStatistics.SOAPSessionInitiateRequests)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSOAPSessionTerminateRequests = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_soap_session_terminate_requests"),
|
|
"(GeneralStatistics.SOAPSessionTerminateRequests)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSOAPSQLRequests = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_soapsql_requests"),
|
|
"(GeneralStatistics.SOAPSQLRequests)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSOAPWSDLRequests = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_soapwsdl_requests"),
|
|
"(GeneralStatistics.SOAPWSDLRequests)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsSQLTraceIOProviderLockWaits = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_sql_trace_io_provider_lock_waits"),
|
|
"(GeneralStatistics.SQLTraceIOProviderLockWaits)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsTempDBRecoveryUnitID = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_tempdb_recovery_unit_ids_generated"),
|
|
"(GeneralStatistics.Tempdbrecoveryunitid)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsTempDBrowSetID = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_tempdb_rowset_ids_generated"),
|
|
"(GeneralStatistics.Tempdbrowsetid)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsTempTablesCreationRate = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_temp_tables_creations"),
|
|
"(GeneralStatistics.TempTablesCreations)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsTempTablesForDestruction = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_temp_tables_awaiting_destruction"),
|
|
"(GeneralStatistics.TempTablesForDestruction)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsTraceEventNotificationQueue = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_trace_event_notification_queue_size"),
|
|
"(GeneralStatistics.TraceEventNotificationQueue)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsTransactions = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_transactions"),
|
|
"(GeneralStatistics.Transactions)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
c.genStatsUserConnections = prometheus.NewDesc(
|
|
prometheus.BuildFQName(types.Namespace, Name, "genstats_user_connections"),
|
|
"(GeneralStatistics.UserConnections)",
|
|
[]string{"mssql_instance"},
|
|
nil,
|
|
)
|
|
|
|
return errors.Join(errs...)
|
|
}
|
|
|
|
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 *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)
|
|
}
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsActiveTempTables,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsActiveTempTables,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsConnectionReset,
|
|
prometheus.CounterValue,
|
|
c.genStatsPerfDataObject[0].GenStatsConnectionResetPerSec,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsEventNotificationsDelayedDrop,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsEventNotificationsDelayedDrop,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsHTTPAuthenticatedRequests,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsHTTPAuthenticatedRequests,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsLogicalConnections,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsLogicalConnections,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsLogins,
|
|
prometheus.CounterValue,
|
|
c.genStatsPerfDataObject[0].GenStatsLoginsPerSec,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsLogouts,
|
|
prometheus.CounterValue,
|
|
c.genStatsPerfDataObject[0].GenStatsLogoutsPerSec,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsMarsDeadlocks,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsMarsDeadlocks,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsNonAtomicYieldRate,
|
|
prometheus.CounterValue,
|
|
c.genStatsPerfDataObject[0].GenStatsNonatomicYieldRate,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsProcessesBlocked,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsProcessesBlocked,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSOAPEmptyRequests,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSOAPEmptyRequests,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSOAPMethodInvocations,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSOAPMethodInvocations,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSOAPSessionInitiateRequests,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSOAPSessionInitiateRequests,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSOAPSessionTerminateRequests,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSOAPSessionTerminateRequests,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSOAPSQLRequests,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSOAPSQLRequests,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSOAPWSDLRequests,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSOAPWSDLRequests,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsSQLTraceIOProviderLockWaits,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsSQLTraceIOProviderLockWaits,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsTempDBRecoveryUnitID,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsTempdbRecoveryUnitID,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsTempDBrowSetID,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsTempdbRowsetID,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsTempTablesCreationRate,
|
|
prometheus.CounterValue,
|
|
c.genStatsPerfDataObject[0].GenStatsTempTablesCreationRate,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsTempTablesForDestruction,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsTempTablesForDestruction,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsTraceEventNotificationQueue,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsTraceEventNotificationQueue,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsTransactions,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsTransactions,
|
|
sqlInstance,
|
|
)
|
|
|
|
ch <- prometheus.MustNewConstMetric(
|
|
c.genStatsUserConnections,
|
|
prometheus.GaugeValue,
|
|
c.genStatsPerfDataObject[0].GenStatsUserConnections,
|
|
sqlInstance,
|
|
)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (c *Collector) closeGeneralStatistics() {
|
|
for _, perfDataCollector := range c.genStatsPerfDataCollectors {
|
|
perfDataCollector.Close()
|
|
}
|
|
}
|