summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/windows/collect_hyperv.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/windows/collect_hyperv.go288
1 files changed, 288 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/windows/collect_hyperv.go b/src/go/collectors/go.d.plugin/modules/windows/collect_hyperv.go
new file mode 100644
index 000000000..8fecbf8f5
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/windows/collect_hyperv.go
@@ -0,0 +1,288 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package windows
+
+import (
+ "strings"
+
+ "github.com/netdata/netdata/go/go.d.plugin/pkg/prometheus"
+)
+
+const (
+ metricHypervHealthCritical = "windows_hyperv_health_critical"
+ metricHypervHealthOK = "windows_hyperv_health_ok"
+
+ metricHypervRootPartition4KGPAPages = "windows_hyperv_root_partition_4K_gpa_pages"
+ metricHypervRootPartition2MGPAPages = "windows_hyperv_root_partition_2M_gpa_pages"
+ metricHypervRootPartition1GGPAPages = "windows_hyperv_root_partition_1G_gpa_pages"
+ metricHypervRootPartition4KDevicePages = "windows_hyperv_root_partition_4K_device_pages"
+ metricHypervRootPartition2MDevicePages = "windows_hyperv_root_partition_2M_device_pages"
+ metricHypervRootPartition1GDevicePages = "windows_hyperv_root_partition_1G_device_pages"
+ metricHypervRootPartitionGPASpaceModifications = "windows_hyperv_root_partition_gpa_space_modifications"
+ metricHypervRootPartitionAttachedDevices = "windows_hyperv_root_partition_attached_devices"
+ metricHypervRootPartitionDepositedPages = "windows_hyperv_root_partition_deposited_pages"
+ metricHypervRootPartitionPhysicalPagesAllocated = "windows_hyperv_root_partition_physical_pages_allocated" // SkippedTimerTicks
+ metricHypervRootPartitionDeviceDMAErrors = "windows_hyperv_root_partition_device_dma_errors"
+ metricHypervRootPartitionDeviceInterruptErrors = "windows_hyperv_root_partition_device_interrupt_errors"
+ metricHypervRootPartitionDeviceInterruptThrottleEvents = "windows_hyperv_root_partition_device_interrupt_throttle_events"
+ metricHypervRootPartitionIOTLBFlush = "windows_hyperv_root_partition_io_tlb_flush"
+ metricHypervRootPartitionAddressSpace = "windows_hyperv_root_partition_address_spaces"
+ metricHypervRootPartitionVirtualTLBPages = "windows_hyperv_root_partition_virtual_tlb_pages"
+ metricHypervRootPartitionVirtualTLBFlushEntries = "windows_hyperv_root_partition_virtual_tlb_flush_entires"
+
+ metricsHypervVMCPUGuestRunTime = "windows_hyperv_vm_cpu_guest_run_time"
+ metricsHypervVMCPUHypervisorRunTime = "windows_hyperv_vm_cpu_hypervisor_run_time"
+ metricsHypervVMCPURemoteRunTime = "windows_hyperv_vm_cpu_remote_run_time"
+ metricsHypervVMCPUTotalRunTime = "windows_hyperv_vm_cpu_total_run_time"
+
+ metricHypervVMMemoryPhysical = "windows_hyperv_vm_memory_physical"
+ metricHypervVMMemoryPhysicalGuestVisible = "windows_hyperv_vm_memory_physical_guest_visible"
+ metricHypervVMMemoryPressureCurrent = "windows_hyperv_vm_memory_pressure_current"
+ metricHyperVVIDPhysicalPagesAllocated = "windows_hyperv_vid_physical_pages_allocated"
+ metricHyperVVIDRemotePhysicalPages = "windows_hyperv_vid_remote_physical_pages"
+
+ metricHypervVMDeviceBytesRead = "windows_hyperv_vm_device_bytes_read"
+ metricHypervVMDeviceBytesWritten = "windows_hyperv_vm_device_bytes_written"
+ metricHypervVMDeviceOperationsRead = "windows_hyperv_vm_device_operations_read"
+ metricHypervVMDeviceOperationsWritten = "windows_hyperv_vm_device_operations_written"
+ metricHypervVMDeviceErrorCount = "windows_hyperv_vm_device_error_count"
+
+ metricHypervVMInterfaceBytesReceived = "windows_hyperv_vm_interface_bytes_received"
+ metricHypervVMInterfaceBytesSent = "windows_hyperv_vm_interface_bytes_sent"
+ metricHypervVMInterfacePacketsIncomingDropped = "windows_hyperv_vm_interface_packets_incoming_dropped"
+ metricHypervVMInterfacePacketsOutgoingDropped = "windows_hyperv_vm_interface_packets_outgoing_dropped"
+ metricHypervVMInterfacePacketsReceived = "windows_hyperv_vm_interface_packets_received"
+ metricHypervVMInterfacePacketsSent = "windows_hyperv_vm_interface_packets_sent"
+
+ metricHypervVSwitchBroadcastPacketsReceivedTotal = "windows_hyperv_vswitch_broadcast_packets_received_total"
+ metricHypervVSwitchBroadcastPacketsSentTotal = "windows_hyperv_vswitch_broadcast_packets_sent_total"
+ metricHypervVSwitchBytesReceivedTotal = "windows_hyperv_vswitch_bytes_received_total"
+ metricHypervVSwitchBytesSentTotal = "windows_hyperv_vswitch_bytes_sent_total"
+ metricHypervVSwitchPacketsReceivedTotal = "windows_hyperv_vswitch_packets_received_total"
+ metricHypervVSwitchPacketsSentTotal = "windows_hyperv_vswitch_packets_sent_total"
+ metricHypervVSwitchDirectedPacketsReceivedTotal = "windows_hyperv_vswitch_directed_packets_received_total"
+ metricHypervVSwitchDirectedPacketsSendTotal = "windows_hyperv_vswitch_directed_packets_send_total"
+ metricHypervVSwitchDroppedPacketsIncomingTotal = "windows_hyperv_vswitch_dropped_packets_incoming_total"
+ metricHypervVSwitchDroppedPacketsOutcomingTotal = "windows_hyperv_vswitch_dropped_packets_outcoming_total"
+ metricHypervVSwitchExtensionDroppedAttacksIncomingTotal = "windows_hyperv_vswitch_extensions_dropped_packets_incoming_total"
+ metricHypervVSwitchExtensionDroppedPacketsOutcomingTotal = "windows_hyperv_vswitch_extensions_dropped_packets_outcoming_total"
+ metricHypervVSwitchLearnedMACAddressTotal = "windows_hyperv_vswitch_learned_mac_addresses_total"
+ metricHypervVSwitchMulticastPacketsReceivedTotal = "windows_hyperv_vswitch_multicast_packets_received_total"
+ metricHypervVSwitchMulticastPacketsSentTotal = "windows_hyperv_vswitch_multicast_packets_sent_total"
+ metricHypervVSwitchNumberOfSendChannelMovesTotal = "windows_hyperv_vswitch_number_of_send_channel_moves_total"
+ metricHypervVSwitchNumberOfVMQMovesTotal = "windows_hyperv_vswitch_number_of_vmq_moves_total"
+ metricHypervVSwitchPacketsFloodedTotal = "windows_hyperv_vswitch_packets_flooded_total"
+ metricHypervVSwitchPurgedMACAddresses = "windows_hyperv_vswitch_purged_mac_addresses_total"
+)
+
+func (w *Windows) collectHyperv(mx map[string]int64, pms prometheus.Series) {
+ if !w.cache.collection[collectorHyperv] {
+ w.cache.collection[collectorHyperv] = true
+ w.addHypervCharts()
+ }
+
+ for _, v := range []string{
+ metricHypervHealthOK,
+ metricHypervHealthCritical,
+ metricHypervRootPartition4KGPAPages,
+ metricHypervRootPartition2MGPAPages,
+ metricHypervRootPartition1GGPAPages,
+ metricHypervRootPartition4KDevicePages,
+ metricHypervRootPartition2MDevicePages,
+ metricHypervRootPartition1GDevicePages,
+ metricHypervRootPartitionGPASpaceModifications,
+ metricHypervRootPartitionAddressSpace,
+ metricHypervRootPartitionAttachedDevices,
+ metricHypervRootPartitionDepositedPages,
+ metricHypervRootPartitionPhysicalPagesAllocated,
+ metricHypervRootPartitionDeviceDMAErrors,
+ metricHypervRootPartitionDeviceInterruptErrors,
+ metricHypervRootPartitionDeviceInterruptThrottleEvents,
+ metricHypervRootPartitionIOTLBFlush,
+ metricHypervRootPartitionVirtualTLBPages,
+ metricHypervRootPartitionVirtualTLBFlushEntries,
+ } {
+ for _, pm := range pms.FindByName(v) {
+ name := strings.TrimPrefix(pm.Name(), "windows_")
+ mx[name] = int64(pm.Value)
+ }
+ }
+
+ w.collectHypervVM(mx, pms)
+ w.collectHypervVMDevices(mx, pms)
+ w.collectHypervVMInterface(mx, pms)
+ w.collectHypervVSwitch(mx, pms)
+}
+
+func (w *Windows) collectHypervVM(mx map[string]int64, pms prometheus.Series) {
+ seen := make(map[string]bool)
+ px := "hyperv_vm_"
+
+ for _, v := range []string{
+ metricHypervVMMemoryPhysical,
+ metricHypervVMMemoryPhysicalGuestVisible,
+ metricHypervVMMemoryPressureCurrent,
+ metricsHypervVMCPUGuestRunTime,
+ metricsHypervVMCPUHypervisorRunTime,
+ metricsHypervVMCPURemoteRunTime,
+ } {
+ for _, pm := range pms.FindByName(v) {
+ if vm := pm.Labels.Get("vm"); vm != "" {
+ name := strings.TrimPrefix(pm.Name(), "windows_hyperv_vm")
+ seen[vm] = true
+ mx[px+hypervCleanName(vm)+name] += int64(pm.Value)
+ }
+ }
+ }
+
+ px = "hyperv_vid_"
+ for _, v := range []string{
+ metricHyperVVIDPhysicalPagesAllocated,
+ metricHyperVVIDRemotePhysicalPages,
+ } {
+ for _, pm := range pms.FindByName(v) {
+ if vm := pm.Labels.Get("vm"); vm != "" {
+ name := strings.TrimPrefix(pm.Name(), "windows_hyperv_vid")
+ seen[vm] = true
+ mx[px+hypervCleanName(vm)+name] = int64(pm.Value)
+ }
+ }
+ }
+
+ for v := range seen {
+ if !w.cache.hypervVMMem[v] {
+ w.cache.hypervVMMem[v] = true
+ w.addHypervVMCharts(v)
+ }
+ }
+ for v := range w.cache.hypervVMMem {
+ if !seen[v] {
+ delete(w.cache.hypervVMMem, v)
+ w.removeHypervVMCharts(v)
+ }
+ }
+}
+
+func (w *Windows) collectHypervVMDevices(mx map[string]int64, pms prometheus.Series) {
+ seen := make(map[string]bool)
+ px := "hyperv_vm_device_"
+
+ for _, v := range []string{
+ metricHypervVMDeviceBytesRead,
+ metricHypervVMDeviceBytesWritten,
+ metricHypervVMDeviceOperationsRead,
+ metricHypervVMDeviceOperationsWritten,
+ metricHypervVMDeviceErrorCount,
+ } {
+ for _, pm := range pms.FindByName(v) {
+ if device := pm.Labels.Get("vm_device"); device != "" {
+ name := strings.TrimPrefix(pm.Name(), "windows_hyperv_vm_device")
+ seen[device] = true
+ mx[px+hypervCleanName(device)+name] = int64(pm.Value)
+ }
+ }
+ }
+
+ for v := range seen {
+ if !w.cache.hypervVMDevices[v] {
+ w.cache.hypervVMDevices[v] = true
+ w.addHypervVMDeviceCharts(v)
+ }
+ }
+ for v := range w.cache.hypervVMDevices {
+ if !seen[v] {
+ delete(w.cache.hypervVMDevices, v)
+ w.removeHypervVMDeviceCharts(v)
+ }
+ }
+}
+
+func (w *Windows) collectHypervVMInterface(mx map[string]int64, pms prometheus.Series) {
+ seen := make(map[string]bool)
+ px := "hyperv_vm_interface_"
+
+ for _, v := range []string{
+ metricHypervVMInterfaceBytesReceived,
+ metricHypervVMInterfaceBytesSent,
+ metricHypervVMInterfacePacketsIncomingDropped,
+ metricHypervVMInterfacePacketsOutgoingDropped,
+ metricHypervVMInterfacePacketsReceived,
+ metricHypervVMInterfacePacketsSent,
+ } {
+ for _, pm := range pms.FindByName(v) {
+ if iface := pm.Labels.Get("vm_interface"); iface != "" {
+ name := strings.TrimPrefix(pm.Name(), "windows_hyperv_vm_interface")
+ seen[iface] = true
+ mx[px+hypervCleanName(iface)+name] = int64(pm.Value)
+ }
+ }
+ }
+
+ for v := range seen {
+ if !w.cache.hypervVMInterfaces[v] {
+ w.cache.hypervVMInterfaces[v] = true
+ w.addHypervVMInterfaceCharts(v)
+ }
+ }
+ for v := range w.cache.hypervVMInterfaces {
+ if !seen[v] {
+ delete(w.cache.hypervVMInterfaces, v)
+ w.removeHypervVMInterfaceCharts(v)
+ }
+ }
+}
+
+func (w *Windows) collectHypervVSwitch(mx map[string]int64, pms prometheus.Series) {
+ seen := make(map[string]bool)
+ px := "hyperv_vswitch_"
+
+ for _, v := range []string{
+ metricHypervVSwitchBytesReceivedTotal,
+ metricHypervVSwitchBytesSentTotal,
+ metricHypervVSwitchPacketsReceivedTotal,
+ metricHypervVSwitchPacketsSentTotal,
+ metricHypervVSwitchDirectedPacketsReceivedTotal,
+ metricHypervVSwitchDirectedPacketsSendTotal,
+ metricHypervVSwitchBroadcastPacketsReceivedTotal,
+ metricHypervVSwitchBroadcastPacketsSentTotal,
+ metricHypervVSwitchMulticastPacketsReceivedTotal,
+ metricHypervVSwitchMulticastPacketsSentTotal,
+ metricHypervVSwitchDroppedPacketsIncomingTotal,
+ metricHypervVSwitchDroppedPacketsOutcomingTotal,
+ metricHypervVSwitchExtensionDroppedAttacksIncomingTotal,
+ metricHypervVSwitchExtensionDroppedPacketsOutcomingTotal,
+ metricHypervVSwitchPacketsFloodedTotal,
+ metricHypervVSwitchLearnedMACAddressTotal,
+ metricHypervVSwitchPurgedMACAddresses,
+ metricHypervVSwitchNumberOfSendChannelMovesTotal,
+ metricHypervVSwitchNumberOfVMQMovesTotal,
+ } {
+ for _, pm := range pms.FindByName(v) {
+ if vswitch := pm.Labels.Get("vswitch"); vswitch != "" {
+ name := strings.TrimPrefix(pm.Name(), "windows_hyperv_vswitch")
+ seen[vswitch] = true
+ mx[px+hypervCleanName(vswitch)+name] = int64(pm.Value)
+ }
+ }
+ }
+
+ for v := range seen {
+ if !w.cache.hypervVswitch[v] {
+ w.cache.hypervVswitch[v] = true
+ w.addHypervVSwitchCharts(v)
+ }
+ }
+ for v := range w.cache.hypervVswitch {
+ if !seen[v] {
+ delete(w.cache.hypervVswitch, v)
+ w.removeHypervVSwitchCharts(v)
+ }
+ }
+}
+
+var hypervNameReplacer = strings.NewReplacer(" ", "_", "?", "_", ":", "_", ".", "_")
+
+func hypervCleanName(name string) string {
+ name = hypervNameReplacer.Replace(name)
+ return strings.ToLower(name)
+}