diff options
Diffstat (limited to '')
-rw-r--r-- | src/go/collectors/go.d.plugin/modules/windows/collect_mssql.go | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/windows/collect_mssql.go b/src/go/collectors/go.d.plugin/modules/windows/collect_mssql.go new file mode 100644 index 000000000..53d88f578 --- /dev/null +++ b/src/go/collectors/go.d.plugin/modules/windows/collect_mssql.go @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +package windows + +import ( + "strings" + + "github.com/netdata/netdata/go/go.d.plugin/pkg/prometheus" +) + +const ( + metricMSSQLAccessMethodPageSplits = "windows_mssql_accessmethods_page_splits" + metricMSSQLBufferCacheHits = "windows_mssql_bufman_buffer_cache_hits" + metricMSSQLBufferCacheLookups = "windows_mssql_bufman_buffer_cache_lookups" + metricMSSQLBufferCheckpointPages = "windows_mssql_bufman_checkpoint_pages" + metricMSSQLBufferPageLifeExpectancy = "windows_mssql_bufman_page_life_expectancy_seconds" + metricMSSQLBufferPageReads = "windows_mssql_bufman_page_reads" + metricMSSQLBufferPageWrites = "windows_mssql_bufman_page_writes" + metricMSSQLBlockedProcesses = "windows_mssql_genstats_blocked_processes" + metricMSSQLUserConnections = "windows_mssql_genstats_user_connections" + metricMSSQLLockWait = "windows_mssql_locks_lock_wait_seconds" + metricMSSQLDeadlocks = "windows_mssql_locks_deadlocks" + 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" + + metricMSSQLDatabaseActiveTransactions = "windows_mssql_databases_active_transactions" + metricMSSQLDatabaseBackupRestoreOperations = "windows_mssql_databases_backup_restore_operations" + metricMSSQLDatabaseDataFileSize = "windows_mssql_databases_data_files_size_bytes" + metricMSSQLDatabaseLogFlushed = "windows_mssql_databases_log_flushed_bytes" + metricMSSQLDatabaseLogFlushes = "windows_mssql_databases_log_flushes" + metricMSSQLDatabaseTransactions = "windows_mssql_databases_transactions" + metricMSSQLDatabaseWriteTransactions = "windows_mssql_databases_write_transactions" +) + +func (w *Windows) collectMSSQL(mx map[string]int64, pms prometheus.Series) { + instances := make(map[string]bool) + dbs := make(map[string]bool) + px := "mssql_instance_" + for _, pm := range pms.FindByName(metricMSSQLAccessMethodPageSplits) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_accessmethods_page_splits"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLBufferCacheHits) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_bufman_buffer_cache_hits"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLBufferCacheLookups) { + if name := pm.Labels.Get("mssql_instance"); name != "" && pm.Value > 0 { + instances[name] = true + mx[px+name+"_cache_hit_ratio"] = int64(float64(mx[px+name+"_bufman_buffer_cache_hits"]) / pm.Value * 100) + } + } + for _, pm := range pms.FindByName(metricMSSQLBufferCheckpointPages) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_bufman_checkpoint_pages"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLBufferPageLifeExpectancy) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_bufman_page_life_expectancy_seconds"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLBufferPageReads) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_bufman_page_reads"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLBufferPageWrites) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_bufman_page_writes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLBlockedProcesses) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_genstats_blocked_processes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLUserConnections) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_genstats_user_connections"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLLockWait) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + if res := pm.Labels.Get("resource"); res != "" { + mx[px+name+"_resource_"+res+"_locks_lock_wait_seconds"] = int64(pm.Value) + } + } + } + for _, pm := range pms.FindByName(metricMSSQLDeadlocks) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + if res := pm.Labels.Get("resource"); res != "" { + mx[px+name+"_resource_"+res+"_locks_deadlocks"] = int64(pm.Value) + } + } + } + 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 + mx[px+name+"_memmgr_total_server_memory_bytes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLStatsAutoParameterization) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + 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 + mx[px+name+"_sqlstats_safe_auto_parameterization_attempts"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLCompilations) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_sqlstats_sql_compilations"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLRecompilations) { + if name := pm.Labels.Get("mssql_instance"); name != "" { + instances[name] = true + mx[px+name+"_sqlstats_sql_recompilations"] = int64(pm.Value) + } + } + + px = "mssql_db_" + for _, pm := range pms.FindByName(metricMSSQLDatabaseActiveTransactions) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_active_transactions"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLDatabaseBackupRestoreOperations) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_backup_restore_operations"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLDatabaseDataFileSize) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_data_files_size_bytes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLDatabaseLogFlushed) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_log_flushed_bytes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLDatabaseLogFlushes) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_log_flushes"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLDatabaseTransactions) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_transactions"] = int64(pm.Value) + } + } + for _, pm := range pms.FindByName(metricMSSQLDatabaseWriteTransactions) { + if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { + instances[name], dbs[name+":"+db] = true, true + mx[px+db+"_instance_"+name+"_write_transactions"] = int64(pm.Value) + } + } + + for v := range instances { + if !w.cache.mssqlInstances[v] { + w.cache.mssqlInstances[v] = true + w.addMSSQLInstanceCharts(v) + } + } + for v := range w.cache.mssqlInstances { + if !instances[v] { + delete(w.cache.mssqlInstances, v) + w.removeMSSQLInstanceCharts(v) + } + } + + for v := range dbs { + if !w.cache.mssqlDBs[v] { + w.cache.mssqlDBs[v] = true + if s := strings.Split(v, ":"); len(s) == 2 { + w.addMSSQLDBCharts(s[0], s[1]) + } + } + } + for v := range w.cache.mssqlDBs { + if !dbs[v] { + delete(w.cache.mssqlDBs, v) + if s := strings.Split(v, ":"); len(s) == 2 { + w.removeMSSQLDBCharts(s[0], s[1]) + } + } + } +} + +func mssqlParseResource(name string) string { + name = strings.ReplaceAll(name, " ", "_") + return strings.ToLower(name) +} |