summaryrefslogtreecommitdiffstats
path: root/collectors/macos.plugin/plugin_macos.c
diff options
context:
space:
mode:
Diffstat (limited to 'collectors/macos.plugin/plugin_macos.c')
-rw-r--r--collectors/macos.plugin/plugin_macos.c154
1 files changed, 121 insertions, 33 deletions
diff --git a/collectors/macos.plugin/plugin_macos.c b/collectors/macos.plugin/plugin_macos.c
index 628a5b10d..1a64ed81c 100644
--- a/collectors/macos.plugin/plugin_macos.c
+++ b/collectors/macos.plugin/plugin_macos.c
@@ -2,7 +2,28 @@
#include "plugin_macos.h"
-static void macos_main_cleanup(void *ptr) {
+static struct macos_module {
+ const char *name;
+ const char *dim;
+
+ int enabled;
+
+ int (*func)(int update_every, usec_t dt);
+ usec_t duration;
+
+ RRDDIM *rd;
+
+} macos_modules[] = {
+ {.name = "sysctl", .dim = "sysctl", .enabled = 1, .func = do_macos_sysctl},
+ {.name = "mach system management interface", .dim = "mach_smi", .enabled = 1, .func = do_macos_mach_smi},
+ {.name = "iokit", .dim = "iokit", .enabled = 1, .func = do_macos_iokit},
+
+ // the terminator of this array
+ {.name = NULL, .dim = NULL, .enabled = 0, .func = NULL}
+};
+
+static void macos_main_cleanup(void *ptr)
+{
struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
static_thread->enabled = NETDATA_MAIN_THREAD_EXITING;
@@ -11,56 +32,123 @@ static void macos_main_cleanup(void *ptr) {
static_thread->enabled = NETDATA_MAIN_THREAD_EXITED;
}
-void *macos_main(void *ptr) {
+void *macos_main(void *ptr)
+{
netdata_thread_cleanup_push(macos_main_cleanup, ptr);
- // when ZERO, attempt to do it
- int vdo_cpu_netdata = !config_get_boolean("plugin:macos", "netdata server resources", 1);
- int vdo_macos_sysctl = !config_get_boolean("plugin:macos", "sysctl", 1);
- int vdo_macos_mach_smi = !config_get_boolean("plugin:macos", "mach system management interface", 1);
- int vdo_macos_iokit = !config_get_boolean("plugin:macos", "iokit", 1);
+ int vdo_cpu_netdata = config_get_boolean("plugin:macos", "netdata server resources", CONFIG_BOOLEAN_YES);
- // keep track of the time each module was called
- unsigned long long sutime_macos_sysctl = 0ULL;
- unsigned long long sutime_macos_mach_smi = 0ULL;
- unsigned long long sutime_macos_iokit = 0ULL;
+ // check the enabled status for each module
+ for (int i = 0; macos_modules[i].name; i++) {
+ struct macos_module *pm = &macos_modules[i];
+
+ pm->enabled = config_get_boolean("plugin:macos", pm->name, pm->enabled);
+ pm->duration = 0ULL;
+ pm->rd = NULL;
+ }
usec_t step = localhost->rrd_update_every * USEC_PER_SEC;
heartbeat_t hb;
heartbeat_init(&hb);
- while(!netdata_exit) {
+ while (!netdata_exit) {
usec_t hb_dt = heartbeat_next(&hb, step);
-
- if(unlikely(netdata_exit)) break;
+ usec_t duration = 0ULL;
// BEGIN -- the job to be done
- if(!vdo_macos_sysctl) {
- debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_sysctl().");
- vdo_macos_sysctl = do_macos_sysctl(localhost->rrd_update_every, hb_dt);
- }
- if(unlikely(netdata_exit)) break;
+ for (int i = 0; macos_modules[i].name; i++) {
+ struct macos_module *pm = &macos_modules[i];
+ if (unlikely(!pm->enabled))
+ continue;
- if(!vdo_macos_mach_smi) {
- debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_mach_smi().");
- vdo_macos_mach_smi = do_macos_mach_smi(localhost->rrd_update_every, hb_dt);
- }
- if(unlikely(netdata_exit)) break;
+ debug(D_PROCNETDEV_LOOP, "macos calling %s.", pm->name);
+
+ pm->enabled = !pm->func(localhost->rrd_update_every, hb_dt);
+ pm->duration = heartbeat_monotonic_dt_to_now_usec(&hb) - duration;
+ duration += pm->duration;
- if(!vdo_macos_iokit) {
- debug(D_PROCNETDEV_LOOP, "MACOS: calling do_macos_iokit().");
- vdo_macos_iokit = do_macos_iokit(localhost->rrd_update_every, hb_dt);
+ if (unlikely(netdata_exit))
+ break;
}
- if(unlikely(netdata_exit)) break;
// END -- the job is done
- // --------------------------------------------------------------------
-
- if(!vdo_cpu_netdata) {
- global_statistics_charts();
- registry_statistics();
+ if (vdo_cpu_netdata) {
+ static RRDSET *st_cpu_thread = NULL, *st_duration = NULL;
+ static RRDDIM *rd_user = NULL, *rd_system = NULL;
+
+ // ----------------------------------------------------------------
+
+ struct rusage thread;
+ getrusage(RUSAGE_THREAD, &thread);
+
+ if (unlikely(!st_cpu_thread)) {
+ st_cpu_thread = rrdset_create_localhost(
+ "netdata",
+ "plugin_macos_cpu",
+ NULL,
+ "macos",
+ NULL,
+ "Netdata macOS plugin CPU usage",
+ "milliseconds/s",
+ "macos",
+ "stats",
+ 132000,
+ localhost->rrd_update_every,
+ RRDSET_TYPE_STACKED);
+
+ rd_user = rrddim_add(st_cpu_thread, "user", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
+ rd_system = rrddim_add(st_cpu_thread, "system", NULL, 1, USEC_PER_MS, RRD_ALGORITHM_INCREMENTAL);
+ } else {
+ rrdset_next(st_cpu_thread);
+ }
+
+ rrddim_set_by_pointer(
+ st_cpu_thread, rd_user, thread.ru_utime.tv_sec * USEC_PER_SEC + thread.ru_utime.tv_usec);
+ rrddim_set_by_pointer(
+ st_cpu_thread, rd_system, thread.ru_stime.tv_sec * USEC_PER_SEC + thread.ru_stime.tv_usec);
+ rrdset_done(st_cpu_thread);
+
+ // ----------------------------------------------------------------
+
+ if (unlikely(!st_duration)) {
+ st_duration = rrdset_find_active_bytype_localhost("netdata", "plugin_macos_modules");
+
+ if (!st_duration) {
+ st_duration = rrdset_create_localhost(
+ "netdata",
+ "plugin_macos_modules",
+ NULL,
+ "macos",
+ NULL,
+ "Netdata macOS plugin modules durations",
+ "milliseconds/run",
+ "macos",
+ "stats",
+ 132001,
+ localhost->rrd_update_every,
+ RRDSET_TYPE_STACKED);
+
+ for (int i = 0; macos_modules[i].name; i++) {
+ struct macos_module *pm = &macos_modules[i];
+ if (unlikely(!pm->enabled))
+ continue;
+
+ pm->rd = rrddim_add(st_duration, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
+ }
+ }
+ } else
+ rrdset_next(st_duration);
+
+ for (int i = 0; macos_modules[i].name; i++) {
+ struct macos_module *pm = &macos_modules[i];
+ if (unlikely(!pm->enabled))
+ continue;
+
+ rrddim_set_by_pointer(st_duration, pm->rd, pm->duration);
+ }
+ rrdset_done(st_duration);
}
}