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;
16 if (unlikely(do_loadavg == -1)) {
17 do_loadavg = config_get_boolean("plugin:macos:sysctl", "enable load average", 1);
22 int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
27 // NEEDED BY: do_loadavg
28 static usec_t last_loadavg_usec = 0;
29 struct loadavg sysload;
31 if (last_loadavg_usec <= dt) {
32 if (likely(do_loadavg)) {
33 if (unlikely(GETSYSCTL("vm.loadavg", sysload))) {
35 error("DISABLED: system.load");
38 st = rrdset_find_bytype("system", "load");
40 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);
41 rrddim_add(st, "load1", NULL, 1, 1000, RRDDIM_ABSOLUTE);
42 rrddim_add(st, "load5", NULL, 1, 1000, RRDDIM_ABSOLUTE);
43 rrddim_add(st, "load15", NULL, 1, 1000, RRDDIM_ABSOLUTE);
47 rrddim_set(st, "load1", (collected_number) ((double)sysload.ldavg[0] / sysload.fscale * 1000));
48 rrddim_set(st, "load5", (collected_number) ((double)sysload.ldavg[1] / sysload.fscale * 1000));
49 rrddim_set(st, "load15", (collected_number) ((double)sysload.ldavg[2] / sysload.fscale * 1000));
54 last_loadavg_usec = st->update_every * USEC_PER_SEC;
56 else last_loadavg_usec -= dt;
61 int getsysctl(const char *name, void *ptr, size_t len)
65 if (unlikely(sysctlbyname(name, ptr, &nlen, NULL, 0) == -1)) {
66 error("MACOS: sysctl(%s...) failed: %s", name, strerror(errno));
69 if (unlikely(nlen != len)) {
70 error("MACOS: sysctl(%s...) expected %lu, got %lu", name, (unsigned long)len, (unsigned long)nlen);