From 27cc1072fe5c4abea171a52ed10e0968249b0f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D1=8F=D0=BA=D0=BE=D0=B2=20=D0=98=D0=B3?= =?UTF-8?q?=D0=BE=D1=80=D1=8C?= Date: Sun, 4 Aug 2019 00:55:28 +0300 Subject: [PATCH] Initial transactions collector implementation --- collector/mssql.go | 238 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 237 insertions(+), 1 deletion(-) diff --git a/collector/mssql.go b/collector/mssql.go index b5467029..a5bd9925 100644 --- a/collector/mssql.go +++ b/collector/mssql.go @@ -91,7 +91,7 @@ func mssqlBuildWMIInstanceClass(suffix string, instance string) string { type mssqlCollectorsMap map[string]mssqlCollectorFunc func mssqlAvailableClassCollectors() string { - return "accessmethods,availreplica,bufman,databases,dbreplica,genstats,locks,memmgr,sqlstats,sqlerrors" + return "accessmethods,availreplica,bufman,databases,dbreplica,genstats,locks,memmgr,sqlstats,sqlerrors,transactions" } func (c *MSSQLCollector) getMSSQLCollectors() mssqlCollectorsMap { @@ -106,6 +106,7 @@ func (c *MSSQLCollector) getMSSQLCollectors() mssqlCollectorsMap { mssqlCollectors["memmgr"] = c.collectMemoryManager mssqlCollectors["sqlstats"] = c.collectSQLStats mssqlCollectors["sqlerrors"] = c.collectSQLErrors + mssqlCollectors["transactions"] = c.collectTransactions return mssqlCollectors } @@ -362,6 +363,21 @@ type MSSQLCollector struct { // Win32_PerfRawData_{instance}_SQLServerSQLErrors SQLErrorsTotal *prometheus.Desc + // Win32_PerfRawData_{instance}_SQLServerTransactions + TransactionsFreeSpaceInTempDbKB *prometheus.Desc + TransactionsLongestTransactionRunningTime *prometheus.Desc + TransactionsNonSnapshotVersionTotalActive *prometheus.Desc + TransactionsSnapshotTotalActive *prometheus.Desc + TransactionsTotalActive *prometheus.Desc + TransactionsUpdateConflictRatio *prometheus.Desc + TransactionsUpdateSnapshotTotalActive *prometheus.Desc + TransactionsVersionCleanupRateKBs *prometheus.Desc + TransactionsVersionGenerationRateKBs *prometheus.Desc + TransactionsVersionStoreSizeKB *prometheus.Desc + TransactionsVersionStoreUnitCount *prometheus.Desc + TransactionsVersionStoreUnitCreation *prometheus.Desc + TransactionsVersionStoreUnitTruncation *prometheus.Desc + mssqlInstances mssqlInstancesType mssqlCollectors mssqlCollectorsMap mssqlChildCollectorFailure int @@ -1649,6 +1665,98 @@ func NewMSSQLCollector() (Collector, error) { nil, ), + // Win32_PerfRawData_{instance}_SQLServerTransactions + TransactionsFreeSpaceInTempDbKB: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_tempdb_free_space_bytes"), + "(Transactions.FreeSpaceInTempDbKB)", + []string{"instance"}, + nil, + ), + + TransactionsLongestTransactionRunningTime: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_longest_transaction_running_seconds"), + "(Transactions.LongestTransactionRunningTime)", + []string{"instance"}, + nil, + ), + + TransactionsNonSnapshotVersionTotalActive: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_nonsnapshot_version_active_total"), + "(Transactions.NonSnapshotVersionTotalActive)", + []string{"instance"}, + nil, + ), + + TransactionsSnapshotTotalActive: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_snapshot_active_total"), + "(Transactions.SnapshotTotalActive)", + []string{"instance"}, + nil, + ), + + TransactionsTotalActive: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_active_total"), + "(Transactions.TotalActive)", + []string{"instance"}, + nil, + ), + + TransactionsUpdateConflictRatio: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_update_conflict_ratio"), + "(Transactions.UpdateConflictRatio)", + []string{"instance"}, + nil, + ), + + TransactionsUpdateSnapshotTotalActive: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_update_snapshot_active_total"), + "(Transactions.UpdateSnapshotTotalActive)", + []string{"instance"}, + nil, + ), + + TransactionsVersionCleanupRateKBs: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_cleanup_rate_bytes"), + "(Transactions.VersionCleanupRateKBs)", + []string{"instance"}, + nil, + ), + + TransactionsVersionGenerationRateKBs: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_generation_rate_bytes"), + "(Transactions.VersionGenerationRateKBs)", + []string{"instance"}, + nil, + ), + + TransactionsVersionStoreSizeKB: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_size_bytes"), + "(Transactions.VersionStoreSizeKB)", + []string{"instance"}, + nil, + ), + + TransactionsVersionStoreUnitCount: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_units"), + "(Transactions.VersionStoreUnitCount)", + []string{"instance"}, + nil, + ), + + TransactionsVersionStoreUnitCreation: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_creation_units"), + "(Transactions.VersionStoreUnitCreation)", + []string{"instance"}, + nil, + ), + + TransactionsVersionStoreUnitTruncation: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_truncation_units"), + "(Transactions.VersionStoreUnitTruncation)", + []string{"instance"}, + nil, + ), + mssqlInstances: getMSSQLInstances(), } @@ -3599,5 +3707,133 @@ func (c *MSSQLCollector) collectSQLErrors(ch chan<- prometheus.Metric, sqlInstan ) } + return nil, nil +} + +type win32PerfRawDataSqlServerTransactions struct { + FreeSpaceInTempDbKB uint64 + LongestTransactionRunningTime uint64 + NonSnapshotVersionTransactions uint64 + SnapshotTransactions uint64 + Transactions uint64 + UpdateConflictRatio uint64 + UpdateSnapshotTransactions uint64 + VersionCleanupRateKBs uint64 + VersionGenerationRateKBs uint64 + VersionStoreSizeKB uint64 + VersionStoreUnitCount uint64 + VersionStoreUnitCreation uint64 + VersionStoreUnitTruncation uint64 +} + +// Win32_PerfRawData_MSSQLSERVER_Transactions docs: +// - https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-transactions-object +func (c *MSSQLCollector) collectTransactions(ch chan<- prometheus.Metric, sqlInstance string) (*prometheus.Desc, error) { + var dst []win32PerfRawDataSqlServerTransactions + log.Debugf("mssql_transactions collector iterating sql instance %s.", sqlInstance) + + class := mssqlBuildWMIInstanceClass("Transactions", sqlInstance) + q := queryAllForClass(&dst, class) + if err := wmi.Query(q, &dst); err != nil { + return nil, err + } + + if len(dst) == 0 { + return nil, errors.New("WMI query returned empty result set") + } + + v := dst[0] + + ch <- prometheus.MustNewConstMetric( + c.TransactionsFreeSpaceInTempDbKB, + prometheus.GaugeValue, + float64(v.FreeSpaceInTempDbKB), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsLongestTransactionRunningTime, + prometheus.GaugeValue, + float64(v.LongestTransactionRunningTime), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsNonSnapshotVersionTotalActive, + prometheus.CounterValue, + float64(v.NonSnapshotVersionTransactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsSnapshotTotalActive, + prometheus.CounterValue, + float64(v.SnapshotTransactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsTotalActive, + prometheus.CounterValue, + float64(v.Transactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsUpdateConflictRatio, + prometheus.GaugeValue, + float64(v.UpdateConflictRatio), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsUpdateSnapshotTotalActive, + prometheus.CounterValue, + float64(v.UpdateSnapshotTransactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionCleanupRateKBs, + prometheus.GaugeValue, + float64(v.VersionCleanupRateKBs), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionGenerationRateKBs, + prometheus.GaugeValue, + float64(v.VersionGenerationRateKBs), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreSizeKB, + prometheus.GaugeValue, + float64(v.VersionStoreSizeKB), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreUnitCount, + prometheus.CounterValue, + float64(v.VersionStoreUnitCount), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreUnitCreation, + prometheus.CounterValue, + float64(v.VersionStoreUnitCreation), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreUnitTruncation, + prometheus.CounterValue, + float64(v.VersionStoreUnitTruncation), + sqlInstance, + ) + return nil, nil } \ No newline at end of file