diff --git a/src/collectors/all.h b/src/collectors/all.h index 2052bdf1c7..6892d131e5 100644 --- a/src/collectors/all.h +++ b/src/collectors/all.h @@ -56,7 +56,53 @@ #define NETDATA_CHART_PRIO_SYSTEM_PACKETS 7001 // freebsd only #define NETDATA_CHART_PRIO_WINDOWS_THREADS 8001 // Windows only #define NETDATA_CHART_PRIO_WINDOWS_THERMAL_ZONES 8002 // Windows only -#define NETDATA_CHART_PRIO_WINDOWS_HYPERV 9000 // Windows only + +// ---------------------------------------------------------------------------- +// Hyper-V + +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE 20000 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE_BY_RUN_CONTEXT 20010 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL 20020 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL_GUEST_VISIBLE 20030 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PRESSURE_CURRENT 20040 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_PHYSICAL_PAGES_ALLOCATED 20050 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_REMOTE_PHYSICAL_PAGES 20060 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_TRAFFIC 20070 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_IPSEC_TRAFFIC 20080 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS 20090 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_BROADCAST_PACKETS 20100 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_MULTICAST_PACKETS 20110 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_DIRECTED_PACKETS 20120 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS_DROPPED 20130 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_BYTES 20140 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_ERRORS 20150 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_OPERATIONS 20160 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VMS_HEALTH 20170 + +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_TRAFFIC 20400 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS 20410 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_BROADCAST_PACKETS 20420 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_MULTICAST_PACKETS 20430 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DIRECTED_PACKETS 20440 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS_FLOODED 20450 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DROPPED_PACKETS 20460 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_EXTENSIONS_DROPPED_PACKETS 20470 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_LEARNED_MAC_ADDRESSES 20470 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PURGED_MAC_ADDRESSES 20480 + +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_IO_TLB_FLUSH 20600 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_FLUSH_ENTRIES 20610 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_PAGES 20620 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ADDRESS_SPACE 20630 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ATTACHED_DEVICES 20640 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_DMA_ERRORS 20650 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_ERRORS 20660 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_THROTTLE_EVENTS 20670 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEPOSITED_PAGES 20680 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_PAGES 20690 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_SPACE_PAGES 20700 +#define NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_MODIFICATIONS 20710 +// ---------------------------------------------------------------------------- // CPU per core diff --git a/src/collectors/windows.plugin/perflib-hyperv.c b/src/collectors/windows.plugin/perflib-hyperv.c index e890a8f397..5233619953 100644 --- a/src/collectors/windows.plugin/perflib-hyperv.c +++ b/src/collectors/windows.plugin/perflib-hyperv.c @@ -9,8 +9,6 @@ #define HYPERV "hyperv" -static long chart_priority = NETDATA_CHART_PRIO_WINDOWS_HYPERV; - static void get_and_sanitize_instance_value( PERF_DATA_BLOCK *pDataBlock, PERF_OBJECT_TYPE *pObjectType, @@ -19,7 +17,7 @@ static void get_and_sanitize_instance_value( size_t buffer_size) { // char wstr[8192]; - if (!getInstanceName(pDataBlock, pObjectType, pi, buffer, sizeof(buffer_size))) { + if (!getInstanceName(pDataBlock, pObjectType, pi, buffer, buffer_size)) { strncpyz(buffer, "[unknown]", buffer_size - 1); // return; } @@ -153,7 +151,7 @@ static bool do_hyperv_memory(PERF_DATA_BLOCK *pDataBlock, int update_every, void "bytes", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL, update_every, RRDSET_TYPE_LINE); @@ -167,7 +165,7 @@ static bool do_hyperv_memory(PERF_DATA_BLOCK *pDataBlock, int update_every, void "bytes", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PHYSICAL_GUEST_VISIBLE, update_every, RRDSET_TYPE_LINE); @@ -181,14 +179,14 @@ static bool do_hyperv_memory(PERF_DATA_BLOCK *pDataBlock, int update_every, void "percentage", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_MEMORY_PRESSURE_CURRENT, update_every, RRDSET_TYPE_LINE); - p->rd_CurrentPressure = rrddim_add(p->st_pressure, "pressure", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); - p->rd_PhysicalMemory = rrddim_add(p->st_vm_memory_physical, "assigned_memory", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE); - p->rd_GuestVisiblePhysicalMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "visible_memory", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE); - p->rd_GuestAvailableMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "available_memory", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE); + p->rd_CurrentPressure = rrddim_add(p->st_pressure, "pressure", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); + p->rd_PhysicalMemory = rrddim_add(p->st_vm_memory_physical, "assigned", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE); + p->rd_GuestVisiblePhysicalMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "visible", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE); + p->rd_GuestAvailableMemory = rrddim_add(p->st_vm_memory_physical_guest_visible, "available", NULL, 1024 * 1024, 1, RRD_ALGORITHM_ABSOLUTE); rrdlabels_add(p->st_vm_memory_physical->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); rrdlabels_add(p->st_pressure->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); @@ -250,7 +248,7 @@ static bool do_hyperv_vid_partition(PERF_DATA_BLOCK *pDataBlock, int update_ever "pages", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_PHYSICAL_PAGES_ALLOCATED, update_every, RRDSET_TYPE_LINE); @@ -264,7 +262,7 @@ static bool do_hyperv_vid_partition(PERF_DATA_BLOCK *pDataBlock, int update_ever "pages", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_VID_REMOTE_PHYSICAL_PAGES, update_every, RRDSET_TYPE_LINE); @@ -329,14 +327,12 @@ static bool do_hyperv_health_summary(PERF_DATA_BLOCK *pDataBlock, int update_eve "vms", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VMS_HEALTH, update_every, RRDSET_TYPE_STACKED); p->rd_HealthCritical = rrddim_add(p->st_health, "critical", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); p->rd_HealthOk = rrddim_add(p->st_health, "ok", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - - rrdlabels_add(p->st_health->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); } SETP_DIM_VALUE(st_health, HealthCritical); @@ -490,14 +486,13 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "pages", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_SPACE_PAGES, update_every, RRDSET_TYPE_LINE); p->rd_DeviceSpacePages4K = rrddim_add(p->st_device_space_pages, "4K", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); p->rd_DeviceSpacePages2M = rrddim_add(p->st_device_space_pages, "2M", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); p->rd_DeviceSpacePages1G = rrddim_add(p->st_device_space_pages, "1G", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_device_space_pages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_gpa_space_pages = rrdset_create_localhost( "root_partition_gpa_space_pages", @@ -509,14 +504,13 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "pages", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_PAGES, update_every, RRDSET_TYPE_LINE); p->rd_GPASpacePages4K = rrddim_add(p->st_gpa_space_pages, "4K", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); p->rd_GPASpacePages2M = rrddim_add(p->st_gpa_space_pages, "2M", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); p->rd_GPASpacePages1G = rrddim_add(p->st_gpa_space_pages, "1G", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_gpa_space_pages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_gpa_space_modifications = rrdset_create_localhost( "root_partition_gpa_space_modifications", @@ -528,13 +522,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "modifications/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_GPA_SPACE_MODIFICATIONS, update_every, RRDSET_TYPE_LINE); p->rd_GPASpaceModifications = rrddim_add(p->st_gpa_space_modifications, "gpa", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_gpa_space_modifications->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_attached_devices = rrdset_create_localhost( "root_partition_attached_devices", @@ -546,12 +539,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "devices", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ATTACHED_DEVICES, update_every, RRDSET_TYPE_LINE); p->rd_AttachedDevices = rrddim_add(p->st_attached_devices, "attached", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_attached_devices->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_deposited_pages = rrdset_create_localhost( "root_partition_deposited_pages", @@ -563,12 +555,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "pages", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEPOSITED_PAGES, update_every, RRDSET_TYPE_LINE); p->rd_DepositedPages = rrddim_add(p->st_deposited_pages, "gpa", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_deposited_pages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_DeviceDMAErrors = rrdset_create_localhost( "root_partition_device_dma_errors", @@ -580,13 +571,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "requests", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_DMA_ERRORS, update_every, RRDSET_TYPE_LINE); p->rd_DeviceDMAErrors = rrddim_add(p->st_DeviceDMAErrors, "illegal_dma", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_DeviceDMAErrors->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_DeviceInterruptErrors = rrdset_create_localhost( "root_partition_device_interrupt_errors", @@ -598,13 +588,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "requests", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_ERRORS, update_every, RRDSET_TYPE_LINE); p->rd_DeviceInterruptErrors = rrddim_add(p->st_DeviceInterruptErrors, "illegal_interrupt", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_DeviceInterruptErrors->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_DeviceInterruptThrottleEvents = rrdset_create_localhost( "root_partition_device_interrupt_throttle_events", @@ -616,14 +605,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "events", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_DEVICE_INTERRUPT_THROTTLE_EVENTS, update_every, RRDSET_TYPE_LINE); p->rd_DeviceInterruptThrottleEvents = rrddim_add(p->st_DeviceInterruptThrottleEvents, "throttling", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add( - p->st_DeviceInterruptThrottleEvents->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_IOΤLBFlushesSec = rrdset_create_localhost( "root_partition_io_tlb_flush", @@ -635,12 +622,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "flushes/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_IO_TLB_FLUSH, update_every, RRDSET_TYPE_LINE); p->rd_IOΤLBFlushesSec = rrddim_add(p->st_IOΤLBFlushesSec, "gpa", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); - rrdlabels_add(p->st_IOΤLBFlushesSec->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_AddressSpaces = rrdset_create_localhost( "root_partition_address_space", @@ -652,12 +638,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "address spaces", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_ADDRESS_SPACE, update_every, RRDSET_TYPE_LINE); p->rd_AddressSpaces = rrddim_add(p->st_AddressSpaces, "address_spaces", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_AddressSpaces->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_VirtualTLBPages = rrdset_create_localhost( "root_partition_virtual_tlb_pages", @@ -669,12 +654,11 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "pages", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_PAGES, update_every, RRDSET_TYPE_LINE); p->rd_VirtualTLBPages = rrddim_add(p->st_VirtualTLBPages, "used", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE); - rrdlabels_add(p->st_VirtualTLBPages->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_VirtualTLBFlushEntiresSec = rrdset_create_localhost( "root_partition_virtual_tlb_flush_entries", @@ -686,13 +670,12 @@ static bool do_hyperv_root_partition(PERF_DATA_BLOCK *pDataBlock, int update_eve "flushes/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_ROOT_PARTITION_VIRTUAL_TLB_FLUSH_ENTRIES, update_every, RRDSET_TYPE_LINE); p->rd_VirtualTLBFlushEntiresSec = rrddim_add(p->st_VirtualTLBFlushEntiresSec, "flushes", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); - rrdlabels_add(p->st_VirtualTLBFlushEntiresSec->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); } // Set the data for each dimension @@ -822,10 +805,10 @@ static bool do_hyperv_storage_device(PERF_DATA_BLOCK *pDataBlock, int update_eve HYPERV, HYPERV".vm_storage_device_operations", "VM storage device IOPS", - "operations/sec", + "operations/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_OPERATIONS, update_every, RRDSET_TYPE_LINE); @@ -843,10 +826,10 @@ static bool do_hyperv_storage_device(PERF_DATA_BLOCK *pDataBlock, int update_eve HYPERV, HYPERV".vm_storage_device_bytes", "VM storage device IO", - "bytes/sec", + "bytes/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_BYTES, update_every, RRDSET_TYPE_AREA); @@ -864,10 +847,10 @@ static bool do_hyperv_storage_device(PERF_DATA_BLOCK *pDataBlock, int update_eve HYPERV, HYPERV".vm_storage_device_errors", "VM storage device errors", - "errors/sec", + "errors/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_STORAGE_DEVICE_ERRORS, update_every, RRDSET_TYPE_LINE); @@ -1050,21 +1033,21 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void p->charts_created = true; p->st_bytes = rrdset_create_localhost( - "vswitch_bytes", + "vswitch_traffic", windows_shared_buffer, NULL, HYPERV, - HYPERV ".vswitch_bytes", + HYPERV ".vswitch_traffic", "Virtual switch traffic", - "bytes/sec", + "kilobits/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_TRAFFIC, update_every, - RRDSET_TYPE_LINE); + RRDSET_TYPE_AREA); - p->rd_BytesReceivedSec = rrddim_add(p->st_bytes, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); - p->rd_BytesSentSec = rrddim_add(p->st_bytes, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_BytesReceivedSec = rrddim_add(p->st_bytes, "received", NULL, 8, 1000, RRD_ALGORITHM_INCREMENTAL); + p->rd_BytesSentSec = rrddim_add(p->st_bytes, "sent", NULL, -8, 1000, RRD_ALGORITHM_INCREMENTAL); rrdlabels_add(p->st_bytes->rrdlabels, "vswitch", windows_shared_buffer, RRDLABEL_SRC_AUTO); p->st_packets = rrdset_create_localhost( @@ -1074,10 +1057,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_packets", "Virtual switch packets", - "packets/sec", + "packets/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS, update_every, RRDSET_TYPE_LINE); @@ -1092,10 +1075,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_directed_packets", "Virtual switch directed packets", - "packets/sec", + "packets/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DIRECTED_PACKETS, update_every, RRDSET_TYPE_LINE); @@ -1112,10 +1095,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_broadcast_packets", "Virtual switch broadcast packets", - "packets/sec", + "packets/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_BROADCAST_PACKETS, update_every, RRDSET_TYPE_LINE); @@ -1132,10 +1115,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_multicast_packets", "Virtual switch multicast packets", - "packets/sec", + "packets/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_MULTICAST_PACKETS, update_every, RRDSET_TYPE_LINE); @@ -1152,10 +1135,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_dropped_packets", "Virtual switch dropped packets", - "drops/sec", + "drops/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_DROPPED_PACKETS, update_every, RRDSET_TYPE_LINE); @@ -1172,10 +1155,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_extensions_dropped_packets", "Virtual switch extensions dropped packets", - "drops/sec", + "drops/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_EXTENSIONS_DROPPED_PACKETS, update_every, RRDSET_TYPE_LINE); @@ -1192,10 +1175,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_packets_flooded", "Virtual switch flooded packets", - "packets/sec", + "packets/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PACKETS_FLOODED, update_every, RRDSET_TYPE_LINE); @@ -1209,10 +1192,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_learned_mac_addresses", "Virtual switch learned MAC addresses", - "mac addresses/sec", + "mac addresses/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_LEARNED_MAC_ADDRESSES, update_every, RRDSET_TYPE_LINE); @@ -1226,10 +1209,10 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void HYPERV, HYPERV ".vswitch_purged_mac_addresses", "Virtual switch purged MAC addresses", - "mac addresses/sec", + "mac addresses/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VSWITCH_PURGED_MAC_ADDRESSES, update_every, RRDSET_TYPE_LINE); @@ -1279,17 +1262,58 @@ static bool do_hyperv_switch(PERF_DATA_BLOCK *pDataBlock, int update_every, void return true; } - struct hypervisor_network_adapter { bool collected_metadata; bool charts_created; - RRDSET *st_packets; + RRDSET *st_dropped_packets; DEFINE_RD(DroppedPacketsOutgoingSec); DEFINE_RD(DroppedPacketsIncomingSec); + RRDSET *st_send_receive_packets; + DEFINE_RD(PacketsSentSec); + DEFINE_RD(PacketsReceivedSec); + + RRDSET *st_send_receive_bytes; + DEFINE_RD(BytesSentSec); + DEFINE_RD(BytesReceivedSec); + + RRDSET *st_IPsecoffloadBytes; + DEFINE_RD(IPsecoffloadBytesReceivedSec); + DEFINE_RD(IPsecoffloadBytesSentSec); + + RRDSET *st_DirectedPackets; + DEFINE_RD(DirectedPacketsSentSec); + DEFINE_RD(DirectedPacketsReceivedSec); + + RRDSET *st_BroadcastPackets; + DEFINE_RD(BroadcastPacketsSentSec); + DEFINE_RD(BroadcastPacketsReceivedSec); + + RRDSET *st_MulticastPackets; + DEFINE_RD(MulticastPacketsSentSec); + DEFINE_RD(MulticastPacketsReceivedSec); + COUNTER_DATA DroppedPacketsOutgoingSec; COUNTER_DATA DroppedPacketsIncomingSec; + + COUNTER_DATA PacketsSentSec; + COUNTER_DATA PacketsReceivedSec; + + COUNTER_DATA BytesSentSec; + COUNTER_DATA BytesReceivedSec; + + COUNTER_DATA IPsecoffloadBytesReceivedSec; + COUNTER_DATA IPsecoffloadBytesSentSec; + + COUNTER_DATA DirectedPacketsSentSec; + COUNTER_DATA DirectedPacketsReceivedSec; + + COUNTER_DATA BroadcastPacketsSentSec; + COUNTER_DATA BroadcastPacketsReceivedSec; + + COUNTER_DATA MulticastPacketsSentSec; + COUNTER_DATA MulticastPacketsReceivedSec; }; // Initialize the keys for the root partition metrics @@ -1297,6 +1321,21 @@ void initialize_hyperv_network_adapter_keys(struct hypervisor_network_adapter *p { p->DroppedPacketsOutgoingSec.key = "Dropped Packets Outgoing/sec"; p->DroppedPacketsIncomingSec.key = "Dropped Packets Incoming/sec"; + + p->PacketsSentSec.key = "Packets Sent/sec"; + p->PacketsReceivedSec.key = "Packets Received/sec"; + + p->BytesSentSec.key = "Bytes Sent/sec"; + p->BytesReceivedSec.key = "Bytes Received/sec"; + + p->IPsecoffloadBytesReceivedSec.key = "IPsec offload Bytes Receive/sec"; + p->IPsecoffloadBytesSentSec.key = "IPsec offload Bytes Sent/sec"; + p->DirectedPacketsSentSec.key = "Directed Packets Sent/sec"; + p->DirectedPacketsReceivedSec.key = "Directed Packets Received/sec"; + p->BroadcastPacketsSentSec.key = "Broadcast Packets Sent/sec"; + p->BroadcastPacketsReceivedSec.key = "Broadcast Packets Received/sec"; + p->MulticastPacketsSentSec.key = "Multicast Packets Sent/sec"; + p->MulticastPacketsReceivedSec.key = "Multicast Packets Received/sec"; } void dict_hyperv_network_adapter_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) @@ -1333,32 +1372,197 @@ static bool do_hyperv_network_adapter(PERF_DATA_BLOCK *pDataBlock, int update_ev GET_INSTANCE_COUNTER(DroppedPacketsIncomingSec); GET_INSTANCE_COUNTER(DroppedPacketsOutgoingSec); + GET_INSTANCE_COUNTER(PacketsReceivedSec); + GET_INSTANCE_COUNTER(PacketsSentSec); + + GET_INSTANCE_COUNTER(BytesReceivedSec); + GET_INSTANCE_COUNTER(BytesSentSec); + + GET_INSTANCE_COUNTER(IPsecoffloadBytesReceivedSec); + GET_INSTANCE_COUNTER(IPsecoffloadBytesSentSec); + + GET_INSTANCE_COUNTER(DirectedPacketsSentSec); + GET_INSTANCE_COUNTER(DirectedPacketsReceivedSec); + + GET_INSTANCE_COUNTER(BroadcastPacketsSentSec); + GET_INSTANCE_COUNTER(BroadcastPacketsReceivedSec); + + GET_INSTANCE_COUNTER(MulticastPacketsSentSec); + GET_INSTANCE_COUNTER(MulticastPacketsReceivedSec); + if (!p->charts_created) { p->charts_created = true; - p->st_packets = rrdset_create_localhost( + p->st_dropped_packets = rrdset_create_localhost( "vm_net_interface_packets_dropped", windows_shared_buffer, NULL, HYPERV, HYPERV".vm_net_interface_packets_dropped", "VM interface packets dropped", - "drops/sec", + "drops/s", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS_DROPPED, update_every, RRDSET_TYPE_LINE); - p->rd_DroppedPacketsIncomingSec = rrddim_add(p->st_packets, "incoming", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); - p->rd_DroppedPacketsOutgoingSec = rrddim_add(p->st_packets, "outgoing", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_DroppedPacketsIncomingSec = rrddim_add(p->st_dropped_packets, "incoming", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_DroppedPacketsOutgoingSec = rrddim_add(p->st_dropped_packets, "outgoing", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + + rrdlabels_add(p->st_dropped_packets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_send_receive_packets = rrdset_create_localhost( + "vm_net_interface_packets", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_net_interface_packets", + "VM interface packets", + "packets/s", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS, + update_every, + RRDSET_TYPE_LINE); + + p->rd_PacketsReceivedSec = rrddim_add(p->st_send_receive_packets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_PacketsSentSec = rrddim_add(p->st_send_receive_packets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + + rrdlabels_add(p->st_send_receive_packets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_send_receive_bytes = rrdset_create_localhost( + "vm_net_interface_traffic", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_net_interface_traffic", + "VM interface traffic", + "kilobits/s", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_TRAFFIC, + update_every, + RRDSET_TYPE_AREA); + + p->rd_BytesReceivedSec = rrddim_add(p->st_send_receive_bytes, "received", NULL, 8, 1000, RRD_ALGORITHM_INCREMENTAL); + p->rd_BytesSentSec = rrddim_add(p->st_send_receive_bytes, "sent", NULL, -8, 1000, RRD_ALGORITHM_INCREMENTAL); + rrdlabels_add(p->st_send_receive_bytes->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_IPsecoffloadBytes = rrdset_create_localhost( + "vm_net_interface_ipsec_traffic", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_net_interface_ipsec_traffic", + "VM interface traffic", + "kilobits/s", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_IPSEC_TRAFFIC, + update_every, + RRDSET_TYPE_AREA); + + p->rd_IPsecoffloadBytesReceivedSec = + rrddim_add(p->st_IPsecoffloadBytes, "received", NULL, 8, 1000, RRD_ALGORITHM_INCREMENTAL); + p->rd_IPsecoffloadBytesSentSec = + rrddim_add(p->st_IPsecoffloadBytes, "sent", NULL, -8, 1000, RRD_ALGORITHM_INCREMENTAL); + rrdlabels_add( + p->st_IPsecoffloadBytes->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_DirectedPackets = rrdset_create_localhost( + "vm_net_interface_directed_packets", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_net_interface_directed_packets", + "VM interface traffic", + "packets/s", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_DIRECTED_PACKETS, + update_every, + RRDSET_TYPE_LINE); + + p->rd_DirectedPacketsReceivedSec = + rrddim_add(p->st_DirectedPackets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_DirectedPacketsSentSec = + rrddim_add(p->st_DirectedPackets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + rrdlabels_add( + p->st_DirectedPackets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_BroadcastPackets = rrdset_create_localhost( + "vm_net_interface_broadcast_packets", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_net_interface_broadcast_packets", + "VM interface broadcast", + "packets/s", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_PACKETS, + update_every, + RRDSET_TYPE_LINE); + + p->rd_BroadcastPacketsReceivedSec = + rrddim_add(p->st_BroadcastPackets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_BroadcastPacketsSentSec = + rrddim_add(p->st_BroadcastPackets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + rrdlabels_add( + p->st_BroadcastPackets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_MulticastPackets = rrdset_create_localhost( + "vm_net_interface_multicast_packets", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_net_interface_multicast_packets", + "VM interface multicast", + "packets/s", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_NET_INTERFACE_MULTICAST_PACKETS, + update_every, + RRDSET_TYPE_LINE); + + p->rd_MulticastPacketsReceivedSec = + rrddim_add(p->st_MulticastPackets, "received", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL); + p->rd_MulticastPacketsSentSec = + rrddim_add(p->st_MulticastPackets, "sent", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL); + rrdlabels_add( + p->st_MulticastPackets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); + - rrdlabels_add(p->st_packets->rrdlabels, "vm_net_interface", windows_shared_buffer, RRDLABEL_SRC_AUTO); } - SETP_DIM_VALUE(st_packets, DroppedPacketsIncomingSec); - SETP_DIM_VALUE(st_packets, DroppedPacketsOutgoingSec); + SETP_DIM_VALUE(st_dropped_packets, DroppedPacketsIncomingSec); + SETP_DIM_VALUE(st_dropped_packets, DroppedPacketsOutgoingSec); - rrdset_done(p->st_packets); + SETP_DIM_VALUE(st_send_receive_packets, PacketsReceivedSec); + SETP_DIM_VALUE(st_send_receive_packets, PacketsSentSec); + + SETP_DIM_VALUE(st_send_receive_bytes, BytesReceivedSec); + SETP_DIM_VALUE(st_send_receive_bytes, BytesSentSec); + + SETP_DIM_VALUE(st_IPsecoffloadBytes, IPsecoffloadBytesReceivedSec); + SETP_DIM_VALUE(st_IPsecoffloadBytes, IPsecoffloadBytesSentSec); + + SETP_DIM_VALUE(st_DirectedPackets, DirectedPacketsSentSec); + SETP_DIM_VALUE(st_DirectedPackets, DirectedPacketsReceivedSec); + + SETP_DIM_VALUE(st_BroadcastPackets, BroadcastPacketsSentSec); + SETP_DIM_VALUE(st_BroadcastPackets, BroadcastPacketsReceivedSec); + + SETP_DIM_VALUE(st_MulticastPackets,MulticastPacketsSentSec); + SETP_DIM_VALUE(st_MulticastPackets,MulticastPacketsReceivedSec); + + rrdset_done(p->st_IPsecoffloadBytes); + rrdset_done(p->st_DirectedPackets); + rrdset_done(p->st_BroadcastPackets); + rrdset_done(p->st_MulticastPackets); + rrdset_done(p->st_send_receive_bytes); + rrdset_done(p->st_send_receive_packets); + rrdset_done(p->st_dropped_packets); } return true; } @@ -1375,9 +1579,17 @@ struct hypervisor_processor { DEFINE_RD(HypervisorRunTime); DEFINE_RD(RemoteRunTime); + RRDSET *st_HypervisorProcessorTotal; + DEFINE_RD(TotalRunTime); + COUNTER_DATA GuestRunTime; COUNTER_DATA HypervisorRunTime; COUNTER_DATA RemoteRunTime; + COUNTER_DATA TotalRunTime; + collected_number GuestRunTime_total; + collected_number HypervisorRunTime_total; + collected_number RemoteRunTime_total; + collected_number TotalRunTime_total; }; @@ -1386,6 +1598,11 @@ void initialize_hyperv_processor_keys(struct hypervisor_processor *p) p->GuestRunTime.key = "% Guest Run Time"; p->HypervisorRunTime.key = "% Hypervisor Run Time"; p->RemoteRunTime.key = "% Remote Run Time"; + p->TotalRunTime.key = "% Total Run Time"; + p->GuestRunTime_total = 0; + p->HypervisorRunTime_total = 0; + p->RemoteRunTime_total = 0; + p->TotalRunTime_total = 0; } void dict_hyperv_processor_insert_cb(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) @@ -1410,9 +1627,13 @@ static bool do_hyperv_processor(PERF_DATA_BLOCK *pDataBlock, int update_every, v get_and_sanitize_instance_value(pDataBlock, pObjectType, pi, windows_shared_buffer, sizeof(windows_shared_buffer)); - if(strcasecmp(windows_shared_buffer, "_Total") == 0) + if (strcasecmp(windows_shared_buffer, "_Total") == 0) continue; + char *vm = strchr(windows_shared_buffer, ':'); + if (vm) + *vm = '\0'; + struct hypervisor_processor *p = dictionary_set(item->instance, windows_shared_buffer, NULL, sizeof(*p)); if (!p->collected_metadata) { @@ -1422,39 +1643,77 @@ static bool do_hyperv_processor(PERF_DATA_BLOCK *pDataBlock, int update_every, v GET_INSTANCE_COUNTER(GuestRunTime); GET_INSTANCE_COUNTER(HypervisorRunTime); GET_INSTANCE_COUNTER(RemoteRunTime); + GET_INSTANCE_COUNTER(TotalRunTime); if (!p->charts_created) { p->charts_created = true; - p->st_HypervisorProcessor = rrdset_create_localhost( + p->st_HypervisorProcessorTotal = rrdset_create_localhost( "vm_cpu_usage", windows_shared_buffer, NULL, HYPERV, HYPERV ".vm_cpu_usage", - "VM CPU usage (100% = 1 core)", + "VM CPU usage", "percentage", _COMMON_PLUGIN_NAME, _COMMON_PLUGIN_MODULE_NAME, - chart_priority++, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE, update_every, RRDSET_TYPE_STACKED); + p->rd_TotalRunTime = + rrddim_add(p->st_HypervisorProcessorTotal, "usage", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL); + rrdlabels_add(p->st_HypervisorProcessorTotal->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); + + p->st_HypervisorProcessor = rrdset_create_localhost( + "vm_cpu_usage_by_run_context", + windows_shared_buffer, + NULL, + HYPERV, + HYPERV ".vm_cpu_usage_by_run_context", + "VM CPU usage by run context", + "percentage", + _COMMON_PLUGIN_NAME, + _COMMON_PLUGIN_MODULE_NAME, + NETDATA_CHART_PRIO_WINDOWS_HYPERV_VM_CPU_USAGE_BY_RUN_CONTEXT, + update_every, + RRDSET_TYPE_STACKED); + p->rd_GuestRunTime = - rrddim_add(p->st_HypervisorProcessor, "guest", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(p->st_HypervisorProcessor, "guest", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL); p->rd_HypervisorRunTime = - rrddim_add(p->st_HypervisorProcessor, "hypervisor", NULL, -1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(p->st_HypervisorProcessor, "hypervisor", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL); p->rd_RemoteRunTime = - rrddim_add(p->st_HypervisorProcessor, "remote", NULL, -1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); + rrddim_add(p->st_HypervisorProcessor, "remote", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL); rrdlabels_add(p->st_HypervisorProcessor->rrdlabels, "vm_name", windows_shared_buffer, RRDLABEL_SRC_AUTO); } - SETP_DIM_VALUE(st_HypervisorProcessor, GuestRunTime); - SETP_DIM_VALUE(st_HypervisorProcessor, HypervisorRunTime); - SETP_DIM_VALUE(st_HypervisorProcessor, RemoteRunTime); - - rrdset_done(p->st_HypervisorProcessor); + p->GuestRunTime_total += (collected_number)p->GuestRunTime.current.Data; + p->HypervisorRunTime_total += (collected_number)p->HypervisorRunTime.current.Data; + p->RemoteRunTime_total += (collected_number)p->RemoteRunTime.current.Data; + p->TotalRunTime_total += (collected_number)p->TotalRunTime.current.Data; } + + { + struct hypervisor_processor *p; + dfe_start_read(item->instance, p) { + rrddim_set_by_pointer(p->st_HypervisorProcessor, p->rd_HypervisorRunTime, (collected_number) p->HypervisorRunTime_total); + rrddim_set_by_pointer(p->st_HypervisorProcessor, p->rd_GuestRunTime, (collected_number) p->GuestRunTime_total); + rrddim_set_by_pointer(p->st_HypervisorProcessor, p->rd_RemoteRunTime, (collected_number) p->RemoteRunTime_total); + rrdset_done(p->st_HypervisorProcessor); + + rrddim_set_by_pointer(p->st_HypervisorProcessorTotal, p->rd_TotalRunTime, (collected_number) p->TotalRunTime_total); + rrdset_done(p->st_HypervisorProcessorTotal); + + p->GuestRunTime_total = 0; + p->HypervisorRunTime_total = 0; + p->RemoteRunTime_total = 0; + p->TotalRunTime_total = 0; + } + dfe_done(p); + } + return true; }