| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #include "windows_plugin.h" |
| 4 | #include "windows-internals.h" |
| 5 | |
| 6 | static RRDSET *st = NULL; |
| 7 | static RRDDIM *rd_user = NULL, *rd_kernel = NULL, *rd_idle = NULL; |
| 8 | |
| 9 | void do_GetSystemCPU_cleanup(void) |
| 10 | { |
| 11 | if (rd_user) |
| 12 | rrddim_free(st, rd_user); |
| 13 | if (rd_kernel) |
| 14 | rrddim_free(st, rd_kernel); |
| 15 | if (rd_idle) |
| 16 | rrddim_free(st, rd_idle); |
| 17 | if (st) |
| 18 | rrdset_free(st); |
| 19 | |
| 20 | rd_user = rd_kernel = rd_idle = NULL; |
| 21 | st = NULL; |
| 22 | } |
| 23 | |
| 24 | int do_GetSystemCPU(int update_every, usec_t dt __maybe_unused) |
| 25 | { |
| 26 | FILETIME idleTime, kernelTime, userTime; |
| 27 | |
| 28 | if (GetSystemTimes(&idleTime, &kernelTime, &userTime) == 0) { |
| 29 | nd_log(NDLS_COLLECTORS, NDLP_ERR, "GetSystemTimes() failed."); |
| 30 | return 1; |
| 31 | } |
| 32 | |
| 33 | ULONGLONG idle = FileTimeToULL(idleTime); |
| 34 | ULONGLONG kernel = FileTimeToULL(kernelTime); |
| 35 | ULONGLONG user = FileTimeToULL(userTime); |
| 36 | |
| 37 | // kernel includes idle |
| 38 | kernel -= idle; |
| 39 | |
| 40 | if (!st) { |
| 41 | st = rrdset_create_localhost( |
| 42 | "system", |
| 43 | "cpu", |
| 44 | NULL, |
| 45 | "cpu", |
| 46 | "system.cpu", |
| 47 | "Total CPU utilization", |
| 48 | "percentage", |
| 49 | PLUGIN_WINDOWS_NAME, |
| 50 | "GetSystemTimes", |
| 51 | NETDATA_CHART_PRIO_SYSTEM_CPU, |
| 52 | update_every, |
| 53 | RRDSET_TYPE_STACKED); |
| 54 | |
| 55 | rd_user = rrddim_add(st, "user", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); |
| 56 | rd_kernel = rrddim_add(st, "system", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); |
| 57 | rd_idle = rrddim_add(st, "idle", NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL); |
| 58 | rrddim_hide(st, "idle"); |
| 59 | } |
| 60 | |
| 61 | rrddim_set_by_pointer(st, rd_user, (collected_number)user); |
| 62 | rrddim_set_by_pointer(st, rd_kernel, (collected_number)kernel); |
| 63 | rrddim_set_by_pointer(st, rd_idle, (collected_number)idle); |
| 64 | rrdset_done(st); |
| 65 | |
| 66 | return 0; |
| 67 | } |