From: Vladimir Kobal Date: Mon, 6 Mar 2017 09:36:45 +0000 (+0200) Subject: Prepare FreeBSD plugin for refactoring and update main function X-Git-Tag: v1.6.0~16^2~31 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netdata.git;a=commitdiff_plain;h=104c3daddb5f10903997c43fdfa7622d88839238 Prepare FreeBSD plugin for refactoring and update main function --- diff --git a/src/freebsd_sysctl.c b/src/freebsd_sysctl.c index 1dc9d47b..bcb3eb74 100644 --- a/src/freebsd_sysctl.c +++ b/src/freebsd_sysctl.c @@ -1,42 +1,30 @@ #include "common.h" -// NEEDED BY: struct vmtotal, struct vmmeter #include -// NEEDED BY: struct devstat #include -// NEEDED BY: struct xswdev +#include #include -// NEEDED BY: struct semid_kernel, struct shmid_kernel, struct msqid_kernel + #define _KERNEL #include #include #include #undef _KERNEL -// NEEDED BY: struct sysctl_netisr_workstream, struct sysctl_netisr_work + #include -// NEEDED BY: struct ifaddrs, getifaddrs() #include #include -// NEEDED BY do_tcp... -#include -#include -// NEEDED BY do_udp..., do_ip... -#include -// NEEDED BY do_udp... -#include -#include -// NEEDED BY do_icmp... + #include +#include #include #include -// NEEDED BY do_ip6... #include -// NEEDED BY do_icmp6... #include -// NEEDED BY do_space, do_inodes -#include -// NEEDED BY do_uptime -#include +#include +#include +#include +#include #define KILO_FACTOR 1024 #define MEGA_FACTOR 1048576 // 1024 * 1024 @@ -44,16 +32,33 @@ #define MAX_INT_DIGITS 10 // maximum number of digits for int +int system_pagesize = PAGE_SIZE; + // NEEDED BY: do_disk_io #define RRD_TYPE_DISK "disk" +// NEEDED BY: do_bandwidth +#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s) + +// FreeBSD plugin initialization +int freebsd_plugin_init() +{ + if (system_pagesize = getpagesize() <= 0) { + error("FREEBSD: can't get system page size"); + return 1; + } + + return 0; +} + // FreeBSD calculates load averages once every 5 seconds #define MIN_LOADAVG_UPDATE_EVERY 5 -// NEEDED BY: do_bandwidth -#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s) +int do_vm_loadavg(int update_every, usec_t dt){ + +} -int do_freebsd_sysctl(int update_every, usec_t dt) { +int do_freebsd_sysctl_old(int update_every, usec_t dt) { static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1, do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1, do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1, do_ipc_msg_queues = -1, @@ -124,7 +129,6 @@ int do_freebsd_sysctl(int update_every, usec_t dt) { RRDSET *st; RRDDIM *rd; - int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize? int i, n; void *p; int common_error = 0; diff --git a/src/global_statistics.c b/src/global_statistics.c index c3d63043..17faeaa1 100644 --- a/src/global_statistics.c +++ b/src/global_statistics.c @@ -129,11 +129,19 @@ void global_statistics_charts(void) { getrusage(RUSAGE_THREAD, &thread); getrusage(RUSAGE_SELF, &me); +#ifdef __FreeBSD__ + if (!stcpu_thread) stcpu_thread = rrdset_find_localhost("netdata.plugin_freebsd_cpu"); + if (!stcpu_thread) { + stcpu_thread = rrdset_create_localhost("netdata", "plugin_freebsd_cpu", NULL, "freebsd", NULL + , "NetData FreeBSD Plugin CPU usage", "milliseconds/s", 132000 + , localhost->rrd_update_every, RRDSET_TYPE_STACKED); +#else if (!stcpu_thread) stcpu_thread = rrdset_find_localhost("netdata.plugin_proc_cpu"); if (!stcpu_thread) { stcpu_thread = rrdset_create_localhost("netdata", "plugin_proc_cpu", NULL, "proc", NULL , "NetData Proc Plugin CPU usage", "milliseconds/s", 132000 , localhost->rrd_update_every, RRDSET_TYPE_STACKED); +#endif rrddim_add(stcpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL); rrddim_add(stcpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL); diff --git a/src/plugin_freebsd.c b/src/plugin_freebsd.c index 3490e70e..003c8d2c 100644 --- a/src/plugin_freebsd.c +++ b/src/plugin_freebsd.c @@ -1,5 +1,27 @@ #include "common.h" +static struct freebsd_module { + const char *name; + const char *dim; + + int enabled; + + int (*func)(int update_every, usec_t dt); + usec_t duration; + + RRDDIM *rd; + +} freebsd_modules[] = { + + { .name = "freebsd_old", .dim = "freebsd_old", .func = do_freebsd_sysctl_old }, + + // system metrics + { .name = "vm.loadavg", .dim = "loadavg", .func = do_vm_loadavg }, + + // the terminator of this array + { .name = NULL, .dim = NULL, .func = NULL } +}; + void *freebsd_main(void *ptr) { struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr; @@ -11,34 +33,80 @@ void *freebsd_main(void *ptr) { if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0) error("Cannot set pthread cancel state to ENABLE."); - // when ZERO, attempt to do it - int vdo_cpu_netdata = !config_get_boolean("plugin:freebsd", "netdata server resources", 1); - int vdo_freebsd_sysctl = !config_get_boolean("plugin:freebsd", "sysctl", 1); + int vdo_cpu_netdata = config_get_boolean("plugin:freebsd", "netdata server resources", 1); + + // initialize FreeBSD plugin + if (freebsd_plugin_init()) + netdata_exit = 1; - // keep track of the time each module was called - unsigned long long sutime_freebsd_sysctl = 0ULL; + // check the enabled status for each module + int i; + for(i = 0 ; freebsd_modules[i].name ;i++) { + struct freebsd_module *pm = &freebsd_modules[i]; + + pm->enabled = config_get_boolean("plugin:freebsd", pm->name, 1); + pm->duration = 0ULL; + pm->rd = NULL; + } usec_t step = localhost->rrd_update_every * USEC_PER_SEC; heartbeat_t hb; heartbeat_init(&hb); + for(;;) { usec_t hb_dt = heartbeat_next(&hb, step); + usec_t duration = 0ULL; if(unlikely(netdata_exit)) break; // BEGIN -- the job to be done - if(!vdo_freebsd_sysctl) { - debug(D_PROCNETDEV_LOOP, "FREEBSD: calling do_freebsd_sysctl()."); - vdo_freebsd_sysctl = do_freebsd_sysctl(localhost->rrd_update_every, hb_dt); + for(i = 0 ; freebsd_modules[i].name ;i++) { + struct freebsd_module *pm = &freebsd_modules[i]; + if(unlikely(!pm->enabled)) continue; + + debug(D_PROCNETDEV_LOOP, "FREEBSD calling %s.", pm->name); + + pm->enabled = !pm->func(localhost->rrd_update_every, hb_dt); + pm->duration = heartbeat_dt_usec(&hb) - duration; + duration += pm->duration; + + if(unlikely(netdata_exit)) break; } - if(unlikely(netdata_exit)) break; // END -- the job is done // -------------------------------------------------------------------- - if(!vdo_cpu_netdata) { + if(vdo_cpu_netdata) { + static RRDSET *st = NULL; + + if(unlikely(!st)) { + st = rrdset_find_bytype_localhost("netdata", "plugin_freebsd_modules"); + + if(!st) { + st = rrdset_create_localhost("netdata", "plugin_freebsd_modules", NULL, "freebsd", NULL + , "NetData FreeBSD Plugin Modules Durations", "milliseconds/run", 132001 + , localhost->rrd_update_every, RRDSET_TYPE_STACKED); + + for(i = 0 ; freebsd_modules[i].name ;i++) { + struct freebsd_module *pm = &freebsd_modules[i]; + if(unlikely(!pm->enabled)) continue; + + pm->rd = rrddim_add(st, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE); + } + } + } + else rrdset_next(st); + + for(i = 0 ; freebsd_modules[i].name ;i++) { + struct freebsd_module *pm = &freebsd_modules[i]; + if(unlikely(!pm->enabled)) continue; + + rrddim_set_by_pointer(st, pm->rd, pm->duration); + } + rrdset_done(st); + global_statistics_charts(); registry_statistics(); } diff --git a/src/plugin_freebsd.h b/src/plugin_freebsd.h index 3a1ac391..a437c4e7 100644 --- a/src/plugin_freebsd.h +++ b/src/plugin_freebsd.h @@ -3,11 +3,14 @@ #include -#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var)) - void *freebsd_main(void *ptr); -extern int do_freebsd_sysctl(int update_every, usec_t dt); +extern int freebsd_plugin_init(); + +extern int do_vm_loadavg(int update_every, usec_t dt); +extern int do_freebsd_sysctl_old(int update_every, usec_t dt); + +#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var)) static inline int getsysctl(const char *name, void *ptr, size_t len) {