]> arthur.barton.de Git - netdata.git/blob - src/macos_sysctl.c
Merge pull request #1458 from ktsaou/master
[netdata.git] / src / macos_sysctl.c
1 #include "common.h"
2 #include <sys/sysctl.h>
3
4 #define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
5
6 // MacOS calculates load averages once every 5 seconds
7 #define MIN_LOADAVG_UPDATE_EVERY 5
8
9 int getsysctl(const char *name, void *ptr, size_t len);
10
11 int do_macos_sysctl(int update_every, usec_t dt) {
12     (void)dt;
13
14     static int do_loadavg = -1;
15
16     if (unlikely(do_loadavg == -1)) {
17         do_loadavg              = config_get_boolean("plugin:macos:sysctl", "enable load average", 1);
18     }
19
20     RRDSET *st;
21
22     int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
23     int i, n;
24     int common_error = 0;
25     size_t size;
26
27     // NEEDED BY: do_loadavg
28     static usec_t last_loadavg_usec = 0;
29     struct loadavg sysload;
30
31     if (last_loadavg_usec <= dt) {
32         if (likely(do_loadavg)) {
33             if (unlikely(GETSYSCTL("vm.loadavg", sysload))) {
34                 do_loadavg = 0;
35                 error("DISABLED: system.load");
36             } else {
37
38                 st = rrdset_find_bytype("system", "load");
39                 if (unlikely(!st)) {
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);
44                 }
45                 else rrdset_next(st);
46
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));
50                 rrdset_done(st);
51             }
52         }
53
54         last_loadavg_usec = st->update_every * USEC_PER_SEC;
55     }
56     else last_loadavg_usec -= dt;
57
58     return 0;
59 }
60
61 int getsysctl(const char *name, void *ptr, size_t len)
62 {
63     size_t nlen = len;
64
65     if (unlikely(sysctlbyname(name, ptr, &nlen, NULL, 0) == -1)) {
66         error("MACOS: sysctl(%s...) failed: %s", name, strerror(errno));
67         return 1;
68     }
69     if (unlikely(nlen != len)) {
70         error("MACOS: sysctl(%s...) expected %lu, got %lu", name, (unsigned long)len, (unsigned long)nlen);
71         return 1;
72     }
73     return 0;
74 }