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

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package windows
     4  
     5  import (
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/netdata/go.d.plugin/agent/module"
    10  )
    11  
    12  const (
    13  	prioCPUUtil = module.Priority + iota
    14  	prioCPUCoreUtil
    15  	prioCPUInterrupts
    16  	prioCPUDPCs
    17  	prioCPUCoreCState
    18  
    19  	prioMemUtil
    20  	prioMemPageFaults
    21  	prioMemSwapUtil
    22  	prioMemSwapOperations
    23  	prioMemSwapPages
    24  	prioMemCache
    25  	prioMemCacheFaults
    26  	prioMemSystemPool
    27  
    28  	prioDiskSpaceUsage
    29  	prioDiskBandwidth
    30  	prioDiskOperations
    31  	prioDiskAvgLatency
    32  
    33  	prioNICBandwidth
    34  	prioNICPackets
    35  	prioNICErrors
    36  	prioNICDiscards
    37  
    38  	prioTCPConnsEstablished
    39  	prioTCPConnsActive
    40  	prioTCPConnsPassive
    41  	prioTCPConnsFailure
    42  	prioTCPConnsReset
    43  	prioTCPSegmentsReceived
    44  	prioTCPSegmentsSent
    45  	prioTCPSegmentsRetransmitted
    46  
    47  	prioOSProcesses
    48  	prioOSUsers
    49  	prioOSVisibleMemoryUsage
    50  	prioOSPagingUsage
    51  
    52  	prioSystemThreads
    53  	prioSystemUptime
    54  
    55  	prioLogonSessions
    56  
    57  	prioThermalzoneTemperature
    58  
    59  	prioProcessesCPUUtilization
    60  	prioProcessesMemoryUsage
    61  	prioProcessesIOBytes
    62  	prioProcessesIOOperations
    63  	prioProcessesPageFaults
    64  	prioProcessesPageFileBytes
    65  	prioProcessesThreads
    66  	prioProcessesHandles
    67  
    68  	prioIISWebsiteTraffic
    69  	prioIISWebsiteFTPFileTransferRate
    70  	prioIISWebsiteActiveConnectionsCount
    71  	prioIISWebsiteRequestsRate
    72  	prioIISWebsiteConnectionAttemptsRate
    73  	prioIISWebsiteUsersCount
    74  	prioIISWebsiteISAPIExtRequestsCount
    75  	prioIISWebsiteISAPIExtRequestsRate
    76  	prioIISWebsiteErrorsRate
    77  	prioIISWebsiteLogonAttemptsRate
    78  	prioIISWebsiteUptime
    79  
    80  	// Connections
    81  	prioMSSQLUserConnections
    82  
    83  	// Transactions
    84  	prioMSSQLDatabaseTransactions
    85  	prioMSSQLDatabaseActiveTransactions
    86  	prioMSSQLDatabaseWriteTransactions
    87  	prioMSSQLDatabaseBackupRestoreOperations
    88  	prioMSSQLDatabaseLogFlushes
    89  	prioMSSQLDatabaseLogFlushed
    90  
    91  	// Size
    92  	prioMSSQLDatabaseDataFileSize
    93  
    94  	// SQL activity
    95  	prioMSSQLStatsBatchRequests
    96  	prioMSSQLStatsCompilations
    97  	prioMSSQLStatsRecompilations
    98  	prioMSSQLStatsAutoParameterization
    99  	prioMSSQLStatsSafeAutoParameterization
   100  
   101  	// Processes
   102  	prioMSSQLBlockedProcess
   103  
   104  	// Buffer Cache
   105  	prioMSSQLCacheHitRatio
   106  	prioMSSQLBufManIOPS
   107  	prioMSSQLBufferCheckpointPages
   108  	prioMSSQLAccessMethodPageSplits
   109  	prioMSSQLBufferPageLifeExpectancy
   110  
   111  	// Memory
   112  	prioMSSQLMemmgrConnectionMemoryBytes
   113  	prioMSSQLMemTotalServer
   114  	prioMSSQLMemmgrExternalBenefitOfMemory
   115  	prioMSSQLMemmgrPendingMemoryGrants
   116  
   117  	// Locks
   118  	prioMSSQLLocksLockWait
   119  	prioMSSQLLocksDeadLocks
   120  
   121  	// Error
   122  	prioMSSQLSqlErrorsTotal
   123  
   124  	// NET Framework
   125  	// Exceptions
   126  	prioNETFrameworkCLRExceptionsThrown
   127  	prioNETFrameworkCLRExceptionsFilters
   128  	prioNETFrameworkCLRExceptionsFinallys
   129  	prioNETFrameworkCLRExceptionsThrowToCatchDepth
   130  
   131  	// InterOP
   132  	prioNETFrameworkCLRInteropCOMCallableWrappers
   133  	prioNETFrameworkCLRInteropMarshalling
   134  	prioNETFrameworkCLRInteropStubsCreated
   135  	prioNETFrameworkCLRJITMethods
   136  
   137  	// JIT
   138  	prioNETFrameworkCLRJITTime
   139  	prioNETFrameworkCLRJITStandardFailures
   140  	prioNETFrameworkCLRJITILBytes
   141  
   142  	// Loading
   143  	prioNETFrameworkCLRLoadingLoaderHeapSize
   144  	prioNETFrameworkCLRLoadingAppDomainsLoaded
   145  	prioNETFrameworkCLRLoadingAppDomainsUnloaded
   146  	prioNETFrameworkCLRLoadingAssembliesLoaded
   147  	prioNETFrameworkCLRLoadingClassesLoaded
   148  	prioNETFrameworkCLRLoadingClassLoadFailure
   149  
   150  	// Locks and threads
   151  	prioNETFrameworkCLRLocksAndThreadsQueueLength
   152  	prioNETFrameworkCLRLocksAndThreadsCurrentLogicalThreads
   153  	prioNETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads
   154  	prioNETFrameworkCLRLocksAndThreadsRecognizedThreads
   155  	prioNETFrameworkCLRLocksAndThreadsContentions
   156  
   157  	// Memory
   158  	prioNETFrameworkCLRMemoryAllocatedBytes
   159  	prioNETFrameworkCLRMemoryFinalizationSurvivors
   160  	prioNETFrameworkCLRMemoryHeapSize
   161  	prioNETFrameworkCLRMemoryPromoted
   162  	prioNETFrameworkCLRMemoryNumberGCHandles
   163  	prioNETFrameworkCLRMemoryCollections
   164  	prioNETFrameworkCLRMemoryInducedGC
   165  	prioNETFrameworkCLRMemoryNumberPinnedObjects
   166  	prioNETFrameworkCLRMemoryNumberSinkBlocksInUse
   167  	prioNETFrameworkCLRMemoryCommitted
   168  	prioNETFrameworkCLRMemoryReserved
   169  	prioNETFrameworkCLRMemoryGCTime
   170  
   171  	// Remoting
   172  	prioNETFrameworkCLRRemotingChannels
   173  	prioNETFrameworkCLRRemotingContextBoundClassesLoaded
   174  	prioNETFrameworkCLRRemotingContextBoundObjects
   175  	prioNETFrameworkCLRRemotingContextProxies
   176  	prioNETFrameworkCLRRemotingContexts
   177  	prioNETFrameworkCLRRemotingRemoteCalls
   178  
   179  	// Security
   180  	prioNETFrameworkCLRSecurityLinkTimeChecks
   181  	prioNETFrameworkCLRSecurityRTChecksTime
   182  	prioNETFrameworkCLRSecurityStackWalkDepth
   183  	prioNETFrameworkCLRSecurityRuntimeChecks
   184  
   185  	prioServiceState
   186  	prioServiceStatus
   187  
   188  	// Database
   189  	prioADDatabaseOperations
   190  	prioADDirectoryOperations
   191  	prioADNameCacheLookups
   192  	prioADCacheHits
   193  
   194  	// Replication
   195  	prioADDRAReplicationIntersiteCompressedTraffic
   196  	prioADDRAReplicationIntrasiteCompressedTraffic
   197  	prioADDRAReplicationSyncObjectsRemaining
   198  	prioADDRAReplicationPropertiesUpdated
   199  	prioADDRAReplicationPropertiesFiltered
   200  	prioADDRAReplicationObjectsFiltered
   201  	prioADReplicationPendingSyncs
   202  	prioADDRASyncRequests
   203  	prioADDirectoryServiceThreadsInUse
   204  
   205  	// Bind
   206  	prioADLDAPBindTime
   207  	prioADBindsTotal
   208  
   209  	// LDAP
   210  	prioADLDAPSearchesTotal
   211  
   212  	// Thread Queue
   213  	prioADATQAverageRequestLatency
   214  	prioADATQOutstandingRequests
   215  
   216  	// Requests
   217  	prioADCSCertTemplateRequests
   218  	prioADCSCertTemplateRequestProcessingTime
   219  	prioADCSCertTemplateRetrievals
   220  	prioADCSCertTemplateFailedRequests
   221  	prioADCSCertTemplateIssuesRequests
   222  	prioADCSCertTemplatePendingRequests
   223  
   224  	// Response
   225  	prioADCSCertTemplateChallengeResponses
   226  
   227  	// Retrieval
   228  	prioADCSCertTemplateRetrievalProcessingTime
   229  
   230  	// Timing
   231  	prioADCSCertTemplateRequestCryptoSigningTime
   232  	prioADCSCertTemplateRequestPolicyModuleProcessingTime
   233  	prioADCSCertTemplateChallengeResponseProcessingTime
   234  	prioADCSCertTemplateSignedCertificateTimestampLists
   235  	prioADCSCertTemplateSignedCertificateTimestampListProcessingTime
   236  
   237  	// ADFS
   238  	// AD
   239  	prioADFSADLoginConnectionFailures
   240  
   241  	// DB Artifacts
   242  	prioADFSDBArtifactFailures
   243  	prioADFSDBArtifactQueryTimeSeconds
   244  
   245  	// DB Config
   246  	prioADFSDBConfigFailures
   247  	prioADFSDBConfigQueryTimeSeconds
   248  
   249  	// Auth
   250  	prioADFSDeviceAuthentications
   251  	prioADFSExternalAuthentications
   252  	prioADFSOauthAuthorizationRequests
   253  	prioADFSCertificateAuthentications
   254  	prioADFSOauthClientAuthentications
   255  	prioADFSPassportAuthentications
   256  	prioADFSSSOAuthentications
   257  	prioADFSUserPasswordAuthentications
   258  	prioADFSWindowsIntegratedAuthentications
   259  
   260  	// OAuth
   261  	prioADFSOauthClientCredentials
   262  	prioADFSOauthClientPrivkeyJwtAuthentication
   263  	prioADFSOauthClientSecretBasicAuthentications
   264  	prioADFSOauthClientSecretPostAuthentications
   265  	prioADFSOauthClientWindowsAuthentications
   266  	prioADFSOauthLogonCertificateRequests
   267  	prioADFSOauthPasswordGrantRequests
   268  	prioADFSOauthTokenRequestsSuccess
   269  	prioADFSFederatedAuthentications
   270  
   271  	// Requests
   272  	prioADFSFederationMetadataRequests
   273  	prioADFSPassiveRequests
   274  	prioADFSPasswordChangeRequests
   275  	prioADFSSAMLPTokenRequests
   276  	prioADFSWSTrustTokenRequestsSuccess
   277  	prioADFSTokenRequests
   278  	prioADFSWSFedTokenRequestsSuccess
   279  
   280  	// Exchange
   281  	// Transport Queue
   282  	prioExchangeTransportQueuesActiveMailboxDelivery
   283  	prioExchangeTransportQueuesExternalActiveRemoteDelivery
   284  	prioExchangeTransportQueuesExternalLargestDelivery
   285  	prioExchangeTransportQueuesInternalActiveRemoteDeliery
   286  	prioExchangeTransportQueuesInternalLargestDelivery
   287  	prioExchangeTransportQueuesRetryMailboxDelivery
   288  	prioExchangeTransportQueuesUnreachable
   289  	prioExchangeTransportQueuesPoison
   290  
   291  	// LDAP
   292  	prioExchangeLDAPLongRunningOPS
   293  	prioExchangeLDAPReadTime
   294  	prioExchangeLDAPSearchTime
   295  	prioExchangeLDAPWriteTime
   296  	prioExchangeLDAPTimeoutErrors
   297  
   298  	//  OWA
   299  	prioExchangeOWACurrentUniqueUsers
   300  	prioExchangeOWARequestsTotal
   301  
   302  	// Sync
   303  	prioExchangeActiveSyncPingCMDsPending
   304  	prioExchangeActiveSyncRequests
   305  	prioExchangeActiveSyncSyncCMDs
   306  
   307  	// RPC
   308  	prioExchangeRPCActiveUserCount
   309  	prioExchangeRPCAvgLatency
   310  	prioExchangeRPCConnectionCount
   311  	prioExchangeRPCOperationsTotal
   312  	prioExchangeRPCRequests
   313  	prioExchangeRpcUserCount
   314  
   315  	// Workload
   316  	prioExchangeWorkloadActiveTasks
   317  	prioExchangeWorkloadCompleteTasks
   318  	prioExchangeWorkloadQueueTasks
   319  	prioExchangeWorkloadYieldedTasks
   320  	prioExchangeWorkloadActivityStatus
   321  
   322  	// HTTP Proxy
   323  	prioExchangeHTTPProxyAVGAuthLatency
   324  	prioExchangeHTTPProxyAVGCASProcessingLatency
   325  	prioExchangeHTTPProxyMailboxProxyFailureRate
   326  	prioExchangeHTTPProxyServerLocatorAvgLatency
   327  	prioExchangeHTTPProxyOutstandingProxyRequests
   328  	prioExchangeHTTPProxyRequestsTotal
   329  
   330  	// Request
   331  	prioExchangeAutoDiscoverRequests
   332  	prioExchangeAvailServiceRequests
   333  
   334  	// Hyperv Health
   335  	prioHypervVMHealth
   336  
   337  	// Hyperv Partition
   338  	prioHypervRootPartitionDeviceSpacePages
   339  	prioHypervRootPartitionGPASpacePages
   340  	prioHypervRootPartitionGPASpaceModifications
   341  	prioHypervRootPartitionAttachedDevices
   342  	prioHypervRootPartitionDepositedPages
   343  	prioHypervRootPartitionSkippedInterrupts
   344  	prioHypervRootPartitionDeviceDMAErrors
   345  	prioHypervRootPartitionDeviceInterruptErrors
   346  	prioHypervRootPartitionDeviceInterruptThrottleEvents
   347  	prioHypervRootPartitionIOTlbFlush
   348  	prioHypervRootPartitionAddressSpace
   349  	prioHypervRootPartitionVirtualTlbFlushEntires
   350  	prioHypervRootPartitionVirtualTlbPages
   351  
   352  	// Hyperv VM (Memory)
   353  	prioHypervVMCPUUsage
   354  	prioHypervVMMemoryPhysical
   355  	prioHypervVMMemoryPhysicalGuestVisible
   356  	prioHypervVMMemoryPressureCurrent
   357  	prioHypervVIDPhysicalPagesAllocated
   358  	prioHypervVIDRemotePhysicalPages
   359  
   360  	// Hyperv Device
   361  	prioHypervVMDeviceBytes
   362  	prioHypervVMDeviceOperations
   363  	prioHypervVMDeviceErrors
   364  
   365  	// Hyperv Interface
   366  	prioHypervVMInterfaceBytes
   367  	prioHypervVMInterfacePacketsDropped
   368  	prioHypervVMInterfacePackets
   369  
   370  	// Hyperv Vswitch
   371  	prioHypervVswitchTrafficTotal
   372  	prioHypervVswitchPackets
   373  	prioHypervVswitchDirectedPackets
   374  	prioHypervVswitchBroadcastPackets
   375  	prioHypervVswitchMulticastPackets
   376  	prioHypervVswitchDroppedPackets
   377  	prioHypervVswitchExtensionsDroppedPackets
   378  	prioHypervVswitchPacketsFlooded
   379  	prioHypervVswitchLearnedMACAddresses
   380  	prioHypervVswitchPurgeMACAddress
   381  
   382  	prioCollectorDuration
   383  	prioCollectorStatus
   384  )
   385  
   386  // CPU
   387  var (
   388  	cpuCharts = module.Charts{
   389  		cpuUtilChart.Copy(),
   390  	}
   391  	cpuUtilChart = module.Chart{
   392  		ID:       "cpu_utilization_total",
   393  		Title:    "Total CPU Utilization (all cores)",
   394  		Units:    "percentage",
   395  		Fam:      "cpu",
   396  		Ctx:      "windows.cpu_utilization_total",
   397  		Type:     module.Stacked,
   398  		Priority: prioCPUUtil,
   399  		Dims: module.Dims{
   400  			{ID: "cpu_idle_time", Name: "idle", Algo: module.PercentOfIncremental, Div: 1000, DimOpts: module.DimOpts{Hidden: true}},
   401  			{ID: "cpu_dpc_time", Name: "dpc", Algo: module.PercentOfIncremental, Div: 1000},
   402  			{ID: "cpu_user_time", Name: "user", Algo: module.PercentOfIncremental, Div: 1000},
   403  			{ID: "cpu_privileged_time", Name: "privileged", Algo: module.PercentOfIncremental, Div: 1000},
   404  			{ID: "cpu_interrupt_time", Name: "interrupt", Algo: module.PercentOfIncremental, Div: 1000},
   405  		},
   406  	}
   407  )
   408  
   409  // CPU core
   410  var (
   411  	cpuCoreChartsTmpl = module.Charts{
   412  		cpuCoreUtilChartTmpl.Copy(),
   413  		cpuCoreInterruptsChartTmpl.Copy(),
   414  		cpuDPCsChartTmpl.Copy(),
   415  		cpuCoreCStateChartTmpl.Copy(),
   416  	}
   417  	cpuCoreUtilChartTmpl = module.Chart{
   418  		ID:       "core_%s_cpu_utilization",
   419  		Title:    "Core CPU Utilization",
   420  		Units:    "percentage",
   421  		Fam:      "cpu",
   422  		Ctx:      "windows.cpu_core_utilization",
   423  		Type:     module.Stacked,
   424  		Priority: prioCPUCoreUtil,
   425  		Dims: module.Dims{
   426  			{ID: "cpu_core_%s_idle_time", Name: "idle", Algo: module.PercentOfIncremental, Div: precision, DimOpts: module.DimOpts{Hidden: true}},
   427  			{ID: "cpu_core_%s_dpc_time", Name: "dpc", Algo: module.PercentOfIncremental, Div: precision},
   428  			{ID: "cpu_core_%s_user_time", Name: "user", Algo: module.PercentOfIncremental, Div: precision},
   429  			{ID: "cpu_core_%s_privileged_time", Name: "privileged", Algo: module.PercentOfIncremental, Div: precision},
   430  			{ID: "cpu_core_%s_interrupt_time", Name: "interrupt", Algo: module.PercentOfIncremental, Div: precision},
   431  		},
   432  	}
   433  	cpuCoreInterruptsChartTmpl = module.Chart{
   434  		ID:       "cpu_core_%s_interrupts",
   435  		Title:    "Received and Serviced Hardware Interrupts",
   436  		Units:    "interrupts/s",
   437  		Fam:      "cpu",
   438  		Ctx:      "windows.cpu_core_interrupts",
   439  		Priority: prioCPUInterrupts,
   440  		Dims: module.Dims{
   441  			{ID: "cpu_core_%s_interrupts", Name: "interrupts", Algo: module.Incremental},
   442  		},
   443  	}
   444  	cpuDPCsChartTmpl = module.Chart{
   445  		ID:       "cpu_core_%s_dpcs",
   446  		Title:    "Received and Serviced Deferred Procedure Calls (DPC)",
   447  		Units:    "dpc/s",
   448  		Fam:      "cpu",
   449  		Ctx:      "windows.cpu_core_dpcs",
   450  		Priority: prioCPUDPCs,
   451  		Dims: module.Dims{
   452  			{ID: "cpu_core_%s_dpcs", Name: "dpcs", Algo: module.Incremental},
   453  		},
   454  	}
   455  	cpuCoreCStateChartTmpl = module.Chart{
   456  		ID:       "cpu_core_%s_cpu_cstate",
   457  		Title:    "Core Time Spent in Low-Power Idle State",
   458  		Units:    "percentage",
   459  		Fam:      "cpu",
   460  		Ctx:      "windows.cpu_core_cstate",
   461  		Type:     module.Stacked,
   462  		Priority: prioCPUCoreCState,
   463  		Dims: module.Dims{
   464  			{ID: "cpu_core_%s_cstate_c1", Name: "c1", Algo: module.PercentOfIncremental, Div: precision},
   465  			{ID: "cpu_core_%s_cstate_c2", Name: "c2", Algo: module.PercentOfIncremental, Div: precision},
   466  			{ID: "cpu_core_%s_cstate_c3", Name: "c3", Algo: module.PercentOfIncremental, Div: precision},
   467  		},
   468  	}
   469  )
   470  
   471  // Memory
   472  var (
   473  	memCharts = module.Charts{
   474  		memUtilChart.Copy(),
   475  		memPageFaultsChart.Copy(),
   476  		memSwapUtilChart.Copy(),
   477  		memSwapOperationsChart.Copy(),
   478  		memSwapPagesChart.Copy(),
   479  		memCacheChart.Copy(),
   480  		memCacheFaultsChart.Copy(),
   481  		memSystemPoolChart.Copy(),
   482  	}
   483  	memUtilChart = module.Chart{
   484  		ID:       "memory_utilization",
   485  		Title:    "Memory Utilization",
   486  		Units:    "bytes",
   487  		Fam:      "mem",
   488  		Ctx:      "windows.memory_utilization",
   489  		Type:     module.Stacked,
   490  		Priority: prioMemUtil,
   491  		Dims: module.Dims{
   492  			{ID: "memory_available_bytes", Name: "available"},
   493  			{ID: "memory_used_bytes", Name: "used"},
   494  		},
   495  	}
   496  	memPageFaultsChart = module.Chart{
   497  		ID:       "memory_page_faults",
   498  		Title:    "Memory Page Faults",
   499  		Units:    "pgfaults/s",
   500  		Fam:      "mem",
   501  		Ctx:      "windows.memory_page_faults",
   502  		Priority: prioMemPageFaults,
   503  		Dims: module.Dims{
   504  			{ID: "memory_page_faults_total", Name: "page_faults", Algo: module.Incremental},
   505  		},
   506  	}
   507  	memSwapUtilChart = module.Chart{
   508  		ID:       "memory_swap_utilization",
   509  		Title:    "Swap Utilization",
   510  		Units:    "bytes",
   511  		Fam:      "mem",
   512  		Ctx:      "windows.memory_swap_utilization",
   513  		Type:     module.Stacked,
   514  		Priority: prioMemSwapUtil,
   515  		Dims: module.Dims{
   516  			{ID: "memory_not_committed_bytes", Name: "available"},
   517  			{ID: "memory_committed_bytes", Name: "used"},
   518  		},
   519  		Vars: module.Vars{
   520  			{ID: "memory_commit_limit"},
   521  		},
   522  	}
   523  	memSwapOperationsChart = module.Chart{
   524  		ID:       "memory_swap_operations",
   525  		Title:    "Swap Operations",
   526  		Units:    "operations/s",
   527  		Fam:      "mem",
   528  		Ctx:      "windows.memory_swap_operations",
   529  		Type:     module.Area,
   530  		Priority: prioMemSwapOperations,
   531  		Dims: module.Dims{
   532  			{ID: "memory_swap_page_reads_total", Name: "read", Algo: module.Incremental},
   533  			{ID: "memory_swap_page_writes_total", Name: "write", Algo: module.Incremental, Mul: -1},
   534  		},
   535  	}
   536  	memSwapPagesChart = module.Chart{
   537  		ID:       "memory_swap_pages",
   538  		Title:    "Swap Pages",
   539  		Units:    "pages/s",
   540  		Fam:      "mem",
   541  		Ctx:      "windows.memory_swap_pages",
   542  		Priority: prioMemSwapPages,
   543  		Dims: module.Dims{
   544  			{ID: "memory_swap_pages_read_total", Name: "read", Algo: module.Incremental},
   545  			{ID: "memory_swap_pages_written_total", Name: "written", Algo: module.Incremental, Mul: -1},
   546  		},
   547  	}
   548  	memCacheChart = module.Chart{
   549  		ID:       "memory_cached",
   550  		Title:    "Cached",
   551  		Units:    "bytes",
   552  		Fam:      "mem",
   553  		Ctx:      "windows.memory_cached",
   554  		Type:     module.Area,
   555  		Priority: prioMemCache,
   556  		Dims: module.Dims{
   557  			{ID: "memory_cache_total", Name: "cached"},
   558  		},
   559  	}
   560  	memCacheFaultsChart = module.Chart{
   561  		ID:       "memory_cache_faults",
   562  		Title:    "Cache Faults",
   563  		Units:    "faults/s",
   564  		Fam:      "mem",
   565  		Ctx:      "windows.memory_cache_faults",
   566  		Priority: prioMemCacheFaults,
   567  		Dims: module.Dims{
   568  			{ID: "memory_cache_faults_total", Name: "cache_faults", Algo: module.Incremental},
   569  		},
   570  	}
   571  	memSystemPoolChart = module.Chart{
   572  		ID:       "memory_system_pool",
   573  		Title:    "System Memory Pool",
   574  		Units:    "bytes",
   575  		Fam:      "mem",
   576  		Ctx:      "windows.memory_system_pool",
   577  		Type:     module.Stacked,
   578  		Priority: prioMemSystemPool,
   579  		Dims: module.Dims{
   580  			{ID: "memory_pool_paged_bytes", Name: "paged"},
   581  			{ID: "memory_pool_nonpaged_bytes_total", Name: "non-paged"},
   582  		},
   583  	}
   584  )
   585  
   586  // Logical Disks
   587  var (
   588  	diskChartsTmpl = module.Charts{
   589  		diskSpaceUsageChartTmpl.Copy(),
   590  		diskBandwidthChartTmpl.Copy(),
   591  		diskOperationsChartTmpl.Copy(),
   592  		diskAvgLatencyChartTmpl.Copy(),
   593  	}
   594  	diskSpaceUsageChartTmpl = module.Chart{
   595  		ID:       "logical_disk_%s_space_usage",
   596  		Title:    "Space usage",
   597  		Units:    "bytes",
   598  		Fam:      "disk",
   599  		Ctx:      "windows.logical_disk_space_usage",
   600  		Type:     module.Stacked,
   601  		Priority: prioDiskSpaceUsage,
   602  		Dims: module.Dims{
   603  			{ID: "logical_disk_%s_free_space", Name: "free"},
   604  			{ID: "logical_disk_%s_used_space", Name: "used"},
   605  		},
   606  	}
   607  	diskBandwidthChartTmpl = module.Chart{
   608  		ID:       "logical_disk_%s_bandwidth",
   609  		Title:    "Bandwidth",
   610  		Units:    "bytes/s",
   611  		Fam:      "disk",
   612  		Ctx:      "windows.logical_disk_bandwidth",
   613  		Type:     module.Area,
   614  		Priority: prioDiskBandwidth,
   615  		Dims: module.Dims{
   616  			{ID: "logical_disk_%s_read_bytes_total", Name: "read", Algo: module.Incremental},
   617  			{ID: "logical_disk_%s_write_bytes_total", Name: "write", Algo: module.Incremental, Mul: -1},
   618  		},
   619  	}
   620  	diskOperationsChartTmpl = module.Chart{
   621  		ID:       "logical_disk_%s_operations",
   622  		Title:    "Operations",
   623  		Units:    "operations/s",
   624  		Fam:      "disk",
   625  		Ctx:      "windows.logical_disk_operations",
   626  		Priority: prioDiskOperations,
   627  		Dims: module.Dims{
   628  			{ID: "logical_disk_%s_reads_total", Name: "reads", Algo: module.Incremental},
   629  			{ID: "logical_disk_%s_writes_total", Name: "writes", Algo: module.Incremental, Mul: -1},
   630  		},
   631  	}
   632  	diskAvgLatencyChartTmpl = module.Chart{
   633  		ID:       "logical_disk_%s_latency",
   634  		Title:    "Average Read/Write Latency",
   635  		Units:    "seconds",
   636  		Fam:      "disk",
   637  		Ctx:      "windows.logical_disk_latency",
   638  		Priority: prioDiskAvgLatency,
   639  		Dims: module.Dims{
   640  			{ID: "logical_disk_%s_read_latency", Name: "read", Algo: module.Incremental, Div: precision},
   641  			{ID: "logical_disk_%s_write_latency", Name: "write", Algo: module.Incremental, Div: precision},
   642  		},
   643  	}
   644  )
   645  
   646  // Network interfaces
   647  var (
   648  	nicChartsTmpl = module.Charts{
   649  		nicBandwidthChartTmpl.Copy(),
   650  		nicPacketsChartTmpl.Copy(),
   651  		nicErrorsChartTmpl.Copy(),
   652  		nicDiscardsChartTmpl.Copy(),
   653  	}
   654  	nicBandwidthChartTmpl = module.Chart{
   655  		ID:       "nic_%s_bandwidth",
   656  		Title:    "Bandwidth",
   657  		Units:    "kilobits/s",
   658  		Fam:      "net",
   659  		Ctx:      "windows.net_nic_bandwidth",
   660  		Type:     module.Area,
   661  		Priority: prioNICBandwidth,
   662  		Dims: module.Dims{
   663  			{ID: "net_nic_%s_bytes_received", Name: "received", Algo: module.Incremental, Div: 1000},
   664  			{ID: "net_nic_%s_bytes_sent", Name: "sent", Algo: module.Incremental, Mul: -1, Div: 1000},
   665  		},
   666  	}
   667  	nicPacketsChartTmpl = module.Chart{
   668  		ID:       "nic_%s_packets",
   669  		Title:    "Packets",
   670  		Units:    "packets/s",
   671  		Fam:      "net",
   672  		Ctx:      "windows.net_nic_packets",
   673  		Priority: prioNICPackets,
   674  		Dims: module.Dims{
   675  			{ID: "net_nic_%s_packets_received_total", Name: "received", Algo: module.Incremental},
   676  			{ID: "net_nic_%s_packets_sent_total", Name: "sent", Algo: module.Incremental, Mul: -1},
   677  		},
   678  	}
   679  	nicErrorsChartTmpl = module.Chart{
   680  		ID:       "nic_%s_errors",
   681  		Title:    "Errors",
   682  		Units:    "errors/s",
   683  		Fam:      "net",
   684  		Ctx:      "windows.net_nic_errors",
   685  		Priority: prioNICErrors,
   686  		Dims: module.Dims{
   687  			{ID: "net_nic_%s_packets_received_errors", Name: "inbound", Algo: module.Incremental},
   688  			{ID: "net_nic_%s_packets_outbound_errors", Name: "outbound", Algo: module.Incremental, Mul: -1},
   689  		},
   690  	}
   691  	nicDiscardsChartTmpl = module.Chart{
   692  		ID:       "nic_%s_discarded",
   693  		Title:    "Discards",
   694  		Units:    "discards/s",
   695  		Fam:      "net",
   696  		Ctx:      "windows.net_nic_discarded",
   697  		Priority: prioNICDiscards,
   698  		Dims: module.Dims{
   699  			{ID: "net_nic_%s_packets_received_discarded", Name: "inbound", Algo: module.Incremental},
   700  			{ID: "net_nic_%s_packets_outbound_discarded", Name: "outbound", Algo: module.Incremental, Mul: -1},
   701  		},
   702  	}
   703  )
   704  
   705  // TCP
   706  var (
   707  	tcpCharts = module.Charts{
   708  		tcpConnsActiveChart.Copy(),
   709  		tcpConnsEstablishedChart.Copy(),
   710  		tcpConnsFailuresChart.Copy(),
   711  		tcpConnsPassiveChart.Copy(),
   712  		tcpConnsResetsChart.Copy(),
   713  		tcpSegmentsReceivedChart.Copy(),
   714  		tcpSegmentsRetransmittedChart.Copy(),
   715  		tcpSegmentsSentChart.Copy(),
   716  	}
   717  	tcpConnsEstablishedChart = module.Chart{
   718  		ID:       "tcp_conns_established",
   719  		Title:    "TCP established connections",
   720  		Units:    "connections",
   721  		Fam:      "tcp",
   722  		Ctx:      "windows.tcp_conns_established",
   723  		Priority: prioTCPConnsEstablished,
   724  		Dims: module.Dims{
   725  			{ID: "tcp_ipv4_conns_established", Name: "ipv4"},
   726  			{ID: "tcp_ipv6_conns_established", Name: "ipv6"},
   727  		},
   728  	}
   729  	tcpConnsActiveChart = module.Chart{
   730  		ID:       "tcp_conns_active",
   731  		Title:    "TCP active connections",
   732  		Units:    "connections/s",
   733  		Fam:      "tcp",
   734  		Ctx:      "windows.tcp_conns_active",
   735  		Priority: prioTCPConnsActive,
   736  		Dims: module.Dims{
   737  			{ID: "tcp_ipv4_conns_active", Name: "ipv4", Algo: module.Incremental},
   738  			{ID: "tcp_ipv6_conns_active", Name: "ipv6", Algo: module.Incremental},
   739  		},
   740  	}
   741  	tcpConnsPassiveChart = module.Chart{
   742  		ID:       "tcp_conns_passive",
   743  		Title:    "TCP passive connections",
   744  		Units:    "connections/s",
   745  		Fam:      "tcp",
   746  		Ctx:      "windows.tcp_conns_passive",
   747  		Priority: prioTCPConnsPassive,
   748  		Dims: module.Dims{
   749  			{ID: "tcp_ipv4_conns_passive", Name: "ipv4", Algo: module.Incremental},
   750  			{ID: "tcp_ipv6_conns_passive", Name: "ipv6", Algo: module.Incremental},
   751  		},
   752  	}
   753  	tcpConnsFailuresChart = module.Chart{
   754  		ID:       "tcp_conns_failures",
   755  		Title:    "TCP connection failures",
   756  		Units:    "failures/s",
   757  		Fam:      "tcp",
   758  		Ctx:      "windows.tcp_conns_failures",
   759  		Priority: prioTCPConnsFailure,
   760  		Dims: module.Dims{
   761  			{ID: "tcp_ipv4_conns_failures", Name: "ipv4", Algo: module.Incremental},
   762  			{ID: "tcp_ipv6_conns_failures", Name: "ipv6", Algo: module.Incremental},
   763  		},
   764  	}
   765  	tcpConnsResetsChart = module.Chart{
   766  		ID:       "tcp_conns_resets",
   767  		Title:    "TCP connections resets",
   768  		Units:    "resets/s",
   769  		Fam:      "tcp",
   770  		Ctx:      "windows.tcp_conns_resets",
   771  		Priority: prioTCPConnsReset,
   772  		Dims: module.Dims{
   773  			{ID: "tcp_ipv4_conns_resets", Name: "ipv4", Algo: module.Incremental},
   774  			{ID: "tcp_ipv6_conns_resets", Name: "ipv6", Algo: module.Incremental},
   775  		},
   776  	}
   777  	tcpSegmentsReceivedChart = module.Chart{
   778  		ID:       "tcp_segments_received",
   779  		Title:    "Number of TCP segments received",
   780  		Units:    "segments/s",
   781  		Fam:      "tcp",
   782  		Ctx:      "windows.tcp_segments_received",
   783  		Priority: prioTCPSegmentsReceived,
   784  		Dims: module.Dims{
   785  			{ID: "tcp_ipv4_segments_received", Name: "ipv4", Algo: module.Incremental},
   786  			{ID: "tcp_ipv6_segments_received", Name: "ipv6", Algo: module.Incremental},
   787  		},
   788  	}
   789  	tcpSegmentsSentChart = module.Chart{
   790  		ID:       "tcp_segments_sent",
   791  		Title:    "Number of TCP segments sent",
   792  		Units:    "segments/s",
   793  		Fam:      "tcp",
   794  		Ctx:      "windows.tcp_segments_sent",
   795  		Priority: prioTCPSegmentsSent,
   796  		Dims: module.Dims{
   797  			{ID: "tcp_ipv4_segments_sent", Name: "ipv4", Algo: module.Incremental},
   798  			{ID: "tcp_ipv6_segments_sent", Name: "ipv6", Algo: module.Incremental},
   799  		},
   800  	}
   801  	tcpSegmentsRetransmittedChart = module.Chart{
   802  		ID:       "tcp_segments_retransmitted",
   803  		Title:    "Number of TCP segments retransmitted",
   804  		Units:    "segments/s",
   805  		Fam:      "tcp",
   806  		Ctx:      "windows.tcp_segments_retransmitted",
   807  		Priority: prioTCPSegmentsRetransmitted,
   808  		Dims: module.Dims{
   809  			{ID: "tcp_ipv4_segments_retransmitted", Name: "ipv4", Algo: module.Incremental},
   810  			{ID: "tcp_ipv6_segments_retransmitted", Name: "ipv6", Algo: module.Incremental},
   811  		},
   812  	}
   813  )
   814  
   815  // OS
   816  var (
   817  	osCharts = module.Charts{
   818  		osProcessesChart.Copy(),
   819  		osUsersChart.Copy(),
   820  		osMemoryUsage.Copy(),
   821  		osPagingFilesUsageChart.Copy(),
   822  	}
   823  	osProcessesChart = module.Chart{
   824  		ID:       "os_processes",
   825  		Title:    "Processes",
   826  		Units:    "number",
   827  		Fam:      "os",
   828  		Ctx:      "windows.os_processes",
   829  		Priority: prioOSProcesses,
   830  		Dims: module.Dims{
   831  			{ID: "os_processes", Name: "processes"},
   832  		},
   833  		Vars: module.Vars{
   834  			{ID: "os_processes_limit"},
   835  		},
   836  	}
   837  	osUsersChart = module.Chart{
   838  		ID:       "os_users",
   839  		Title:    "Number of Users",
   840  		Units:    "users",
   841  		Fam:      "os",
   842  		Ctx:      "windows.os_users",
   843  		Priority: prioOSUsers,
   844  		Dims: module.Dims{
   845  			{ID: "os_users", Name: "users"},
   846  		},
   847  	}
   848  	osMemoryUsage = module.Chart{
   849  		ID:       "os_visible_memory_usage",
   850  		Title:    "Visible Memory Usage",
   851  		Units:    "bytes",
   852  		Fam:      "os",
   853  		Ctx:      "windows.os_visible_memory_usage",
   854  		Type:     module.Stacked,
   855  		Priority: prioOSVisibleMemoryUsage,
   856  		Dims: module.Dims{
   857  			{ID: "os_physical_memory_free_bytes", Name: "free"},
   858  			{ID: "os_visible_memory_used_bytes", Name: "used"},
   859  		},
   860  		Vars: module.Vars{
   861  			{ID: "os_visible_memory_bytes"},
   862  		},
   863  	}
   864  	osPagingFilesUsageChart = module.Chart{
   865  		ID:       "os_paging_files_usage",
   866  		Title:    "Paging Files Usage",
   867  		Units:    "bytes",
   868  		Fam:      "os",
   869  		Ctx:      "windows.os_paging_files_usage",
   870  		Type:     module.Stacked,
   871  		Priority: prioOSPagingUsage,
   872  		Dims: module.Dims{
   873  			{ID: "os_paging_free_bytes", Name: "free"},
   874  			{ID: "os_paging_used_bytes", Name: "used"},
   875  		},
   876  		Vars: module.Vars{
   877  			{ID: "os_paging_limit_bytes"},
   878  		},
   879  	}
   880  )
   881  
   882  // System
   883  var (
   884  	systemCharts = module.Charts{
   885  		systemThreadsChart.Copy(),
   886  		systemUptimeChart.Copy(),
   887  	}
   888  	systemThreadsChart = module.Chart{
   889  		ID:       "system_threads",
   890  		Title:    "Threads",
   891  		Units:    "number",
   892  		Fam:      "system",
   893  		Ctx:      "windows.system_threads",
   894  		Priority: prioSystemThreads,
   895  		Dims: module.Dims{
   896  			{ID: "system_threads", Name: "threads"},
   897  		},
   898  	}
   899  	systemUptimeChart = module.Chart{
   900  		ID:       "system_uptime",
   901  		Title:    "Uptime",
   902  		Units:    "seconds",
   903  		Fam:      "system",
   904  		Ctx:      "windows.system_uptime",
   905  		Priority: prioSystemUptime,
   906  		Dims: module.Dims{
   907  			{ID: "system_up_time", Name: "time"},
   908  		},
   909  	}
   910  )
   911  
   912  // IIS
   913  var (
   914  	iisWebsiteChartsTmpl = module.Charts{
   915  		iisWebsiteTrafficChartTempl.Copy(),
   916  		iisWebsiteRequestsRateChartTmpl.Copy(),
   917  		iisWebsiteActiveConnectionsCountChartTmpl.Copy(),
   918  		iisWebsiteUsersCountChartTmpl.Copy(),
   919  		iisWebsiteConnectionAttemptsRate.Copy(),
   920  		iisWebsiteISAPIExtRequestsCountChartTmpl.Copy(),
   921  		iisWebsiteISAPIExtRequestsRateChartTmpl.Copy(),
   922  		iisWebsiteFTPFileTransferRateChartTempl.Copy(),
   923  		iisWebsiteLogonAttemptsRateChartTmpl.Copy(),
   924  		iisWebsiteErrorsRateChart.Copy(),
   925  		iisWebsiteUptimeChartTmpl.Copy(),
   926  	}
   927  	iisWebsiteTrafficChartTempl = module.Chart{
   928  		OverModule: "iis",
   929  		ID:         "iis_website_%s_traffic",
   930  		Title:      "Website traffic",
   931  		Units:      "bytes/s",
   932  		Fam:        "traffic",
   933  		Ctx:        "iis.website_traffic",
   934  		Type:       module.Area,
   935  		Priority:   prioIISWebsiteTraffic,
   936  		Dims: module.Dims{
   937  			{ID: "iis_website_%s_received_bytes_total", Name: "received", Algo: module.Incremental},
   938  			{ID: "iis_website_%s_sent_bytes_total", Name: "sent", Algo: module.Incremental, Mul: -1},
   939  		},
   940  	}
   941  	iisWebsiteFTPFileTransferRateChartTempl = module.Chart{
   942  		OverModule: "iis",
   943  		ID:         "iis_website_%s_ftp_file_transfer_rate",
   944  		Title:      "Website FTP file transfer rate",
   945  		Units:      "files/s",
   946  		Fam:        "traffic",
   947  		Ctx:        "iis.website_ftp_file_transfer_rate",
   948  		Priority:   prioIISWebsiteFTPFileTransferRate,
   949  		Dims: module.Dims{
   950  			{ID: "iis_website_%s_files_received_total", Name: "received", Algo: module.Incremental},
   951  			{ID: "iis_website_%s_files_sent_total", Name: "sent", Algo: module.Incremental},
   952  		},
   953  	}
   954  	iisWebsiteActiveConnectionsCountChartTmpl = module.Chart{
   955  		OverModule: "iis",
   956  		ID:         "iis_website_%s_active_connections_count",
   957  		Title:      "Website active connections",
   958  		Units:      "connections",
   959  		Fam:        "connections",
   960  		Ctx:        "iis.website_active_connections_count",
   961  		Priority:   prioIISWebsiteActiveConnectionsCount,
   962  		Dims: module.Dims{
   963  			{ID: "iis_website_%s_current_connections", Name: "active"},
   964  		},
   965  	}
   966  	iisWebsiteConnectionAttemptsRate = module.Chart{
   967  		OverModule: "iis",
   968  		ID:         "iis_website_%s_connection_attempts_rate",
   969  		Title:      "Website connections attempts",
   970  		Units:      "attempts/s",
   971  		Fam:        "connections",
   972  		Ctx:        "iis.website_connection_attempts_rate",
   973  		Priority:   prioIISWebsiteConnectionAttemptsRate,
   974  		Dims: module.Dims{
   975  			{ID: "iis_website_%s_connection_attempts_all_instances_total", Name: "connection", Algo: module.Incremental},
   976  		},
   977  	}
   978  	iisWebsiteRequestsRateChartTmpl = module.Chart{
   979  		OverModule: "iis",
   980  		ID:         "iis_website_%s_requests_rate",
   981  		Title:      "Website requests rate",
   982  		Units:      "requests/s",
   983  		Fam:        "requests",
   984  		Ctx:        "iis.website_requests_rate",
   985  		Priority:   prioIISWebsiteRequestsRate,
   986  		Dims: module.Dims{
   987  			{ID: "iis_website_%s_requests_total", Name: "requests", Algo: module.Incremental},
   988  		},
   989  	}
   990  	iisWebsiteUsersCountChartTmpl = module.Chart{
   991  		OverModule: "iis",
   992  		ID:         "iis_website_%s_users_count",
   993  		Title:      "Website users with pending requests",
   994  		Units:      "users",
   995  		Fam:        "requests",
   996  		Ctx:        "iis.website_users_count",
   997  		Type:       module.Stacked,
   998  		Priority:   prioIISWebsiteUsersCount,
   999  		Dims: module.Dims{
  1000  			{ID: "iis_website_%s_current_anonymous_users", Name: "anonymous"},
  1001  			{ID: "iis_website_%s_current_non_anonymous_users", Name: "non_anonymous"},
  1002  		},
  1003  	}
  1004  	iisWebsiteISAPIExtRequestsCountChartTmpl = module.Chart{
  1005  		OverModule: "iis",
  1006  		ID:         "iis_website_%s_isapi_extension_requests_count",
  1007  		Title:      "ISAPI extension requests",
  1008  		Units:      "requests",
  1009  		Fam:        "requests",
  1010  		Ctx:        "iis.website_isapi_extension_requests_count",
  1011  		Priority:   prioIISWebsiteISAPIExtRequestsCount,
  1012  		Dims: module.Dims{
  1013  			{ID: "iis_website_%s_current_isapi_extension_requests", Name: "isapi"},
  1014  		},
  1015  	}
  1016  	iisWebsiteISAPIExtRequestsRateChartTmpl = module.Chart{
  1017  		OverModule: "iis",
  1018  		ID:         "iis_website_%s_isapi_extension_requests_rate",
  1019  		Title:      "Website extensions request",
  1020  		Units:      "requests/s",
  1021  		Fam:        "requests",
  1022  		Ctx:        "iis.website_isapi_extension_requests_rate",
  1023  		Priority:   prioIISWebsiteISAPIExtRequestsRate,
  1024  		Dims: module.Dims{
  1025  			{ID: "iis_website_%s_isapi_extension_requests_total", Name: "isapi", Algo: module.Incremental},
  1026  		},
  1027  	}
  1028  	iisWebsiteErrorsRateChart = module.Chart{
  1029  		OverModule: "iis",
  1030  		ID:         "iis_website_%s_errors_rate",
  1031  		Title:      "Website errors",
  1032  		Units:      "errors/s",
  1033  		Fam:        "requests",
  1034  		Ctx:        "iis.website_errors_rate",
  1035  		Type:       module.Stacked,
  1036  		Priority:   prioIISWebsiteErrorsRate,
  1037  		Dims: module.Dims{
  1038  			{ID: "iis_website_%s_locked_errors_total", Name: "document_locked", Algo: module.Incremental},
  1039  			{ID: "iis_website_%s_not_found_errors_total", Name: "document_not_found", Algo: module.Incremental},
  1040  		},
  1041  	}
  1042  	iisWebsiteLogonAttemptsRateChartTmpl = module.Chart{
  1043  		OverModule: "iis",
  1044  		ID:         "iis_website_%s_logon_attempts_rate",
  1045  		Title:      "Website logon attempts",
  1046  		Units:      "attempts/s",
  1047  		Fam:        "logon",
  1048  		Ctx:        "iis.website_logon_attempts_rate",
  1049  		Priority:   prioIISWebsiteLogonAttemptsRate,
  1050  		Dims: module.Dims{
  1051  			{ID: "iis_website_%s_logon_attempts_total", Name: "logon", Algo: module.Incremental},
  1052  		},
  1053  	}
  1054  	iisWebsiteUptimeChartTmpl = module.Chart{
  1055  		OverModule: "iis",
  1056  		ID:         "iis_website_%s_uptime",
  1057  		Title:      "Website uptime",
  1058  		Units:      "seconds",
  1059  		Fam:        "uptime",
  1060  		Ctx:        "iis.website_uptime",
  1061  		Priority:   prioIISWebsiteUptime,
  1062  		Dims: module.Dims{
  1063  			{ID: "iis_website_%s_service_uptime", Name: "uptime"},
  1064  		},
  1065  	}
  1066  )
  1067  
  1068  // MS-SQL
  1069  var (
  1070  	mssqlInstanceChartsTmpl = module.Charts{
  1071  		mssqlAccessMethodPageSplitsChart.Copy(),
  1072  		mssqlCacheHitRatioChart.Copy(),
  1073  		mssqlBufferCheckpointPageChart.Copy(),
  1074  		mssqlBufferPageLifeExpectancyChart.Copy(),
  1075  		mssqlBufManIOPSChart.Copy(),
  1076  		mssqlBlockedProcessChart.Copy(),
  1077  		mssqlLocksWaitChart.Copy(),
  1078  		mssqlDeadLocksChart.Copy(),
  1079  		mssqlMemmgrConnectionMemoryBytesChart.Copy(),
  1080  		mssqlMemmgrExternalBenefitOfMemoryChart.Copy(),
  1081  		mssqlMemmgrPendingMemoryChart.Copy(),
  1082  		mssqlMemmgrTotalServerChart.Copy(),
  1083  		mssqlSQLErrorsTotalChart.Copy(),
  1084  		mssqlStatsAutoParamChart.Copy(),
  1085  		mssqlStatsBatchRequestsChart.Copy(),
  1086  		mssqlStatsSafeAutoChart.Copy(),
  1087  		mssqlStatsCompilationChart.Copy(),
  1088  		mssqlStatsRecompilationChart.Copy(),
  1089  		mssqlUserConnectionChart.Copy(),
  1090  	}
  1091  	mssqlDatabaseChartsTmpl = module.Charts{
  1092  		mssqlDatabaseActiveTransactionsChart.Copy(),
  1093  		mssqlDatabaseBackupRestoreOperationsChart.Copy(),
  1094  		mssqlDatabaseSizeChart.Copy(),
  1095  		mssqlDatabaseLogFlushedChart.Copy(),
  1096  		mssqlDatabaseLogFlushesChart.Copy(),
  1097  		mssqlDatabaseTransactionsChart.Copy(),
  1098  		mssqlDatabaseWriteTransactionsChart.Copy(),
  1099  	}
  1100  	// Access Method:
  1101  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-access-methods-object?view=sql-server-ver16
  1102  	mssqlAccessMethodPageSplitsChart = module.Chart{
  1103  		OverModule: "mssql",
  1104  		ID:         "mssql_instance_%s_accessmethods_page_splits",
  1105  		Title:      "Page splits",
  1106  		Units:      "splits/s",
  1107  		Fam:        "buffer cache",
  1108  		Ctx:        "mssql.instance_accessmethods_page_splits",
  1109  		Priority:   prioMSSQLAccessMethodPageSplits,
  1110  		Dims: module.Dims{
  1111  			{ID: "mssql_instance_%s_accessmethods_page_splits", Name: "page", Algo: module.Incremental},
  1112  		},
  1113  	}
  1114  	// Buffer Management
  1115  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-buffer-manager-object?view=sql-server-ver16
  1116  	mssqlCacheHitRatioChart = module.Chart{
  1117  		OverModule: "mssql",
  1118  		ID:         "mssql_instance_%s_cache_hit_ratio",
  1119  		Title:      "Buffer Cache hit ratio",
  1120  		Units:      "percentage",
  1121  		Fam:        "buffer cache",
  1122  		Ctx:        "mssql.instance_cache_hit_ratio",
  1123  		Priority:   prioMSSQLCacheHitRatio,
  1124  		Dims: module.Dims{
  1125  			{ID: "mssql_instance_%s_cache_hit_ratio", Name: "hit_ratio"},
  1126  		},
  1127  	}
  1128  	mssqlBufferCheckpointPageChart = module.Chart{
  1129  		OverModule: "mssql",
  1130  		ID:         "mssql_instance_%s_bufman_checkpoint_pages",
  1131  		Title:      "Flushed pages",
  1132  		Units:      "pages/s",
  1133  		Fam:        "buffer cache",
  1134  		Ctx:        "mssql.instance_bufman_checkpoint_pages",
  1135  		Priority:   prioMSSQLBufferCheckpointPages,
  1136  		Dims: module.Dims{
  1137  			{ID: "mssql_instance_%s_bufman_checkpoint_pages", Name: "flushed", Algo: module.Incremental},
  1138  		},
  1139  	}
  1140  	mssqlBufferPageLifeExpectancyChart = module.Chart{
  1141  		OverModule: "mssql",
  1142  		ID:         "mssql_instance_%s_bufman_page_life_expectancy",
  1143  		Title:      "Page life expectancy",
  1144  		Units:      "seconds",
  1145  		Fam:        "buffer cache",
  1146  		Ctx:        "mssql.instance_bufman_page_life_expectancy",
  1147  		Priority:   prioMSSQLBufferPageLifeExpectancy,
  1148  		Dims: module.Dims{
  1149  			{ID: "mssql_instance_%s_bufman_page_life_expectancy_seconds", Name: "life_expectancy"},
  1150  		},
  1151  	}
  1152  	mssqlBufManIOPSChart = module.Chart{
  1153  		OverModule: "mssql",
  1154  		ID:         "mssql_instance_%s_bufman_iops",
  1155  		Title:      "Number of pages input and output",
  1156  		Units:      "pages/s",
  1157  		Fam:        "buffer cache",
  1158  		Ctx:        "mssql.instance_bufman_iops",
  1159  		Priority:   prioMSSQLBufManIOPS,
  1160  		Dims: module.Dims{
  1161  			{ID: "mssql_instance_%s_bufman_page_reads", Name: "read", Algo: module.Incremental},
  1162  			{ID: "mssql_instance_%s_bufman_page_writes", Name: "written", Mul: -1, Algo: module.Incremental},
  1163  		},
  1164  	}
  1165  	// General Statistic
  1166  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-general-statistics-object?view=sql-server-ver16
  1167  	mssqlBlockedProcessChart = module.Chart{
  1168  		OverModule: "mssql",
  1169  		ID:         "mssql_instance_%s_blocked_process",
  1170  		Title:      "Blocked processes",
  1171  		Units:      "process",
  1172  		Fam:        "processes",
  1173  		Ctx:        "mssql.instance_blocked_processes",
  1174  		Priority:   prioMSSQLBlockedProcess,
  1175  		Dims: module.Dims{
  1176  			{ID: "mssql_instance_%s_genstats_blocked_processes", Name: "blocked"},
  1177  		},
  1178  	}
  1179  	mssqlUserConnectionChart = module.Chart{
  1180  		OverModule: "mssql",
  1181  		ID:         "mssql_instance_%s_user_connection",
  1182  		Title:      "User connections",
  1183  		Units:      "connections",
  1184  		Fam:        "connections",
  1185  		Ctx:        "mssql.instance_user_connection",
  1186  		Priority:   prioMSSQLUserConnections,
  1187  		Dims: module.Dims{
  1188  			{ID: "mssql_instance_%s_genstats_user_connections", Name: "user"},
  1189  		},
  1190  	}
  1191  	// Lock Wait
  1192  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-locks-object?view=sql-server-ver16
  1193  	mssqlLocksWaitChart = module.Chart{
  1194  		OverModule: "mssql",
  1195  		ID:         "mssql_instance_%s_locks_lock_wait",
  1196  		Title:      "Lock requests that required the caller to wait",
  1197  		Units:      "locks/s",
  1198  		Fam:        "locks",
  1199  		Ctx:        "mssql.instance_locks_lock_wait",
  1200  		Priority:   prioMSSQLLocksLockWait,
  1201  		Dims: module.Dims{
  1202  			{ID: "mssql_instance_%s_resource_AllocUnit_locks_lock_wait_seconds", Name: "alloc_unit", Algo: module.Incremental},
  1203  			{ID: "mssql_instance_%s_resource_Application_locks_lock_wait_seconds", Name: "application", Algo: module.Incremental},
  1204  			{ID: "mssql_instance_%s_resource_Database_locks_lock_wait_seconds", Name: "database", Algo: module.Incremental},
  1205  			{ID: "mssql_instance_%s_resource_Extent_locks_lock_wait_seconds", Name: "extent", Algo: module.Incremental},
  1206  			{ID: "mssql_instance_%s_resource_File_locks_lock_wait_seconds", Name: "file", Algo: module.Incremental},
  1207  			{ID: "mssql_instance_%s_resource_HoBT_locks_lock_wait_seconds", Name: "hobt", Algo: module.Incremental},
  1208  			{ID: "mssql_instance_%s_resource_Key_locks_lock_wait_seconds", Name: "key", Algo: module.Incremental},
  1209  			{ID: "mssql_instance_%s_resource_Metadata_locks_lock_wait_seconds", Name: "metadata", Algo: module.Incremental},
  1210  			{ID: "mssql_instance_%s_resource_OIB_locks_lock_wait_seconds", Name: "oib", Algo: module.Incremental},
  1211  			{ID: "mssql_instance_%s_resource_Object_locks_lock_wait_seconds", Name: "object", Algo: module.Incremental},
  1212  			{ID: "mssql_instance_%s_resource_Page_locks_lock_wait_seconds", Name: "page", Algo: module.Incremental},
  1213  			{ID: "mssql_instance_%s_resource_RID_locks_lock_wait_seconds", Name: "rid", Algo: module.Incremental},
  1214  			{ID: "mssql_instance_%s_resource_RowGroup_locks_lock_wait_seconds", Name: "row_group", Algo: module.Incremental},
  1215  			{ID: "mssql_instance_%s_resource_Xact_locks_lock_wait_seconds", Name: "xact", Algo: module.Incremental},
  1216  		},
  1217  	}
  1218  	mssqlDeadLocksChart = module.Chart{
  1219  		OverModule: "mssql",
  1220  		ID:         "mssql_instance_%s_locks_deadlocks",
  1221  		Title:      "Lock requests that resulted in deadlock",
  1222  		Units:      "locks/s",
  1223  		Fam:        "locks",
  1224  		Ctx:        "mssql.instance_locks_deadlocks",
  1225  		Priority:   prioMSSQLLocksDeadLocks,
  1226  		Dims: module.Dims{
  1227  			{ID: "mssql_instance_%s_resource_AllocUnit_locks_deadlocks", Name: "alloc_unit", Algo: module.Incremental},
  1228  			{ID: "mssql_instance_%s_resource_Application_locks_deadlocks", Name: "application", Algo: module.Incremental},
  1229  			{ID: "mssql_instance_%s_resource_Database_locks_deadlocks", Name: "database", Algo: module.Incremental},
  1230  			{ID: "mssql_instance_%s_resource_Extent_locks_deadlocks", Name: "extent", Algo: module.Incremental},
  1231  			{ID: "mssql_instance_%s_resource_File_locks_deadlocks", Name: "file", Algo: module.Incremental},
  1232  			{ID: "mssql_instance_%s_resource_HoBT_locks_deadlocks", Name: "hobt", Algo: module.Incremental},
  1233  			{ID: "mssql_instance_%s_resource_Key_locks_deadlocks", Name: "key", Algo: module.Incremental},
  1234  			{ID: "mssql_instance_%s_resource_Metadata_locks_deadlocks", Name: "metadata", Algo: module.Incremental},
  1235  			{ID: "mssql_instance_%s_resource_OIB_locks_deadlocks", Name: "oib", Algo: module.Incremental},
  1236  			{ID: "mssql_instance_%s_resource_Object_locks_deadlocks", Name: "object", Algo: module.Incremental},
  1237  			{ID: "mssql_instance_%s_resource_Page_locks_deadlocks", Name: "page", Algo: module.Incremental},
  1238  			{ID: "mssql_instance_%s_resource_RID_locks_deadlocks", Name: "rid", Algo: module.Incremental},
  1239  			{ID: "mssql_instance_%s_resource_RowGroup_locks_deadlocks", Name: "row_group", Algo: module.Incremental},
  1240  			{ID: "mssql_instance_%s_resource_Xact_locks_deadlocks", Name: "xact", Algo: module.Incremental},
  1241  		},
  1242  	}
  1243  
  1244  	// Memory Manager
  1245  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-memory-manager-object?view=sql-server-ver16
  1246  	mssqlMemmgrConnectionMemoryBytesChart = module.Chart{
  1247  		OverModule: "mssql",
  1248  		ID:         "mssql_instance_%s_memmgr_connection_memory_bytes",
  1249  		Title:      "Amount of dynamic memory to maintain connections",
  1250  		Units:      "bytes",
  1251  		Fam:        "memory",
  1252  		Ctx:        "mssql.instance_memmgr_connection_memory_bytes",
  1253  		Priority:   prioMSSQLMemmgrConnectionMemoryBytes,
  1254  		Dims: module.Dims{
  1255  			{ID: "mssql_instance_%s_memmgr_connection_memory_bytes", Name: "memory", Algo: module.Incremental},
  1256  		},
  1257  	}
  1258  	mssqlMemmgrExternalBenefitOfMemoryChart = module.Chart{
  1259  		OverModule: "mssql",
  1260  		ID:         "mssql_instance_%s_memmgr_external_benefit_of_memory",
  1261  		Title:      "Performance benefit from adding memory to a specific cache",
  1262  		Units:      "bytes",
  1263  		Fam:        "memory",
  1264  		Ctx:        "mssql.instance_memmgr_external_benefit_of_memory",
  1265  		Priority:   prioMSSQLMemmgrExternalBenefitOfMemory,
  1266  		Dims: module.Dims{
  1267  			{ID: "mssql_instance_%s_memmgr_external_benefit_of_memory", Name: "benefit", Algo: module.Incremental},
  1268  		},
  1269  	}
  1270  	mssqlMemmgrPendingMemoryChart = module.Chart{
  1271  		OverModule: "mssql",
  1272  		ID:         "mssql_instance_%s_memmgr_pending_memory_grants",
  1273  		Title:      "Process waiting for memory grant",
  1274  		Units:      "process",
  1275  		Fam:        "memory",
  1276  		Ctx:        "mssql.instance_memmgr_pending_memory_grants",
  1277  		Priority:   prioMSSQLMemmgrPendingMemoryGrants,
  1278  		Dims: module.Dims{
  1279  			{ID: "mssql_instance_%s_memmgr_pending_memory_grants", Name: "pending"},
  1280  		},
  1281  	}
  1282  	mssqlMemmgrTotalServerChart = module.Chart{
  1283  		OverModule: "mssql",
  1284  		ID:         "mssql_instance_%s_memmgr_server_memory",
  1285  		Title:      "Memory committed",
  1286  		Units:      "bytes",
  1287  		Fam:        "memory",
  1288  		Ctx:        "mssql.instance_memmgr_server_memory",
  1289  		Priority:   prioMSSQLMemTotalServer,
  1290  		Dims: module.Dims{
  1291  			{ID: "mssql_instance_%s_memmgr_total_server_memory_bytes", Name: "memory"},
  1292  		},
  1293  	}
  1294  
  1295  	// SQL errors
  1296  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-errors-object?view=sql-server-ver16
  1297  	mssqlSQLErrorsTotalChart = module.Chart{
  1298  		OverModule: "mssql",
  1299  		ID:         "mssql_instance_%s_sql_errors_total",
  1300  		Title:      "Errors",
  1301  		Units:      "errors/s",
  1302  		Fam:        "errors",
  1303  		Ctx:        "mssql.instance_sql_errors",
  1304  		Priority:   prioMSSQLSqlErrorsTotal,
  1305  		Dims: module.Dims{
  1306  			{ID: "mssql_instance_%s_sql_errors_total_db_offline_errors", Name: "db_offline", Algo: module.Incremental},
  1307  			{ID: "mssql_instance_%s_sql_errors_total_info_errors", Name: "info", Algo: module.Incremental},
  1308  			{ID: "mssql_instance_%s_sql_errors_total_kill_connection_errors", Name: "kill_connection", Algo: module.Incremental},
  1309  			{ID: "mssql_instance_%s_sql_errors_total_user_errors", Name: "user", Algo: module.Incremental},
  1310  		},
  1311  	}
  1312  
  1313  	// SQL Statistic
  1314  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-sql-statistics-object?view=sql-server-ver16
  1315  	mssqlStatsAutoParamChart = module.Chart{
  1316  		OverModule: "mssql",
  1317  		ID:         "mssql_instance_%s_sqlstats_auto_parameterization_attempts",
  1318  		Title:      "Failed auto-parameterization attempts",
  1319  		Units:      "attempts/s",
  1320  		Fam:        "sql activity",
  1321  		Ctx:        "mssql.instance_sqlstats_auto_parameterization_attempts",
  1322  		Priority:   prioMSSQLStatsAutoParameterization,
  1323  		Dims: module.Dims{
  1324  			{ID: "mssql_instance_%s_sqlstats_auto_parameterization_attempts", Name: "failed", Algo: module.Incremental},
  1325  		},
  1326  	}
  1327  	mssqlStatsBatchRequestsChart = module.Chart{
  1328  		OverModule: "mssql",
  1329  		ID:         "mssql_instance_%s_sqlstats_batch_requests",
  1330  		Title:      "Total of batches requests",
  1331  		Units:      "requests/s",
  1332  		Fam:        "sql activity",
  1333  		Ctx:        "mssql.instance_sqlstats_batch_requests",
  1334  		Priority:   prioMSSQLStatsBatchRequests,
  1335  		Dims: module.Dims{
  1336  			{ID: "mssql_instance_%s_sqlstats_batch_requests", Name: "batch", Algo: module.Incremental},
  1337  		},
  1338  	}
  1339  	mssqlStatsSafeAutoChart = module.Chart{
  1340  		OverModule: "mssql",
  1341  		ID:         "mssql_instance_%s_sqlstats_safe_auto_parameterization_attempts",
  1342  		Title:      "Safe auto-parameterization attempts",
  1343  		Units:      "attempts/s",
  1344  		Fam:        "sql activity",
  1345  		Ctx:        "mssql.instance_sqlstats_safe_auto_parameterization_attempts",
  1346  		Priority:   prioMSSQLStatsSafeAutoParameterization,
  1347  		Dims: module.Dims{
  1348  			{ID: "mssql_instance_%s_sqlstats_safe_auto_parameterization_attempts", Name: "safe", Algo: module.Incremental},
  1349  		},
  1350  	}
  1351  	mssqlStatsCompilationChart = module.Chart{
  1352  		OverModule: "mssql",
  1353  		ID:         "mssql_instance_%s_sqlstats_sql_compilations",
  1354  		Title:      "SQL compilations",
  1355  		Units:      "compilations/s",
  1356  		Fam:        "sql activity",
  1357  		Ctx:        "mssql.instance_sqlstats_sql_compilations",
  1358  		Priority:   prioMSSQLStatsCompilations,
  1359  		Dims: module.Dims{
  1360  			{ID: "mssql_instance_%s_sqlstats_sql_compilations", Name: "compilations", Algo: module.Incremental},
  1361  		},
  1362  	}
  1363  	mssqlStatsRecompilationChart = module.Chart{
  1364  		OverModule: "mssql",
  1365  		ID:         "mssql_instance_%s_sqlstats_sql_recompilations",
  1366  		Title:      "SQL re-compilations",
  1367  		Units:      "recompiles/s",
  1368  		Fam:        "sql activity",
  1369  		Ctx:        "mssql.instance_sqlstats_sql_recompilations",
  1370  		Priority:   prioMSSQLStatsRecompilations,
  1371  		Dims: module.Dims{
  1372  			{ID: "mssql_instance_%s_sqlstats_sql_recompilations", Name: "recompiles", Algo: module.Incremental},
  1373  		},
  1374  	}
  1375  
  1376  	// Database
  1377  	// Source: https://learn.microsoft.com/en-us/sql/relational-databases/performance-monitor/sql-server-databases-object?view=sql-server-2017
  1378  	mssqlDatabaseActiveTransactionsChart = module.Chart{
  1379  		OverModule: "mssql",
  1380  		ID:         "mssql_db_%s_instance_%s_active_transactions",
  1381  		Title:      "Active transactions per database",
  1382  		Units:      "transactions",
  1383  		Fam:        "transactions",
  1384  		Ctx:        "mssql.database_active_transactions",
  1385  		Priority:   prioMSSQLDatabaseActiveTransactions,
  1386  		Dims: module.Dims{
  1387  			{ID: "mssql_db_%s_instance_%s_active_transactions", Name: "active"},
  1388  		},
  1389  	}
  1390  	mssqlDatabaseBackupRestoreOperationsChart = module.Chart{
  1391  		OverModule: "mssql",
  1392  		ID:         "mssql_db_%s_instance_%s_backup_restore_operations",
  1393  		Title:      "Backup IO per database",
  1394  		Units:      "operations/s",
  1395  		Fam:        "transactions",
  1396  		Ctx:        "mssql.database_backup_restore_operations",
  1397  		Priority:   prioMSSQLDatabaseBackupRestoreOperations,
  1398  		Dims: module.Dims{
  1399  			{ID: "mssql_db_%s_instance_%s_backup_restore_operations", Name: "backup", Algo: module.Incremental},
  1400  		},
  1401  	}
  1402  	mssqlDatabaseSizeChart = module.Chart{
  1403  		OverModule: "mssql",
  1404  		ID:         "mssql_db_%s_instance_%s_data_files_size",
  1405  		Title:      "Current database size",
  1406  		Units:      "bytes",
  1407  		Fam:        "size",
  1408  		Ctx:        "mssql.database_data_files_size",
  1409  		Priority:   prioMSSQLDatabaseDataFileSize,
  1410  		Dims: module.Dims{
  1411  			{ID: "mssql_db_%s_instance_%s_data_files_size_bytes", Name: "size"},
  1412  		},
  1413  	}
  1414  	mssqlDatabaseLogFlushedChart = module.Chart{
  1415  		OverModule: "mssql",
  1416  		ID:         "mssql_db_%s_instance_%s_log_flushed",
  1417  		Title:      "Log flushed",
  1418  		Units:      "bytes/s",
  1419  		Fam:        "transactions",
  1420  		Ctx:        "mssql.database_log_flushed",
  1421  		Priority:   prioMSSQLDatabaseLogFlushed,
  1422  		Dims: module.Dims{
  1423  			{ID: "mssql_db_%s_instance_%s_log_flushed_bytes", Name: "flushed", Algo: module.Incremental},
  1424  		},
  1425  	}
  1426  	mssqlDatabaseLogFlushesChart = module.Chart{
  1427  		OverModule: "mssql",
  1428  		ID:         "mssql_db_%s_instance_%s_log_flushes",
  1429  		Title:      "Log flushes",
  1430  		Units:      "flushes/s",
  1431  		Fam:        "transactions",
  1432  		Ctx:        "mssql.database_log_flushes",
  1433  		Priority:   prioMSSQLDatabaseLogFlushes,
  1434  		Dims: module.Dims{
  1435  			{ID: "mssql_db_%s_instance_%s_log_flushes", Name: "log", Algo: module.Incremental},
  1436  		},
  1437  	}
  1438  	mssqlDatabaseTransactionsChart = module.Chart{
  1439  		OverModule: "mssql",
  1440  		ID:         "mssql_db_%s_instance_%s_transactions",
  1441  		Title:      "Transactions",
  1442  		Units:      "transactions/s",
  1443  		Fam:        "transactions",
  1444  		Ctx:        "mssql.database_transactions",
  1445  		Priority:   prioMSSQLDatabaseTransactions,
  1446  		Dims: module.Dims{
  1447  			{ID: "mssql_db_%s_instance_%s_transactions", Name: "transactions", Algo: module.Incremental},
  1448  		},
  1449  	}
  1450  	mssqlDatabaseWriteTransactionsChart = module.Chart{
  1451  		OverModule: "mssql",
  1452  		ID:         "mssql_db_%s_instance_%s_write_transactions",
  1453  		Title:      "Write transactions",
  1454  		Units:      "transactions/s",
  1455  		Fam:        "transactions",
  1456  		Ctx:        "mssql.database_write_transactions",
  1457  		Priority:   prioMSSQLDatabaseWriteTransactions,
  1458  		Dims: module.Dims{
  1459  			{ID: "mssql_db_%s_instance_%s_write_transactions", Name: "write", Algo: module.Incremental},
  1460  		},
  1461  	}
  1462  )
  1463  
  1464  // AD
  1465  var (
  1466  	adCharts = module.Charts{
  1467  		adDatabaseOperationsChart.Copy(),
  1468  		adDirectoryOperationsChart.Copy(),
  1469  		adNameCacheLookupsChart.Copy(),
  1470  		adNameCacheHitsChart.Copy(),
  1471  		adDRAReplicationIntersiteCompressedTrafficChart.Copy(),
  1472  		adDRAReplicationIntrasiteCompressedTrafficChart.Copy(),
  1473  		adDRAReplicationSyncObjectRemainingChart.Copy(),
  1474  		adDRAReplicationObjectsFilteredChart.Copy(),
  1475  		adDRAReplicationPropertiesUpdatedChart.Copy(),
  1476  		adDRAReplicationPropertiesFilteredChart.Copy(),
  1477  		adDRAReplicationPendingSyncsChart.Copy(),
  1478  		adDRAReplicationSyncRequestsChart.Copy(),
  1479  		adDirectoryServiceThreadsChart.Copy(),
  1480  		adLDAPLastBindTimeChart.Copy(),
  1481  		adBindsTotalChart.Copy(),
  1482  		adLDAPSearchesChart.Copy(),
  1483  		adATQAverageRequestLatencyChart.Copy(),
  1484  		adATQOutstandingRequestsChart.Copy(),
  1485  	}
  1486  	adDatabaseOperationsChart = module.Chart{
  1487  		OverModule: "ad",
  1488  		ID:         "ad_database_operations",
  1489  		Title:      "AD database operations",
  1490  		Units:      "operations/s",
  1491  		Fam:        "database",
  1492  		Ctx:        "ad.database_operations",
  1493  		Priority:   prioADDatabaseOperations,
  1494  		Dims: module.Dims{
  1495  			{ID: "ad_database_operations_total_add", Name: "add", Algo: module.Incremental},
  1496  			{ID: "ad_database_operations_total_delete", Name: "delete", Algo: module.Incremental},
  1497  			{ID: "ad_database_operations_total_modify", Name: "modify", Algo: module.Incremental},
  1498  			{ID: "ad_database_operations_total_recycle", Name: "recycle", Algo: module.Incremental},
  1499  		},
  1500  	}
  1501  	adDirectoryOperationsChart = module.Chart{
  1502  		OverModule: "ad",
  1503  		ID:         "ad_directory_operations_read",
  1504  		Title:      "AD directory operations",
  1505  		Units:      "operations/s",
  1506  		Fam:        "database",
  1507  		Ctx:        "ad.directory_operations",
  1508  		Priority:   prioADDirectoryOperations,
  1509  		Dims: module.Dims{
  1510  			{ID: "ad_directory_operations_total_read", Name: "read", Algo: module.Incremental},
  1511  			{ID: "ad_directory_operations_total_write", Name: "write", Algo: module.Incremental},
  1512  			{ID: "ad_directory_operations_total_search", Name: "search", Algo: module.Incremental},
  1513  		},
  1514  	}
  1515  	adNameCacheLookupsChart = module.Chart{
  1516  		OverModule: "ad",
  1517  		ID:         "ad_name_cache_lookups",
  1518  		Title:      "Name cache lookups",
  1519  		Units:      "lookups/s",
  1520  		Fam:        "database",
  1521  		Ctx:        "ad.name_cache_lookups",
  1522  		Priority:   prioADNameCacheLookups,
  1523  		Dims: module.Dims{
  1524  			{ID: "ad_name_cache_lookups_total", Name: "lookups", Algo: module.Incremental},
  1525  		},
  1526  	}
  1527  	adNameCacheHitsChart = module.Chart{
  1528  		OverModule: "ad",
  1529  		ID:         "ad_name_cache_hits",
  1530  		Title:      "Name cache hits",
  1531  		Units:      "hits/s",
  1532  		Fam:        "database",
  1533  		Ctx:        "ad.name_cache_hits",
  1534  		Priority:   prioADCacheHits,
  1535  		Dims: module.Dims{
  1536  			{ID: "ad_name_cache_hits_total", Name: "hits", Algo: module.Incremental},
  1537  		},
  1538  	}
  1539  	adDRAReplicationIntersiteCompressedTrafficChart = module.Chart{
  1540  		OverModule: "ad",
  1541  		ID:         "ad_dra_replication_intersite_compressed_traffic",
  1542  		Title:      "DRA replication compressed traffic withing site",
  1543  		Units:      "bytes/s",
  1544  		Fam:        "replication",
  1545  		Ctx:        "ad.dra_replication_intersite_compressed_traffic",
  1546  		Priority:   prioADDRAReplicationIntersiteCompressedTraffic,
  1547  		Type:       module.Area,
  1548  		Dims: module.Dims{
  1549  			{ID: "ad_replication_data_intersite_bytes_total_inbound", Name: "inbound", Algo: module.Incremental},
  1550  			{ID: "ad_replication_data_intersite_bytes_total_outbound", Name: "outbound", Algo: module.Incremental, Mul: -1},
  1551  		},
  1552  	}
  1553  	adDRAReplicationIntrasiteCompressedTrafficChart = module.Chart{
  1554  		OverModule: "ad",
  1555  		ID:         "ad_dra_replication_intrasite_compressed_traffic",
  1556  		Title:      "DRA replication compressed traffic between sites",
  1557  		Units:      "bytes/s",
  1558  		Fam:        "replication",
  1559  		Ctx:        "ad.dra_replication_intrasite_compressed_traffic",
  1560  		Priority:   prioADDRAReplicationIntrasiteCompressedTraffic,
  1561  		Type:       module.Area,
  1562  		Dims: module.Dims{
  1563  			{ID: "ad_replication_data_intrasite_bytes_total_inbound", Name: "inbound", Algo: module.Incremental},
  1564  			{ID: "ad_replication_data_intrasite_bytes_total_outbound", Name: "outbound", Algo: module.Incremental, Mul: -1},
  1565  		},
  1566  	}
  1567  	adDRAReplicationSyncObjectRemainingChart = module.Chart{
  1568  		OverModule: "ad",
  1569  		ID:         "ad_dra_replication_sync_objects_remaining",
  1570  		Title:      "DRA replication full sync objects remaining",
  1571  		Units:      "objects",
  1572  		Fam:        "replication",
  1573  		Ctx:        "ad.dra_replication_sync_objects_remaining",
  1574  		Priority:   prioADDRAReplicationSyncObjectsRemaining,
  1575  		Dims: module.Dims{
  1576  			{ID: "ad_replication_inbound_sync_objects_remaining", Name: "inbound"},
  1577  		},
  1578  	}
  1579  	adDRAReplicationObjectsFilteredChart = module.Chart{
  1580  		OverModule: "ad",
  1581  		ID:         "ad_dra_replication_objects_filtered",
  1582  		Title:      "DRA replication objects filtered",
  1583  		Units:      "objects/s",
  1584  		Fam:        "replication",
  1585  		Ctx:        "ad.dra_replication_objects_filtered",
  1586  		Priority:   prioADDRAReplicationObjectsFiltered,
  1587  		Dims: module.Dims{
  1588  			{ID: "ad_replication_inbound_objects_filtered_total", Name: "inbound", Algo: module.Incremental},
  1589  		},
  1590  	}
  1591  	adDRAReplicationPropertiesUpdatedChart = module.Chart{
  1592  		OverModule: "ad",
  1593  		ID:         "ad_dra_replication_properties_updated",
  1594  		Title:      "DRA replication properties updated",
  1595  		Units:      "properties/s",
  1596  		Fam:        "replication",
  1597  		Ctx:        "ad.dra_replication_properties_updated",
  1598  		Priority:   prioADDRAReplicationPropertiesUpdated,
  1599  		Dims: module.Dims{
  1600  			{ID: "ad_replication_inbound_properties_updated_total", Name: "inbound", Algo: module.Incremental},
  1601  		},
  1602  	}
  1603  	adDRAReplicationPropertiesFilteredChart = module.Chart{
  1604  		OverModule: "ad",
  1605  		ID:         "ad_dra_replication_properties_filtered",
  1606  		Title:      "DRA replication properties filtered",
  1607  		Units:      "properties/s",
  1608  		Fam:        "replication",
  1609  		Ctx:        "ad.dra_replication_properties_filtered",
  1610  		Priority:   prioADDRAReplicationPropertiesFiltered,
  1611  		Dims: module.Dims{
  1612  			{ID: "ad_replication_inbound_properties_filtered_total", Name: "inbound", Algo: module.Incremental},
  1613  		},
  1614  	}
  1615  	adDRAReplicationPendingSyncsChart = module.Chart{
  1616  		OverModule: "ad",
  1617  		ID:         "ad_dra_replication_pending_syncs",
  1618  		Title:      "DRA replication pending syncs",
  1619  		Units:      "syncs",
  1620  		Fam:        "replication",
  1621  		Ctx:        "ad.dra_replication_pending_syncs",
  1622  		Priority:   prioADReplicationPendingSyncs,
  1623  		Dims: module.Dims{
  1624  			{ID: "ad_replication_pending_synchronizations", Name: "pending"},
  1625  		},
  1626  	}
  1627  	adDRAReplicationSyncRequestsChart = module.Chart{
  1628  		OverModule: "ad",
  1629  		ID:         "ad_dra_replication_sync_requests",
  1630  		Title:      "DRA replication sync requests",
  1631  		Units:      "requests/s",
  1632  		Fam:        "replication",
  1633  		Ctx:        "ad.dra_replication_sync_requests",
  1634  		Priority:   prioADDRASyncRequests,
  1635  		Dims: module.Dims{
  1636  			{ID: "ad_replication_sync_requests_total", Name: "request", Algo: module.Incremental},
  1637  		},
  1638  	}
  1639  	adDirectoryServiceThreadsChart = module.Chart{
  1640  		OverModule: "ad",
  1641  		ID:         "ad_ds_threads",
  1642  		Title:      "Directory Service threads",
  1643  		Units:      "threads",
  1644  		Fam:        "replication",
  1645  		Ctx:        "ad.ds_threads",
  1646  		Priority:   prioADDirectoryServiceThreadsInUse,
  1647  		Dims: module.Dims{
  1648  			{ID: "ad_directory_service_threads", Name: "in_use"},
  1649  		},
  1650  	}
  1651  	adLDAPLastBindTimeChart = module.Chart{
  1652  		OverModule: "ad",
  1653  		ID:         "ad_ldap_last_bind_time",
  1654  		Title:      "LDAP last successful bind time",
  1655  		Units:      "seconds",
  1656  		Fam:        "bind",
  1657  		Ctx:        "ad.ldap_last_bind_time",
  1658  		Priority:   prioADLDAPBindTime,
  1659  		Dims: module.Dims{
  1660  			{ID: "ad_ldap_last_bind_time_seconds", Name: "last_bind"},
  1661  		},
  1662  	}
  1663  	adBindsTotalChart = module.Chart{
  1664  		OverModule: "ad",
  1665  		ID:         "ad_binds",
  1666  		Title:      "Successful binds",
  1667  		Units:      "bind/s",
  1668  		Fam:        "bind",
  1669  		Ctx:        "ad.binds",
  1670  		Priority:   prioADBindsTotal,
  1671  		Dims: module.Dims{
  1672  			{ID: "ad_binds_total", Name: "binds", Algo: module.Incremental},
  1673  		},
  1674  	}
  1675  	adLDAPSearchesChart = module.Chart{
  1676  		OverModule: "ad",
  1677  		ID:         "ad_ldap_searches",
  1678  		Title:      "LDAP client search operations",
  1679  		Units:      "searches/s",
  1680  		Fam:        "ldap",
  1681  		Ctx:        "ad.ldap_searches",
  1682  		Priority:   prioADLDAPSearchesTotal,
  1683  		Dims: module.Dims{
  1684  			{ID: "ad_ldap_searches_total", Name: "searches", Algo: module.Incremental},
  1685  		},
  1686  	}
  1687  	// https://techcommunity.microsoft.com/t5/ask-the-directory-services-team/understanding-atq-performance-counters-yet-another-twist-in-the/ba-p/400293
  1688  	adATQAverageRequestLatencyChart = module.Chart{
  1689  		OverModule: "ad",
  1690  		ID:         "ad_atq_average_request_latency",
  1691  		Title:      "Average request processing time",
  1692  		Units:      "seconds",
  1693  		Fam:        "queue",
  1694  		Ctx:        "ad.atq_average_request_latency",
  1695  		Priority:   prioADATQAverageRequestLatency,
  1696  		Dims: module.Dims{
  1697  			{ID: "ad_atq_average_request_latency", Name: "time", Div: precision},
  1698  		},
  1699  	}
  1700  	adATQOutstandingRequestsChart = module.Chart{
  1701  		OverModule: "ad",
  1702  		ID:         "ad_atq_outstanding_requests",
  1703  		Title:      "Outstanding requests",
  1704  		Units:      "requests",
  1705  		Fam:        "queue",
  1706  		Ctx:        "ad.atq_outstanding_requests",
  1707  		Priority:   prioADATQOutstandingRequests,
  1708  		Dims: module.Dims{
  1709  			{ID: "ad_atq_outstanding_requests", Name: "outstanding"},
  1710  		},
  1711  	}
  1712  )
  1713  
  1714  // AD CS
  1715  var (
  1716  	adcsCertTemplateChartsTmpl = module.Charts{
  1717  		adcsCertTemplateRequestsChartTmpl.Copy(),
  1718  		adcsCertTemplateFailedRequestsChartTmpl.Copy(),
  1719  		adcsCertTemplateIssuedRequestsChartTmpl.Copy(),
  1720  		adcsCertTemplatePendingRequestsChartTmpl.Copy(),
  1721  		adcsCertTemplateRequestProcessingTimeChartTmpl.Copy(),
  1722  
  1723  		adcsCertTemplateRetrievalsChartTmpl.Copy(),
  1724  		adcsCertificateRetrievalsTimeChartTmpl.Copy(),
  1725  		adcsCertTemplateRequestCryptoSigningTimeChartTmpl.Copy(),
  1726  		adcsCertTemplateRequestPolicyModuleProcessingTimeChartTmpl.Copy(),
  1727  		adcsCertTemplateChallengeResponseChartTmpl.Copy(),
  1728  		adcsCertTemplateChallengeResponseProcessingTimeChartTmpl.Copy(),
  1729  		adcsCertTemplateSignedCertificateTimestampListsChartTmpl.Copy(),
  1730  		adcsCertTemplateSignedCertificateTimestampListProcessingTimeChartTmpl.Copy(),
  1731  	}
  1732  	adcsCertTemplateRequestsChartTmpl = module.Chart{
  1733  		OverModule: "adcs",
  1734  		ID:         "adcs_cert_template%s_requests",
  1735  		Title:      "Certificate requests processed",
  1736  		Units:      "requests/s",
  1737  		Fam:        "requests",
  1738  		Ctx:        "adcs.cert_template_requests",
  1739  		Priority:   prioADCSCertTemplateRequests,
  1740  		Dims: module.Dims{
  1741  			{ID: "adcs_cert_template_%s_requests_total", Name: "requests", Algo: module.Incremental},
  1742  		},
  1743  	}
  1744  	adcsCertTemplateFailedRequestsChartTmpl = module.Chart{
  1745  		OverModule: "adcs",
  1746  		ID:         "adcs_cert_template_%s_failed_requests",
  1747  		Title:      "Certificate failed requests processed",
  1748  		Units:      "requests/s",
  1749  		Fam:        "requests",
  1750  		Ctx:        "adcs.cert_template_failed_requests",
  1751  		Priority:   prioADCSCertTemplateFailedRequests,
  1752  		Dims: module.Dims{
  1753  			{ID: "adcs_cert_template_%s_failed_requests_total", Name: "failed", Algo: module.Incremental},
  1754  		},
  1755  	}
  1756  	adcsCertTemplateIssuedRequestsChartTmpl = module.Chart{
  1757  		OverModule: "adcs",
  1758  		ID:         "adcs_cert_template_%s_issued_requests",
  1759  		Title:      "Certificate issued requests processed",
  1760  		Units:      "requests/s",
  1761  		Fam:        "requests",
  1762  		Ctx:        "adcs.cert_template_issued_requests",
  1763  		Priority:   prioADCSCertTemplateIssuesRequests,
  1764  		Dims: module.Dims{
  1765  			{ID: "adcs_cert_template_%s_issued_requests_total", Name: "issued", Algo: module.Incremental},
  1766  		},
  1767  	}
  1768  	adcsCertTemplatePendingRequestsChartTmpl = module.Chart{
  1769  		OverModule: "adcs",
  1770  		ID:         "adcs_cert_template_%s_pending_requests",
  1771  		Title:      "Certificate pending requests processed",
  1772  		Units:      "requests/s",
  1773  		Fam:        "requests",
  1774  		Ctx:        "adcs.cert_template_pending_requests",
  1775  		Priority:   prioADCSCertTemplatePendingRequests,
  1776  		Dims: module.Dims{
  1777  			{ID: "adcs_cert_template_%s_pending_requests_total", Name: "pending", Algo: module.Incremental},
  1778  		},
  1779  	}
  1780  	adcsCertTemplateRequestProcessingTimeChartTmpl = module.Chart{
  1781  		OverModule: "adcs",
  1782  		ID:         "adcs_cert_template_%s_request_processing_time",
  1783  		Title:      "Certificate last request processing time",
  1784  		Units:      "seconds",
  1785  		Fam:        "requests",
  1786  		Ctx:        "adcs.cert_template_request_processing_time",
  1787  		Priority:   prioADCSCertTemplateRequestProcessingTime,
  1788  		Dims: module.Dims{
  1789  			{ID: "adcs_cert_template_%s_request_processing_time_seconds", Name: "processing_time", Div: precision},
  1790  		},
  1791  	}
  1792  	adcsCertTemplateChallengeResponseChartTmpl = module.Chart{
  1793  		OverModule: "adcs",
  1794  		ID:         "adcs_cert_template_%s_challenge_responses",
  1795  		Title:      "Certificate challenge responses",
  1796  		Units:      "responses/s",
  1797  		Fam:        "responses",
  1798  		Ctx:        "adcs.cert_template_challenge_responses",
  1799  		Priority:   prioADCSCertTemplateChallengeResponses,
  1800  		Dims: module.Dims{
  1801  			{ID: "adcs_cert_template_%s_challenge_responses_total", Name: "challenge", Algo: module.Incremental},
  1802  		},
  1803  	}
  1804  	adcsCertTemplateRetrievalsChartTmpl = module.Chart{
  1805  		OverModule: "adcs",
  1806  		ID:         "adcs_cert_template_%s_retrievals",
  1807  		Title:      "Total of certificate retrievals",
  1808  		Units:      "retrievals/s",
  1809  		Fam:        "retrievals",
  1810  		Ctx:        "adcs.cert_template_retrievals",
  1811  		Priority:   prioADCSCertTemplateRetrievals,
  1812  		Dims: module.Dims{
  1813  			{ID: "adcs_cert_template_%s_retrievals_total", Name: "retrievals", Algo: module.Incremental},
  1814  		},
  1815  	}
  1816  	adcsCertificateRetrievalsTimeChartTmpl = module.Chart{
  1817  		OverModule: "adcs",
  1818  		ID:         "adcs_cert_template_%s_retrievals_processing_time",
  1819  		Title:      "Certificate last retrieval processing time",
  1820  		Units:      "seconds",
  1821  		Fam:        "retrievals",
  1822  		Ctx:        "adcs.cert_template_retrieval_processing_time",
  1823  		Priority:   prioADCSCertTemplateRetrievalProcessingTime,
  1824  		Dims: module.Dims{
  1825  			{ID: "adcs_cert_template_%s_retrievals_processing_time_seconds", Name: "processing_time", Div: precision},
  1826  		},
  1827  	}
  1828  	adcsCertTemplateRequestCryptoSigningTimeChartTmpl = module.Chart{
  1829  		OverModule: "adcs",
  1830  		ID:         "adcs_cert_template_%s_request_cryptographic_signing_time",
  1831  		Title:      "Certificate last signing operation request time",
  1832  		Units:      "seconds",
  1833  		Fam:        "timings",
  1834  		Ctx:        "adcs.cert_template_request_cryptographic_signing_time",
  1835  		Priority:   prioADCSCertTemplateRequestCryptoSigningTime,
  1836  		Dims: module.Dims{
  1837  			{ID: "adcs_cert_template_%s_request_cryptographic_signing_time_seconds", Name: "singing_time", Div: precision},
  1838  		},
  1839  	}
  1840  	adcsCertTemplateRequestPolicyModuleProcessingTimeChartTmpl = module.Chart{
  1841  		OverModule: "adcs",
  1842  		ID:         "adcs_cert_template_%s_request_policy_module_processing_time",
  1843  		Title:      "Certificate last policy module processing request time",
  1844  		Units:      "seconds",
  1845  		Fam:        "timings",
  1846  		Ctx:        "adcs.cert_template_request_policy_module_processing",
  1847  		Priority:   prioADCSCertTemplateRequestPolicyModuleProcessingTime,
  1848  		Dims: module.Dims{
  1849  			{ID: "adcs_cert_template_%s_request_policy_module_processing_time_seconds", Name: "processing_time", Div: precision},
  1850  		},
  1851  	}
  1852  	adcsCertTemplateChallengeResponseProcessingTimeChartTmpl = module.Chart{
  1853  		OverModule: "adcs",
  1854  		ID:         "adcs_cert_template_%s_challenge_response_processing_time",
  1855  		Title:      "Certificate last challenge response time",
  1856  		Units:      "seconds",
  1857  		Fam:        "timings",
  1858  		Ctx:        "adcs.cert_template_challenge_response_processing_time",
  1859  		Priority:   prioADCSCertTemplateChallengeResponseProcessingTime,
  1860  		Dims: module.Dims{
  1861  			{ID: "adcs_cert_template_%s_challenge_response_processing_time_seconds", Name: "processing_time", Div: precision},
  1862  		},
  1863  	}
  1864  	adcsCertTemplateSignedCertificateTimestampListsChartTmpl = module.Chart{
  1865  		OverModule: "adcs",
  1866  		ID:         "adcs_cert_template_%s_signed_certificate_timestamp_lists",
  1867  		Title:      "Certificate Signed Certificate Timestamp Lists processed",
  1868  		Units:      "lists/s",
  1869  		Fam:        "timings",
  1870  		Ctx:        "adcs.cert_template_signed_certificate_timestamp_lists",
  1871  		Priority:   prioADCSCertTemplateSignedCertificateTimestampLists,
  1872  		Dims: module.Dims{
  1873  			{ID: "adcs_cert_template_%s_signed_certificate_timestamp_lists_total", Name: "processed", Algo: module.Incremental},
  1874  		},
  1875  	}
  1876  	adcsCertTemplateSignedCertificateTimestampListProcessingTimeChartTmpl = module.Chart{
  1877  		OverModule: "adcs",
  1878  		ID:         "adcs_cert_template_%s_signed_certificate_timestamp_list_processing_time",
  1879  		Title:      "Certificate last Signed Certificate Timestamp List process time",
  1880  		Units:      "seconds",
  1881  		Fam:        "timings",
  1882  		Ctx:        "adcs.cert_template_signed_certificate_timestamp_list_processing_time",
  1883  		Priority:   prioADCSCertTemplateSignedCertificateTimestampListProcessingTime,
  1884  		Dims: module.Dims{
  1885  			{ID: "adcs_cert_template_%s_signed_certificate_timestamp_list_processing_time_seconds", Name: "processing_time", Div: precision},
  1886  		},
  1887  	}
  1888  )
  1889  
  1890  // AD FS
  1891  var (
  1892  	adfsCharts = module.Charts{
  1893  		adfsADLoginConnectionFailuresChart.Copy(),
  1894  		adfsCertificateAuthenticationsChart.Copy(),
  1895  		adfsDBArtifactFailuresChart.Copy(),
  1896  		adfsDBArtifactQueryTimeSecondsChart.Copy(),
  1897  		adfsDBConfigFailuresChart.Copy(),
  1898  		adfsDBConfigQueryTimeSecondsChart.Copy(),
  1899  		adfsDeviceAuthenticationsChart.Copy(),
  1900  		adfsExternalAuthenticationsChart.Copy(),
  1901  		adfsFederatedAuthenticationsChart.Copy(),
  1902  		adfsFederationMetadataRequestsChart.Copy(),
  1903  
  1904  		adfsOAuthAuthorizationRequestsChart.Copy(),
  1905  		adfsOAuthClientAuthenticationsChart.Copy(),
  1906  		adfsOAuthClientCredentialRequestsChart.Copy(),
  1907  		adfsOAuthClientPrivKeyJwtAuthenticationsChart.Copy(),
  1908  		adfsOAuthClientSecretBasicAuthenticationsChart.Copy(),
  1909  		adfsOAuthClientSecretPostAuthenticationsChart.Copy(),
  1910  		adfsOAuthClientWindowsAuthenticationsChart.Copy(),
  1911  		adfsOAuthLogonCertificateRequestsChart.Copy(),
  1912  		adfsOAuthPasswordGrantRequestsChart.Copy(),
  1913  		adfsOAuthTokenRequestsChart.Copy(),
  1914  
  1915  		adfsPassiveRequestsChart.Copy(),
  1916  		adfsPassportAuthenticationsChart.Copy(),
  1917  		adfsPasswordChangeChart.Copy(),
  1918  		adfsSAMLPTokenRequestsChart.Copy(),
  1919  		adfsSSOAuthenticationsChart.Copy(),
  1920  		adfsTokenRequestsChart.Copy(),
  1921  		adfsUserPasswordAuthenticationsChart.Copy(),
  1922  		adfsWindowsIntegratedAuthenticationsChart.Copy(),
  1923  		adfsWSFedTokenRequestsSuccessChart.Copy(),
  1924  		adfsWSTrustTokenRequestsSuccessChart.Copy(),
  1925  	}
  1926  
  1927  	adfsADLoginConnectionFailuresChart = module.Chart{
  1928  		OverModule: "adfs",
  1929  		ID:         "adfs_ad_login_connection_failures",
  1930  		Title:      "Connection failures",
  1931  		Units:      "failures/s",
  1932  		Fam:        "ad",
  1933  		Ctx:        "adfs.ad_login_connection_failures",
  1934  		Priority:   prioADFSADLoginConnectionFailures,
  1935  		Dims: module.Dims{
  1936  			{ID: "adfs_ad_login_connection_failures_total", Name: "connection", Algo: module.Incremental},
  1937  		},
  1938  	}
  1939  	adfsCertificateAuthenticationsChart = module.Chart{
  1940  		OverModule: "adfs",
  1941  		ID:         "adfs_certificate_authentications",
  1942  		Title:      "User Certificate authentications",
  1943  		Units:      "authentications/s",
  1944  		Fam:        "auth",
  1945  		Ctx:        "adfs.certificate_authentications",
  1946  		Priority:   prioADFSCertificateAuthentications,
  1947  		Dims: module.Dims{
  1948  			{ID: "adfs_certificate_authentications_total", Name: "authentications", Algo: module.Incremental},
  1949  		},
  1950  	}
  1951  
  1952  	adfsDBArtifactFailuresChart = module.Chart{
  1953  		OverModule: "adfs",
  1954  		ID:         "adfs_db_artifact_failures",
  1955  		Title:      "Connection failures to the artifact database",
  1956  		Units:      "failures/s",
  1957  		Fam:        "db artifact",
  1958  		Ctx:        "adfs.db_artifact_failures",
  1959  		Priority:   prioADFSDBArtifactFailures,
  1960  		Dims: module.Dims{
  1961  			{ID: "adfs_db_artifact_failure_total", Name: "connection", Algo: module.Incremental},
  1962  		},
  1963  	}
  1964  	adfsDBArtifactQueryTimeSecondsChart = module.Chart{
  1965  		OverModule: "adfs",
  1966  		ID:         "adfs_db_artifact_query_time_seconds",
  1967  		Title:      "Time taken for an artifact database query",
  1968  		Units:      "seconds/s",
  1969  		Fam:        "db artifact",
  1970  		Ctx:        "adfs.db_artifact_query_time_seconds",
  1971  		Priority:   prioADFSDBArtifactQueryTimeSeconds,
  1972  		Dims: module.Dims{
  1973  			{ID: "adfs_db_artifact_query_time_seconds_total", Name: "query_time", Algo: module.Incremental, Div: precision},
  1974  		},
  1975  	}
  1976  	adfsDBConfigFailuresChart = module.Chart{
  1977  		OverModule: "adfs",
  1978  		ID:         "adfs_db_config_failures",
  1979  		Title:      "Connection failures to the configuration database",
  1980  		Units:      "failures/s",
  1981  		Fam:        "db config",
  1982  		Ctx:        "adfs.db_config_failures",
  1983  		Priority:   prioADFSDBConfigFailures,
  1984  		Dims: module.Dims{
  1985  			{ID: "adfs_db_config_failure_total", Name: "connection", Algo: module.Incremental},
  1986  		},
  1987  	}
  1988  	adfsDBConfigQueryTimeSecondsChart = module.Chart{
  1989  		OverModule: "adfs",
  1990  		ID:         "adfs_db_config_query_time_seconds",
  1991  		Title:      "Time taken for a configuration database query",
  1992  		Units:      "seconds/s",
  1993  		Fam:        "db config",
  1994  		Ctx:        "adfs.db_config_query_time_seconds",
  1995  		Priority:   prioADFSDBConfigQueryTimeSeconds,
  1996  		Dims: module.Dims{
  1997  			{ID: "adfs_db_config_query_time_seconds_total", Name: "query_time", Algo: module.Incremental, Div: precision},
  1998  		},
  1999  	}
  2000  	adfsDeviceAuthenticationsChart = module.Chart{
  2001  		OverModule: "adfs",
  2002  		ID:         "adfs_device_authentications",
  2003  		Title:      "Device authentications",
  2004  		Units:      "authentications/s",
  2005  		Fam:        "auth",
  2006  		Ctx:        "adfs.device_authentications",
  2007  		Priority:   prioADFSDeviceAuthentications,
  2008  		Dims: module.Dims{
  2009  			{ID: "adfs_device_authentications_total", Name: "authentications", Algo: module.Incremental},
  2010  		},
  2011  	}
  2012  	adfsExternalAuthenticationsChart = module.Chart{
  2013  		OverModule: "adfs",
  2014  		ID:         "adfs_external_authentications",
  2015  		Title:      "Authentications from external MFA providers",
  2016  		Units:      "authentications/s",
  2017  		Fam:        "auth",
  2018  		Ctx:        "adfs.external_authentications",
  2019  		Priority:   prioADFSExternalAuthentications,
  2020  		Dims: module.Dims{
  2021  			{ID: "adfs_external_authentications_success_total", Name: "success", Algo: module.Incremental},
  2022  			{ID: "adfs_external_authentications_failure_total", Name: "failure", Algo: module.Incremental},
  2023  		},
  2024  	}
  2025  	adfsFederatedAuthenticationsChart = module.Chart{
  2026  		OverModule: "adfs",
  2027  		ID:         "adfs_federated_authentications",
  2028  		Title:      "Authentications from Federated Sources",
  2029  		Units:      "authentications/s",
  2030  		Fam:        "auth",
  2031  		Ctx:        "adfs.federated_authentications",
  2032  		Priority:   prioADFSFederatedAuthentications,
  2033  		Dims: module.Dims{
  2034  			{ID: "adfs_federated_authentications_total", Name: "authentications", Algo: module.Incremental},
  2035  		},
  2036  	}
  2037  	adfsFederationMetadataRequestsChart = module.Chart{
  2038  		OverModule: "adfs",
  2039  		ID:         "adfs_federation_metadata_requests",
  2040  		Title:      "Federation Metadata requests",
  2041  		Units:      "requests/s",
  2042  		Fam:        "requests",
  2043  		Ctx:        "adfs.federation_metadata_requests",
  2044  		Priority:   prioADFSFederationMetadataRequests,
  2045  		Dims: module.Dims{
  2046  			{ID: "adfs_federation_metadata_requests_total", Name: "requests", Algo: module.Incremental},
  2047  		},
  2048  	}
  2049  
  2050  	adfsOAuthAuthorizationRequestsChart = module.Chart{
  2051  		OverModule: "adfs",
  2052  		ID:         "adfs_oauth_authorization_requests",
  2053  		Title:      "Incoming requests to the OAuth Authorization endpoint",
  2054  		Units:      "requests/s",
  2055  		Fam:        "oauth",
  2056  		Ctx:        "adfs.oauth_authorization_requests",
  2057  		Priority:   prioADFSOauthAuthorizationRequests,
  2058  		Dims: module.Dims{
  2059  			{ID: "adfs_oauth_authorization_requests_total", Name: "requests", Algo: module.Incremental},
  2060  		},
  2061  	}
  2062  	adfsOAuthClientAuthenticationsChart = module.Chart{
  2063  		OverModule: "adfs",
  2064  		ID:         "adfs_oauth_client_authentications",
  2065  		Title:      "OAuth client authentications",
  2066  		Units:      "authentications/s",
  2067  		Fam:        "oauth",
  2068  		Ctx:        "adfs.oauth_client_authentications",
  2069  		Priority:   prioADFSOauthClientAuthentications,
  2070  		Dims: module.Dims{
  2071  			{ID: "adfs_oauth_client_authentication_success_total", Name: "success", Algo: module.Incremental},
  2072  			{ID: "adfs_oauth_client_authentication_failure_total", Name: "failure", Algo: module.Incremental},
  2073  		},
  2074  	}
  2075  	adfsOAuthClientCredentialRequestsChart = module.Chart{
  2076  		OverModule: "adfs",
  2077  		ID:         "adfs_oauth_client_credentials_requests",
  2078  		Title:      "OAuth client credentials requests",
  2079  		Units:      "requests/s",
  2080  		Fam:        "oauth",
  2081  		Ctx:        "adfs.oauth_client_credentials_requests",
  2082  		Priority:   prioADFSOauthClientCredentials,
  2083  		Dims: module.Dims{
  2084  			{ID: "adfs_oauth_client_credentials_success_total", Name: "success", Algo: module.Incremental},
  2085  			{ID: "adfs_oauth_client_credentials_failure_total", Name: "failure", Algo: module.Incremental},
  2086  		},
  2087  	}
  2088  	adfsOAuthClientPrivKeyJwtAuthenticationsChart = module.Chart{
  2089  		OverModule: "adfs",
  2090  		ID:         "adfs_oauth_client_privkey_jwt_authentications",
  2091  		Title:      "OAuth client private key JWT authentications",
  2092  		Units:      "authentications/s",
  2093  		Fam:        "oauth",
  2094  		Ctx:        "adfs.oauth_client_privkey_jwt_authentications",
  2095  		Priority:   prioADFSOauthClientPrivkeyJwtAuthentication,
  2096  		Dims: module.Dims{
  2097  			{ID: "adfs_oauth_client_privkey_jwt_authentications_success_total", Name: "success", Algo: module.Incremental},
  2098  			{ID: "adfs_oauth_client_privkey_jtw_authentication_failure_total", Name: "failure", Algo: module.Incremental},
  2099  		},
  2100  	}
  2101  	adfsOAuthClientSecretBasicAuthenticationsChart = module.Chart{
  2102  		OverModule: "adfs",
  2103  		ID:         "adfs_oauth_client_secret_basic_authentications",
  2104  		Title:      "OAuth client secret basic authentications",
  2105  		Units:      "authentications/s",
  2106  		Fam:        "oauth",
  2107  		Ctx:        "adfs.oauth_client_secret_basic_authentications",
  2108  		Priority:   prioADFSOauthClientSecretBasicAuthentications,
  2109  		Dims: module.Dims{
  2110  			{ID: "adfs_oauth_client_secret_basic_authentications_success_total", Name: "success", Algo: module.Incremental},
  2111  			{ID: "adfs_oauth_client_secret_basic_authentications_failure_total", Name: "failure", Algo: module.Incremental},
  2112  		},
  2113  	}
  2114  	adfsOAuthClientSecretPostAuthenticationsChart = module.Chart{
  2115  		OverModule: "adfs",
  2116  		ID:         "adfs_oauth_client_secret_post_authentications",
  2117  		Title:      "OAuth client secret post authentications",
  2118  		Units:      "authentications/s",
  2119  		Fam:        "oauth",
  2120  		Ctx:        "adfs.oauth_client_secret_post_authentications",
  2121  		Priority:   prioADFSOauthClientSecretPostAuthentications,
  2122  		Dims: module.Dims{
  2123  			{ID: "adfs_oauth_client_secret_post_authentications_success_total", Name: "success", Algo: module.Incremental},
  2124  			{ID: "adfs_oauth_client_secret_post_authentications_failure_total", Name: "failure", Algo: module.Incremental},
  2125  		},
  2126  	}
  2127  	adfsOAuthClientWindowsAuthenticationsChart = module.Chart{
  2128  		OverModule: "adfs",
  2129  		ID:         "adfs_oauth_client_windows_authentications",
  2130  		Title:      "OAuth client windows integrated authentications",
  2131  		Units:      "authentications/s",
  2132  		Fam:        "oauth",
  2133  		Ctx:        "adfs.oauth_client_windows_authentications",
  2134  		Priority:   prioADFSOauthClientWindowsAuthentications,
  2135  		Dims: module.Dims{
  2136  			{ID: "adfs_oauth_client_windows_authentications_success_total", Name: "success", Algo: module.Incremental},
  2137  			{ID: "adfs_oauth_client_windows_authentications_failure_total", Name: "failure", Algo: module.Incremental},
  2138  		},
  2139  	}
  2140  	adfsOAuthLogonCertificateRequestsChart = module.Chart{
  2141  		OverModule: "adfs",
  2142  		ID:         "adfs_oauth_logon_certificate_requests",
  2143  		Title:      "OAuth logon certificate requests",
  2144  		Units:      "requests/s",
  2145  		Fam:        "oauth",
  2146  		Ctx:        "adfs.oauth_logon_certificate_requests",
  2147  		Priority:   prioADFSOauthLogonCertificateRequests,
  2148  		Dims: module.Dims{
  2149  			{ID: "adfs_oauth_logon_certificate_token_requests_success_total", Name: "success", Algo: module.Incremental},
  2150  			{ID: "adfs_oauth_logon_certificate_requests_failure_total", Name: "failure", Algo: module.Incremental},
  2151  		},
  2152  	}
  2153  	adfsOAuthPasswordGrantRequestsChart = module.Chart{
  2154  		OverModule: "adfs",
  2155  		ID:         "adfs_oauth_password_grant_requests",
  2156  		Title:      "OAuth password grant requests",
  2157  		Units:      "requests/s",
  2158  		Fam:        "oauth",
  2159  		Ctx:        "adfs.oauth_password_grant_requests",
  2160  		Priority:   prioADFSOauthPasswordGrantRequests,
  2161  		Dims: module.Dims{
  2162  			{ID: "adfs_oauth_password_grant_requests_success_total", Name: "success", Algo: module.Incremental},
  2163  			{ID: "adfs_oauth_password_grant_requests_failure_total", Name: "failure", Algo: module.Incremental},
  2164  		},
  2165  	}
  2166  	adfsOAuthTokenRequestsChart = module.Chart{
  2167  		OverModule: "adfs",
  2168  		ID:         "adfs_oauth_token_requests_success",
  2169  		Title:      "Successful RP token requests over OAuth protocol",
  2170  		Units:      "requests/s",
  2171  		Fam:        "oauth",
  2172  		Ctx:        "adfs.oauth_token_requests_success",
  2173  		Priority:   prioADFSOauthTokenRequestsSuccess,
  2174  		Dims: module.Dims{
  2175  			{ID: "adfs_oauth_token_requests_success_total", Name: "success", Algo: module.Incremental},
  2176  		},
  2177  	}
  2178  
  2179  	adfsPassiveRequestsChart = module.Chart{
  2180  		OverModule: "adfs",
  2181  		ID:         "adfs_passive_requests",
  2182  		Title:      "Passive requests",
  2183  		Units:      "requests/s",
  2184  		Fam:        "requests",
  2185  		Ctx:        "adfs.passive_requests",
  2186  		Priority:   prioADFSPassiveRequests,
  2187  		Dims: module.Dims{
  2188  			{ID: "adfs_passive_requests_total", Name: "passive", Algo: module.Incremental},
  2189  		},
  2190  	}
  2191  	adfsPassportAuthenticationsChart = module.Chart{
  2192  		OverModule: "adfs",
  2193  		ID:         "adfs_passport_authentications",
  2194  		Title:      "Microsoft Passport SSO authentications",
  2195  		Units:      "authentications/s",
  2196  		Fam:        "auth",
  2197  		Ctx:        "adfs.passport_authentications",
  2198  		Priority:   prioADFSPassportAuthentications,
  2199  		Dims: module.Dims{
  2200  			{ID: "adfs_passport_authentications_total", Name: "passport", Algo: module.Incremental},
  2201  		},
  2202  	}
  2203  	adfsPasswordChangeChart = module.Chart{
  2204  		OverModule: "adfs",
  2205  		ID:         "adfs_password_change_requests",
  2206  		Title:      "Password change requests",
  2207  		Units:      "requests/s",
  2208  		Fam:        "requests",
  2209  		Ctx:        "adfs.password_change_requests",
  2210  		Priority:   prioADFSPasswordChangeRequests,
  2211  		Dims: module.Dims{
  2212  			{ID: "adfs_password_change_succeeded_total", Name: "success", Algo: module.Incremental},
  2213  			{ID: "adfs_password_change_failed_total", Name: "failed", Algo: module.Incremental},
  2214  		},
  2215  	}
  2216  	adfsSAMLPTokenRequestsChart = module.Chart{
  2217  		OverModule: "adfs",
  2218  		ID:         "adfs_samlp_token_requests_success",
  2219  		Title:      "Successful RP token requests over SAML-P protocol",
  2220  		Units:      "requests/s",
  2221  		Fam:        "requests",
  2222  		Ctx:        "adfs.samlp_token_requests_success",
  2223  		Priority:   prioADFSSAMLPTokenRequests,
  2224  		Dims: module.Dims{
  2225  			{ID: "adfs_samlp_token_requests_success_total", Name: "success", Algo: module.Incremental},
  2226  		},
  2227  	}
  2228  	adfsWSTrustTokenRequestsSuccessChart = module.Chart{
  2229  		OverModule: "adfs",
  2230  		ID:         "adfs_wstrust_token_requests_success",
  2231  		Title:      "Successful RP token requests over WS-Trust protocol",
  2232  		Units:      "requests/s",
  2233  		Fam:        "requests",
  2234  		Ctx:        "adfs.wstrust_token_requests_success",
  2235  		Priority:   prioADFSWSTrustTokenRequestsSuccess,
  2236  		Dims: module.Dims{
  2237  			{ID: "adfs_wstrust_token_requests_success_total", Name: "success", Algo: module.Incremental},
  2238  		},
  2239  	}
  2240  	adfsSSOAuthenticationsChart = module.Chart{
  2241  		OverModule: "adfs",
  2242  		ID:         "adfs_sso_authentications",
  2243  		Title:      "SSO authentications",
  2244  		Units:      "authentications/s",
  2245  		Fam:        "auth",
  2246  		Ctx:        "adfs.sso_authentications",
  2247  		Priority:   prioADFSSSOAuthentications,
  2248  		Dims: module.Dims{
  2249  			{ID: "adfs_sso_authentications_success_total", Name: "success", Algo: module.Incremental},
  2250  			{ID: "adfs_sso_authentications_failure_total", Name: "failure", Algo: module.Incremental},
  2251  		},
  2252  	}
  2253  	adfsTokenRequestsChart = module.Chart{
  2254  		OverModule: "adfs",
  2255  		ID:         "adfs_token_requests",
  2256  		Title:      "Token access requests",
  2257  		Units:      "requests/s",
  2258  		Fam:        "requests",
  2259  		Ctx:        "adfs.token_requests",
  2260  		Priority:   prioADFSTokenRequests,
  2261  		Dims: module.Dims{
  2262  			{ID: "adfs_token_requests_total", Name: "requests", Algo: module.Incremental},
  2263  		},
  2264  	}
  2265  	adfsUserPasswordAuthenticationsChart = module.Chart{
  2266  		OverModule: "adfs",
  2267  		ID:         "adfs_userpassword_authentications",
  2268  		Title:      "AD U/P authentications",
  2269  		Units:      "authentications/s",
  2270  		Fam:        "auth",
  2271  		Ctx:        "adfs.userpassword_authentications",
  2272  		Priority:   prioADFSUserPasswordAuthentications,
  2273  		Dims: module.Dims{
  2274  			{ID: "adfs_sso_authentications_success_total", Name: "success", Algo: module.Incremental},
  2275  			{ID: "adfs_sso_authentications_failure_total", Name: "failure", Algo: module.Incremental},
  2276  		},
  2277  	}
  2278  	adfsWindowsIntegratedAuthenticationsChart = module.Chart{
  2279  		OverModule: "adfs",
  2280  		ID:         "adfs_windows_integrated_authentications",
  2281  		Title:      "Windows integrated authentications using Kerberos or NTLM",
  2282  		Units:      "authentications/s",
  2283  		Fam:        "auth",
  2284  		Ctx:        "adfs.windows_integrated_authentications",
  2285  		Priority:   prioADFSWindowsIntegratedAuthentications,
  2286  		Dims: module.Dims{
  2287  			{ID: "adfs_windows_integrated_authentications_total", Name: "authentications", Algo: module.Incremental},
  2288  		},
  2289  	}
  2290  	adfsWSFedTokenRequestsSuccessChart = module.Chart{
  2291  		OverModule: "adfs",
  2292  		ID:         "adfs_wsfed_token_requests_success",
  2293  		Title:      "Successful RP token requests over WS-Fed protocol",
  2294  		Units:      "requests/s",
  2295  		Fam:        "requests",
  2296  		Ctx:        "adfs.wsfed_token_requests_success",
  2297  		Priority:   prioADFSWSFedTokenRequestsSuccess,
  2298  		Dims: module.Dims{
  2299  			{ID: "adfs_wsfed_token_requests_success_total", Name: "success", Algo: module.Incremental},
  2300  		},
  2301  	}
  2302  )
  2303  
  2304  // Exchange
  2305  var (
  2306  	exchangeCharts = module.Charts{
  2307  		exchangeActiveSyncPingCMDsPendingChart.Copy(),
  2308  		exchangeActiveSyncRequestsChart.Copy(),
  2309  		exchangeActiveSyncCMDsChart.Copy(),
  2310  		exchangeAutoDiscoverRequestsChart.Copy(),
  2311  		exchangeAvailableServiceRequestsChart.Copy(),
  2312  		exchangeOWACurrentUniqueUsersChart.Copy(),
  2313  		exchangeOWARequestsChart.Copy(),
  2314  		exchangeRPCActiveUsersCountChart.Copy(),
  2315  		exchangeRPCAvgLatencyChart.Copy(),
  2316  		exchangeRPCConnectionChart.Copy(),
  2317  		exchangeRPCOperationsChart.Copy(),
  2318  		exchangeRPCRequestsChart.Copy(),
  2319  		exchangeRPCUserChart.Copy(),
  2320  		exchangeTransportQueuesActiveMailBoxDelivery.Copy(),
  2321  		exchangeTransportQueuesExternalActiveRemoteDelivery.Copy(),
  2322  		exchangeTransportQueuesExternalLargestDelivery.Copy(),
  2323  		exchangeTransportQueuesInternalActiveRemoteDelivery.Copy(),
  2324  		exchangeTransportQueuesInternalLargestDelivery.Copy(),
  2325  		exchangeTransportQueuesRetryMailboxDelivery.Copy(),
  2326  		exchangeTransportQueuesUnreachable.Copy(),
  2327  		exchangeTransportQueuesPoison.Copy(),
  2328  	}
  2329  	exchangeWorkloadChartsTmpl = module.Charts{
  2330  		exchangeWorkloadActiveTasks.Copy(),
  2331  		exchangeWorkloadCompletedTasks.Copy(),
  2332  		exchangeWorkloadQueuedTasks.Copy(),
  2333  		exchangeWorkloadYieldedTasks.Copy(),
  2334  
  2335  		exchangeWorkloadActivityStatus.Copy(),
  2336  	}
  2337  	exchangeLDAPChartsTmpl = module.Charts{
  2338  		exchangeLDAPLongRunningOPS.Copy(),
  2339  		exchangeLDAPReadTime.Copy(),
  2340  		exchangeLDAPSearchTime.Copy(),
  2341  		exchangeLDAPTimeoutErrors.Copy(),
  2342  		exchangeLDAPWriteTime.Copy(),
  2343  	}
  2344  	exchangeHTTPProxyChartsTmpl = module.Charts{
  2345  		exchangeProxyAvgAuthLatency.Copy(),
  2346  		exchangeProxyAvgCasProcessingLatencySec.Copy(),
  2347  		exchangeProxyMailboxProxyFailureRace.Copy(),
  2348  		exchangeProxyMailboxServerLocatorAvgLatencySec.Copy(),
  2349  		exchangeProxyOutstandingProxyRequests.Copy(),
  2350  		exchangeProxyRequestsTotal.Copy(),
  2351  	}
  2352  
  2353  	exchangeActiveSyncPingCMDsPendingChart = module.Chart{
  2354  		OverModule: "exchange",
  2355  		ID:         "exchange_activesync_ping_cmds_pending",
  2356  		Title:      "Ping commands pending in queue",
  2357  		Units:      "commands",
  2358  		Fam:        "sync",
  2359  		Ctx:        "exchange.activesync_ping_cmds_pending",
  2360  		Priority:   prioExchangeActiveSyncPingCMDsPending,
  2361  		Dims: module.Dims{
  2362  			{ID: "exchange_activesync_ping_cmds_pending", Name: "pending"},
  2363  		},
  2364  	}
  2365  	exchangeActiveSyncRequestsChart = module.Chart{
  2366  		OverModule: "exchange",
  2367  		ID:         "exchange_activesync_requests",
  2368  		Title:      "HTTP requests received from ASP.NET",
  2369  		Units:      "requests/s",
  2370  		Fam:        "sync",
  2371  		Ctx:        "exchange.activesync_requests",
  2372  		Priority:   prioExchangeActiveSyncRequests,
  2373  		Dims: module.Dims{
  2374  			{ID: "exchange_activesync_requests_total", Name: "received", Algo: module.Incremental},
  2375  		},
  2376  	}
  2377  	exchangeActiveSyncCMDsChart = module.Chart{
  2378  		OverModule: "exchange",
  2379  		ID:         "exchange_activesync_sync_cmds",
  2380  		Title:      "Sync commands processed",
  2381  		Units:      "commands/s",
  2382  		Fam:        "sync",
  2383  		Ctx:        "exchange.activesync_sync_cmds",
  2384  		Priority:   prioExchangeActiveSyncSyncCMDs,
  2385  		Dims: module.Dims{
  2386  			{ID: "exchange_activesync_sync_cmds_total", Name: "processed", Algo: module.Incremental},
  2387  		},
  2388  	}
  2389  	exchangeAutoDiscoverRequestsChart = module.Chart{
  2390  		OverModule: "exchange",
  2391  		ID:         "exchange_autodiscover_requests",
  2392  		Title:      "Autodiscover service requests processed",
  2393  		Units:      "requests/s",
  2394  		Fam:        "requests",
  2395  		Ctx:        "exchange.autodiscover_requests",
  2396  		Priority:   prioExchangeAutoDiscoverRequests,
  2397  		Dims: module.Dims{
  2398  			{ID: "exchange_autodiscover_requests_total", Name: "processed", Algo: module.Incremental},
  2399  		},
  2400  	}
  2401  	exchangeAvailableServiceRequestsChart = module.Chart{
  2402  		OverModule: "exchange",
  2403  		ID:         "exchange_avail_service_requests",
  2404  		Title:      "Requests serviced",
  2405  		Units:      "requests/s",
  2406  		Fam:        "requests",
  2407  		Ctx:        "exchange.avail_service_requests",
  2408  		Priority:   prioExchangeAvailServiceRequests,
  2409  		Dims: module.Dims{
  2410  			{ID: "exchange_avail_service_requests_per_sec", Name: "serviced", Algo: module.Incremental},
  2411  		},
  2412  	}
  2413  	exchangeOWACurrentUniqueUsersChart = module.Chart{
  2414  		OverModule: "exchange",
  2415  		ID:         "exchange_owa_current_unique_users",
  2416  		Title:      "Unique users currently logged on to Outlook Web App",
  2417  		Units:      "users",
  2418  		Fam:        "owa",
  2419  		Ctx:        "exchange.owa_current_unique_users",
  2420  		Priority:   prioExchangeOWACurrentUniqueUsers,
  2421  		Dims: module.Dims{
  2422  			{ID: "exchange_owa_current_unique_users", Name: "logged-in"},
  2423  		},
  2424  	}
  2425  	exchangeOWARequestsChart = module.Chart{
  2426  		OverModule: "exchange",
  2427  		ID:         "exchange_owa_requests_total",
  2428  		Title:      "Requests handled by Outlook Web App",
  2429  		Units:      "requests/s",
  2430  		Fam:        "owa",
  2431  		Ctx:        "exchange.owa_requests_total",
  2432  		Priority:   prioExchangeOWARequestsTotal,
  2433  		Dims: module.Dims{
  2434  			{ID: "exchange_owa_requests_total", Name: "handled", Algo: module.Incremental},
  2435  		},
  2436  	}
  2437  	exchangeRPCActiveUsersCountChart = module.Chart{
  2438  		OverModule: "exchange",
  2439  		ID:         "exchange_rpc_active_user",
  2440  		Title:      "Active unique users in the last 2 minutes",
  2441  		Units:      "users",
  2442  		Fam:        "rpc",
  2443  		Ctx:        "exchange.rpc_active_user_count",
  2444  		Priority:   prioExchangeRPCActiveUserCount,
  2445  		Dims: module.Dims{
  2446  			{ID: "exchange_rpc_active_user_count", Name: "active"},
  2447  		},
  2448  	}
  2449  	exchangeRPCAvgLatencyChart = module.Chart{
  2450  		OverModule: "exchange",
  2451  		ID:         "exchange_rpc_avg_latency",
  2452  		Title:      "Average latency",
  2453  		Units:      "seconds",
  2454  		Fam:        "rpc",
  2455  		Ctx:        "exchange.rpc_avg_latency",
  2456  		Priority:   prioExchangeRPCAvgLatency,
  2457  		Dims: module.Dims{
  2458  			{ID: "exchange_rpc_avg_latency_sec", Name: "latency", Div: precision},
  2459  		},
  2460  	}
  2461  	exchangeRPCConnectionChart = module.Chart{
  2462  		OverModule: "exchange",
  2463  		ID:         "exchange_rpc_connection",
  2464  		Title:      "Client connections",
  2465  		Units:      "connections",
  2466  		Fam:        "rpc",
  2467  		Ctx:        "exchange.rpc_connection_count",
  2468  		Priority:   prioExchangeRPCConnectionCount,
  2469  		Dims: module.Dims{
  2470  			{ID: "exchange_rpc_connection_count", Name: "connections"},
  2471  		},
  2472  	}
  2473  	exchangeRPCOperationsChart = module.Chart{
  2474  		OverModule: "exchange",
  2475  		ID:         "exchange_rpc_operations",
  2476  		Title:      "RPC operations",
  2477  		Units:      "operations/s",
  2478  		Fam:        "rpc",
  2479  		Ctx:        "exchange.rpc_operations",
  2480  		Priority:   prioExchangeRPCOperationsTotal,
  2481  		Dims: module.Dims{
  2482  			{ID: "exchange_rpc_operations_total", Name: "operations", Algo: module.Incremental},
  2483  		},
  2484  	}
  2485  	exchangeRPCRequestsChart = module.Chart{
  2486  		OverModule: "exchange",
  2487  		ID:         "exchange_rpc_requests_total",
  2488  		Title:      "Clients requests currently being processed",
  2489  		Units:      "requests",
  2490  		Fam:        "rpc",
  2491  		Ctx:        "exchange.rpc_requests",
  2492  		Priority:   prioExchangeRPCRequests,
  2493  		Dims: module.Dims{
  2494  			{ID: "exchange_rpc_requests", Name: "processed"},
  2495  		},
  2496  	}
  2497  	exchangeRPCUserChart = module.Chart{
  2498  		OverModule: "exchange",
  2499  		ID:         "exchange_rpc_user",
  2500  		Title:      "RPC users",
  2501  		Units:      "users",
  2502  		Fam:        "rpc",
  2503  		Ctx:        "exchange.rpc_user_count",
  2504  		Priority:   prioExchangeRpcUserCount,
  2505  		Dims: module.Dims{
  2506  			{ID: "exchange_rpc_user_count", Name: "users"},
  2507  		},
  2508  	}
  2509  
  2510  	// Source: https://learn.microsoft.com/en-us/exchange/mail-flow/queues/queues?view=exchserver-2019
  2511  	exchangeTransportQueuesActiveMailBoxDelivery = module.Chart{
  2512  		OverModule: "exchange",
  2513  		ID:         "exchange_transport_queues_active_mailbox_delivery",
  2514  		Title:      "Active Mailbox Delivery Queue length",
  2515  		Units:      "messages",
  2516  		Fam:        "queue",
  2517  		Ctx:        "exchange.transport_queues_active_mail_box_delivery",
  2518  		Priority:   prioExchangeTransportQueuesActiveMailboxDelivery,
  2519  		Dims: module.Dims{
  2520  			{ID: "exchange_transport_queues_active_mailbox_delivery_low_priority", Name: "low"},
  2521  			{ID: "exchange_transport_queues_active_mailbox_delivery_high_priority", Name: "high"},
  2522  			{ID: "exchange_transport_queues_active_mailbox_delivery_none_priority", Name: "none"},
  2523  			{ID: "exchange_transport_queues_active_mailbox_delivery_normal_priority", Name: "normal"},
  2524  		},
  2525  	}
  2526  	exchangeTransportQueuesExternalActiveRemoteDelivery = module.Chart{
  2527  		OverModule: "exchange",
  2528  		ID:         "exchange_transport_queues_external_active_remote_delivery",
  2529  		Title:      "External Active Remote Delivery Queue length",
  2530  		Units:      "messages",
  2531  		Fam:        "queue",
  2532  		Ctx:        "exchange.transport_queues_external_active_remote_delivery",
  2533  		Priority:   prioExchangeTransportQueuesExternalActiveRemoteDelivery,
  2534  		Dims: module.Dims{
  2535  			{ID: "exchange_transport_queues_external_active_remote_delivery_low_priority", Name: "low"},
  2536  			{ID: "exchange_transport_queues_external_active_remote_delivery_high_priority", Name: "high"},
  2537  			{ID: "exchange_transport_queues_external_active_remote_delivery_none_priority", Name: "none"},
  2538  			{ID: "exchange_transport_queues_external_active_remote_delivery_normal_priority", Name: "normal"},
  2539  		},
  2540  	}
  2541  	exchangeTransportQueuesExternalLargestDelivery = module.Chart{
  2542  		OverModule: "exchange",
  2543  		ID:         "exchange_transport_queues_external_largest_delivery",
  2544  		Title:      "External Largest Delivery Queue length",
  2545  		Units:      "messages",
  2546  		Fam:        "queue",
  2547  		Ctx:        "exchange.transport_queues_external_largest_delivery",
  2548  		Priority:   prioExchangeTransportQueuesExternalLargestDelivery,
  2549  		Dims: module.Dims{
  2550  			{ID: "exchange_transport_queues_external_largest_delivery_low_priority", Name: "low"},
  2551  			{ID: "exchange_transport_queues_external_largest_delivery_high_priority", Name: "high"},
  2552  			{ID: "exchange_transport_queues_external_largest_delivery_none_priority", Name: "none"},
  2553  			{ID: "exchange_transport_queues_external_largest_delivery_normal_priority", Name: "normal"},
  2554  		},
  2555  	}
  2556  	exchangeTransportQueuesInternalActiveRemoteDelivery = module.Chart{
  2557  		OverModule: "exchange",
  2558  		ID:         "exchange_transport_queues_internal_active_remote_delivery",
  2559  		Title:      "Internal Active Remote Delivery Queue length",
  2560  		Units:      "messages",
  2561  		Fam:        "queue",
  2562  		Ctx:        "exchange.transport_queues_internal_active_remote_delivery",
  2563  		Priority:   prioExchangeTransportQueuesInternalActiveRemoteDeliery,
  2564  		Dims: module.Dims{
  2565  			{ID: "exchange_transport_queues_internal_active_remote_delivery_low_priority", Name: "low"},
  2566  			{ID: "exchange_transport_queues_internal_active_remote_delivery_high_priority", Name: "high"},
  2567  			{ID: "exchange_transport_queues_internal_active_remote_delivery_none_priority", Name: "none"},
  2568  			{ID: "exchange_transport_queues_internal_active_remote_delivery_normal_priority", Name: "normal"},
  2569  		},
  2570  	}
  2571  	exchangeTransportQueuesInternalLargestDelivery = module.Chart{
  2572  		OverModule: "exchange",
  2573  		ID:         "exchange_transport_queues_internal_largest_delivery",
  2574  		Title:      "Internal Largest Delivery Queue length",
  2575  		Units:      "messages",
  2576  		Fam:        "queue",
  2577  		Ctx:        "exchange.transport_queues_internal_largest_delivery",
  2578  		Priority:   prioExchangeTransportQueuesInternalLargestDelivery,
  2579  		Dims: module.Dims{
  2580  			{ID: "exchange_transport_queues_internal_largest_delivery_low_priority", Name: "low"},
  2581  			{ID: "exchange_transport_queues_internal_largest_delivery_high_priority", Name: "high"},
  2582  			{ID: "exchange_transport_queues_internal_largest_delivery_none_priority", Name: "none"},
  2583  			{ID: "exchange_transport_queues_internal_largest_delivery_normal_priority", Name: "normal"},
  2584  		},
  2585  	}
  2586  	exchangeTransportQueuesRetryMailboxDelivery = module.Chart{
  2587  		OverModule: "exchange",
  2588  		ID:         "exchange_transport_queues_retry_mailbox_delivery",
  2589  		Title:      "Internal Active Remote Delivery Queue length",
  2590  		Units:      "messages",
  2591  		Fam:        "queue",
  2592  		Ctx:        "exchange.transport_queues_retry_mailbox_delivery",
  2593  		Priority:   prioExchangeTransportQueuesRetryMailboxDelivery,
  2594  		Dims: module.Dims{
  2595  			{ID: "exchange_transport_queues_retry_mailbox_delivery_low_priority", Name: "low"},
  2596  			{ID: "exchange_transport_queues_retry_mailbox_delivery_high_priority", Name: "high"},
  2597  			{ID: "exchange_transport_queues_retry_mailbox_delivery_none_priority", Name: "none"},
  2598  			{ID: "exchange_transport_queues_retry_mailbox_delivery_normal_priority", Name: "normal"},
  2599  		},
  2600  	}
  2601  	exchangeTransportQueuesUnreachable = module.Chart{
  2602  		OverModule: "exchange",
  2603  		ID:         "exchange_transport_queues_unreachable",
  2604  		Title:      "Unreachable Queue length",
  2605  		Units:      "messages",
  2606  		Fam:        "queue",
  2607  		Ctx:        "exchange.transport_queues_unreachable",
  2608  		Priority:   prioExchangeTransportQueuesUnreachable,
  2609  		Dims: module.Dims{
  2610  			{ID: "exchange_transport_queues_unreachable_low_priority", Name: "low"},
  2611  			{ID: "exchange_transport_queues_unreachable_high_priority", Name: "high"},
  2612  			{ID: "exchange_transport_queues_unreachable_none_priority", Name: "none"},
  2613  			{ID: "exchange_transport_queues_unreachable_normal_priority", Name: "normal"},
  2614  		},
  2615  	}
  2616  	exchangeTransportQueuesPoison = module.Chart{
  2617  		OverModule: "exchange",
  2618  		ID:         "exchange_transport_queues_poison",
  2619  		Title:      "Poison Queue Length",
  2620  		Units:      "messages/s",
  2621  		Fam:        "queue",
  2622  		Ctx:        "exchange.transport_queues_poison",
  2623  		Priority:   prioExchangeTransportQueuesPoison,
  2624  		Dims: module.Dims{
  2625  			{ID: "exchange_transport_queues_poison_high_priority", Name: "high"},
  2626  			{ID: "exchange_transport_queues_poison_low_priority", Name: "low"},
  2627  			{ID: "exchange_transport_queues_poison_none_priority", Name: "none"},
  2628  			{ID: "exchange_transport_queues_poison_normal_priority", Name: "normal"},
  2629  		},
  2630  	}
  2631  
  2632  	exchangeWorkloadActiveTasks = module.Chart{
  2633  		OverModule: "exchange",
  2634  		ID:         "exchange_workload_%s_tasks",
  2635  		Title:      "Workload active tasks",
  2636  		Units:      "tasks",
  2637  		Fam:        "workload",
  2638  		Ctx:        "exchange.workload_active_tasks",
  2639  		Priority:   prioExchangeWorkloadActiveTasks,
  2640  		Dims: module.Dims{
  2641  			{ID: "exchange_workload_%s_active_tasks", Name: "active"},
  2642  		},
  2643  	}
  2644  	exchangeWorkloadCompletedTasks = module.Chart{
  2645  		OverModule: "exchange",
  2646  		ID:         "exchange_workload_%s_completed_tasks",
  2647  		Title:      "Workload completed tasks",
  2648  		Units:      "tasks/s",
  2649  		Fam:        "workload",
  2650  		Ctx:        "exchange.workload_completed_tasks",
  2651  		Priority:   prioExchangeWorkloadCompleteTasks,
  2652  		Dims: module.Dims{
  2653  			{ID: "exchange_workload_%s_completed_tasks", Name: "completed", Algo: module.Incremental},
  2654  		},
  2655  	}
  2656  	exchangeWorkloadQueuedTasks = module.Chart{
  2657  		OverModule: "exchange",
  2658  		ID:         "exchange_workload_%s_queued_tasks",
  2659  		Title:      "Workload queued tasks",
  2660  		Units:      "tasks/s",
  2661  		Fam:        "workload",
  2662  		Ctx:        "exchange.workload_queued_tasks",
  2663  		Priority:   prioExchangeWorkloadQueueTasks,
  2664  		Dims: module.Dims{
  2665  			{ID: "exchange_workload_%s_queued_tasks", Name: "queued", Algo: module.Incremental},
  2666  		},
  2667  	}
  2668  	exchangeWorkloadYieldedTasks = module.Chart{
  2669  		OverModule: "exchange",
  2670  		ID:         "exchange_workload_%s_yielded_tasks",
  2671  		Title:      "Workload yielded tasks",
  2672  		Units:      "tasks/s",
  2673  		Fam:        "workload",
  2674  		Ctx:        "exchange.workload_yielded_tasks",
  2675  		Priority:   prioExchangeWorkloadYieldedTasks,
  2676  		Dims: module.Dims{
  2677  			{ID: "exchange_workload_%s_yielded_tasks", Name: "yielded", Algo: module.Incremental},
  2678  		},
  2679  	}
  2680  	exchangeWorkloadActivityStatus = module.Chart{
  2681  		OverModule: "exchange",
  2682  		ID:         "exchange_workload_%s_activity_status",
  2683  		Title:      "Workload activity status",
  2684  		Units:      "status",
  2685  		Fam:        "workload",
  2686  		Ctx:        "exchange.workload_activity_status",
  2687  		Priority:   prioExchangeWorkloadActivityStatus,
  2688  		Dims: module.Dims{
  2689  			{ID: "exchange_workload_%s_is_active", Name: "active"},
  2690  			{ID: "exchange_workload_%s_is_paused", Name: "paused"},
  2691  		},
  2692  	}
  2693  
  2694  	exchangeLDAPLongRunningOPS = module.Chart{
  2695  		OverModule: "exchange",
  2696  		ID:         "exchange_ldap_%s_long_running_ops",
  2697  		Title:      "Long Running LDAP operations",
  2698  		Units:      "operations/s",
  2699  		Fam:        "ldap",
  2700  		Ctx:        "exchange.ldap_long_running_ops_per_sec",
  2701  		Priority:   prioExchangeLDAPLongRunningOPS,
  2702  		Dims: module.Dims{
  2703  			{ID: "exchange_ldap_%s_long_running_ops_per_sec", Name: "long-running", Algo: module.Incremental},
  2704  		},
  2705  	}
  2706  	exchangeLDAPReadTime = module.Chart{
  2707  		OverModule: "exchange",
  2708  		ID:         "exchange_ldap_%s_read_time",
  2709  		Title:      "Time to send an LDAP read request and receive a response",
  2710  		Units:      "seconds",
  2711  		Fam:        "ldap",
  2712  		Ctx:        "exchange.ldap_read_time",
  2713  		Priority:   prioExchangeLDAPReadTime,
  2714  		Dims: module.Dims{
  2715  			{ID: "exchange_ldap_%s_read_time_sec", Name: "read", Algo: module.Incremental, Div: precision},
  2716  		},
  2717  	}
  2718  	exchangeLDAPSearchTime = module.Chart{
  2719  		OverModule: "exchange",
  2720  		ID:         "exchange_ldap_%s_search_time",
  2721  		Title:      "Time to send an LDAP search request and receive a response",
  2722  		Units:      "seconds",
  2723  		Fam:        "ldap",
  2724  		Ctx:        "exchange.ldap_search_time",
  2725  		Priority:   prioExchangeLDAPSearchTime,
  2726  		Dims: module.Dims{
  2727  			{ID: "exchange_ldap_%s_search_time_sec", Name: "search", Algo: module.Incremental, Div: precision},
  2728  		},
  2729  	}
  2730  	exchangeLDAPWriteTime = module.Chart{
  2731  		OverModule: "exchange",
  2732  		ID:         "exchange_ldap_%s_write_time",
  2733  		Title:      "Time to send an LDAP search request and receive a response",
  2734  		Units:      "second",
  2735  		Fam:        "ldap",
  2736  		Ctx:        "exchange.ldap_write_time",
  2737  		Priority:   prioExchangeLDAPWriteTime,
  2738  		Dims: module.Dims{
  2739  			{ID: "exchange_ldap_%s_write_time_sec", Name: "write", Algo: module.Incremental, Div: precision},
  2740  		},
  2741  	}
  2742  	exchangeLDAPTimeoutErrors = module.Chart{
  2743  		OverModule: "exchange",
  2744  		ID:         "exchange_ldap_%s_timeout_errors",
  2745  		Title:      "LDAP timeout errors",
  2746  		Units:      "errors/s",
  2747  		Fam:        "ldap",
  2748  		Ctx:        "exchange.ldap_timeout_errors",
  2749  		Priority:   prioExchangeLDAPTimeoutErrors,
  2750  		Dims: module.Dims{
  2751  			{ID: "exchange_ldap_%s_timeout_errors_total", Name: "timeout", Algo: module.Incremental},
  2752  		},
  2753  	}
  2754  
  2755  	exchangeProxyAvgAuthLatency = module.Chart{
  2756  		OverModule: "exchange",
  2757  		ID:         "exchange_proxy_%s_avg_auth_latency",
  2758  		Title:      "Average time spent authenticating CAS",
  2759  		Units:      "seconds",
  2760  		Fam:        "proxy",
  2761  		Ctx:        "exchange.http_proxy_avg_auth_latency",
  2762  		Priority:   prioExchangeHTTPProxyAVGAuthLatency,
  2763  		Dims: module.Dims{
  2764  			{ID: "exchange_http_proxy_%s_avg_auth_latency", Name: "latency"},
  2765  		},
  2766  	}
  2767  	exchangeProxyAvgCasProcessingLatencySec = module.Chart{
  2768  		OverModule: "exchange",
  2769  		ID:         "exchange_proxy_%s_avg_cas_processing_latency_sec",
  2770  		Title:      "Average time spent authenticating CAS",
  2771  		Units:      "seconds",
  2772  		Fam:        "proxy",
  2773  		Ctx:        "exchange.http_proxy_avg_cas_processing_latency_sec",
  2774  		Priority:   prioExchangeHTTPProxyAVGCASProcessingLatency,
  2775  		Dims: module.Dims{
  2776  			{ID: "exchange_http_proxy_%s_avg_cas_proccessing_latency_sec", Name: "latency"},
  2777  		},
  2778  	}
  2779  	exchangeProxyMailboxProxyFailureRace = module.Chart{
  2780  		OverModule: "exchange",
  2781  		ID:         "exchange_proxy_%s_mailbox_proxy_failure_rate",
  2782  		Title:      "Percentage of failures between this CAS and MBX servers",
  2783  		Units:      "percentage",
  2784  		Fam:        "proxy",
  2785  		Ctx:        "exchange.http_proxy_mailbox_proxy_failure_rate",
  2786  		Priority:   prioExchangeHTTPProxyMailboxProxyFailureRate,
  2787  		Dims: module.Dims{
  2788  			{ID: "exchange_http_proxy_%s_mailbox_proxy_failure_rate", Name: "failures", Div: precision},
  2789  		},
  2790  	}
  2791  	exchangeProxyMailboxServerLocatorAvgLatencySec = module.Chart{
  2792  		OverModule: "exchange",
  2793  		ID:         "exchange_proxy_%s_mailbox_server_locator_avg_latency_sec",
  2794  		Title:      "Average latency of MailboxServerLocator web service calls",
  2795  		Units:      "seconds",
  2796  		Fam:        "proxy",
  2797  		Ctx:        "exchange.http_proxy_mailbox_server_locator_avg_latency_sec",
  2798  		Priority:   prioExchangeHTTPProxyServerLocatorAvgLatency,
  2799  		Dims: module.Dims{
  2800  			{ID: "exchange_http_proxy_%s_mailbox_server_locator_avg_latency_sec", Name: "latency", Div: precision},
  2801  		},
  2802  	}
  2803  	exchangeProxyOutstandingProxyRequests = module.Chart{
  2804  		OverModule: "exchange",
  2805  		ID:         "exchange_proxy_%s_outstanding_proxy_requests",
  2806  		Title:      "Concurrent outstanding proxy requests",
  2807  		Units:      "requests",
  2808  		Fam:        "proxy",
  2809  		Ctx:        "exchange.http_proxy_outstanding_proxy_requests",
  2810  		Priority:   prioExchangeHTTPProxyOutstandingProxyRequests,
  2811  		Dims: module.Dims{
  2812  			{ID: "exchange_http_proxy_%s_outstanding_proxy_requests", Name: "outstanding"},
  2813  		},
  2814  	}
  2815  	exchangeProxyRequestsTotal = module.Chart{
  2816  		OverModule: "exchange",
  2817  		ID:         "exchange_proxy_%s_requests_total",
  2818  		Title:      "Number of proxy requests processed each second",
  2819  		Units:      "requests/s",
  2820  		Fam:        "proxy",
  2821  		Ctx:        "exchange.http_proxy_requests",
  2822  		Priority:   prioExchangeHTTPProxyRequestsTotal,
  2823  		Dims: module.Dims{
  2824  			{ID: "exchange_http_proxy_%s_requests_total", Name: "processed", Algo: module.Incremental},
  2825  		},
  2826  	}
  2827  )
  2828  
  2829  // Logon
  2830  var (
  2831  	logonCharts = module.Charts{
  2832  		logonSessionsChart.Copy(),
  2833  	}
  2834  	logonSessionsChart = module.Chart{
  2835  		ID:       "logon_active_sessions_by_type",
  2836  		Title:    "Active User Logon Sessions By Type",
  2837  		Units:    "sessions",
  2838  		Fam:      "logon",
  2839  		Ctx:      "windows.logon_type_sessions",
  2840  		Type:     module.Stacked,
  2841  		Priority: prioLogonSessions,
  2842  		Dims: module.Dims{
  2843  			{ID: "logon_type_system_sessions", Name: "system"},
  2844  			{ID: "logon_type_proxy_sessions", Name: "proxy"},
  2845  			{ID: "logon_type_network_sessions", Name: "network"},
  2846  			{ID: "logon_type_interactive_sessions", Name: "interactive"},
  2847  			{ID: "logon_type_batch_sessions", Name: "batch"},
  2848  			{ID: "logon_type_service_sessions", Name: "service"},
  2849  			{ID: "logon_type_unlock_sessions", Name: "unlock"},
  2850  			{ID: "logon_type_network_clear_text_sessions", Name: "network_clear_text"},
  2851  			{ID: "logon_type_new_credentials_sessions", Name: "new_credentials"},
  2852  			{ID: "logon_type_remote_interactive_sessions", Name: "remote_interactive"},
  2853  			{ID: "logon_type_cached_interactive_sessions", Name: "cached_interactive"},
  2854  			{ID: "logon_type_cached_remote_interactive_sessions", Name: "cached_remote_interactive"},
  2855  			{ID: "logon_type_cached_unlock_sessions", Name: "cached_unlock"},
  2856  		},
  2857  	}
  2858  )
  2859  
  2860  // Thermal zone
  2861  var (
  2862  	thermalzoneChartsTmpl = module.Charts{
  2863  		thermalzoneTemperatureChartTmpl.Copy(),
  2864  	}
  2865  	thermalzoneTemperatureChartTmpl = module.Chart{
  2866  		ID:       "thermalzone_%s_temperature",
  2867  		Title:    "Thermal zone temperature",
  2868  		Units:    "Celsius",
  2869  		Fam:      "thermalzone",
  2870  		Ctx:      "windows.thermalzone_temperature",
  2871  		Priority: prioThermalzoneTemperature,
  2872  		Dims: module.Dims{
  2873  			{ID: "thermalzone_%s_temperature", Name: "temperature"},
  2874  		},
  2875  	}
  2876  )
  2877  
  2878  // Processes
  2879  var (
  2880  	processesCharts = module.Charts{
  2881  		processesCPUUtilizationTotalChart.Copy(),
  2882  		processesMemoryUsageChart.Copy(),
  2883  		processesHandlesChart.Copy(),
  2884  		processesIOBytesChart.Copy(),
  2885  		processesIOOperationsChart.Copy(),
  2886  		processesPageFaultsChart.Copy(),
  2887  		processesPageFileBytes.Copy(),
  2888  		processesThreads.Copy(),
  2889  	}
  2890  	processesCPUUtilizationTotalChart = module.Chart{
  2891  		ID:       "processes_cpu_utilization",
  2892  		Title:    "CPU usage (100% = 1 core)",
  2893  		Units:    "percentage",
  2894  		Fam:      "processes",
  2895  		Ctx:      "windows.processes_cpu_utilization",
  2896  		Type:     module.Stacked,
  2897  		Priority: prioProcessesCPUUtilization,
  2898  	}
  2899  	processesMemoryUsageChart = module.Chart{
  2900  		ID:       "processes_memory_usage",
  2901  		Title:    "Memory usage",
  2902  		Units:    "bytes",
  2903  		Fam:      "processes",
  2904  		Ctx:      "windows.processes_memory_usage",
  2905  		Type:     module.Stacked,
  2906  		Priority: prioProcessesMemoryUsage,
  2907  	}
  2908  	processesIOBytesChart = module.Chart{
  2909  		ID:       "processes_io_bytes",
  2910  		Title:    "Total of IO bytes (read, write, other)",
  2911  		Units:    "bytes/s",
  2912  		Fam:      "processes",
  2913  		Ctx:      "windows.processes_io_bytes",
  2914  		Type:     module.Stacked,
  2915  		Priority: prioProcessesIOBytes,
  2916  	}
  2917  	processesIOOperationsChart = module.Chart{
  2918  		ID:       "processes_io_operations",
  2919  		Title:    "Total of IO events (read, write, other)",
  2920  		Units:    "operations/s",
  2921  		Fam:      "processes",
  2922  		Ctx:      "windows.processes_io_operations",
  2923  		Type:     module.Stacked,
  2924  		Priority: prioProcessesIOOperations,
  2925  	}
  2926  	processesPageFaultsChart = module.Chart{
  2927  		ID:       "processes_page_faults",
  2928  		Title:    "Number of page faults",
  2929  		Units:    "pgfaults/s",
  2930  		Fam:      "processes",
  2931  		Ctx:      "windows.processes_page_faults",
  2932  		Type:     module.Stacked,
  2933  		Priority: prioProcessesPageFaults,
  2934  	}
  2935  	processesPageFileBytes = module.Chart{
  2936  		ID:       "processes_page_file_bytes",
  2937  		Title:    "Bytes used in page file(s)",
  2938  		Units:    "bytes",
  2939  		Fam:      "processes",
  2940  		Ctx:      "windows.processes_file_bytes",
  2941  		Type:     module.Stacked,
  2942  		Priority: prioProcessesPageFileBytes,
  2943  	}
  2944  	processesThreads = module.Chart{
  2945  		ID:       "processes_threads",
  2946  		Title:    "Active threads",
  2947  		Units:    "threads",
  2948  		Fam:      "processes",
  2949  		Ctx:      "windows.processes_threads",
  2950  		Type:     module.Stacked,
  2951  		Priority: prioProcessesThreads,
  2952  	}
  2953  	processesHandlesChart = module.Chart{
  2954  		ID:       "processes_handles",
  2955  		Title:    "Number of handles open",
  2956  		Units:    "handles",
  2957  		Fam:      "processes",
  2958  		Ctx:      "windows.processes_handles",
  2959  		Type:     module.Stacked,
  2960  		Priority: prioProcessesHandles,
  2961  	}
  2962  )
  2963  
  2964  // .NET
  2965  var (
  2966  	netFrameworkCLRExceptionsChartsTmpl = module.Charts{
  2967  		netFrameworkCLRExceptionsThrown.Copy(),
  2968  		netFrameworkCLRExceptionsFilters.Copy(),
  2969  		netFrameworkCLRExceptionsFinallys.Copy(),
  2970  		netFrameworkCLRExceptionsThrowToCatchDepth.Copy(),
  2971  	}
  2972  
  2973  	netFrameworkCLRInteropChartsTmpl = module.Charts{
  2974  		netFrameworkCLRInteropCOMCallableWrapper.Copy(),
  2975  		netFrameworkCLRInteropMarshalling.Copy(),
  2976  		netFrameworkCLRInteropStubsCreated.Copy(),
  2977  	}
  2978  
  2979  	netFrameworkCLRJITChartsTmpl = module.Charts{
  2980  		netFrameworkCLRJITMethods.Copy(),
  2981  		netFrameworkCLRJITTime.Copy(),
  2982  		netFrameworkCLRJITStandardFailures.Copy(),
  2983  		netFrameworkCLRJITILBytes.Copy(),
  2984  	}
  2985  
  2986  	netFrameworkCLRLoadingChartsTmpl = module.Charts{
  2987  		netFrameworkCLRLoadingLoaderHeapSize.Copy(),
  2988  		netFrameworkCLRLoadingAppDomainsLoaded.Copy(),
  2989  		netFrameworkCLRLoadingAppDomainsUnloaded.Copy(),
  2990  		netFrameworkCLRLoadingAssembliesLoaded.Copy(),
  2991  		netFrameworkCLRLoadingClassesLoaded.Copy(),
  2992  		netFrameworkCLRLoadingClassLoadFailure.Copy(),
  2993  	}
  2994  
  2995  	netFrameworkCLRLocksAndThreadsChartsTmpl = module.Charts{
  2996  		netFrameworkCLRLockAndThreadsQueueLength.Copy(),
  2997  		netFrameworkCLRLockAndThreadsCurrentLogicalThreads.Copy(),
  2998  		netFrameworkCLRLockAndThreadsCurrentPhysicalThreads.Copy(),
  2999  		netFrameworkCLRLockAndThreadsRecognizedThreads.Copy(),
  3000  		netFrameworkCLRLockAndThreadsContentions.Copy(),
  3001  	}
  3002  
  3003  	netFrameworkCLRMemoryChartsTmpl = module.Charts{
  3004  		netFrameworkCLRMemoryAllocatedBytes.Copy(),
  3005  		netFrameworkCLRMemoryFinalizationSurvivors.Copy(),
  3006  		netFrameworkCLRMemoryHeapSize.Copy(),
  3007  		netFrameworkCLRMemoryPromoted.Copy(),
  3008  		netFrameworkCLRMemoryNumberGCHandles.Copy(),
  3009  		netFrameworkCLRMemoryCollections.Copy(),
  3010  		netFrameworkCLRMemoryInducedGC.Copy(),
  3011  		netFrameworkCLRMemoryNumberPinnedObjects.Copy(),
  3012  		netFrameworkCLRMemoryNumberSinkBlocksInUse.Copy(),
  3013  		netFrameworkCLRMemoryCommitted.Copy(),
  3014  		netFrameworkCLRMemoryReserved.Copy(),
  3015  		netFrameworkCLRMemoryGCTime.Copy(),
  3016  	}
  3017  
  3018  	netFrameworkCLRRemotingChartsTmpl = module.Charts{
  3019  		netFrameworkCLRRemotingChannels.Copy(),
  3020  		netFrameworkCLRRemotingContextBoundClassesLoaded.Copy(),
  3021  		netFrameworkCLRRemotingContextBoundObjects.Copy(),
  3022  		netFrameworkCLRRemotingContextProxies.Copy(),
  3023  		netFrameworkCLRRemotingContexts.Copy(),
  3024  		netFrameworkCLRRemotingCalls.Copy(),
  3025  	}
  3026  
  3027  	netFrameworkCLRSecurityChartsTmpl = module.Charts{
  3028  		netFrameworkCLRSecurityLinkTimeChecks.Copy(),
  3029  		netFrameworkCLRSecurityChecksTime.Copy(),
  3030  		netFrameworkCLRSecurityStackWalkDepth.Copy(),
  3031  		netFrameworkCLRSecurityRuntimeChecks.Copy(),
  3032  	}
  3033  
  3034  	// Exceptions
  3035  	netFrameworkCLRExceptionsThrown = module.Chart{
  3036  		OverModule: "netframework",
  3037  		ID:         "netframework_%s_clrexception_thrown",
  3038  		Title:      "Thrown exceptions",
  3039  		Units:      "exceptions/s",
  3040  		Fam:        "exceptions",
  3041  		Ctx:        "netframework.clrexception_thrown",
  3042  		Priority:   prioNETFrameworkCLRExceptionsThrown,
  3043  		Dims: module.Dims{
  3044  			{ID: "netframework_%s_clrexception_thrown_total", Name: "exceptions", Algo: module.Incremental},
  3045  		},
  3046  	}
  3047  	netFrameworkCLRExceptionsFilters = module.Chart{
  3048  		OverModule: "netframework",
  3049  		ID:         "netframework_%s_clrexception_filters",
  3050  		Title:      "Executed exception filters",
  3051  		Units:      "filters/s",
  3052  		Fam:        "exceptions",
  3053  		Ctx:        "netframework.clrexception_filters",
  3054  		Priority:   prioNETFrameworkCLRExceptionsFilters,
  3055  		Dims: module.Dims{
  3056  			{ID: "netframework_%s_clrexception_filters_total", Name: "filters", Algo: module.Incremental},
  3057  		},
  3058  	}
  3059  	netFrameworkCLRExceptionsFinallys = module.Chart{
  3060  		OverModule: "netframework",
  3061  		ID:         "netframework_%s_clrexception_finallys",
  3062  		Title:      "Executed finally blocks",
  3063  		Units:      "finallys/s",
  3064  		Fam:        "exceptions",
  3065  		Ctx:        "netframework.clrexception_finallys",
  3066  		Priority:   prioNETFrameworkCLRExceptionsFinallys,
  3067  		Dims: module.Dims{
  3068  			{ID: "netframework_%s_clrexception_finallys_total", Name: "finallys", Algo: module.Incremental},
  3069  		},
  3070  	}
  3071  	netFrameworkCLRExceptionsThrowToCatchDepth = module.Chart{
  3072  		OverModule: "netframework",
  3073  		ID:         "netframework_%s_clrexception_throw_to_catch_depth",
  3074  		Title:      "Traversed stack frames",
  3075  		Units:      "stack_frames/s",
  3076  		Fam:        "exceptions",
  3077  		Ctx:        "netframework.clrexception_throw_to_catch_depth",
  3078  		Priority:   prioNETFrameworkCLRExceptionsThrowToCatchDepth,
  3079  		Dims: module.Dims{
  3080  			{ID: "netframework_%s_clrexception_throw_to_catch_depth_total", Name: "traversed", Algo: module.Incremental},
  3081  		},
  3082  	}
  3083  
  3084  	// Interop
  3085  	netFrameworkCLRInteropCOMCallableWrapper = module.Chart{
  3086  		OverModule: "netframework",
  3087  		ID:         "netframework_%s_clrinterop_com_callable_wrappers",
  3088  		Title:      "COM callable wrappers (CCW)",
  3089  		Units:      "ccw/s",
  3090  		Fam:        "interop",
  3091  		Ctx:        "netframework.clrinterop_com_callable_wrappers",
  3092  		Priority:   prioNETFrameworkCLRInteropCOMCallableWrappers,
  3093  		Dims: module.Dims{
  3094  			{ID: "netframework_%s_clrinterop_com_callable_wrappers_total", Name: "com_callable_wrappers", Algo: module.Incremental},
  3095  		},
  3096  	}
  3097  	netFrameworkCLRInteropMarshalling = module.Chart{
  3098  		OverModule: "netframework",
  3099  		ID:         "netframework_%s_clrinterop_interop_marshalling",
  3100  		Title:      "Arguments and return values marshallings",
  3101  		Units:      "marshalling/s",
  3102  		Fam:        "interop",
  3103  		Ctx:        "netframework.clrinterop_interop_marshallings",
  3104  		Priority:   prioNETFrameworkCLRInteropMarshalling,
  3105  		Dims: module.Dims{
  3106  			{ID: "netframework_%s_clrinterop_interop_marshalling_total", Name: "marshallings", Algo: module.Incremental},
  3107  		},
  3108  	}
  3109  	netFrameworkCLRInteropStubsCreated = module.Chart{
  3110  		OverModule: "netframework",
  3111  		ID:         "netframework_%s_clrinterop_interop_stubs_created",
  3112  		Title:      "Created stubs",
  3113  		Units:      "stubs/s",
  3114  		Fam:        "interop",
  3115  		Ctx:        "netframework.clrinterop_interop_stubs_created",
  3116  		Priority:   prioNETFrameworkCLRInteropStubsCreated,
  3117  		Dims: module.Dims{
  3118  			{ID: "netframework_%s_clrinterop_interop_stubs_created_total", Name: "created", Algo: module.Incremental},
  3119  		},
  3120  	}
  3121  
  3122  	// JIT
  3123  	netFrameworkCLRJITMethods = module.Chart{
  3124  		OverModule: "netframework",
  3125  		ID:         "netframework_%s_clrjit_methods",
  3126  		Title:      "JIT-compiled methods",
  3127  		Units:      "methods/s",
  3128  		Fam:        "jit",
  3129  		Ctx:        "netframework.clrjit_methods",
  3130  		Priority:   prioNETFrameworkCLRJITMethods,
  3131  		Dims: module.Dims{
  3132  			{ID: "netframework_%s_clrjit_methods_total", Name: "jit-compiled", Algo: module.Incremental},
  3133  		},
  3134  	}
  3135  	netFrameworkCLRJITTime = module.Chart{
  3136  		OverModule: "netframework",
  3137  		ID:         "netframework_%s_clrjit_time",
  3138  		Title:      "Time spent in JIT compilation",
  3139  		Units:      "percentage",
  3140  		Fam:        "jit",
  3141  		Ctx:        "netframework.clrjit_time",
  3142  		Priority:   prioNETFrameworkCLRJITTime,
  3143  		Dims: module.Dims{
  3144  			{ID: "netframework_%s_clrjit_time_percent", Name: "time"},
  3145  		},
  3146  	}
  3147  	netFrameworkCLRJITStandardFailures = module.Chart{
  3148  		OverModule: "netframework",
  3149  		ID:         "netframework_%s_clrjit_standard_failures",
  3150  		Title:      "JIT compiler failures",
  3151  		Units:      "failures/s",
  3152  		Fam:        "jit",
  3153  		Ctx:        "netframework.clrjit_standard_failures",
  3154  		Priority:   prioNETFrameworkCLRJITStandardFailures,
  3155  		Dims: module.Dims{
  3156  			{ID: "netframework_%s_clrjit_standard_failures_total", Name: "failures", Algo: module.Incremental},
  3157  		},
  3158  	}
  3159  	netFrameworkCLRJITILBytes = module.Chart{
  3160  		OverModule: "netframework",
  3161  		ID:         "netframework_%s_clrjit_il_bytes",
  3162  		Title:      "Compiled Microsoft intermediate language (MSIL) bytes",
  3163  		Units:      "bytes/s",
  3164  		Fam:        "jit",
  3165  		Ctx:        "netframework.clrjit_il_bytes",
  3166  		Priority:   prioNETFrameworkCLRJITILBytes,
  3167  		Dims: module.Dims{
  3168  			{ID: "netframework_%s_clrjit_il_bytes_total", Name: "compiled_msil", Algo: module.Incremental},
  3169  		},
  3170  	}
  3171  
  3172  	// Loading
  3173  	netFrameworkCLRLoadingLoaderHeapSize = module.Chart{
  3174  		OverModule: "netframework",
  3175  		ID:         "netframework_%s_clrloading_loader_heap_size",
  3176  		Title:      "Memory committed by class loader",
  3177  		Units:      "bytes",
  3178  		Fam:        "loading",
  3179  		Ctx:        "netframework.clrloading_loader_heap_size",
  3180  		Priority:   prioNETFrameworkCLRLoadingLoaderHeapSize,
  3181  		Dims: module.Dims{
  3182  			{ID: "netframework_%s_clrloading_loader_heap_size_bytes", Name: "committed"},
  3183  		},
  3184  	}
  3185  	netFrameworkCLRLoadingAppDomainsLoaded = module.Chart{
  3186  		OverModule: "netframework",
  3187  		ID:         "netframework_%s_clrloading_appdomains_loaded",
  3188  		Title:      "Loaded application domains",
  3189  		Units:      "domain/s",
  3190  		Fam:        "loading",
  3191  		Ctx:        "netframework.clrloading_appdomains_loaded",
  3192  		Priority:   prioNETFrameworkCLRLoadingAppDomainsLoaded,
  3193  		Dims: module.Dims{
  3194  			{ID: "netframework_%s_clrloading_appdomains_loaded_total", Name: "loaded", Algo: module.Incremental},
  3195  		},
  3196  	}
  3197  	netFrameworkCLRLoadingAppDomainsUnloaded = module.Chart{
  3198  		OverModule: "netframework",
  3199  		ID:         "netframework_%s_clrloading_appdomains_unloaded",
  3200  		Title:      "Unloaded application domains",
  3201  		Units:      "domain/s",
  3202  		Fam:        "loading",
  3203  		Ctx:        "netframework.clrloading_appdomains_unloaded",
  3204  		Priority:   prioNETFrameworkCLRLoadingAppDomainsUnloaded,
  3205  		Dims: module.Dims{
  3206  			{ID: "netframework_%s_clrloading_appdomains_unloaded_total", Name: "unloaded", Algo: module.Incremental},
  3207  		},
  3208  	}
  3209  	netFrameworkCLRLoadingAssembliesLoaded = module.Chart{
  3210  		OverModule: "netframework",
  3211  		ID:         "netframework_%s_clrloading_assemblies_loaded",
  3212  		Title:      "Loaded assemblies",
  3213  		Units:      "assemblies/s",
  3214  		Fam:        "loading",
  3215  		Ctx:        "netframework.clrloading_assemblies_loaded",
  3216  		Priority:   prioNETFrameworkCLRLoadingAssembliesLoaded,
  3217  		Dims: module.Dims{
  3218  			{ID: "netframework_%s_clrloading_assemblies_loaded_total", Name: "loaded", Algo: module.Incremental},
  3219  		},
  3220  	}
  3221  	netFrameworkCLRLoadingClassesLoaded = module.Chart{
  3222  		OverModule: "netframework",
  3223  		ID:         "netframework_%s_clrloading_classes_loaded",
  3224  		Title:      "Loaded classes in all assemblies",
  3225  		Units:      "classes/s",
  3226  		Fam:        "loading",
  3227  		Ctx:        "netframework.clrloading_classes_loaded",
  3228  		Priority:   prioNETFrameworkCLRLoadingClassesLoaded,
  3229  		Dims: module.Dims{
  3230  			{ID: "netframework_%s_clrloading_classes_loaded_total", Name: "loaded", Algo: module.Incremental},
  3231  		},
  3232  	}
  3233  	netFrameworkCLRLoadingClassLoadFailure = module.Chart{
  3234  		OverModule: "netframework",
  3235  		ID:         "netframework_%s_clrloading_class_load_failure",
  3236  		Title:      "Class load failures",
  3237  		Units:      "failures/s",
  3238  		Fam:        "loading",
  3239  		Ctx:        "netframework.clrloading_class_load_failures",
  3240  		Priority:   prioNETFrameworkCLRLoadingClassLoadFailure,
  3241  		Dims: module.Dims{
  3242  			{ID: "netframework_%s_clrloading_class_load_failures_total", Name: "class_load", Algo: module.Incremental},
  3243  		},
  3244  	}
  3245  
  3246  	// Lock and Threads
  3247  	netFrameworkCLRLockAndThreadsQueueLength = module.Chart{
  3248  		OverModule: "netframework",
  3249  		ID:         "netframework_%s_clrlocksandthreads_queue_length",
  3250  		Title:      "Threads waited to acquire a managed lock",
  3251  		Units:      "threads/s",
  3252  		Fam:        "locks threads",
  3253  		Ctx:        "netframework.clrlocksandthreads_queue_length",
  3254  		Priority:   prioNETFrameworkCLRLocksAndThreadsQueueLength,
  3255  		Dims: module.Dims{
  3256  			{ID: "netframework_%s_clrlocksandthreads_queue_length_total", Name: "threads", Algo: module.Incremental},
  3257  		},
  3258  	}
  3259  	netFrameworkCLRLockAndThreadsCurrentLogicalThreads = module.Chart{
  3260  		OverModule: "netframework",
  3261  		ID:         "netframework_%s_clrlocksandthreads_current_logical_threads",
  3262  		Title:      "Logical threads",
  3263  		Units:      "threads",
  3264  		Fam:        "locks threads",
  3265  		Ctx:        "netframework.clrlocksandthreads_current_logical_threads",
  3266  		Priority:   prioNETFrameworkCLRLocksAndThreadsCurrentLogicalThreads,
  3267  		Dims: module.Dims{
  3268  			{ID: "netframework_%s_clrlocksandthreads_current_logical_threads", Name: "logical"},
  3269  		},
  3270  	}
  3271  	netFrameworkCLRLockAndThreadsCurrentPhysicalThreads = module.Chart{
  3272  		OverModule: "netframework",
  3273  		ID:         "netframework_%s_clrlocksandthreads_current_physical_threads",
  3274  		Title:      "Physical threads",
  3275  		Units:      "threads",
  3276  		Fam:        "locks threads",
  3277  		Ctx:        "netframework.clrlocksandthreads_current_physical_threads",
  3278  		Priority:   prioNETFrameworkCLRLocksAndThreadsCurrentPhysicalThreads,
  3279  		Dims: module.Dims{
  3280  			{ID: "netframework_%s_clrlocksandthreads_physical_threads_current", Name: "physical"},
  3281  		},
  3282  	}
  3283  	netFrameworkCLRLockAndThreadsRecognizedThreads = module.Chart{
  3284  		OverModule: "netframework",
  3285  		ID:         "netframework_%s_clrlocksandthreads_recognized_threads",
  3286  		Title:      "Threads recognized by the runtime",
  3287  		Units:      "threads/s",
  3288  		Fam:        "locks threads",
  3289  		Ctx:        "netframework.clrlocksandthreads_recognized_threads",
  3290  		Priority:   prioNETFrameworkCLRLocksAndThreadsRecognizedThreads,
  3291  		Dims: module.Dims{
  3292  			{ID: "netframework_%s_clrlocksandthreads_recognized_threads_total", Name: "threads", Algo: module.Incremental},
  3293  		},
  3294  	}
  3295  	netFrameworkCLRLockAndThreadsContentions = module.Chart{
  3296  		OverModule: "netframework",
  3297  		ID:         "netframework_%s_clrlocksandthreads_contentions",
  3298  		Title:      "Fails to acquire a managed lock",
  3299  		Units:      "contentions/s",
  3300  		Fam:        "locks threads",
  3301  		Ctx:        "netframework.clrlocksandthreads_contentions",
  3302  		Priority:   prioNETFrameworkCLRLocksAndThreadsContentions,
  3303  		Dims: module.Dims{
  3304  			{ID: "netframework_%s_clrlocksandthreads_contentions_total", Name: "contentions", Algo: module.Incremental},
  3305  		},
  3306  	}
  3307  
  3308  	// Memory
  3309  	netFrameworkCLRMemoryAllocatedBytes = module.Chart{
  3310  		OverModule: "netframework",
  3311  		ID:         "netframework_%s_clrmemory_allocated_bytes",
  3312  		Title:      "Memory allocated on the garbage collection heap",
  3313  		Units:      "bytes/s",
  3314  		Fam:        "memory",
  3315  		Ctx:        "netframework.clrmemory_allocated_bytes",
  3316  		Priority:   prioNETFrameworkCLRMemoryAllocatedBytes,
  3317  		Dims: module.Dims{
  3318  			{ID: "netframework_%s_clrmemory_allocated_bytes_total", Name: "allocated", Algo: module.Incremental},
  3319  		},
  3320  	}
  3321  	netFrameworkCLRMemoryFinalizationSurvivors = module.Chart{
  3322  		OverModule: "netframework",
  3323  		ID:         "netframework_%s_clrmemory_finalization_survivors",
  3324  		Title:      "Objects that survived garbage-collection",
  3325  		Units:      "objects",
  3326  		Fam:        "memory",
  3327  		Ctx:        "netframework.clrmemory_finalization_survivors",
  3328  		Priority:   prioNETFrameworkCLRMemoryFinalizationSurvivors,
  3329  		Dims: module.Dims{
  3330  			{ID: "netframework_%s_clrmemory_finalization_survivors", Name: "survived"},
  3331  		},
  3332  	}
  3333  	netFrameworkCLRMemoryHeapSize = module.Chart{
  3334  		OverModule: "netframework",
  3335  		ID:         "netframework_%s_clrmemory_heap_size",
  3336  		Title:      "Maximum bytes that can be allocated",
  3337  		Units:      "bytes",
  3338  		Fam:        "memory",
  3339  		Ctx:        "netframework.clrmemory_heap_size",
  3340  		Priority:   prioNETFrameworkCLRMemoryHeapSize,
  3341  		Dims: module.Dims{
  3342  			{ID: "netframework_%s_clrmemory_heap_size_bytes", Name: "heap"},
  3343  		},
  3344  	}
  3345  	netFrameworkCLRMemoryPromoted = module.Chart{
  3346  		OverModule: "netframework",
  3347  		ID:         "netframework_%s_clrmemory_promoted",
  3348  		Title:      "Memory promoted to the next generation",
  3349  		Units:      "bytes",
  3350  		Fam:        "memory",
  3351  		Ctx:        "netframework.clrmemory_promoted",
  3352  		Priority:   prioNETFrameworkCLRMemoryPromoted,
  3353  		Dims: module.Dims{
  3354  			{ID: "netframework_%s_clrmemory_promoted_bytes", Name: "promoted"},
  3355  		},
  3356  	}
  3357  	netFrameworkCLRMemoryNumberGCHandles = module.Chart{
  3358  		OverModule: "netframework",
  3359  		ID:         "netframework_%s_clrmemory_number_gc_handles",
  3360  		Title:      "Garbage collection handles",
  3361  		Units:      "handles",
  3362  		Fam:        "memory",
  3363  		Ctx:        "netframework.clrmemory_number_gc_handles",
  3364  		Priority:   prioNETFrameworkCLRMemoryNumberGCHandles,
  3365  		Dims: module.Dims{
  3366  			{ID: "netframework_%s_clrmemory_number_gc_handles", Name: "used"},
  3367  		},
  3368  	}
  3369  	netFrameworkCLRMemoryCollections = module.Chart{
  3370  		OverModule: "netframework",
  3371  		ID:         "netframework_%s_clrmemory_collections",
  3372  		Title:      "Garbage collections",
  3373  		Units:      "gc/s",
  3374  		Fam:        "memory",
  3375  		Ctx:        "netframework.clrmemory_collections",
  3376  		Priority:   prioNETFrameworkCLRMemoryCollections,
  3377  		Dims: module.Dims{
  3378  			{ID: "netframework_%s_clrmemory_collections_total", Name: "gc", Algo: module.Incremental},
  3379  		},
  3380  	}
  3381  	netFrameworkCLRMemoryInducedGC = module.Chart{
  3382  		OverModule: "netframework",
  3383  		ID:         "netframework_%s_clrmemory_induced_gc",
  3384  		Title:      "Garbage collections induced",
  3385  		Units:      "gc/s",
  3386  		Fam:        "memory",
  3387  		Ctx:        "netframework.clrmemory_induced_gc",
  3388  		Priority:   prioNETFrameworkCLRMemoryInducedGC,
  3389  		Dims: module.Dims{
  3390  			{ID: "netframework_%s_clrmemory_induced_gc_total", Name: "gc", Algo: module.Incremental},
  3391  		},
  3392  	}
  3393  	netFrameworkCLRMemoryNumberPinnedObjects = module.Chart{
  3394  		OverModule: "netframework",
  3395  		ID:         "netframework_%s_clrmemory_number_pinned_objects",
  3396  		Title:      "Pinned objects encountered",
  3397  		Units:      "objects",
  3398  		Fam:        "memory",
  3399  		Ctx:        "netframework.clrmemory_number_pinned_objects",
  3400  		Priority:   prioNETFrameworkCLRMemoryNumberPinnedObjects,
  3401  		Dims: module.Dims{
  3402  			{ID: "netframework_%s_clrmemory_number_pinned_objects", Name: "pinned"},
  3403  		},
  3404  	}
  3405  	netFrameworkCLRMemoryNumberSinkBlocksInUse = module.Chart{
  3406  		OverModule: "netframework",
  3407  		ID:         "netframework_%s_clrmemory_number_sink_blocks_in_use",
  3408  		Title:      "Synchronization blocks in use",
  3409  		Units:      "blocks",
  3410  		Fam:        "memory",
  3411  		Ctx:        "netframework.clrmemory_number_sink_blocks_in_use",
  3412  		Priority:   prioNETFrameworkCLRMemoryNumberSinkBlocksInUse,
  3413  		Dims: module.Dims{
  3414  			{ID: "netframework_%s_clrmemory_number_sink_blocksinuse", Name: "used"},
  3415  		},
  3416  	}
  3417  	netFrameworkCLRMemoryCommitted = module.Chart{
  3418  		OverModule: "netframework",
  3419  		ID:         "netframework_%s_clrmemory_committed",
  3420  		Title:      "Virtual memory committed by GC",
  3421  		Units:      "bytes",
  3422  		Fam:        "memory",
  3423  		Ctx:        "netframework.clrmemory_committed",
  3424  		Priority:   prioNETFrameworkCLRMemoryCommitted,
  3425  		Dims: module.Dims{
  3426  			{ID: "netframework_%s_clrmemory_committed_bytes", Name: "committed"},
  3427  		},
  3428  	}
  3429  	netFrameworkCLRMemoryReserved = module.Chart{
  3430  		OverModule: "netframework",
  3431  		ID:         "netframework_%s_clrmemory_reserved",
  3432  		Title:      "Virtual memory reserved by GC",
  3433  		Units:      "bytes",
  3434  		Fam:        "memory",
  3435  		Ctx:        "netframework.clrmemory_reserved",
  3436  		Priority:   prioNETFrameworkCLRMemoryReserved,
  3437  		Dims: module.Dims{
  3438  			{ID: "netframework_%s_clrmemory_reserved_bytes", Name: "reserved"},
  3439  		},
  3440  	}
  3441  	netFrameworkCLRMemoryGCTime = module.Chart{
  3442  		OverModule: "netframework",
  3443  		ID:         "netframework_%s_clrmemory_gc_time",
  3444  		Title:      "Time spent on GC",
  3445  		Units:      "percentage",
  3446  		Fam:        "memory",
  3447  		Ctx:        "netframework.clrmemory_gc_time",
  3448  		Priority:   prioNETFrameworkCLRMemoryGCTime,
  3449  		Dims: module.Dims{
  3450  			{ID: "netframework_%s_clrmemory_gc_time_percent", Name: "time"},
  3451  		},
  3452  	}
  3453  
  3454  	// Remoting
  3455  	netFrameworkCLRRemotingChannels = module.Chart{
  3456  		OverModule: "netframework",
  3457  		ID:         "netframework_%s_clrremoting_channels",
  3458  		Title:      "Registered channels",
  3459  		Units:      "channels/s",
  3460  		Fam:        "remoting",
  3461  		Ctx:        "netframework.clrremoting_channels",
  3462  		Priority:   prioNETFrameworkCLRRemotingChannels,
  3463  		Dims: module.Dims{
  3464  			{ID: "netframework_%s_clrremoting_channels_total", Name: "registered", Algo: module.Incremental},
  3465  		},
  3466  	}
  3467  	netFrameworkCLRRemotingContextBoundClassesLoaded = module.Chart{
  3468  		OverModule: "netframework",
  3469  		ID:         "netframework_%s_clrremoting_context_bound_classes_loaded",
  3470  		Title:      "Loaded context-bound classes",
  3471  		Units:      "classes",
  3472  		Fam:        "remoting",
  3473  		Ctx:        "netframework.clrremoting_context_bound_classes_loaded",
  3474  		Priority:   prioNETFrameworkCLRRemotingContextBoundClassesLoaded,
  3475  		Dims: module.Dims{
  3476  			{ID: "netframework_%s_clrremoting_context_bound_classes_loaded", Name: "loaded"},
  3477  		},
  3478  	}
  3479  	netFrameworkCLRRemotingContextBoundObjects = module.Chart{
  3480  		OverModule: "netframework",
  3481  		ID:         "netframework_%s_clrremoting_context_bound_objects",
  3482  		Title:      "Allocated context-bound objects",
  3483  		Units:      "objects/s",
  3484  		Fam:        "remoting",
  3485  		Ctx:        "netframework.clrremoting_context_bound_objects",
  3486  		Priority:   prioNETFrameworkCLRRemotingContextBoundObjects,
  3487  		Dims: module.Dims{
  3488  			{ID: "netframework_%s_clrremoting_context_bound_objects_total", Name: "allocated", Algo: module.Incremental},
  3489  		},
  3490  	}
  3491  	netFrameworkCLRRemotingContextProxies = module.Chart{
  3492  		OverModule: "netframework",
  3493  		ID:         "netframework_%s_clrremoting_context_proxies",
  3494  		Title:      "Remoting proxy objects",
  3495  		Units:      "objects/s",
  3496  		Fam:        "remoting",
  3497  		Ctx:        "netframework.clrremoting_context_proxies",
  3498  		Priority:   prioNETFrameworkCLRRemotingContextProxies,
  3499  		Dims: module.Dims{
  3500  			{ID: "netframework_%s_clrremoting_context_proxies_total", Name: "objects", Algo: module.Incremental},
  3501  		},
  3502  	}
  3503  	netFrameworkCLRRemotingContexts = module.Chart{
  3504  		OverModule: "netframework",
  3505  		ID:         "netframework_%s_clrremoting_contexts",
  3506  		Title:      "Total of remoting contexts",
  3507  		Units:      "contexts",
  3508  		Fam:        "remoting",
  3509  		Ctx:        "netframework.clrremoting_contexts",
  3510  		Priority:   prioNETFrameworkCLRRemotingContexts,
  3511  		Dims: module.Dims{
  3512  			{ID: "netframework_%s_clrremoting_contexts", Name: "contexts"},
  3513  		},
  3514  	}
  3515  	netFrameworkCLRRemotingCalls = module.Chart{
  3516  		OverModule: "netframework",
  3517  		ID:         "netframework_%s_clrremoting_calls",
  3518  		Title:      "Remote Procedure Calls (RPC) invoked",
  3519  		Units:      "calls/s",
  3520  		Fam:        "remoting",
  3521  		Ctx:        "netframework.clrremoting_remote_calls",
  3522  		Priority:   prioNETFrameworkCLRRemotingRemoteCalls,
  3523  		Dims: module.Dims{
  3524  			{ID: "netframework_%s_clrremoting_remote_calls_total", Name: "rpc", Algo: module.Incremental},
  3525  		},
  3526  	}
  3527  
  3528  	// Security
  3529  	netFrameworkCLRSecurityLinkTimeChecks = module.Chart{
  3530  		OverModule: "netframework",
  3531  		ID:         "netframework_%s_clrsecurity_link_time_checks",
  3532  		Title:      "Link-time code access security checks",
  3533  		Units:      "checks/s",
  3534  		Fam:        "security",
  3535  		Ctx:        "netframework.clrsecurity_link_time_checks",
  3536  		Priority:   prioNETFrameworkCLRSecurityLinkTimeChecks,
  3537  		Dims: module.Dims{
  3538  			{ID: "netframework_%s_clrsecurity_link_time_checks_total", Name: "linktime", Algo: module.Incremental},
  3539  		},
  3540  	}
  3541  	netFrameworkCLRSecurityChecksTime = module.Chart{
  3542  		OverModule: "netframework",
  3543  		ID:         "netframework_%s_clrsecurity_checks_time",
  3544  		Title:      "Time spent performing runtime code access security checks",
  3545  		Units:      "percentage",
  3546  		Fam:        "security",
  3547  		Ctx:        "netframework.clrsecurity_checks_time",
  3548  		Priority:   prioNETFrameworkCLRSecurityRTChecksTime,
  3549  		Dims: module.Dims{
  3550  			{ID: "netframework_%s_clrsecurity_checks_time_percent", Name: "time"},
  3551  		},
  3552  	}
  3553  	netFrameworkCLRSecurityStackWalkDepth = module.Chart{
  3554  		OverModule: "netframework",
  3555  		ID:         "netframework_%s_clrsecurity_stack_walk_depth",
  3556  		Title:      "Depth of the stack",
  3557  		Units:      "depth",
  3558  		Fam:        "security",
  3559  		Ctx:        "netframework.clrsecurity_stack_walk_depth",
  3560  		Priority:   prioNETFrameworkCLRSecurityStackWalkDepth,
  3561  		Dims: module.Dims{
  3562  			{ID: "netframework_%s_clrsecurity_stack_walk_depth", Name: "stack"},
  3563  		},
  3564  	}
  3565  	netFrameworkCLRSecurityRuntimeChecks = module.Chart{
  3566  		OverModule: "netframework",
  3567  		ID:         "netframework_%s_clrsecurity_runtime_checks",
  3568  		Title:      "Runtime code access security checks performed",
  3569  		Units:      "checks/s",
  3570  		Fam:        "security",
  3571  		Ctx:        "netframework.clrsecurity_runtime_checks",
  3572  		Priority:   prioNETFrameworkCLRSecurityRuntimeChecks,
  3573  		Dims: module.Dims{
  3574  			{ID: "netframework_%s_clrsecurity_runtime_checks_total", Name: "runtime", Algo: module.Incremental},
  3575  		},
  3576  	}
  3577  )
  3578  
  3579  // Service
  3580  var (
  3581  	serviceChartsTmpl = module.Charts{
  3582  		serviceStateChartTmpl.Copy(),
  3583  		serviceStatusChartTmpl.Copy(),
  3584  	}
  3585  	serviceStateChartTmpl = module.Chart{
  3586  		ID:       "service_%s_state",
  3587  		Title:    "Service state",
  3588  		Units:    "state",
  3589  		Fam:      "services",
  3590  		Ctx:      "windows.service_state",
  3591  		Priority: prioServiceState,
  3592  		Dims: module.Dims{
  3593  			{ID: "service_%s_state_running", Name: "running"},
  3594  			{ID: "service_%s_state_stopped", Name: "stopped"},
  3595  			{ID: "service_%s_state_start_pending", Name: "start_pending"},
  3596  			{ID: "service_%s_state_stop_pending", Name: "stop_pending"},
  3597  			{ID: "service_%s_state_continue_pending", Name: "continue_pending"},
  3598  			{ID: "service_%s_state_pause_pending", Name: "pause_pending"},
  3599  			{ID: "service_%s_state_paused", Name: "paused"},
  3600  			{ID: "service_%s_state_unknown", Name: "unknown"},
  3601  		},
  3602  	}
  3603  	serviceStatusChartTmpl = module.Chart{
  3604  		ID:       "service_%s_status",
  3605  		Title:    "Service status",
  3606  		Units:    "status",
  3607  		Fam:      "services",
  3608  		Ctx:      "windows.service_status",
  3609  		Priority: prioServiceStatus,
  3610  		Dims: module.Dims{
  3611  			{ID: "service_%s_status_ok", Name: "ok"},
  3612  			{ID: "service_%s_status_error", Name: "error"},
  3613  			{ID: "service_%s_status_unknown", Name: "unknown"},
  3614  			{ID: "service_%s_status_degraded", Name: "degraded"},
  3615  			{ID: "service_%s_status_pred_fail", Name: "pred_fail"},
  3616  			{ID: "service_%s_status_starting", Name: "starting"},
  3617  			{ID: "service_%s_status_stopping", Name: "stopping"},
  3618  			{ID: "service_%s_status_service", Name: "service"},
  3619  			{ID: "service_%s_status_stressed", Name: "stressed"},
  3620  			{ID: "service_%s_status_nonrecover", Name: "nonrecover"},
  3621  			{ID: "service_%s_status_no_contact", Name: "no_contact"},
  3622  			{ID: "service_%s_status_lost_comm", Name: "lost_comm"},
  3623  		},
  3624  	}
  3625  )
  3626  
  3627  // HyperV
  3628  var (
  3629  	hypervChartsTmpl = module.Charts{
  3630  		hypervVirtualMachinesHealthChart.Copy(),
  3631  		hypervRootPartitionDeviceSpacePagesChart.Copy(),
  3632  		hypervRootPartitionGPASpacePagesChart.Copy(),
  3633  		hypervRootPartitionGPASpaceModificationsChart.Copy(),
  3634  		hypervRootPartitionAttachedDevicesChart.Copy(),
  3635  		hypervRootPartitionDepositedPagesChart.Copy(),
  3636  		hypervRootPartitionSkippedInterrupts.Copy(),
  3637  		hypervRootPartitionDeviceDMAErrorsChart.Copy(),
  3638  		hypervRootPartitionDeviceInterruptErrorsChart.Copy(),
  3639  		hypervRootPartitionDeviceInterruptThrottledEventsChart.Copy(),
  3640  		hypervRootPartitionIOTlbFlushChart.Copy(),
  3641  		hypervRootPartitionAddressSpaceChart.Copy(),
  3642  		hypervRootPartitionVirtualTlbFlushEntries.Copy(),
  3643  		hypervRootPartitionVirtualTlbPages.Copy(),
  3644  	}
  3645  	hypervVirtualMachinesHealthChart = module.Chart{
  3646  		OverModule: "hyperv",
  3647  		ID:         "health_vm",
  3648  		Title:      "Virtual machines health status",
  3649  		Units:      "vms",
  3650  		Fam:        "vms health",
  3651  		Ctx:        "hyperv.vms_health",
  3652  		Priority:   prioHypervVMHealth,
  3653  		Type:       module.Stacked,
  3654  		Dims: module.Dims{
  3655  			{ID: "hyperv_health_ok", Name: "ok"},
  3656  			{ID: "hyperv_health_critical", Name: "critical"},
  3657  		},
  3658  	}
  3659  	hypervRootPartitionDeviceSpacePagesChart = module.Chart{
  3660  		OverModule: "hyperv",
  3661  		ID:         "root_partition_device_space_pages",
  3662  		Title:      "Root partition pages in the device space",
  3663  		Units:      "pages",
  3664  		Fam:        "root partition",
  3665  		Ctx:        "hyperv.root_partition_device_space_pages",
  3666  		Priority:   prioHypervRootPartitionDeviceSpacePages,
  3667  		Dims: module.Dims{
  3668  			{ID: "hyperv_root_partition_4K_device_pages", Name: "4K"},
  3669  			{ID: "hyperv_root_partition_2M_device_pages", Name: "2M"},
  3670  			{ID: "hyperv_root_partition_1G_device_pages", Name: "1G"},
  3671  		},
  3672  	}
  3673  	hypervRootPartitionGPASpacePagesChart = module.Chart{
  3674  		OverModule: "hyperv",
  3675  		ID:         "root_partition_gpa_space_pages",
  3676  		Title:      "Root partition pages in the GPA space",
  3677  		Units:      "pages",
  3678  		Fam:        "root partition",
  3679  		Ctx:        "windows.hyperv_root_partition_gpa_space_pages",
  3680  		Priority:   prioHypervRootPartitionGPASpacePages,
  3681  		Dims: module.Dims{
  3682  			{ID: "hyperv_root_partition_4K_gpa_pages", Name: "4K"},
  3683  			{ID: "hyperv_root_partition_2M_gpa_pages", Name: "2M"},
  3684  			{ID: "hyperv_root_partition_1G_gpa_pages", Name: "1G"},
  3685  		},
  3686  	}
  3687  	hypervRootPartitionGPASpaceModificationsChart = module.Chart{
  3688  		OverModule: "hyperv",
  3689  		ID:         "root_partition_gpa_space_modifications",
  3690  		Title:      "Root partition GPA space modifications",
  3691  		Units:      "modifications/s",
  3692  		Fam:        "root partition",
  3693  		Ctx:        "hyperv.root_partition_gpa_space_modifications",
  3694  		Priority:   prioHypervRootPartitionGPASpaceModifications,
  3695  		Dims: module.Dims{
  3696  			{ID: "hyperv_root_partition_gpa_space_modifications", Name: "gpa", Algo: module.Incremental},
  3697  		},
  3698  	}
  3699  	hypervRootPartitionAttachedDevicesChart = module.Chart{
  3700  		OverModule: "hyperv",
  3701  		ID:         "root_partition_attached_devices",
  3702  		Title:      "Root partition attached devices",
  3703  		Units:      "devices",
  3704  		Fam:        "root partition",
  3705  		Ctx:        "hyperv.root_partition_attached_devices",
  3706  		Priority:   prioHypervRootPartitionAttachedDevices,
  3707  		Dims: module.Dims{
  3708  			{ID: "hyperv_root_partition_attached_devices", Name: "attached"},
  3709  		},
  3710  	}
  3711  	hypervRootPartitionDepositedPagesChart = module.Chart{
  3712  		OverModule: "hyperv",
  3713  		ID:         "root_partition_deposited_pages",
  3714  		Title:      "Root partition deposited pages",
  3715  		Units:      "pages",
  3716  		Fam:        "root partition",
  3717  		Ctx:        "hyperv.root_partition_deposited_pages",
  3718  		Priority:   prioHypervRootPartitionDepositedPages,
  3719  		Dims: module.Dims{
  3720  			{ID: "hyperv_root_partition_deposited_pages", Name: "deposited"},
  3721  		},
  3722  	}
  3723  	hypervRootPartitionSkippedInterrupts = module.Chart{
  3724  		OverModule: "hyperv",
  3725  		ID:         "root_partition_skipped_interrupts",
  3726  		Title:      "Root partition skipped interrupts",
  3727  		Units:      "interrupts",
  3728  		Fam:        "root partition",
  3729  		Ctx:        "hyperv.root_partition_skipped_interrupts",
  3730  		Priority:   prioHypervRootPartitionSkippedInterrupts,
  3731  		Dims: module.Dims{
  3732  			{ID: "hyperv_root_partition_physical_pages_allocated", Name: "skipped"},
  3733  		},
  3734  	}
  3735  	hypervRootPartitionDeviceDMAErrorsChart = module.Chart{
  3736  		OverModule: "hyperv",
  3737  		ID:         "root_partition_device_dma_errors",
  3738  		Title:      "Root partition illegal DMA requests",
  3739  		Units:      "requests",
  3740  		Fam:        "root partition",
  3741  		Ctx:        "hyperv.root_partition_device_dma_errors",
  3742  		Priority:   prioHypervRootPartitionDeviceDMAErrors,
  3743  		Dims: module.Dims{
  3744  			{ID: "hyperv_root_partition_deposited_pages", Name: "illegal_dma"},
  3745  		},
  3746  	}
  3747  	hypervRootPartitionDeviceInterruptErrorsChart = module.Chart{
  3748  		OverModule: "hyperv",
  3749  		ID:         "partition_device_interrupt_errors",
  3750  		Title:      "Root partition illegal interrupt requests",
  3751  		Units:      "requests",
  3752  		Fam:        "root partition",
  3753  		Ctx:        "hyperv.root_partition_device_interrupt_errors",
  3754  		Priority:   prioHypervRootPartitionDeviceInterruptErrors,
  3755  		Dims: module.Dims{
  3756  			{ID: "hyperv_root_partition_device_interrupt_errors", Name: "illegal_interrupt"},
  3757  		},
  3758  	}
  3759  	hypervRootPartitionDeviceInterruptThrottledEventsChart = module.Chart{
  3760  		OverModule: "hyperv",
  3761  		ID:         "root_partition_device_interrupt_throttle_events",
  3762  		Title:      "Root partition throttled interrupts",
  3763  		Units:      "events",
  3764  		Fam:        "root partition",
  3765  		Ctx:        "hyperv.root_partition_device_interrupt_throttle_events",
  3766  		Priority:   prioHypervRootPartitionDeviceInterruptThrottleEvents,
  3767  		Dims: module.Dims{
  3768  			{ID: "hyperv_root_partition_device_interrupt_throttle_events", Name: "throttling"},
  3769  		},
  3770  	}
  3771  	hypervRootPartitionIOTlbFlushChart = module.Chart{
  3772  		OverModule: "hyperv",
  3773  		ID:         "root_partition_io_tbl_flush",
  3774  		Title:      "Root partition flushes of I/O TLBs",
  3775  		Units:      "flushes/s",
  3776  		Fam:        "root partition",
  3777  		Ctx:        "hyperv.root_partition_io_tlb_flush",
  3778  		Priority:   prioHypervRootPartitionIOTlbFlush,
  3779  		Dims: module.Dims{
  3780  			{ID: "hyperv_root_partition_io_tlb_flush", Name: "flushes", Algo: module.Incremental},
  3781  		},
  3782  	}
  3783  	hypervRootPartitionAddressSpaceChart = module.Chart{
  3784  		OverModule: "hyperv",
  3785  		ID:         "root_partition_address_space",
  3786  		Title:      "Root partition address spaces in the virtual TLB",
  3787  		Units:      "address spaces",
  3788  		Fam:        "root partition",
  3789  		Ctx:        "hyperv.root_partition_address_space",
  3790  		Priority:   prioHypervRootPartitionAddressSpace,
  3791  		Dims: module.Dims{
  3792  			{ID: "hyperv_root_partition_address_spaces", Name: "address_spaces"},
  3793  		},
  3794  	}
  3795  	hypervRootPartitionVirtualTlbFlushEntries = module.Chart{
  3796  		OverModule: "hyperv",
  3797  		ID:         "root_partition_virtual_tbl_flush_entries",
  3798  		Title:      "Root partition flushes of the entire virtual TLB",
  3799  		Units:      "flushes/s",
  3800  		Fam:        "root partition",
  3801  		Ctx:        "hyperv.root_partition_virtual_tlb_flush_entries",
  3802  		Priority:   prioHypervRootPartitionVirtualTlbFlushEntires,
  3803  		Dims: module.Dims{
  3804  			{ID: "hyperv_root_partition_virtual_tlb_flush_entires", Name: "flushes", Algo: module.Incremental},
  3805  		},
  3806  	}
  3807  	hypervRootPartitionVirtualTlbPages = module.Chart{
  3808  		OverModule: "hyperv",
  3809  		ID:         "root_partition_virtual_tlb_pages",
  3810  		Title:      "Root partition pages used by the virtual TLB",
  3811  		Units:      "pages",
  3812  		Fam:        "root partition",
  3813  		Ctx:        "hyperv.root_partition_virtual_tlb_pages",
  3814  		Priority:   prioHypervRootPartitionVirtualTlbPages,
  3815  		Dims: module.Dims{
  3816  			{ID: "hyperv_root_partition_virtual_tlb_pages", Name: "used"},
  3817  		},
  3818  	}
  3819  )
  3820  
  3821  // HyperV VM Memory
  3822  var (
  3823  	hypervVMChartsTemplate = module.Charts{
  3824  		hypervHypervVMCPUUsageChartTmpl.Copy(),
  3825  		hypervHypervVMMemoryPhysicalChartTmpl.Copy(),
  3826  		hypervHypervVMMemoryPhysicalGuestVisibleChartTmpl.Copy(),
  3827  		hypervHypervVMMemoryPressureCurrentChartTmpl.Copy(),
  3828  		hypervVIDPhysicalPagesAllocatedChartTmpl.Copy(),
  3829  		hypervVIDRemotePhysicalPagesChartTmpl.Copy(),
  3830  	}
  3831  	hypervHypervVMCPUUsageChartTmpl = module.Chart{
  3832  		OverModule: "hyperv",
  3833  		ID:         "vm_%s_cpu_usage",
  3834  		Title:      "VM CPU usage (100% = 1 core)",
  3835  		Units:      "percentage",
  3836  		Fam:        "vm cpu",
  3837  		Ctx:        "hyperv.vm_cpu_usage",
  3838  		Priority:   prioHypervVMCPUUsage,
  3839  		Type:       module.Stacked,
  3840  		Dims: module.Dims{
  3841  			{ID: "hyperv_vm_%s_cpu_guest_run_time", Name: "guest", Div: 1e5, Algo: module.Incremental},
  3842  			{ID: "hyperv_vm_%s_cpu_hypervisor_run_time", Name: "hypervisor", Div: 1e5, Algo: module.Incremental},
  3843  			{ID: "hyperv_vm_%s_cpu_remote_run_time", Name: "remote", Div: 1e5, Algo: module.Incremental},
  3844  		},
  3845  	}
  3846  	hypervHypervVMMemoryPhysicalChartTmpl = module.Chart{
  3847  		OverModule: "hyperv",
  3848  		ID:         "vm_%s_memory_physical",
  3849  		Title:      "VM assigned memory",
  3850  		Units:      "MiB",
  3851  		Fam:        "vm mem",
  3852  		Ctx:        "hyperv.vm_memory_physical",
  3853  		Priority:   prioHypervVMMemoryPhysical,
  3854  		Dims: module.Dims{
  3855  			{ID: "hyperv_vm_%s_memory_physical", Name: "assigned_memory"},
  3856  		},
  3857  	}
  3858  	hypervHypervVMMemoryPhysicalGuestVisibleChartTmpl = module.Chart{
  3859  		OverModule: "hyperv",
  3860  		ID:         "vm_%s_memory_physical_guest_visible",
  3861  		Title:      "VM guest visible memory",
  3862  		Units:      "MiB",
  3863  		Fam:        "vm mem",
  3864  		Ctx:        "hyperv.vm_memory_physical_guest_visible",
  3865  		Priority:   prioHypervVMMemoryPhysicalGuestVisible,
  3866  		Dims: module.Dims{
  3867  			{ID: "hyperv_vm_%s_memory_physical_guest_visible", Name: "visible_memory"},
  3868  		},
  3869  	}
  3870  	hypervHypervVMMemoryPressureCurrentChartTmpl = module.Chart{
  3871  		OverModule: "hyperv",
  3872  		ID:         "vm_%s_memory_pressure_current",
  3873  		Title:      "VM current pressure",
  3874  		Units:      "percentage",
  3875  		Fam:        "vm mem",
  3876  		Ctx:        "hyperv.vm_memory_pressure_current",
  3877  		Priority:   prioHypervVMMemoryPressureCurrent,
  3878  		Dims: module.Dims{
  3879  			{ID: "hyperv_vm_%s_memory_pressure_current", Name: "pressure"},
  3880  		},
  3881  	}
  3882  	hypervVIDPhysicalPagesAllocatedChartTmpl = module.Chart{
  3883  		OverModule: "hyperv",
  3884  		ID:         "vm_%s_vid_physical_pages_allocated",
  3885  		Title:      "VM physical pages allocated",
  3886  		Units:      "pages",
  3887  		Fam:        "vm mem",
  3888  		Ctx:        "hyperv.vm_vid_physical_pages_allocated",
  3889  		Priority:   prioHypervVIDPhysicalPagesAllocated,
  3890  		Dims: module.Dims{
  3891  			{ID: "hyperv_vid_%s_physical_pages_allocated", Name: "allocated"},
  3892  		},
  3893  	}
  3894  	hypervVIDRemotePhysicalPagesChartTmpl = module.Chart{
  3895  		OverModule: "hyperv",
  3896  		ID:         "vm_%s_remote_physical_pages",
  3897  		Title:      "VM physical pages not allocated from the preferred NUMA node",
  3898  		Units:      "pages",
  3899  		Fam:        "vm mem",
  3900  		Ctx:        "hyperv.vm_vid_remote_physical_pages",
  3901  		Priority:   prioHypervVIDRemotePhysicalPages,
  3902  		Dims: module.Dims{
  3903  			{ID: "hyperv_vid_%s_remote_physical_pages", Name: "remote_physical"},
  3904  		},
  3905  	}
  3906  )
  3907  
  3908  // HyperV VM storage device
  3909  var (
  3910  	hypervVMDeviceChartsTemplate = module.Charts{
  3911  		hypervVMDeviceIOChartTmpl.Copy(),
  3912  		hypervVMDeviceIOPSChartTmpl.Copy(),
  3913  		hypervVMDeviceErrorCountChartTmpl.Copy(),
  3914  	}
  3915  	hypervVMDeviceIOChartTmpl = module.Chart{
  3916  		OverModule: "hyperv",
  3917  		ID:         "vm_device_%s_bytes_read",
  3918  		Title:      "VM storage device IO",
  3919  		Units:      "bytes/s",
  3920  		Fam:        "vm disk",
  3921  		Ctx:        "hyperv.vm_device_bytes",
  3922  		Priority:   prioHypervVMDeviceBytes,
  3923  		Type:       module.Area,
  3924  		Dims: module.Dims{
  3925  			{ID: "hyperv_vm_device_%s_bytes_read", Name: "read", Algo: module.Incremental},
  3926  			{ID: "hyperv_vm_device_%s_bytes_written", Name: "written", Algo: module.Incremental},
  3927  		},
  3928  	}
  3929  	hypervVMDeviceIOPSChartTmpl = module.Chart{
  3930  		OverModule: "hyperv",
  3931  		ID:         "vm_device_%s_operation_read",
  3932  		Title:      "VM storage device IOPS",
  3933  		Units:      "operations/s",
  3934  		Fam:        "vm disk",
  3935  		Ctx:        "hyperv.vm_device_operations",
  3936  		Priority:   prioHypervVMDeviceOperations,
  3937  		Dims: module.Dims{
  3938  			{ID: "hyperv_vm_device_%s_operations_read", Name: "read", Algo: module.Incremental},
  3939  			{ID: "hyperv_vm_device_%s_operations_written", Name: "write", Algo: module.Incremental},
  3940  		},
  3941  	}
  3942  	hypervVMDeviceErrorCountChartTmpl = module.Chart{
  3943  		OverModule: "hyperv",
  3944  		ID:         "vm_device_%s_error_count",
  3945  		Title:      "VM storage device errors",
  3946  		Units:      "errors/s",
  3947  		Fam:        "vm disk",
  3948  		Ctx:        "hyperv.vm_device_errors",
  3949  		Priority:   prioHypervVMDeviceErrors,
  3950  		Dims: module.Dims{
  3951  			{ID: "hyperv_vm_device_%s_error_count", Name: "errors", Algo: module.Incremental},
  3952  		},
  3953  	}
  3954  )
  3955  
  3956  // HyperV VM network interface
  3957  var (
  3958  	hypervVMInterfaceChartsTemplate = module.Charts{
  3959  		hypervVMInterfaceTrafficChartTmpl.Copy(),
  3960  		hypervVMInterfacePacketsChartTmpl.Copy(),
  3961  		hypervVMInterfacePacketsDroppedChartTmpl.Copy(),
  3962  	}
  3963  
  3964  	hypervVMInterfaceTrafficChartTmpl = module.Chart{
  3965  		OverModule: "hyperv",
  3966  		ID:         "vm_interface_%s_bytes",
  3967  		Title:      "VM interface traffic",
  3968  		Units:      "bytes/s",
  3969  		Fam:        "vm net",
  3970  		Ctx:        "hyperv.vm_interface_bytes",
  3971  		Priority:   prioHypervVMInterfaceBytes,
  3972  		Type:       module.Area,
  3973  		Dims: module.Dims{
  3974  			{ID: "hyperv_vm_interface_%s_bytes_received", Name: "received", Algo: module.Incremental},
  3975  			{ID: "hyperv_vm_interface_%s_bytes_sent", Name: "sent", Algo: module.Incremental},
  3976  		},
  3977  	}
  3978  	hypervVMInterfacePacketsChartTmpl = module.Chart{
  3979  		OverModule: "hyperv",
  3980  		ID:         "vm_interface_%s_packets",
  3981  		Title:      "VM interface packets",
  3982  		Units:      "packets/s",
  3983  		Fam:        "vm net",
  3984  		Ctx:        "hyperv.vm_interface_packets",
  3985  		Priority:   prioHypervVMInterfacePackets,
  3986  		Dims: module.Dims{
  3987  			{ID: "hyperv_vm_interface_%s_packets_received", Name: "received", Algo: module.Incremental},
  3988  			{ID: "hyperv_vm_interface_%s_packets_sent", Name: "sent", Algo: module.Incremental},
  3989  		},
  3990  	}
  3991  	hypervVMInterfacePacketsDroppedChartTmpl = module.Chart{
  3992  		OverModule: "hyperv",
  3993  		ID:         "vm_interface_%s_packets_dropped",
  3994  		Title:      "VM interface packets dropped",
  3995  		Units:      "drops/s",
  3996  		Fam:        "vm net",
  3997  		Ctx:        "hyperv.vm_interface_packets_dropped",
  3998  		Priority:   prioHypervVMInterfacePacketsDropped,
  3999  		Dims: module.Dims{
  4000  			{ID: "hyperv_vm_interface_%s_packets_incoming_dropped", Name: "incoming", Algo: module.Incremental},
  4001  			{ID: "hyperv_vm_interface_%s_packets_outgoing_dropped", Name: "outgoing", Algo: module.Incremental},
  4002  		},
  4003  	}
  4004  )
  4005  
  4006  // HyperV Virtual Switch
  4007  var (
  4008  	hypervVswitchChartsTemplate = module.Charts{
  4009  		hypervVswitchTrafficChartTmpl.Copy(),
  4010  		hypervVswitchPacketsChartTmpl.Copy(),
  4011  		hypervVswitchDirectedPacketsChartTmpl.Copy(),
  4012  		hypervVswitchBroadcastPacketsChartTmpl.Copy(),
  4013  		hypervVswitchMulticastPacketsChartTmpl.Copy(),
  4014  		hypervVswitchDroppedPacketsChartTmpl.Copy(),
  4015  		hypervVswitchExtensionDroppedPacketsChartTmpl.Copy(),
  4016  		hypervVswitchPacketsFloodedTotalChartTmpl.Copy(),
  4017  		hypervVswitchLearnedMACAddressChartTmpl.Copy(),
  4018  		hypervVswitchPurgedMACAddressChartTmpl.Copy(),
  4019  	}
  4020  
  4021  	hypervVswitchTrafficChartTmpl = module.Chart{
  4022  		OverModule: "hyperv",
  4023  		ID:         "vswitch_%s_traffic",
  4024  		Title:      "Virtual switch traffic",
  4025  		Units:      "bytes/s",
  4026  		Fam:        "vswitch traffic",
  4027  		Ctx:        "hyperv.vswitch_bytes",
  4028  		Priority:   prioHypervVswitchTrafficTotal,
  4029  		Type:       module.Area,
  4030  		Dims: module.Dims{
  4031  			{ID: "hyperv_vswitch_%s_bytes_received_total", Name: "received", Algo: module.Incremental},
  4032  			{ID: "hyperv_vswitch_%s_bytes_sent_total", Name: "sent", Algo: module.Incremental},
  4033  		},
  4034  	}
  4035  	hypervVswitchPacketsChartTmpl = module.Chart{
  4036  		OverModule: "hyperv",
  4037  		ID:         "vswitch_%s_packets",
  4038  		Title:      "Virtual switch packets",
  4039  		Units:      "packets/s",
  4040  		Fam:        "vswitch packets",
  4041  		Ctx:        "hyperv.vswitch_packets",
  4042  		Priority:   prioHypervVswitchPackets,
  4043  		Dims: module.Dims{
  4044  			{ID: "hyperv_vswitch_%s_packets_received_total", Name: "received", Algo: module.Incremental},
  4045  			// FIXME: https://github.com/prometheus-community/windows_exporter/pull/1201
  4046  			//{ID: "hyperv_vswitch_%s_packets_sent_total", Name: "sent", Algo: module.Incremental},
  4047  		},
  4048  	}
  4049  	hypervVswitchDirectedPacketsChartTmpl = module.Chart{
  4050  		OverModule: "hyperv",
  4051  		ID:         "vswitch_%s_directed_packets",
  4052  		Title:      "Virtual switch directed packets",
  4053  		Units:      "packets/s",
  4054  		Fam:        "vswitch packets",
  4055  		Ctx:        "hyperv.vswitch_directed_packets",
  4056  		Priority:   prioHypervVswitchDirectedPackets,
  4057  		Dims: module.Dims{
  4058  			{ID: "hyperv_vswitch_%s_directed_packets_received_total", Name: "received", Algo: module.Incremental},
  4059  			{ID: "hyperv_vswitch_%s_directed_packets_send_total", Name: "sent", Algo: module.Incremental},
  4060  		},
  4061  	}
  4062  	hypervVswitchBroadcastPacketsChartTmpl = module.Chart{
  4063  		OverModule: "hyperv",
  4064  		ID:         "vswitch_%s_broadcast_packets",
  4065  		Title:      "Virtual switch broadcast packets",
  4066  		Units:      "packets/s",
  4067  		Fam:        "vswitch packets",
  4068  		Ctx:        "hyperv.vswitch_broadcast_packets",
  4069  		Priority:   prioHypervVswitchBroadcastPackets,
  4070  		Dims: module.Dims{
  4071  			{ID: "hyperv_vswitch_%s_broadcast_packets_received_total", Name: "received", Algo: module.Incremental},
  4072  			{ID: "hyperv_vswitch_%s_broadcast_packets_sent_total", Name: "sent", Algo: module.Incremental},
  4073  		},
  4074  	}
  4075  	hypervVswitchMulticastPacketsChartTmpl = module.Chart{
  4076  		OverModule: "hyperv",
  4077  		ID:         "vswitch_%s_multicast_packets",
  4078  		Title:      "Virtual switch multicast packets",
  4079  		Units:      "packets/s",
  4080  		Fam:        "vswitch packets",
  4081  		Ctx:        "hyperv.vswitch_multicast_packets",
  4082  		Priority:   prioHypervVswitchMulticastPackets,
  4083  		Dims: module.Dims{
  4084  			{ID: "hyperv_vswitch_%s_multicast_packets_received_total", Name: "received", Algo: module.Incremental},
  4085  			{ID: "hyperv_vswitch_%s_multicast_packets_sent_total", Name: "sent", Algo: module.Incremental},
  4086  		},
  4087  	}
  4088  	hypervVswitchDroppedPacketsChartTmpl = module.Chart{
  4089  		OverModule: "hyperv",
  4090  		ID:         "vswitch_%s_dropped_packets",
  4091  		Title:      "Virtual switch dropped packets",
  4092  		Units:      "drops/s",
  4093  		Fam:        "vswitch drops",
  4094  		Ctx:        "hyperv.vswitch_dropped_packets",
  4095  		Priority:   prioHypervVswitchDroppedPackets,
  4096  		Dims: module.Dims{
  4097  			{ID: "hyperv_vswitch_%s_dropped_packets_incoming_total", Name: "incoming", Algo: module.Incremental},
  4098  			{ID: "hyperv_vswitch_%s_dropped_packets_outcoming_total", Name: "outgoing", Algo: module.Incremental},
  4099  		},
  4100  	}
  4101  	hypervVswitchExtensionDroppedPacketsChartTmpl = module.Chart{
  4102  		OverModule: "hyperv",
  4103  		ID:         "vswitch_%s_extensions_dropped_packets_incoming",
  4104  		Title:      "Virtual switch extensions dropped packets",
  4105  		Units:      "drops/s",
  4106  		Fam:        "vswitch drops",
  4107  		Ctx:        "hyperv.vswitch_extensions_dropped_packets",
  4108  		Priority:   prioHypervVswitchExtensionsDroppedPackets,
  4109  		Dims: module.Dims{
  4110  			{ID: "hyperv_vswitch_%s_extensions_dropped_packets_incoming_total", Name: "incoming", Algo: module.Incremental},
  4111  			{ID: "hyperv_vswitch_%s_extensions_dropped_packets_outcoming_total", Name: "outgoing", Algo: module.Incremental},
  4112  		},
  4113  	}
  4114  	hypervVswitchPacketsFloodedTotalChartTmpl = module.Chart{
  4115  		OverModule: "hyperv",
  4116  		ID:         "vswitch_%s_packets_flooded",
  4117  		Title:      "Virtual switch flooded packets",
  4118  		Units:      "packets/s",
  4119  		Fam:        "vswitch flood",
  4120  		Ctx:        "hyperv.vswitch_packets_flooded",
  4121  		Priority:   prioHypervVswitchPacketsFlooded,
  4122  		Dims: module.Dims{
  4123  			{ID: "hyperv_vswitch_%s_packets_flooded_total", Name: "flooded", Algo: module.Incremental},
  4124  		},
  4125  	}
  4126  	hypervVswitchLearnedMACAddressChartTmpl = module.Chart{
  4127  		OverModule: "hyperv",
  4128  		ID:         "vswitch_%s_learned_mac_addresses",
  4129  		Title:      "Virtual switch learned MAC addresses",
  4130  		Units:      "mac addresses/s",
  4131  		Fam:        "vswitch mac addresses",
  4132  		Ctx:        "hyperv.vswitch_learned_mac_addresses",
  4133  		Priority:   prioHypervVswitchLearnedMACAddresses,
  4134  		Dims: module.Dims{
  4135  			{ID: "hyperv_vswitch_%s_learned_mac_addresses_total", Name: "learned", Algo: module.Incremental},
  4136  		},
  4137  	}
  4138  	hypervVswitchPurgedMACAddressChartTmpl = module.Chart{
  4139  		OverModule: "hyperv",
  4140  		ID:         "vswitch_%s_purged_mac_addresses",
  4141  		Title:      "Virtual switch purged MAC addresses",
  4142  		Units:      "mac addresses/s",
  4143  		Fam:        "vswitch mac addresses",
  4144  		Ctx:        "hyperv.vswitch_purged_mac_addresses",
  4145  		Priority:   prioHypervVswitchPurgeMACAddress,
  4146  		Dims: module.Dims{
  4147  			{ID: "hyperv_vswitch_%s_purged_mac_addresses_total", Name: "purged", Algo: module.Incremental},
  4148  		},
  4149  	}
  4150  )
  4151  
  4152  // Collectors
  4153  var (
  4154  	collectorChartsTmpl = module.Charts{
  4155  		collectorDurationChartTmpl.Copy(),
  4156  		collectorStatusChartTmpl.Copy(),
  4157  	}
  4158  	collectorDurationChartTmpl = module.Chart{
  4159  		ID:       "collector_%s_duration",
  4160  		Title:    "Duration of a data collection",
  4161  		Units:    "seconds",
  4162  		Fam:      "collection",
  4163  		Ctx:      "windows.collector_duration",
  4164  		Priority: prioCollectorDuration,
  4165  		Dims: module.Dims{
  4166  			{ID: "collector_%s_duration", Name: "duration", Div: precision},
  4167  		},
  4168  	}
  4169  	collectorStatusChartTmpl = module.Chart{
  4170  		ID:       "collector_%s_status",
  4171  		Title:    "Status of a data collection",
  4172  		Units:    "status",
  4173  		Fam:      "collection",
  4174  		Ctx:      "windows.collector_status",
  4175  		Priority: prioCollectorStatus,
  4176  		Dims: module.Dims{
  4177  			{ID: "collector_%s_status_success", Name: "success"},
  4178  			{ID: "collector_%s_status_fail", Name: "fail"},
  4179  		},
  4180  	}
  4181  )
  4182  
  4183  func (w *Windows) addCPUCharts() {
  4184  	charts := cpuCharts.Copy()
  4185  
  4186  	if err := w.Charts().Add(*charts...); err != nil {
  4187  		w.Warning(err)
  4188  	}
  4189  }
  4190  
  4191  func (w *Windows) addCPUCoreCharts(core string) {
  4192  	charts := cpuCoreChartsTmpl.Copy()
  4193  
  4194  	for _, chart := range *charts {
  4195  		chart.ID = fmt.Sprintf(chart.ID, core)
  4196  		chart.Labels = []module.Label{
  4197  			{Key: "core", Value: core},
  4198  		}
  4199  		for _, dim := range chart.Dims {
  4200  			dim.ID = fmt.Sprintf(dim.ID, core)
  4201  		}
  4202  	}
  4203  
  4204  	if err := w.Charts().Add(*charts...); err != nil {
  4205  		w.Warning(err)
  4206  	}
  4207  }
  4208  
  4209  func (w *Windows) removeCPUCoreCharts(core string) {
  4210  	px := fmt.Sprintf("cpu_core_%s", core)
  4211  	w.removeCharts(px)
  4212  }
  4213  
  4214  func (w *Windows) addMemoryCharts() {
  4215  	charts := memCharts.Copy()
  4216  
  4217  	if err := w.Charts().Add(*charts...); err != nil {
  4218  		w.Warning(err)
  4219  	}
  4220  }
  4221  
  4222  func (w *Windows) addDiskCharts(disk string) {
  4223  	charts := diskChartsTmpl.Copy()
  4224  
  4225  	for _, chart := range *charts {
  4226  		chart.ID = fmt.Sprintf(chart.ID, disk)
  4227  		chart.Labels = []module.Label{
  4228  			{Key: "disk", Value: disk},
  4229  		}
  4230  		for _, dim := range chart.Dims {
  4231  			dim.ID = fmt.Sprintf(dim.ID, disk)
  4232  		}
  4233  	}
  4234  
  4235  	if err := w.Charts().Add(*charts...); err != nil {
  4236  		w.Warning(err)
  4237  	}
  4238  }
  4239  
  4240  func (w *Windows) removeDiskCharts(disk string) {
  4241  	px := fmt.Sprintf("logical_disk_%s", disk)
  4242  	w.removeCharts(px)
  4243  }
  4244  
  4245  func (w *Windows) addNICCharts(nic string) {
  4246  	charts := nicChartsTmpl.Copy()
  4247  
  4248  	for _, chart := range *charts {
  4249  		chart.ID = fmt.Sprintf(chart.ID, nic)
  4250  		chart.Labels = []module.Label{
  4251  			{Key: "nic", Value: nic},
  4252  		}
  4253  		for _, dim := range chart.Dims {
  4254  			dim.ID = fmt.Sprintf(dim.ID, nic)
  4255  		}
  4256  	}
  4257  
  4258  	if err := w.Charts().Add(*charts...); err != nil {
  4259  		w.Warning(err)
  4260  	}
  4261  }
  4262  
  4263  func (w *Windows) removeNICCharts(nic string) {
  4264  	px := fmt.Sprintf("nic_%s", nic)
  4265  	w.removeCharts(px)
  4266  }
  4267  
  4268  func (w *Windows) addTCPCharts() {
  4269  	charts := tcpCharts.Copy()
  4270  
  4271  	if err := w.Charts().Add(*charts...); err != nil {
  4272  		w.Warning(err)
  4273  	}
  4274  }
  4275  
  4276  func (w *Windows) addOSCharts() {
  4277  	charts := osCharts.Copy()
  4278  
  4279  	if err := w.Charts().Add(*charts...); err != nil {
  4280  		w.Warning(err)
  4281  	}
  4282  }
  4283  
  4284  func (w *Windows) addSystemCharts() {
  4285  	charts := systemCharts.Copy()
  4286  
  4287  	if err := w.Charts().Add(*charts...); err != nil {
  4288  		w.Warning(err)
  4289  	}
  4290  }
  4291  
  4292  func (w *Windows) addLogonCharts() {
  4293  	charts := logonCharts.Copy()
  4294  
  4295  	if err := w.Charts().Add(*charts...); err != nil {
  4296  		w.Warning(err)
  4297  	}
  4298  }
  4299  
  4300  func (w *Windows) addADFSCharts() {
  4301  	charts := adfsCharts.Copy()
  4302  
  4303  	if err := w.Charts().Add(*charts...); err != nil {
  4304  		w.Warning(err)
  4305  	}
  4306  }
  4307  
  4308  func (w *Windows) addExchangeCharts() {
  4309  	charts := exchangeCharts.Copy()
  4310  
  4311  	if err := w.Charts().Add(*charts...); err != nil {
  4312  		w.Warning(err)
  4313  	}
  4314  }
  4315  
  4316  func (w *Windows) addExchangeWorkloadCharts(name string) {
  4317  	charts := exchangeWorkloadChartsTmpl.Copy()
  4318  
  4319  	for _, chart := range *charts {
  4320  		chart.ID = fmt.Sprintf(chart.ID, name)
  4321  		chart.Labels = []module.Label{
  4322  			{Key: "workload", Value: name},
  4323  		}
  4324  		for _, dim := range chart.Dims {
  4325  			dim.ID = fmt.Sprintf(dim.ID, name)
  4326  		}
  4327  	}
  4328  
  4329  	if err := w.Charts().Add(*charts...); err != nil {
  4330  		w.Warning(err)
  4331  	}
  4332  }
  4333  
  4334  func (w *Windows) removeExchangeWorkloadCharts(name string) {
  4335  	px := fmt.Sprintf("exchange_workload_%s", name)
  4336  	w.removeCharts(px)
  4337  }
  4338  
  4339  func (w *Windows) addExchangeLDAPCharts(name string) {
  4340  	charts := exchangeLDAPChartsTmpl.Copy()
  4341  
  4342  	for _, chart := range *charts {
  4343  		chart.ID = fmt.Sprintf(chart.ID, name)
  4344  		chart.Labels = []module.Label{
  4345  			{Key: "ldap_process", Value: name},
  4346  		}
  4347  		for _, dim := range chart.Dims {
  4348  			dim.ID = fmt.Sprintf(dim.ID, name)
  4349  		}
  4350  	}
  4351  
  4352  	if err := w.Charts().Add(*charts...); err != nil {
  4353  		w.Warning(err)
  4354  	}
  4355  }
  4356  
  4357  func (w *Windows) removeExchangeLDAPCharts(name string) {
  4358  	px := fmt.Sprintf("exchange_ldap_%s", name)
  4359  	w.removeCharts(px)
  4360  }
  4361  
  4362  func (w *Windows) addExchangeHTTPProxyCharts(name string) {
  4363  	charts := exchangeHTTPProxyChartsTmpl.Copy()
  4364  
  4365  	for _, chart := range *charts {
  4366  		chart.ID = fmt.Sprintf(chart.ID, name)
  4367  		chart.Labels = []module.Label{
  4368  			{Key: "http_proxy", Value: name},
  4369  		}
  4370  		for _, dim := range chart.Dims {
  4371  			dim.ID = fmt.Sprintf(dim.ID, name)
  4372  		}
  4373  	}
  4374  
  4375  	if err := w.Charts().Add(*charts...); err != nil {
  4376  		w.Warning(err)
  4377  	}
  4378  }
  4379  
  4380  func (w *Windows) removeExchangeHTTPProxyCharts(name string) {
  4381  	px := fmt.Sprintf("exchange_http_proxy_%s", name)
  4382  	w.removeCharts(px)
  4383  }
  4384  
  4385  func (w *Windows) addThermalZoneCharts(zone string) {
  4386  	charts := thermalzoneChartsTmpl.Copy()
  4387  
  4388  	for _, chart := range *charts {
  4389  		chart.ID = fmt.Sprintf(chart.ID, zone)
  4390  		chart.Labels = []module.Label{
  4391  			{Key: "thermalzone", Value: zone},
  4392  		}
  4393  		for _, dim := range chart.Dims {
  4394  			dim.ID = fmt.Sprintf(dim.ID, zone)
  4395  		}
  4396  	}
  4397  
  4398  	if err := w.Charts().Add(*charts...); err != nil {
  4399  		w.Warning(err)
  4400  	}
  4401  }
  4402  
  4403  func (w *Windows) removeThermalZoneCharts(zone string) {
  4404  	px := fmt.Sprintf("thermalzone_%s", zone)
  4405  	w.removeCharts(px)
  4406  }
  4407  
  4408  func (w *Windows) addIISWebsiteCharts(website string) {
  4409  	charts := iisWebsiteChartsTmpl.Copy()
  4410  
  4411  	for _, chart := range *charts {
  4412  		chart.ID = fmt.Sprintf(chart.ID, website)
  4413  		chart.Labels = []module.Label{
  4414  			{Key: "website", Value: website},
  4415  		}
  4416  		for _, dim := range chart.Dims {
  4417  			dim.ID = fmt.Sprintf(dim.ID, website)
  4418  		}
  4419  	}
  4420  
  4421  	if err := w.Charts().Add(*charts...); err != nil {
  4422  		w.Warning(err)
  4423  	}
  4424  }
  4425  
  4426  func (w *Windows) removeIIWebsiteSCharts(website string) {
  4427  	px := fmt.Sprintf("iis_website_%s", website)
  4428  	w.removeCharts(px)
  4429  }
  4430  
  4431  func (w *Windows) addMSSQLDBCharts(instance string, dbname string) {
  4432  	charts := mssqlDatabaseChartsTmpl.Copy()
  4433  
  4434  	for _, chart := range *charts {
  4435  		chart.ID = fmt.Sprintf(chart.ID, dbname, instance)
  4436  		chart.Labels = []module.Label{
  4437  			{Key: "mssql_instance", Value: instance},
  4438  			{Key: "database", Value: dbname},
  4439  		}
  4440  		for _, dim := range chart.Dims {
  4441  			dim.ID = fmt.Sprintf(dim.ID, dbname, instance)
  4442  		}
  4443  	}
  4444  
  4445  	if err := w.Charts().Add(*charts...); err != nil {
  4446  		w.Warning(err)
  4447  	}
  4448  }
  4449  
  4450  func (w *Windows) removeMSSQLDBCharts(instance string, dbname string) {
  4451  	px := fmt.Sprintf("mssql_db_%s_instance_%s", dbname, instance)
  4452  	w.removeCharts(px)
  4453  }
  4454  
  4455  func (w *Windows) addMSSQLInstanceCharts(instance string) {
  4456  	charts := mssqlInstanceChartsTmpl.Copy()
  4457  
  4458  	for _, chart := range *charts {
  4459  		chart.ID = fmt.Sprintf(chart.ID, instance)
  4460  		chart.Labels = []module.Label{
  4461  			{Key: "mssql_instance", Value: instance},
  4462  		}
  4463  		for _, dim := range chart.Dims {
  4464  			dim.ID = fmt.Sprintf(dim.ID, instance)
  4465  		}
  4466  	}
  4467  
  4468  	if err := w.Charts().Add(*charts...); err != nil {
  4469  		w.Warning(err)
  4470  	}
  4471  }
  4472  
  4473  func (w *Windows) removeMSSQLInstanceCharts(instance string) {
  4474  	px := fmt.Sprintf("mssql_instance_%s", instance)
  4475  	w.removeCharts(px)
  4476  }
  4477  
  4478  func (w *Windows) addProcessesCharts() {
  4479  	charts := processesCharts.Copy()
  4480  
  4481  	if err := w.Charts().Add(*charts...); err != nil {
  4482  		w.Warning(err)
  4483  	}
  4484  }
  4485  
  4486  func (w *Windows) addADCharts() {
  4487  	charts := adCharts.Copy()
  4488  
  4489  	if err := w.Charts().Add(*charts...); err != nil {
  4490  		w.Warning(err)
  4491  	}
  4492  }
  4493  
  4494  func (w *Windows) addCertificateTemplateCharts(template string) {
  4495  	charts := adcsCertTemplateChartsTmpl.Copy()
  4496  
  4497  	for _, chart := range *charts {
  4498  		chart.ID = fmt.Sprintf(chart.ID, template)
  4499  		chart.Labels = []module.Label{
  4500  			{Key: "cert_template", Value: template},
  4501  		}
  4502  		for _, dim := range chart.Dims {
  4503  			dim.ID = fmt.Sprintf(dim.ID, template)
  4504  		}
  4505  	}
  4506  
  4507  	if err := w.Charts().Add(*charts...); err != nil {
  4508  		w.Warning(err)
  4509  	}
  4510  }
  4511  
  4512  func (w *Windows) removeCertificateTemplateCharts(template string) {
  4513  	px := fmt.Sprintf("adcs_cert_template_%s", template)
  4514  	w.removeCharts(px)
  4515  }
  4516  
  4517  func (w *Windows) addProcessToCharts(procID string) {
  4518  	for _, chart := range *w.Charts() {
  4519  		var dim *module.Dim
  4520  		switch chart.ID {
  4521  		case processesCPUUtilizationTotalChart.ID:
  4522  			id := fmt.Sprintf("process_%s_cpu_time", procID)
  4523  			dim = &module.Dim{ID: id, Name: procID, Algo: module.Incremental, Div: 1000, Mul: 100}
  4524  			if procID == "Idle" {
  4525  				dim.Hidden = true
  4526  			}
  4527  		case processesMemoryUsageChart.ID:
  4528  			id := fmt.Sprintf("process_%s_working_set_private_bytes", procID)
  4529  			dim = &module.Dim{ID: id, Name: procID}
  4530  		case processesIOBytesChart.ID:
  4531  			id := fmt.Sprintf("process_%s_io_bytes", procID)
  4532  			dim = &module.Dim{ID: id, Name: procID, Algo: module.Incremental}
  4533  		case processesIOOperationsChart.ID:
  4534  			id := fmt.Sprintf("process_%s_io_operations", procID)
  4535  			dim = &module.Dim{ID: id, Name: procID, Algo: module.Incremental}
  4536  		case processesPageFaultsChart.ID:
  4537  			id := fmt.Sprintf("process_%s_page_faults", procID)
  4538  			dim = &module.Dim{ID: id, Name: procID, Algo: module.Incremental}
  4539  		case processesPageFileBytes.ID:
  4540  			id := fmt.Sprintf("process_%s_page_file_bytes", procID)
  4541  			dim = &module.Dim{ID: id, Name: procID}
  4542  		case processesThreads.ID:
  4543  			id := fmt.Sprintf("process_%s_threads", procID)
  4544  			dim = &module.Dim{ID: id, Name: procID}
  4545  		case processesHandlesChart.ID:
  4546  			id := fmt.Sprintf("process_%s_handles", procID)
  4547  			dim = &module.Dim{ID: id, Name: procID}
  4548  		default:
  4549  			continue
  4550  		}
  4551  
  4552  		if dim == nil {
  4553  			continue
  4554  		}
  4555  		if err := chart.AddDim(dim); err != nil {
  4556  			w.Warning(err)
  4557  			continue
  4558  		}
  4559  		chart.MarkNotCreated()
  4560  	}
  4561  }
  4562  
  4563  func (w *Windows) removeProcessFromCharts(procID string) {
  4564  	for _, chart := range *w.Charts() {
  4565  		var id string
  4566  		switch chart.ID {
  4567  		case processesCPUUtilizationTotalChart.ID:
  4568  			id = fmt.Sprintf("process_%s_cpu_time", procID)
  4569  		case processesMemoryUsageChart.ID:
  4570  			id = fmt.Sprintf("process_%s_working_set_private_bytes", procID)
  4571  		case processesIOBytesChart.ID:
  4572  			id = fmt.Sprintf("process_%s_io_bytes", procID)
  4573  		case processesIOOperationsChart.ID:
  4574  			id = fmt.Sprintf("process_%s_io_operations", procID)
  4575  		case processesPageFaultsChart.ID:
  4576  			id = fmt.Sprintf("process_%s_page_faults", procID)
  4577  		case processesPageFileBytes.ID:
  4578  			id = fmt.Sprintf("process_%s_page_file_bytes", procID)
  4579  		case processesThreads.ID:
  4580  			id = fmt.Sprintf("process_%s_threads", procID)
  4581  		case processesHandlesChart.ID:
  4582  			id = fmt.Sprintf("process_%s_handles", procID)
  4583  		default:
  4584  			continue
  4585  		}
  4586  
  4587  		if err := chart.MarkDimRemove(id, false); err != nil {
  4588  			w.Warning(err)
  4589  			continue
  4590  		}
  4591  		chart.MarkNotCreated()
  4592  	}
  4593  }
  4594  
  4595  func (w *Windows) addProcessNetFrameworkExceptionsCharts(procName string) {
  4596  	charts := netFrameworkCLRExceptionsChartsTmpl.Copy()
  4597  
  4598  	for _, chart := range *charts {
  4599  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4600  		chart.Labels = []module.Label{
  4601  			{Key: "process", Value: procName},
  4602  		}
  4603  		for _, dim := range chart.Dims {
  4604  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4605  		}
  4606  	}
  4607  
  4608  	if err := w.Charts().Add(*charts...); err != nil {
  4609  		w.Warning(err)
  4610  	}
  4611  }
  4612  
  4613  func (w *Windows) removeProcessFromNetFrameworkExceptionsCharts(procName string) {
  4614  	px := fmt.Sprintf("netframework_%s_clrexception", strings.ToLower(procName))
  4615  	w.removeCharts(px)
  4616  }
  4617  
  4618  func (w *Windows) addProcessNetFrameworkInteropCharts(procName string) {
  4619  	charts := netFrameworkCLRInteropChartsTmpl.Copy()
  4620  
  4621  	for _, chart := range *charts {
  4622  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4623  		chart.Labels = []module.Label{
  4624  			{Key: "process", Value: procName},
  4625  		}
  4626  		for _, dim := range chart.Dims {
  4627  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4628  		}
  4629  	}
  4630  
  4631  	if err := w.Charts().Add(*charts...); err != nil {
  4632  		w.Warning(err)
  4633  	}
  4634  }
  4635  
  4636  func (w *Windows) removeProcessNetFrameworkInteropCharts(procName string) {
  4637  	px := fmt.Sprintf("netframework_%s_clrinterop", strings.ToLower(procName))
  4638  	w.removeCharts(px)
  4639  }
  4640  
  4641  func (w *Windows) addProcessNetFrameworkJITCharts(procName string) {
  4642  	charts := netFrameworkCLRJITChartsTmpl.Copy()
  4643  
  4644  	for _, chart := range *charts {
  4645  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4646  		chart.Labels = []module.Label{
  4647  			{Key: "process", Value: procName},
  4648  		}
  4649  		for _, dim := range chart.Dims {
  4650  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4651  		}
  4652  	}
  4653  
  4654  	if err := w.Charts().Add(*charts...); err != nil {
  4655  		w.Warning(err)
  4656  	}
  4657  }
  4658  
  4659  func (w *Windows) removeProcessNetFrameworkJITCharts(procName string) {
  4660  	px := fmt.Sprintf("netframework_%s_clrjit", strings.ToLower(procName))
  4661  	w.removeCharts(px)
  4662  }
  4663  
  4664  func (w *Windows) addProcessNetFrameworkLoadingCharts(procName string) {
  4665  	charts := netFrameworkCLRLoadingChartsTmpl.Copy()
  4666  
  4667  	for _, chart := range *charts {
  4668  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4669  		chart.Labels = []module.Label{
  4670  			{Key: "process", Value: procName},
  4671  		}
  4672  		for _, dim := range chart.Dims {
  4673  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4674  		}
  4675  	}
  4676  
  4677  	if err := w.Charts().Add(*charts...); err != nil {
  4678  		w.Warning(err)
  4679  	}
  4680  }
  4681  
  4682  func (w *Windows) removeProcessNetFrameworkLoadingCharts(procName string) {
  4683  	px := fmt.Sprintf("netframework_%s_clrloading", strings.ToLower(procName))
  4684  	w.removeCharts(px)
  4685  }
  4686  
  4687  func (w *Windows) addProcessNetFrameworkLocksAndThreadsCharts(procName string) {
  4688  	charts := netFrameworkCLRLocksAndThreadsChartsTmpl.Copy()
  4689  
  4690  	for _, chart := range *charts {
  4691  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4692  		chart.Labels = []module.Label{
  4693  			{Key: "process", Value: procName},
  4694  		}
  4695  		for _, dim := range chart.Dims {
  4696  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4697  		}
  4698  	}
  4699  
  4700  	if err := w.Charts().Add(*charts...); err != nil {
  4701  		w.Warning(err)
  4702  	}
  4703  }
  4704  
  4705  func (w *Windows) removeProcessNetFrameworkLocksAndThreadsCharts(procName string) {
  4706  	px := fmt.Sprintf("netframework_%s_clrlocksandthreads", strings.ToLower(procName))
  4707  	w.removeCharts(px)
  4708  }
  4709  
  4710  func (w *Windows) addProcessNetFrameworkMemoryCharts(procName string) {
  4711  	charts := netFrameworkCLRMemoryChartsTmpl.Copy()
  4712  
  4713  	for _, chart := range *charts {
  4714  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4715  		chart.Labels = []module.Label{
  4716  			{Key: "process", Value: procName},
  4717  		}
  4718  		for _, dim := range chart.Dims {
  4719  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4720  		}
  4721  	}
  4722  
  4723  	if err := w.Charts().Add(*charts...); err != nil {
  4724  		w.Warning(err)
  4725  	}
  4726  }
  4727  
  4728  func (w *Windows) removeProcessNetFrameworkMemoryCharts(procName string) {
  4729  	px := fmt.Sprintf("netframework_%s_clrmemory", strings.ToLower(procName))
  4730  	w.removeCharts(px)
  4731  }
  4732  
  4733  func (w *Windows) addProcessNetFrameworkRemotingCharts(procName string) {
  4734  	charts := netFrameworkCLRRemotingChartsTmpl.Copy()
  4735  
  4736  	for _, chart := range *charts {
  4737  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4738  		chart.Labels = []module.Label{
  4739  			{Key: "process", Value: procName},
  4740  		}
  4741  		for _, dim := range chart.Dims {
  4742  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4743  		}
  4744  	}
  4745  
  4746  	if err := w.Charts().Add(*charts...); err != nil {
  4747  		w.Warning(err)
  4748  	}
  4749  }
  4750  
  4751  func (w *Windows) removeProcessNetFrameworkRemotingCharts(procName string) {
  4752  	px := fmt.Sprintf("netframework_%s_clrremoting", strings.ToLower(procName))
  4753  	w.removeCharts(px)
  4754  }
  4755  
  4756  func (w *Windows) addProcessNetFrameworkSecurityCharts(procName string) {
  4757  	charts := netFrameworkCLRSecurityChartsTmpl.Copy()
  4758  
  4759  	for _, chart := range *charts {
  4760  		chart.ID = fmt.Sprintf(chart.ID, strings.ToLower(procName))
  4761  		chart.Labels = []module.Label{
  4762  			{Key: "process", Value: procName},
  4763  		}
  4764  		for _, dim := range chart.Dims {
  4765  			dim.ID = fmt.Sprintf(dim.ID, procName)
  4766  		}
  4767  	}
  4768  
  4769  	if err := w.Charts().Add(*charts...); err != nil {
  4770  		w.Warning(err)
  4771  	}
  4772  }
  4773  
  4774  func (w *Windows) removeProcessNetFrameworkSecurityCharts(procName string) {
  4775  	px := fmt.Sprintf("netframework_%s_clrsecurity", strings.ToLower(procName))
  4776  	w.removeCharts(px)
  4777  }
  4778  
  4779  func (w *Windows) addServiceCharts(svc string) {
  4780  	charts := serviceChartsTmpl.Copy()
  4781  
  4782  	for _, chart := range *charts {
  4783  		chart.ID = fmt.Sprintf(chart.ID, svc)
  4784  		chart.Labels = []module.Label{
  4785  			{Key: "service", Value: svc},
  4786  		}
  4787  		for _, dim := range chart.Dims {
  4788  			dim.ID = fmt.Sprintf(dim.ID, svc)
  4789  		}
  4790  	}
  4791  
  4792  	if err := w.Charts().Add(*charts...); err != nil {
  4793  		w.Warning(err)
  4794  	}
  4795  }
  4796  
  4797  func (w *Windows) removeServiceCharts(svc string) {
  4798  	px := fmt.Sprintf("service_%s", svc)
  4799  	w.removeCharts(px)
  4800  }
  4801  
  4802  func (w *Windows) addCollectorCharts(name string) {
  4803  	charts := collectorChartsTmpl.Copy()
  4804  
  4805  	for _, chart := range *charts {
  4806  		chart.ID = fmt.Sprintf(chart.ID, name)
  4807  		chart.Labels = []module.Label{
  4808  			{Key: "collector", Value: name},
  4809  		}
  4810  		for _, dim := range chart.Dims {
  4811  			dim.ID = fmt.Sprintf(dim.ID, name)
  4812  		}
  4813  	}
  4814  
  4815  	if err := w.Charts().Add(*charts...); err != nil {
  4816  		w.Warning(err)
  4817  	}
  4818  }
  4819  
  4820  func (w *Windows) addHypervCharts() {
  4821  	charts := hypervChartsTmpl.Copy()
  4822  
  4823  	if err := w.Charts().Add(*charts...); err != nil {
  4824  		w.Warning(err)
  4825  	}
  4826  }
  4827  
  4828  func (w *Windows) addHypervVMCharts(vm string) {
  4829  	charts := hypervVMChartsTemplate.Copy()
  4830  	n := hypervCleanName(vm)
  4831  
  4832  	for _, chart := range *charts {
  4833  		chart.ID = fmt.Sprintf(chart.ID, n)
  4834  		chart.Labels = []module.Label{
  4835  			{Key: "vm_name", Value: vm},
  4836  		}
  4837  		for _, dim := range chart.Dims {
  4838  			dim.ID = fmt.Sprintf(dim.ID, n)
  4839  		}
  4840  	}
  4841  
  4842  	if err := w.Charts().Add(*charts...); err != nil {
  4843  		w.Warning(err)
  4844  	}
  4845  }
  4846  
  4847  func (w *Windows) removeHypervVMCharts(vm string) {
  4848  	px := fmt.Sprintf("vm_%s", hypervCleanName(vm))
  4849  	w.removeCharts(px)
  4850  }
  4851  
  4852  func (w *Windows) addHypervVMDeviceCharts(device string) {
  4853  	charts := hypervVMDeviceChartsTemplate.Copy()
  4854  	n := hypervCleanName(device)
  4855  
  4856  	for _, chart := range *charts {
  4857  		chart.ID = fmt.Sprintf(chart.ID, n)
  4858  		chart.Labels = []module.Label{
  4859  			{Key: "vm_device", Value: device},
  4860  		}
  4861  		for _, dim := range chart.Dims {
  4862  			dim.ID = fmt.Sprintf(dim.ID, n)
  4863  		}
  4864  	}
  4865  
  4866  	if err := w.Charts().Add(*charts...); err != nil {
  4867  		w.Warning(err)
  4868  	}
  4869  }
  4870  
  4871  func (w *Windows) removeHypervVMDeviceCharts(device string) {
  4872  	px := fmt.Sprintf("vm_device_%s", hypervCleanName(device))
  4873  	w.removeCharts(px)
  4874  }
  4875  
  4876  func (w *Windows) addHypervVMInterfaceCharts(iface string) {
  4877  	charts := hypervVMInterfaceChartsTemplate.Copy()
  4878  	n := hypervCleanName(iface)
  4879  
  4880  	for _, chart := range *charts {
  4881  		chart.ID = fmt.Sprintf(chart.ID, n)
  4882  		chart.Labels = []module.Label{
  4883  			{Key: "vm_interface", Value: iface},
  4884  		}
  4885  		for _, dim := range chart.Dims {
  4886  			dim.ID = fmt.Sprintf(dim.ID, n)
  4887  		}
  4888  	}
  4889  
  4890  	if err := w.Charts().Add(*charts...); err != nil {
  4891  		w.Warning(err)
  4892  	}
  4893  }
  4894  
  4895  func (w *Windows) removeHypervVMInterfaceCharts(iface string) {
  4896  	px := fmt.Sprintf("vm_interface_%s", hypervCleanName(iface))
  4897  	w.removeCharts(px)
  4898  }
  4899  
  4900  func (w *Windows) addHypervVSwitchCharts(vswitch string) {
  4901  	charts := hypervVswitchChartsTemplate.Copy()
  4902  	n := hypervCleanName(vswitch)
  4903  
  4904  	for _, chart := range *charts {
  4905  		chart.ID = fmt.Sprintf(chart.ID, n)
  4906  		chart.Labels = []module.Label{
  4907  			{Key: "vswitch", Value: vswitch},
  4908  		}
  4909  		for _, dim := range chart.Dims {
  4910  			dim.ID = fmt.Sprintf(dim.ID, n)
  4911  		}
  4912  	}
  4913  
  4914  	if err := w.Charts().Add(*charts...); err != nil {
  4915  		w.Warning(err)
  4916  	}
  4917  }
  4918  
  4919  func (w *Windows) removeHypervVSwitchCharts(vswitch string) {
  4920  	px := fmt.Sprintf("vswitch_%s", hypervCleanName(vswitch))
  4921  	w.removeCharts(px)
  4922  }
  4923  
  4924  func (w *Windows) removeCollectorCharts(name string) {
  4925  	px := fmt.Sprintf("collector_%s", name)
  4926  	w.removeCharts(px)
  4927  }
  4928  
  4929  func (w *Windows) removeCharts(prefix string) {
  4930  	for _, chart := range *w.Charts() {
  4931  		if strings.HasPrefix(chart.ID, prefix) {
  4932  			chart.MarkRemove()
  4933  			chart.MarkNotCreated()
  4934  		}
  4935  	}
  4936  }