Separate macOS plugin
Vladimir Kobal committed
Dec 26, 2016 at 19:34 UTC
54a793a748bd73d56abc93ea973476490e25d4a2
9 files changed
+227
-15
configure.ac
+2
-1
@@ -45,13 +45,14 @@ freebsd*)
45
build_target=freebsd
46
;;
47
darwin*)
48
- build_target=freebsd
48
+ build_target=macos
49
;;
50
*)
51
;;
52
esac
53
54
AM_CONDITIONAL([FREEBSD], [test x$build_target = xfreebsd])
55
+AM_CONDITIONAL([MACOS], [test x$build_target = xmacos])
56
57
AC_ARG_ENABLE(
58
[plugin-nfacct],
src/Makefile.am
+8
@@ -67,6 +67,13 @@ netdata_SOURCES += \
67
freebsd_sysctl.c \
68
$(NULL)
69
else
70
+if MACOS
71
+netdata_SOURCES += \
72
+ plugin_macos.c plugin_macos.h \
73
+ macos_sysctl.c \
74
+ macos_mach_smi.c \
75
+ $(NULL)
76
+else
77
netdata_SOURCES += \
78
plugin_proc.c plugin_proc.h \
79
proc_diskstats.c \
@@ -91,6 +98,7 @@ netdata_SOURCES += \
98
sys_kernel_mm_ksm.c \
99
$(NULL)
100
endif
101
+endif
102
103
netdata_LDADD = \
104
$(OPTIONAL_MATH_LIBS) \
src/common.h
+6
-4
@@ -136,11 +136,13 @@
136
#include "plugin_checks.h"
137
#include "plugin_idlejitter.h"
138
#include "plugin_nfacct.h"
139
-#if !(defined(__FreeBSD__) || defined(__APPLE__))
140
-#include "plugin_proc.h"
141
-#else
139
+#if defined(__FreeBSD__)
140
#include "plugin_freebsd.h"
143
-#endif /* __FreeBSD__ || __APPLE__*/
141
+#elif defined(__APPLE__)
142
+#include "plugin_macos.h"
143
+#else
144
+#include "plugin_proc.h"
145
+#endif /* __FreeBSD__, __APPLE__*/
146
#include "plugin_tc.h"
147
#include "plugins_d.h"
148
src/freebsd_sysctl.c
-6
@@ -1,6 +1,5 @@
1
#include "common.h"
2
3
-#ifndef __APPLE__
3
// NEEDED BY: struct vmtotal, struct vmmeter
4
#include <sys/vmmeter.h>
5
// NEEDED BY: struct devstat
@@ -19,7 +18,6 @@
18
#define _IFI_OQDROPS // It is for FreeNAS only. Most probably in future releases of FreeNAS it will be removed
19
#include <net/if.h>
20
#include <ifaddrs.h>
22
-#endif /* __APPLE__ */
21
// NEEDED BY: do_disk_io
22
#define RRD_TYPE_DISK "disk"
23
@@ -73,7 +71,6 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
71
static usec_t last_loadavg_usec = 0;
72
struct loadavg sysload;
73
76
-#ifndef __APPLE__
74
// NEEDED BY: do_cpu, do_cpu_cores
75
long cp_time[CPUSTATES];
76
@@ -180,7 +177,6 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
177
178
// --------------------------------------------------------------------
179
183
-#endif /* __APPLE__ */
180
if (last_loadavg_usec <= dt) {
181
if (likely(do_loadavg)) {
182
if (unlikely(GETSYSCTL("vm.loadavg", sysload))) {
@@ -207,7 +203,6 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
203
last_loadavg_usec = st->update_every * USEC_PER_SEC;
204
}
205
else last_loadavg_usec -= dt;
210
-#ifndef __APPLE__
206
207
// --------------------------------------------------------------------
208
@@ -1193,7 +1188,6 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
1188
freeifaddrs(ifap);
1189
}
1190
}
1196
-#endif /* __APPLE__ */
1191
1192
return 0;
1193
}
src/macos_mach_smi.c
new
+48
@@ -0,0 +1,48 @@
1
+#include "common.h"
2
+
3
+int do_macos_mach_smi(int update_every, usec_t dt) {
4
+ (void)dt;
5
+
6
+ static int do_cpu = -1;
7
+
8
+ if (unlikely(do_cpu == -1)) {
9
+ do_cpu = config_get_boolean("plugin:macos:mach_smi", "cpu utilization", 1);
10
+ }
11
+
12
+ RRDSET *st;
13
+
14
+ // NEEDED BY: do_cpu, do_cpu_cores
15
+ long cp_time[5];
16
+
17
+ // --------------------------------------------------------------------
18
+
19
+ if (likely(do_cpu)) {
20
+ if (unlikely(1)) {
21
+ do_cpu = 0;
22
+ error("DISABLED: system.cpu");
23
+ } else {
24
+
25
+ st = rrdset_find_bytype("system", "cpu");
26
+ if (unlikely(!st)) {
27
+ st = rrdset_create("system", "cpu", NULL, "cpu", "system.cpu", "Total CPU utilization", "percentage", 100, update_every, RRDSET_TYPE_STACKED);
28
+
29
+ rrddim_add(st, "user", NULL, 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
30
+ rrddim_add(st, "nice", NULL, 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
31
+ rrddim_add(st, "system", NULL, 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
32
+ rrddim_add(st, "interrupt", NULL, 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
33
+ rrddim_add(st, "idle", NULL, 1, 1, RRDDIM_PCENT_OVER_DIFF_TOTAL);
34
+ rrddim_hide(st, "idle");
35
+ }
36
+ else rrdset_next(st);
37
+
38
+ rrddim_set(st, "user", cp_time[0]);
39
+ rrddim_set(st, "nice", cp_time[1]);
40
+ rrddim_set(st, "system", cp_time[2]);
41
+ rrddim_set(st, "interrupt", cp_time[3]);
42
+ rrddim_set(st, "idle", cp_time[4]);
43
+ rrdset_done(st);
44
+ }
45
+ }
46
+
47
+ return 0;
48
+}
src/macos_sysctl.c
new
+74
@@ -0,0 +1,74 @@
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
+}
src/main.c
+6
-4
@@ -45,11 +45,13 @@ struct netdata_static_thread {
45
46
{"tc", "plugins", "tc", 1, NULL, NULL, tc_main},
47
{"idlejitter", "plugins", "idlejitter", 1, NULL, NULL, cpuidlejitter_main},
48
-#if !(defined(__FreeBSD__) || defined(__APPLE__))
49
- {"proc", "plugins", "proc", 1, NULL, NULL, proc_main},
50
-#else
48
+#if defined(__FreeBSD__)
49
{"freebsd", "plugins", "freebsd", 1, NULL, NULL, freebsd_main},
52
-#endif /* __FreeBSD__ || __APPLE__*/
50
+#elif defined(__APPLE__)
51
+ {"macos", "plugins", "macos", 1, NULL, NULL, macos_main},
52
+#else
53
+ {"proc", "plugins", "proc", 1, NULL, NULL, proc_main},
54
+#endif /* __FreeBSD__, __APPLE__*/
55
{"cgroups", "plugins", "cgroups", 1, NULL, NULL, cgroups_main},
56
{"check", "plugins", "checks", 0, NULL, NULL, checks_main},
57
{"backends", NULL, NULL, 1, NULL, NULL, backends_main},
src/plugin_macos.c
new
+74
@@ -0,0 +1,74 @@
1
+#include "common.h"
2
+
3
+void *macos_main(void *ptr)
4
+{
5
+ (void)ptr;
6
+
7
+ info("MACOS Plugin thread created with task id %d", gettid());
8
+
9
+ if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0)
10
+ error("Cannot set pthread cancel type to DEFERRED.");
11
+
12
+ if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
13
+ error("Cannot set pthread cancel state to ENABLE.");
14
+
15
+ // disable (by default) various interface that are not needed
16
+ /*
17
+ config_get_boolean("plugin:proc:/proc/net/dev:lo", "enabled", 0);
18
+ config_get_boolean("plugin:proc:/proc/net/dev:fireqos_monitor", "enabled", 0);
19
+ */
20
+
21
+ // when ZERO, attempt to do it
22
+ int vdo_cpu_netdata = !config_get_boolean("plugin:macos", "netdata server resources", 1);
23
+ int vdo_macos_sysctl = !config_get_boolean("plugin:macos", "sysctl", 1);
24
+ int vdo_macos_mach_smi = !config_get_boolean("plugin:macos", "mach system management interface", 1);
25
+
26
+ // keep track of the time each module was called
27
+ unsigned long long sutime_macos_sysctl = 0ULL;
28
+ unsigned long long sutime_macos_mach_smi = 0ULL;
29
+
30
+ usec_t step = rrd_update_every * USEC_PER_SEC;
31
+ for(;;) {
32
+ usec_t now = now_realtime_usec();
33
+ usec_t next = now - (now % step) + step;
34
+
35
+ while(now < next) {
36
+ sleep_usec(next - now);
37
+ now = now_realtime_usec();
38
+ }
39
+
40
+ if(unlikely(netdata_exit)) break;
41
+
42
+ // BEGIN -- the job to be done
43
+
44
+ if(!vdo_macos_sysctl) {
45
+ debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_sysctl().");
46
+ now = now_realtime_usec();
47
+ vdo_macos_sysctl = do_macos_sysctl(rrd_update_every, (sutime_macos_sysctl > 0)?now - sutime_macos_sysctl:0ULL);
48
+ sutime_macos_sysctl = now;
49
+ }
50
+ if(unlikely(netdata_exit)) break;
51
+
52
+ if(!vdo_macos_mach_smi) {
53
+ debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_mach_smi().");
54
+ now = now_realtime_usec();
55
+ vdo_macos_mach_smi = do_macos_mach_smi(rrd_update_every, (sutime_macos_mach_smi > 0)?now - sutime_macos_mach_smi:0ULL);
56
+ sutime_macos_mach_smi = now;
57
+ }
58
+ if(unlikely(netdata_exit)) break;
59
+
60
+ // END -- the job is done
61
+
62
+ // --------------------------------------------------------------------
63
+
64
+ if(!vdo_cpu_netdata) {
65
+ global_statistics_charts();
66
+ registry_statistics();
67
+ }
68
+ }
69
+
70
+ info("MACOS thread exiting");
71
+
72
+ pthread_exit(NULL);
73
+ return NULL;
74
+}
src/plugin_macos.h
new
+9
@@ -0,0 +1,9 @@
1
+#ifndef NETDATA_PLUGIN_MACOS_H
2
+#define NETDATA_PLUGIN_MACOS_H 1
3
+
4
+void *macos_main(void *ptr);
5
+
6
+extern int do_macos_sysctl(int update_every, usec_t dt);
7
+extern int do_macos_mach_smi(int update_every, usec_t dt);
8
+
9
+#endif /* NETDATA_PLUGIN_MACOS_H */