From d49008318dece012273341cfe9cd7d2c89efe537 Mon Sep 17 00:00:00 2001 From: thiagoftsm Date: Wed, 28 Dec 2022 11:07:53 +0000 Subject: [PATCH] Mssql additional metrics (#1041) Co-authored-by: ilyam8 --- modules/wmi/README.md | 4 +++ modules/wmi/charts.go | 59 ++++++++++++++++++++++++++++++++++++ modules/wmi/collect_mssql.go | 36 ++++++++++++++++++++++ modules/wmi/wmi_test.go | 7 +++++ 4 files changed, 106 insertions(+) diff --git a/modules/wmi/README.md b/modules/wmi/README.md index 99ee02188..b1df8cfc7 100644 --- a/modules/wmi/README.md +++ b/modules/wmi/README.md @@ -144,9 +144,13 @@ Labels per scope: | mssql_instance_blocked_processes | mssql instance | blocked | processes | | mssql_instance_user_connection | mssql instance | user | connections | | mssql_instance_locks_lock_wait | mssql instance | alloc_unit, application, database, extent, file, hobt, key, metadata, oib, object, page, rid, row_group, xact | locks/s | +| mssql_instance_memmgr_connection_memory_bytes | mssql instance | memory | bytes | +| mssql_instance_memmgr_external_benefit_of_memory | mssql instance | benefit | bytes | | mssql_instance_memmgr_pending_memory_grants | mssql instance | pending | processes | | mssql_instance_memmgr_server_memory | mssql instance | memory | bytes | +| mssql_instance_sql_errors | mssql instance | db_offline, info, kill_connection, user | errors | | mssql_instance_sqlstats_auto_parameterization_attempts | mssql instance | failed | attempts/s | +| mssql_instance_sqlstats_batch_requests | mssql instance | batch | requests/s | | mssql_instance_sqlstats_safe_auto_parameterization_attempts | mssql instance | safe | attempts/s | | mssql_instance_sqlstats_sql_compilations | mssql instance | compilations | compilations/s | | mssql_instance_sqlstats_sql_recompilations | mssql instance | recompiles | recompiles/s | diff --git a/modules/wmi/charts.go b/modules/wmi/charts.go index b11c9e643..63d8ee5c8 100644 --- a/modules/wmi/charts.go +++ b/modules/wmi/charts.go @@ -92,9 +92,13 @@ const ( prioMSSQLBlockedProcess prioMSSQLUserConnections prioMSSQLLocksLockWait + prioMSSQLMemmgrConnectionMemoryBytes + prioMSSQLMemmgrExternalBenefitOfMemory prioMSSQLMemmgrPendingMemoryGrants prioMSSQLMemTotalServer + prioMSSQLSqlErrorsTotal prioMSSQLStatsAutoParameterization + prioMSSQLStatsBatchRequests prioMSSQLStatsSafeAutoParameterization prioMSSQLStatsCompilations prioMSSQLStatsRecompilations @@ -845,9 +849,13 @@ var ( mssqlBufManIOPSChart.Copy(), mssqlBlockedProcessChart.Copy(), mssqlLocksWaitChart.Copy(), + mssqlMemmgrConnectionMemoryBytesChart.Copy(), + mssqlMemmgrExternalBenefitOfMemoryChart.Copy(), mssqlMemmgrPendingMemoryChart.Copy(), mssqlMemmgrTotalServerChart.Copy(), + mssqlSQLErrorsTotalChart.Copy(), mssqlStatsAutoParamChart.Copy(), + mssqlStatsBatchRequestsChart.Copy(), mssqlStatsSafeAutoChart.Copy(), mssqlStatsCompilationChart.Copy(), mssqlStatsRecompilationChart.Copy(), @@ -974,6 +982,28 @@ var ( } // Memory Manager // Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-memory-manager-object?view=sql-server-ver16 + mssqlMemmgrConnectionMemoryBytesChart = module.Chart{ + ID: "mssql_instance_%s_memmgr_connection_memory_bytes", + Title: "Amount of dynamic memory to maintain connections", + Units: "bytes", + Fam: "mssql", + Ctx: "wmi.mssql_instance_memmgr_connection_memory_bytes", + Priority: prioMSSQLMemmgrConnectionMemoryBytes, + Dims: module.Dims{ + {ID: "mssql_instance_%s_memmgr_connection_memory_bytes", Name: "memory", Algo: module.Incremental}, + }, + } + mssqlMemmgrExternalBenefitOfMemoryChart = module.Chart{ + ID: "mssql_instance_%s_memmgr_external_benefit_of_memory", + Title: "Performance benefit from adding memory to a specific cache", + Units: "bytes", + Fam: "mssql", + Ctx: "wmi.mssql_instance_memmgr_external_benefit_of_memory", + Priority: prioMSSQLMemmgrExternalBenefitOfMemory, + Dims: module.Dims{ + {ID: "mssql_instance_%s_memmgr_external_benefit_of_memory", Name: "benefit", Algo: module.Incremental}, + }, + } mssqlMemmgrPendingMemoryChart = module.Chart{ ID: "mssql_instance_%s_memmgr_pending_memory_grants", Title: "Process waiting for memory grant", @@ -996,6 +1026,24 @@ var ( {ID: "mssql_instance_%s_memmgr_total_server_memory_bytes", Name: "memory"}, }, } + + // SQL errors + // Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-errors-object?view=sql-server-ver16 + mssqlSQLErrorsTotalChart = module.Chart{ + ID: "mssql_instance_%s_sql_errors_total", + Title: "Errors", + Units: "errors/s", + Fam: "mssql", + Ctx: "wmi.mssql_instance_sql_errors", + Priority: prioMSSQLSqlErrorsTotal, + Dims: module.Dims{ + {ID: "mssql_instance_%s_sql_errors_total_db_offline_errors", Name: "db_offline", Algo: module.Incremental}, + {ID: "mssql_instance_%s_sql_errors_total_info_errors", Name: "info", Algo: module.Incremental}, + {ID: "mssql_instance_%s_sql_errors_total_kill_connection_errors", Name: "kill_connection", Algo: module.Incremental}, + {ID: "mssql_instance_%s_sql_errors_total_user_errors", Name: "user", Algo: module.Incremental}, + }, + } + // SQL Statistic // Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-statistics-object?view=sql-server-ver16 mssqlStatsAutoParamChart = module.Chart{ @@ -1009,6 +1057,17 @@ var ( {ID: "mssql_instance_%s_sqlstats_auto_parameterization_attempts", Name: "failed", Algo: module.Incremental}, }, } + mssqlStatsBatchRequestsChart = module.Chart{ + ID: "mssql_instance_%s_sqlstats_batch_requests", + Title: "Total of batches requests", + Units: "requests/s", + Fam: "mssql", + Ctx: "wmi.mssql_instance_sqlstats_batch_requests", + Priority: prioMSSQLStatsBatchRequests, + Dims: module.Dims{ + {ID: "mssql_instance_%s_sqlstats_batch_requests", Name: "batch", Algo: module.Incremental}, + }, + } mssqlStatsSafeAutoChart = module.Chart{ ID: "mssql_instance_%s_sqlstats_safe_auto_parameterization_attempts", Title: "Safe auto-parameterization attempts", diff --git a/modules/wmi/collect_mssql.go b/modules/wmi/collect_mssql.go index 3568a4fdc..193a6db16 100644 --- a/modules/wmi/collect_mssql.go +++ b/modules/wmi/collect_mssql.go @@ -19,9 +19,13 @@ const ( metricMSSQLBlockedProcesses = "windows_mssql_genstats_blocked_processes" metricMSSQLUserConnections = "windows_mssql_genstats_user_connections" metricMSSQLLockWait = "windows_mssql_locks_lock_wait_seconds" + metricMSSQLConnectionMemoryBytes = "windows_mssql_memmgr_connection_memory_bytes" + metricMSSQLExternalBenefitOfMemory = "windows_mssql_memmgr_external_benefit_of_memory" metricMSSQLPendingMemoryGrants = "windows_mssql_memmgr_pending_memory_grants" + metricMSSQLSQLErrorsTotal = "windows_mssql_sql_errors_total" metricMSSQLTotalServerMemory = "windows_mssql_memmgr_total_server_memory_bytes" metricMSSQLStatsAutoParameterization = "windows_mssql_sqlstats_auto_parameterization_attempts" + metricMSSQLStatsBatchRequests = "windows_mssql_sqlstats_batch_requests" metricMSSQLStatSafeAutoParameterization = "windows_mssql_sqlstats_safe_auto_parameterization_attempts" metricMSSQLCompilations = "windows_mssql_sqlstats_sql_compilations" metricMSSQLRecompilations = "windows_mssql_sqlstats_sql_recompilations" @@ -101,12 +105,33 @@ func (w *WMI) collectMSSQL(mx map[string]int64, pms prometheus.Series) { } } } + for _, pm := range pms.FindByName(metricMSSQLConnectionMemoryBytes) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_memmgr_connection_memory_bytes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLExternalBenefitOfMemory) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_memmgr_external_benefit_of_memory"] = int64(pm.Value) + } + } for _, pm := range pms.FindByName(metricMSSQLPendingMemoryGrants) { if name := pm.Labels.Get("mssql_instance"); name != "" { instances[name] = true mx[px+name+"_memmgr_pending_memory_grants"] = int64(pm.Value) } } + for _, pm := range pms.FindByName(metricMSSQLSQLErrorsTotal) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + if res := pm.Labels.Get("resource"); res != "" && res != "_Total" { + dim := mssqlParseResource(res) + mx[px+name+"_sql_errors_total_"+dim] = int64(pm.Value) + } + } + } for _, pm := range pms.FindByName(metricMSSQLTotalServerMemory) { if name := pm.Labels.Get("mssql_instance"); name != "" { instances[name] = true @@ -119,6 +144,12 @@ func (w *WMI) collectMSSQL(mx map[string]int64, pms prometheus.Series) { mx[px+name+"_sqlstats_auto_parameterization_attempts"] = int64(pm.Value) } } + for _, pm := range pms.FindByName(metricMSSQLStatsBatchRequests) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_sqlstats_batch_requests"] = int64(pm.Value) + } + } for _, pm := range pms.FindByName(metricMSSQLStatSafeAutoParameterization) { if name := pm.Labels.Get("mssql_instance"); name != "" { instances[name] = true @@ -212,3 +243,8 @@ func (w *WMI) collectMSSQL(mx map[string]int64, pms prometheus.Series) { } } } + +func mssqlParseResource(name string) string { + name = strings.ReplaceAll(name, " ", "_") + return strings.ToLower(name) +} diff --git a/modules/wmi/wmi_test.go b/modules/wmi/wmi_test.go index 5bdeeefab..b1bbf6e76 100644 --- a/modules/wmi/wmi_test.go +++ b/modules/wmi/wmi_test.go @@ -392,6 +392,8 @@ func TestWMI_Collect(t *testing.T) { "mssql_instance_SQLEXPRESS_cache_hit_ratio": 100, "mssql_instance_SQLEXPRESS_genstats_blocked_processes": 0, "mssql_instance_SQLEXPRESS_genstats_user_connections": 1, + "mssql_instance_SQLEXPRESS_memmgr_connection_memory_bytes": 1015808, + "mssql_instance_SQLEXPRESS_memmgr_external_benefit_of_memory": 0, "mssql_instance_SQLEXPRESS_memmgr_pending_memory_grants": 0, "mssql_instance_SQLEXPRESS_memmgr_total_server_memory_bytes": 198836224, "mssql_instance_SQLEXPRESS_resource_AllocUnit_locks_lock_wait_seconds": 0, @@ -408,7 +410,12 @@ func TestWMI_Collect(t *testing.T) { "mssql_instance_SQLEXPRESS_resource_RID_locks_lock_wait_seconds": 0, "mssql_instance_SQLEXPRESS_resource_RowGroup_locks_lock_wait_seconds": 0, "mssql_instance_SQLEXPRESS_resource_Xact_locks_lock_wait_seconds": 0, + "mssql_instance_SQLEXPRESS_sql_errors_total_db_offline_errors": 0, + "mssql_instance_SQLEXPRESS_sql_errors_total_info_errors": 766, + "mssql_instance_SQLEXPRESS_sql_errors_total_kill_connection_errors": 0, + "mssql_instance_SQLEXPRESS_sql_errors_total_user_errors": 29, "mssql_instance_SQLEXPRESS_sqlstats_auto_parameterization_attempts": 37, + "mssql_instance_SQLEXPRESS_sqlstats_batch_requests": 2972, "mssql_instance_SQLEXPRESS_sqlstats_safe_auto_parameterization_attempts": 2, "mssql_instance_SQLEXPRESS_sqlstats_sql_compilations": 376, "mssql_instance_SQLEXPRESS_sqlstats_sql_recompilations": 8,