github.com/netdata/go.d.plugin@v0.58.1/modules/windows/collect.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package windows
     4  
     5  import (
     6  	"github.com/netdata/go.d.plugin/pkg/prometheus"
     7  )
     8  
     9  const precision = 1000
    10  
    11  const (
    12  	collectorAD                             = "ad"
    13  	collectorADCS                           = "adcs"
    14  	collectorADFS                           = "adfs"
    15  	collectorCPU                            = "cpu"
    16  	collectorMemory                         = "memory"
    17  	collectorNet                            = "net"
    18  	collectorLogicalDisk                    = "logical_disk"
    19  	collectorOS                             = "os"
    20  	collectorSystem                         = "system"
    21  	collectorLogon                          = "logon"
    22  	collectorThermalZone                    = "thermalzone"
    23  	collectorTCP                            = "tcp"
    24  	collectorIIS                            = "iis"
    25  	collectorMSSQL                          = "mssql"
    26  	collectorProcess                        = "process"
    27  	collectorService                        = "service"
    28  	collectorNetFrameworkCLRExceptions      = "netframework_clrexceptions"
    29  	collectorNetFrameworkCLRInterop         = "netframework_clrinterop"
    30  	collectorNetFrameworkCLRJIT             = "netframework_clrjit"
    31  	collectorNetFrameworkCLRLoading         = "netframework_clrloading"
    32  	collectorNetFrameworkCLRLocksAndThreads = "netframework_clrlocksandthreads"
    33  	collectorNetFrameworkCLRMemory          = "netframework_clrmemory"
    34  	collectorNetFrameworkCLRRemoting        = "netframework_clrremoting"
    35  	collectorNetFrameworkCLRSecurity        = "netframework_clrsecurity"
    36  	collectorExchange                       = "exchange"
    37  	collectorHyperv                         = "hyperv"
    38  )
    39  
    40  func (w *Windows) collect() (map[string]int64, error) {
    41  	pms, err := w.prom.ScrapeSeries()
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  
    46  	mx := make(map[string]int64)
    47  	w.collectMetrics(mx, pms)
    48  
    49  	if hasKey(mx, "os_visible_memory_bytes", "memory_available_bytes") {
    50  		mx["memory_used_bytes"] = 0 +
    51  			mx["os_visible_memory_bytes"] -
    52  			mx["memory_available_bytes"]
    53  	}
    54  	if hasKey(mx, "os_paging_limit_bytes", "os_paging_free_bytes") {
    55  		mx["os_paging_used_bytes"] = 0 +
    56  			mx["os_paging_limit_bytes"] -
    57  			mx["os_paging_free_bytes"]
    58  	}
    59  	if hasKey(mx, "os_visible_memory_bytes", "os_physical_memory_free_bytes") {
    60  		mx["os_visible_memory_used_bytes"] = 0 +
    61  			mx["os_visible_memory_bytes"] -
    62  			mx["os_physical_memory_free_bytes"]
    63  	}
    64  	if hasKey(mx, "memory_commit_limit", "memory_committed_bytes") {
    65  		mx["memory_not_committed_bytes"] = 0 +
    66  			mx["memory_commit_limit"] -
    67  			mx["memory_committed_bytes"]
    68  	}
    69  	if hasKey(mx, "memory_standby_cache_reserve_bytes", "memory_standby_cache_normal_priority_bytes", "memory_standby_cache_core_bytes") {
    70  		mx["memory_standby_cache_total"] = 0 +
    71  			mx["memory_standby_cache_reserve_bytes"] +
    72  			mx["memory_standby_cache_normal_priority_bytes"] +
    73  			mx["memory_standby_cache_core_bytes"]
    74  	}
    75  	if hasKey(mx, "memory_standby_cache_total", "memory_modified_page_list_bytes") {
    76  		mx["memory_cache_total"] = 0 +
    77  			mx["memory_standby_cache_total"] +
    78  			mx["memory_modified_page_list_bytes"]
    79  	}
    80  
    81  	return mx, nil
    82  }
    83  
    84  func (w *Windows) collectMetrics(mx map[string]int64, pms prometheus.Series) {
    85  	w.collectCollector(mx, pms)
    86  	for _, pm := range pms.FindByName(metricCollectorSuccess) {
    87  		if pm.Value == 0 {
    88  			continue
    89  		}
    90  
    91  		switch pm.Labels.Get("collector") {
    92  		case collectorCPU:
    93  			w.collectCPU(mx, pms)
    94  		case collectorMemory:
    95  			w.collectMemory(mx, pms)
    96  		case collectorNet:
    97  			w.collectNet(mx, pms)
    98  		case collectorLogicalDisk:
    99  			w.collectLogicalDisk(mx, pms)
   100  		case collectorOS:
   101  			w.collectOS(mx, pms)
   102  		case collectorSystem:
   103  			w.collectSystem(mx, pms)
   104  		case collectorLogon:
   105  			w.collectLogon(mx, pms)
   106  		case collectorThermalZone:
   107  			w.collectThermalzone(mx, pms)
   108  		case collectorTCP:
   109  			w.collectTCP(mx, pms)
   110  		case collectorProcess:
   111  			w.collectProcess(mx, pms)
   112  		case collectorService:
   113  			w.collectService(mx, pms)
   114  		case collectorIIS:
   115  			w.collectIIS(mx, pms)
   116  		case collectorMSSQL:
   117  			w.collectMSSQL(mx, pms)
   118  		case collectorAD:
   119  			w.collectAD(mx, pms)
   120  		case collectorADCS:
   121  			w.collectADCS(mx, pms)
   122  		case collectorADFS:
   123  			w.collectADFS(mx, pms)
   124  		case collectorNetFrameworkCLRExceptions:
   125  			w.collectNetFrameworkCLRExceptions(mx, pms)
   126  		case collectorNetFrameworkCLRInterop:
   127  			w.collectNetFrameworkCLRInterop(mx, pms)
   128  		case collectorNetFrameworkCLRJIT:
   129  			w.collectNetFrameworkCLRJIT(mx, pms)
   130  		case collectorNetFrameworkCLRLoading:
   131  			w.collectNetFrameworkCLRLoading(mx, pms)
   132  		case collectorNetFrameworkCLRLocksAndThreads:
   133  			w.collectNetFrameworkCLRLocksAndThreads(mx, pms)
   134  		case collectorNetFrameworkCLRMemory:
   135  			w.collectNetFrameworkCLRMemory(mx, pms)
   136  		case collectorNetFrameworkCLRRemoting:
   137  			w.collectNetFrameworkCLRRemoting(mx, pms)
   138  		case collectorNetFrameworkCLRSecurity:
   139  			w.collectNetFrameworkCLRSecurity(mx, pms)
   140  		case collectorExchange:
   141  			w.collectExchange(mx, pms)
   142  		case collectorHyperv:
   143  			w.collectHyperv(mx, pms)
   144  		}
   145  	}
   146  }
   147  
   148  func hasKey(mx map[string]int64, key string, keys ...string) bool {
   149  	_, ok := mx[key]
   150  	switch len(keys) {
   151  	case 0:
   152  		return ok
   153  	default:
   154  		return ok && hasKey(mx, keys[0], keys[1:]...)
   155  	}
   156  }
   157  
   158  func boolToInt(v bool) int64 {
   159  	if v {
   160  		return 1
   161  	}
   162  	return 0
   163  }