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  }