@cryptotaxi247 / netdata-1 / commits / 54a793a74

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 */