netdata/netdata

View on GitHub
src/go/collectors/go.d.plugin/modules/windows/collect_mssql.go

Summary

Maintainability
F
4 days
Test Coverage
// 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)
}