]> arthur.barton.de Git - netdata.git/blob - src/macos_sysctl.c
8a129dabf70125c161a47f692ebd5a82b9fe5c11
[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, do_swap = -1;
15
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);
19     }
20
21     RRDSET *st;
22
23     int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
24     int i, n;
25     int common_error = 0;
26     size_t size;
27
28     // NEEDED BY: do_loadavg
29     static usec_t last_loadavg_usec = 0;
30     struct loadavg sysload;
31
32     // NEEDED BY: do_swap
33     struct xsw_usage swap_usage;
34
35     if (last_loadavg_usec <= dt) {
36         if (likely(do_loadavg)) {
37             if (unlikely(GETSYSCTL("vm.loadavg", sysload))) {
38                 do_loadavg = 0;
39                 error("DISABLED: system.load");
40             } else {
41
42                 st = rrdset_find_bytype("system", "load");
43                 if (unlikely(!st)) {
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);
48                 }
49                 else rrdset_next(st);
50
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));
54                 rrdset_done(st);
55             }
56         }
57
58         last_loadavg_usec = st->update_every * USEC_PER_SEC;
59     }
60     else last_loadavg_usec -= dt;
61
62     if (likely(do_swap)) {
63         if (unlikely(GETSYSCTL("vm.swapusage", swap_usage))) {
64             do_swap = 0;
65             error("DISABLED: system.swap");
66         } else {
67             st = rrdset_find("system.swap");
68             if (unlikely(!st)) {
69                 st = rrdset_create("system", "swap", NULL, "swap", NULL, "System Swap", "MB", 201, update_every, RRDSET_TYPE_STACKED);
70                 st->isdetail = 1;
71
72                 rrddim_add(st, "free",    NULL, 1, 1048576, RRDDIM_ABSOLUTE);
73                 rrddim_add(st, "used",    NULL, 1, 1048576, RRDDIM_ABSOLUTE);
74             }
75             else rrdset_next(st);
76
77             rrddim_set(st, "free", swap_usage.xsu_avail);
78             rrddim_set(st, "used", swap_usage.xsu_used);
79             rrdset_done(st);
80         }
81     }
82
83     return 0;
84 }
85
86 int getsysctl(const char *name, void *ptr, size_t len)
87 {
88     size_t nlen = len;
89
90     if (unlikely(sysctlbyname(name, ptr, &nlen, NULL, 0) == -1)) {
91         error("MACOS: sysctl(%s...) failed: %s", name, strerror(errno));
92         return 1;
93     }
94     if (unlikely(nlen != len)) {
95         error("MACOS: sysctl(%s...) expected %lu, got %lu", name, (unsigned long)len, (unsigned long)nlen);
96         return 1;
97     }
98     return 0;
99 }