diff --git a/.gitignore b/.gitignore index 7cc56baf..57676a59 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ VERSION *.swp *.un~ output/ -.idea +.vscode +.idea \ No newline at end of file diff --git a/collector/mssql.go b/collector/mssql.go index 804f24d3..9b0d3744 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 } @@ -360,7 +361,22 @@ type MSSQLCollector struct { SQLStatsUnsafeAutoParams *prometheus.Desc // Win32_PerfRawData_{instance}_SQLServerSQLErrors - SQLErrorsTotal *prometheus.Desc + SQLErrorsTotal *prometheus.Desc + + // Win32_PerfRawData_{instance}_SQLServerTransactions + TransactionsTempDbFreeSpaceBytes *prometheus.Desc + TransactionsLongestTransactionRunningSeconds *prometheus.Desc + TransactionsNonSnapshotVersionActiveTotal *prometheus.Desc + TransactionsSnapshotActiveTotal *prometheus.Desc + TransactionsActiveTotal *prometheus.Desc + TransactionsUpdateConflictsTotal *prometheus.Desc + TransactionsUpdateSnapshotActiveTotal *prometheus.Desc + TransactionsVersionCleanupRateBytes *prometheus.Desc + TransactionsVersionGenerationRateBytes *prometheus.Desc + TransactionsVersionStoreSizeBytes *prometheus.Desc + TransactionsVersionStoreUnits *prometheus.Desc + TransactionsVersionStoreCreationUnits *prometheus.Desc + TransactionsVersionStoreTruncationUnits *prometheus.Desc mssqlInstances mssqlInstancesType mssqlCollectors mssqlCollectorsMap @@ -1649,6 +1665,86 @@ func NewMSSQLCollector() (Collector, error) { nil, ), + // Win32_PerfRawData_{instance}_SQLServerTransactions + TransactionsTempDbFreeSpaceBytes: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_tempdb_free_space_bytes"), + "(Transactions.FreeSpaceInTempDbKB)", + []string{"instance"}, + nil, + ), + TransactionsLongestTransactionRunningSeconds: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_longest_transaction_running_seconds"), + "(Transactions.LongestTransactionRunningTime)", + []string{"instance"}, + nil, + ), + TransactionsNonSnapshotVersionActiveTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_nonsnapshot_version_active_total"), + "(Transactions.NonSnapshotVersionTransactions)", + []string{"instance"}, + nil, + ), + TransactionsSnapshotActiveTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_snapshot_active_total"), + "(Transactions.SnapshotTransactions)", + []string{"instance"}, + nil, + ), + TransactionsActiveTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_active_total"), + "(Transactions.Transactions)", + []string{"instance"}, + nil, + ), + TransactionsUpdateConflictsTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_update_conflicts_total"), + "(Transactions.UpdateConflictRatio)", + []string{"instance"}, + nil, + ), + TransactionsUpdateSnapshotActiveTotal: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_update_snapshot_active_total"), + "(Transactions.UpdateSnapshotTransactions)", + []string{"instance"}, + nil, + ), + TransactionsVersionCleanupRateBytes: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_cleanup_rate_bytes"), + "(Transactions.VersionCleanupRateKBs)", + []string{"instance"}, + nil, + ), + TransactionsVersionGenerationRateBytes: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_generation_rate_bytes"), + "(Transactions.VersionGenerationRateKBs)", + []string{"instance"}, + nil, + ), + TransactionsVersionStoreSizeBytes: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_size_bytes"), + "(Transactions.VersionStoreSizeKB)", + []string{"instance"}, + nil, + ), + TransactionsVersionStoreUnits: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_units"), + "(Transactions.VersionStoreUnitCount)", + []string{"instance"}, + nil, + ), + TransactionsVersionStoreCreationUnits: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_creation_units"), + "(Transactions.VersionStoreUnitCreation)", + []string{"instance"}, + nil, + ), + TransactionsVersionStoreTruncationUnits: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, subsystem, "transactions_version_store_truncation_units"), + "(Transactions.VersionStoreUnitTruncation)", + []string{"instance"}, + nil, + ), + mssqlInstances: getMSSQLInstances(), } @@ -3572,8 +3668,8 @@ func (c *MSSQLCollector) collectSQLStats(ch chan<- prometheus.Metric, sqlInstanc } type win32PerfRawDataSQLServerSQLErrors struct { - Name string - Errorssec uint64 + Name string + ErrorsPersec uint64 } // Win32_PerfRawData_MSSQLSERVER_SQLServerErrors docs: @@ -3594,10 +3690,138 @@ func (c *MSSQLCollector) collectSQLErrors(ch chan<- prometheus.Metric, sqlInstan ch <- prometheus.MustNewConstMetric( c.SQLErrorsTotal, prometheus.CounterValue, - float64(v.Errorssec), + float64(v.ErrorsPersec), sqlInstance, resource, ) } return nil, nil -} \ No newline at end of file +} + +type win32PerfRawDataSqlServerTransactions struct { + FreeSpaceintempdbKB uint64 + LongestTransactionRunningTime uint64 + NonSnapshotVersionTransactions uint64 + SnapshotTransactions uint64 + Transactions uint64 + Updateconflictratio uint64 + UpdateSnapshotTransactions uint64 + VersionCleanuprateKBPers uint64 + VersionGenerationrateKBPers 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.TransactionsTempDbFreeSpaceBytes, + prometheus.GaugeValue, + float64(v.FreeSpaceintempdbKB*1024), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsLongestTransactionRunningSeconds, + prometheus.GaugeValue, + float64(v.LongestTransactionRunningTime), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsNonSnapshotVersionActiveTotal, + prometheus.CounterValue, + float64(v.NonSnapshotVersionTransactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsSnapshotActiveTotal, + prometheus.CounterValue, + float64(v.SnapshotTransactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsActiveTotal, + prometheus.CounterValue, + float64(v.Transactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsUpdateConflictsTotal, + prometheus.CounterValue, + float64(v.Updateconflictratio), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsUpdateSnapshotActiveTotal, + prometheus.CounterValue, + float64(v.UpdateSnapshotTransactions), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionCleanupRateBytes, + prometheus.GaugeValue, + float64(v.VersionCleanuprateKBPers*1024), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionGenerationRateBytes, + prometheus.GaugeValue, + float64(v.VersionGenerationrateKBPers*1024), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreSizeBytes, + prometheus.GaugeValue, + float64(v.VersionStoreSizeKB*1024), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreUnits, + prometheus.CounterValue, + float64(v.VersionStoreunitcount), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreCreationUnits, + prometheus.CounterValue, + float64(v.VersionStoreunitcreation), + sqlInstance, + ) + + ch <- prometheus.MustNewConstMetric( + c.TransactionsVersionStoreTruncationUnits, + prometheus.CounterValue, + float64(v.VersionStoreunittruncation), + sqlInstance, + ) + + return nil, nil +} diff --git a/docs/collector.mssql.md b/docs/collector.mssql.md index 76c7c1a1..4b619673 100644 --- a/docs/collector.mssql.md +++ b/docs/collector.mssql.md @@ -5,14 +5,14 @@ The mssql collector exposes metrics about the MSSQL server ||| -|- Metric name prefix | `mssql` -Classes | [`Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-access-methods-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerAvailabilityReplica`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-availability-replica)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-buffer-manager-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerDatabaseReplica`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-database-replica)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-databases-object?view=sql-server-2017)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-general-statistics-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerLocks`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-locks-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-memory-manager-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-statistics-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerSQLErrors`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-errors-object) +Classes | [`Win32_PerfRawData_MSSQLSERVER_SQLServerAccessMethods`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-access-methods-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerAvailabilityReplica`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-availability-replica)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerBufferManager`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-buffer-manager-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerDatabaseReplica`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-database-replica)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerDatabases`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-databases-object?view=sql-server-2017)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerGeneralStatistics`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-general-statistics-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerLocks`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-locks-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerMemoryManager`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-memory-manager-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerSQLStatistics`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-statistics-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerSQLErrors`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-errors-object)
[`Win32_PerfRawData_MSSQLSERVER_SQLServerTransactions`](https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-transactions-object) Enabled by default? | No ## Flags ### `--collectors.mssql.classes-enabled` -Comma-separated list of MSSQL WMI classes to use. Supported values are `accessmethods`, `availreplica`, `bufman`, `databases`, `dbreplica`, `genstats`, `locks`, `memmgr`, `sqlstats` and `sqlerrors`. +Comma-separated list of MSSQL WMI classes to use. Supported values are `accessmethods`, `availreplica`, `bufman`, `databases`, `dbreplica`, `genstats`, `locks`, `memmgr`, `sqlstats`, `sqlerrors` and `transactions`. ### `--collectors.mssql.class-print` @@ -231,6 +231,19 @@ Name | Description | Type | Labels `wmi_mssql_sqlstats_sql_recompilations` | _Not yet documented_ | counter | `instance` `wmi_mssql_sqlstats_unsafe_auto_parameterization_attempts` | _Not yet documented_ | counter | `instance` `wmi_mssql_sql_errors_total` | _Not yet documented_ | counter | `instance`, `resource` +`wmi_mssql_transactions_tempdb_free_space_bytes` | _Not yet documented_ | gauge | `instance` +`wmi_mssql_transactions_longest_transaction_running_seconds` | _Not yet documented_ | gauge | `instance` +`wmi_mssql_transactions_nonsnapshot_version_active_total` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_snapshot_active_total` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_active_total` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_update_conflicts_total` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_update_snapshot_active_total` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_version_cleanup_rate_bytes` | _Not yet documented_ | gauge | `instance` +`wmi_mssql_transactions_version_generation_rate_bytes` | _Not yet documented_ | gauge | `instance` +`wmi_mssql_transactions_version_store_size_bytes` | _Not yet documented_ | gauge | `instance` +`wmi_mssql_transactions_version_store_units` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_version_store_creation_units` | _Not yet documented_ | counter | `instance` +`wmi_mssql_transactions_version_store_truncation_units` | _Not yet documented_ | counter | `instance` ### Example metric _This collector does not yet have explained examples, we would appreciate your help adding them!_