2 #include <sys/sysctl.h>
4 #define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
6 // MacOS calculates load averages once every 5 seconds
7 #define MIN_LOADAVG_UPDATE_EVERY 5
9 int getsysctl(const char *name, void *ptr, size_t len);
11 int do_macos_sysctl(int update_every, usec_t dt) {
14 static int do_loadavg = -1, do_swap = -1;
16 if (unlikely(do_loadavg == -1)) {
17 do_loadavg = config_get_boolean("plugin:macos:sysctl", "enable load average", 1);
18 do_swap = config_get_boolean("plugin:macos:sysctl", "system swap", 1);
23 int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
28 // NEEDED BY: do_loadavg
29 static usec_t last_loadavg_usec = 0;
30 struct loadavg sysload;
33 struct xsw_usage swap_usage;
35 if (last_loadavg_usec <= dt) {
36 if (likely(do_loadavg)) {
37 if (unlikely(GETSYSCTL("vm.loadavg", sysload))) {
39 error("DISABLED: system.load");
42 st = rrdset_find_bytype("system", "load");
44 st = rrdset_create("system", "load", NULL, "load", NULL, "System Load Average", "load", 100, (update_every < MIN_LOADAVG_UPDATE_EVERY) ? MIN_LOADAVG_UPDATE_EVERY : update_every, RRDSET_TYPE_LINE);
45 rrddim_add(st, "load1", NULL, 1, 1000, RRDDIM_ABSOLUTE);
46 rrddim_add(st, "load5", NULL, 1, 1000, RRDDIM_ABSOLUTE);
47 rrddim_add(st, "load15", NULL, 1, 1000, RRDDIM_ABSOLUTE);
51 rrddim_set(st, "load1", (collected_number) ((double)sysload.ldavg[0] / sysload.fscale * 1000));
52 rrddim_set(st, "load5", (collected_number) ((double)sysload.ldavg[1] / sysload.fscale * 1000));
53 rrddim_set(st, "load15", (collected_number) ((double)sysload.ldavg[2] / sysload.fscale * 1000));
58 last_loadavg_usec = st->update_every * USEC_PER_SEC;
60 else last_loadavg_usec -= dt;
62 if (likely(do_swap)) {
63 if (unlikely(GETSYSCTL("vm.swapusage", swap_usage))) {
65 error("DISABLED: system.swap");
67 st = rrdset_find("system.swap");
69 st = rrdset_create("system", "swap", NULL, "swap", NULL, "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED);
72 rrddim_add(st, "free", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
73 rrddim_add(st, "used", NULL, 1, 1048576, RRDDIM_ABSOLUTE);
77 rrddim_set(st, "free", swap_usage.xsu_avail);
78 rrddim_set(st, "used", swap_usage.xsu_used);
86 int getsysctl(const char *name, void *ptr, size_t len)
90 if (unlikely(sysctlbyname(name, ptr, &nlen, NULL, 0) == -1)) {
91 error("MACOS: sysctl(%s...) failed: %s", name, strerror(errno));
94 if (unlikely(nlen != len)) {
95 error("MACOS: sysctl(%s...) expected %lu, got %lu", name, (unsigned long)len, (unsigned long)nlen);