github.com/netdata/go.d.plugin@v0.58.1/modules/windows/collect_mssql.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package windows 4 5 import ( 6 "strings" 7 8 "github.com/netdata/go.d.plugin/pkg/prometheus" 9 ) 10 11 const ( 12 metricMSSQLAccessMethodPageSplits = "windows_mssql_accessmethods_page_splits" 13 metricMSSQLBufferCacheHits = "windows_mssql_bufman_buffer_cache_hits" 14 metricMSSQLBufferCacheLookups = "windows_mssql_bufman_buffer_cache_lookups" 15 metricMSSQLBufferCheckpointPages = "windows_mssql_bufman_checkpoint_pages" 16 metricMSSQLBufferPageLifeExpectancy = "windows_mssql_bufman_page_life_expectancy_seconds" 17 metricMSSQLBufferPageReads = "windows_mssql_bufman_page_reads" 18 metricMSSQLBufferPageWrites = "windows_mssql_bufman_page_writes" 19 metricMSSQLBlockedProcesses = "windows_mssql_genstats_blocked_processes" 20 metricMSSQLUserConnections = "windows_mssql_genstats_user_connections" 21 metricMSSQLLockWait = "windows_mssql_locks_lock_wait_seconds" 22 metricMSSQLDeadlocks = "windows_mssql_locks_deadlocks" 23 metricMSSQLConnectionMemoryBytes = "windows_mssql_memmgr_connection_memory_bytes" 24 metricMSSQLExternalBenefitOfMemory = "windows_mssql_memmgr_external_benefit_of_memory" 25 metricMSSQLPendingMemoryGrants = "windows_mssql_memmgr_pending_memory_grants" 26 metricMSSQLSQLErrorsTotal = "windows_mssql_sql_errors_total" 27 metricMSSQLTotalServerMemory = "windows_mssql_memmgr_total_server_memory_bytes" 28 metricMSSQLStatsAutoParameterization = "windows_mssql_sqlstats_auto_parameterization_attempts" 29 metricMSSQLStatsBatchRequests = "windows_mssql_sqlstats_batch_requests" 30 metricMSSQLStatSafeAutoParameterization = "windows_mssql_sqlstats_safe_auto_parameterization_attempts" 31 metricMSSQLCompilations = "windows_mssql_sqlstats_sql_compilations" 32 metricMSSQLRecompilations = "windows_mssql_sqlstats_sql_recompilations" 33 34 metricMSSQLDatabaseActiveTransactions = "windows_mssql_databases_active_transactions" 35 metricMSSQLDatabaseBackupRestoreOperations = "windows_mssql_databases_backup_restore_operations" 36 metricMSSQLDatabaseDataFileSize = "windows_mssql_databases_data_files_size_bytes" 37 metricMSSQLDatabaseLogFlushed = "windows_mssql_databases_log_flushed_bytes" 38 metricMSSQLDatabaseLogFlushes = "windows_mssql_databases_log_flushes" 39 metricMSSQLDatabaseTransactions = "windows_mssql_databases_transactions" 40 metricMSSQLDatabaseWriteTransactions = "windows_mssql_databases_write_transactions" 41 ) 42 43 func (w *Windows) collectMSSQL(mx map[string]int64, pms prometheus.Series) { 44 instances := make(map[string]bool) 45 dbs := make(map[string]bool) 46 px := "mssql_instance_" 47 for _, pm := range pms.FindByName(metricMSSQLAccessMethodPageSplits) { 48 if name := pm.Labels.Get("mssql_instance"); name != "" { 49 instances[name] = true 50 mx[px+name+"_accessmethods_page_splits"] = int64(pm.Value) 51 } 52 } 53 for _, pm := range pms.FindByName(metricMSSQLBufferCacheHits) { 54 if name := pm.Labels.Get("mssql_instance"); name != "" { 55 instances[name] = true 56 mx[px+name+"_bufman_buffer_cache_hits"] = int64(pm.Value) 57 } 58 } 59 for _, pm := range pms.FindByName(metricMSSQLBufferCacheLookups) { 60 if name := pm.Labels.Get("mssql_instance"); name != "" && pm.Value > 0 { 61 instances[name] = true 62 mx[px+name+"_cache_hit_ratio"] = int64(float64(mx[px+name+"_bufman_buffer_cache_hits"]) / pm.Value * 100) 63 } 64 } 65 for _, pm := range pms.FindByName(metricMSSQLBufferCheckpointPages) { 66 if name := pm.Labels.Get("mssql_instance"); name != "" { 67 instances[name] = true 68 mx[px+name+"_bufman_checkpoint_pages"] = int64(pm.Value) 69 } 70 } 71 for _, pm := range pms.FindByName(metricMSSQLBufferPageLifeExpectancy) { 72 if name := pm.Labels.Get("mssql_instance"); name != "" { 73 instances[name] = true 74 mx[px+name+"_bufman_page_life_expectancy_seconds"] = int64(pm.Value) 75 } 76 } 77 for _, pm := range pms.FindByName(metricMSSQLBufferPageReads) { 78 if name := pm.Labels.Get("mssql_instance"); name != "" { 79 instances[name] = true 80 mx[px+name+"_bufman_page_reads"] = int64(pm.Value) 81 } 82 } 83 for _, pm := range pms.FindByName(metricMSSQLBufferPageWrites) { 84 if name := pm.Labels.Get("mssql_instance"); name != "" { 85 instances[name] = true 86 mx[px+name+"_bufman_page_writes"] = int64(pm.Value) 87 } 88 } 89 for _, pm := range pms.FindByName(metricMSSQLBlockedProcesses) { 90 if name := pm.Labels.Get("mssql_instance"); name != "" { 91 instances[name] = true 92 mx[px+name+"_genstats_blocked_processes"] = int64(pm.Value) 93 } 94 } 95 for _, pm := range pms.FindByName(metricMSSQLUserConnections) { 96 if name := pm.Labels.Get("mssql_instance"); name != "" { 97 instances[name] = true 98 mx[px+name+"_genstats_user_connections"] = int64(pm.Value) 99 } 100 } 101 for _, pm := range pms.FindByName(metricMSSQLLockWait) { 102 if name := pm.Labels.Get("mssql_instance"); name != "" { 103 instances[name] = true 104 if res := pm.Labels.Get("resource"); res != "" { 105 mx[px+name+"_resource_"+res+"_locks_lock_wait_seconds"] = int64(pm.Value) 106 } 107 } 108 } 109 for _, pm := range pms.FindByName(metricMSSQLDeadlocks) { 110 if name := pm.Labels.Get("mssql_instance"); name != "" { 111 instances[name] = true 112 if res := pm.Labels.Get("resource"); res != "" { 113 mx[px+name+"_resource_"+res+"_locks_deadlocks"] = int64(pm.Value) 114 } 115 } 116 } 117 for _, pm := range pms.FindByName(metricMSSQLConnectionMemoryBytes) { 118 if name := pm.Labels.Get("mssql_instance"); name != "" { 119 instances[name] = true 120 mx[px+name+"_memmgr_connection_memory_bytes"] = int64(pm.Value) 121 } 122 } 123 for _, pm := range pms.FindByName(metricMSSQLExternalBenefitOfMemory) { 124 if name := pm.Labels.Get("mssql_instance"); name != "" { 125 instances[name] = true 126 mx[px+name+"_memmgr_external_benefit_of_memory"] = int64(pm.Value) 127 } 128 } 129 for _, pm := range pms.FindByName(metricMSSQLPendingMemoryGrants) { 130 if name := pm.Labels.Get("mssql_instance"); name != "" { 131 instances[name] = true 132 mx[px+name+"_memmgr_pending_memory_grants"] = int64(pm.Value) 133 } 134 } 135 for _, pm := range pms.FindByName(metricMSSQLSQLErrorsTotal) { 136 if name := pm.Labels.Get("mssql_instance"); name != "" { 137 instances[name] = true 138 if res := pm.Labels.Get("resource"); res != "" && res != "_Total" { 139 dim := mssqlParseResource(res) 140 mx[px+name+"_sql_errors_total_"+dim] = int64(pm.Value) 141 } 142 } 143 } 144 for _, pm := range pms.FindByName(metricMSSQLTotalServerMemory) { 145 if name := pm.Labels.Get("mssql_instance"); name != "" { 146 instances[name] = true 147 mx[px+name+"_memmgr_total_server_memory_bytes"] = int64(pm.Value) 148 } 149 } 150 for _, pm := range pms.FindByName(metricMSSQLStatsAutoParameterization) { 151 if name := pm.Labels.Get("mssql_instance"); name != "" { 152 instances[name] = true 153 mx[px+name+"_sqlstats_auto_parameterization_attempts"] = int64(pm.Value) 154 } 155 } 156 for _, pm := range pms.FindByName(metricMSSQLStatsBatchRequests) { 157 if name := pm.Labels.Get("mssql_instance"); name != "" { 158 instances[name] = true 159 mx[px+name+"_sqlstats_batch_requests"] = int64(pm.Value) 160 } 161 } 162 for _, pm := range pms.FindByName(metricMSSQLStatSafeAutoParameterization) { 163 if name := pm.Labels.Get("mssql_instance"); name != "" { 164 instances[name] = true 165 mx[px+name+"_sqlstats_safe_auto_parameterization_attempts"] = int64(pm.Value) 166 } 167 } 168 for _, pm := range pms.FindByName(metricMSSQLCompilations) { 169 if name := pm.Labels.Get("mssql_instance"); name != "" { 170 instances[name] = true 171 mx[px+name+"_sqlstats_sql_compilations"] = int64(pm.Value) 172 } 173 } 174 for _, pm := range pms.FindByName(metricMSSQLRecompilations) { 175 if name := pm.Labels.Get("mssql_instance"); name != "" { 176 instances[name] = true 177 mx[px+name+"_sqlstats_sql_recompilations"] = int64(pm.Value) 178 } 179 } 180 181 px = "mssql_db_" 182 for _, pm := range pms.FindByName(metricMSSQLDatabaseActiveTransactions) { 183 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 184 instances[name], dbs[name+":"+db] = true, true 185 mx[px+db+"_instance_"+name+"_active_transactions"] = int64(pm.Value) 186 } 187 } 188 for _, pm := range pms.FindByName(metricMSSQLDatabaseBackupRestoreOperations) { 189 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 190 instances[name], dbs[name+":"+db] = true, true 191 mx[px+db+"_instance_"+name+"_backup_restore_operations"] = int64(pm.Value) 192 } 193 } 194 for _, pm := range pms.FindByName(metricMSSQLDatabaseDataFileSize) { 195 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 196 instances[name], dbs[name+":"+db] = true, true 197 mx[px+db+"_instance_"+name+"_data_files_size_bytes"] = int64(pm.Value) 198 } 199 } 200 for _, pm := range pms.FindByName(metricMSSQLDatabaseLogFlushed) { 201 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 202 instances[name], dbs[name+":"+db] = true, true 203 mx[px+db+"_instance_"+name+"_log_flushed_bytes"] = int64(pm.Value) 204 } 205 } 206 for _, pm := range pms.FindByName(metricMSSQLDatabaseLogFlushes) { 207 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 208 instances[name], dbs[name+":"+db] = true, true 209 mx[px+db+"_instance_"+name+"_log_flushes"] = int64(pm.Value) 210 } 211 } 212 for _, pm := range pms.FindByName(metricMSSQLDatabaseTransactions) { 213 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 214 instances[name], dbs[name+":"+db] = true, true 215 mx[px+db+"_instance_"+name+"_transactions"] = int64(pm.Value) 216 } 217 } 218 for _, pm := range pms.FindByName(metricMSSQLDatabaseWriteTransactions) { 219 if name, db := pm.Labels.Get("mssql_instance"), pm.Labels.Get("database"); name != "" && db != "" { 220 instances[name], dbs[name+":"+db] = true, true 221 mx[px+db+"_instance_"+name+"_write_transactions"] = int64(pm.Value) 222 } 223 } 224 225 for v := range instances { 226 if !w.cache.mssqlInstances[v] { 227 w.cache.mssqlInstances[v] = true 228 w.addMSSQLInstanceCharts(v) 229 } 230 } 231 for v := range w.cache.mssqlInstances { 232 if !instances[v] { 233 delete(w.cache.mssqlInstances, v) 234 w.removeMSSQLInstanceCharts(v) 235 } 236 } 237 238 for v := range dbs { 239 if !w.cache.mssqlDBs[v] { 240 w.cache.mssqlDBs[v] = true 241 if s := strings.Split(v, ":"); len(s) == 2 { 242 w.addMSSQLDBCharts(s[0], s[1]) 243 } 244 } 245 } 246 for v := range w.cache.mssqlDBs { 247 if !dbs[v] { 248 delete(w.cache.mssqlDBs, v) 249 if s := strings.Split(v, ":"); len(s) == 2 { 250 w.removeMSSQLDBCharts(s[0], s[1]) 251 } 252 } 253 } 254 } 255 256 func mssqlParseResource(name string) string { 257 name = strings.ReplaceAll(name, " ", "_") 258 return strings.ToLower(name) 259 }