]> arthur.barton.de Git - netdata.git/commitdiff
Prepare FreeBSD plugin for refactoring and update main function
authorVladimir Kobal <vlad@prokk.net>
Mon, 6 Mar 2017 09:36:45 +0000 (11:36 +0200)
committerVladimir Kobal <vlad@prokk.net>
Mon, 6 Mar 2017 16:13:06 +0000 (18:13 +0200)
src/freebsd_sysctl.c
src/global_statistics.c
src/plugin_freebsd.c
src/plugin_freebsd.h

index 1dc9d47bbfd6b639b05fee9bd0fd19e21ed8a206..bcb3eb74d12d236af13ea5e5417890f219244476 100644 (file)
@@ -1,42 +1,30 @@
 #include "common.h"
 
-// NEEDED BY: struct vmtotal, struct vmmeter
 #include <sys/vmmeter.h>
-// NEEDED BY: struct devstat
 #include <sys/devicestat.h>
-// NEEDED BY: struct xswdev
+#include <sys/mount.h>
 #include <vm/vm_param.h>
-// NEEDED BY: struct semid_kernel, struct shmid_kernel, struct msqid_kernel
+
 #define _KERNEL
 #include <sys/sem.h>
 #include <sys/shm.h>
 #include <sys/msg.h>
 #undef _KERNEL
-// NEEDED BY: struct sysctl_netisr_workstream, struct sysctl_netisr_work
+
 #include <net/netisr.h>
-// NEEDED BY: struct ifaddrs, getifaddrs()
 #include <net/if.h>
 #include <ifaddrs.h>
-// NEEDED BY do_tcp...
-#include <netinet/tcp_var.h>
-#include <netinet/tcp_fsm.h>
-// NEEDED BY do_udp..., do_ip...
-#include <netinet/ip_var.h>
-// NEEDED BY do_udp...
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-// NEEDED BY do_icmp...
+
 #include <netinet/ip.h>
+#include <netinet/ip_var.h>
 #include <netinet/ip_icmp.h>
 #include <netinet/icmp_var.h>
-// NEEDED BY do_ip6...
 #include <netinet6/ip6_var.h>
-// NEEDED BY do_icmp6...
 #include <netinet/icmp6.h>
-// NEEDED BY do_space, do_inodes
-#include <sys/mount.h>
-// NEEDED BY do_uptime
-#include <time.h>
+#include <netinet/tcp_var.h>
+#include <netinet/tcp_fsm.h>
+#include <netinet/udp.h>
+#include <netinet/udp_var.h>
 
 #define KILO_FACTOR 1024
 #define MEGA_FACTOR 1048576     // 1024 * 1024
 
 #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;
index c3d63043e13967a6efbb48fcfb4734d271c3f078..17faeaa1f3e829b1b89ff88feded9d1f9b3fb907 100644 (file)
@@ -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);
index 3490e70edef2f587d758ce0bb1adf61ecb6a77db..003c8d2ce984b733d5c138c78e5b24ff5891b85d 100644 (file)
@@ -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();
         }
index 3a1ac39100ff884171bfcb5bdb0a7b3b7afa6e96..a437c4e7cc956dd01b0c81a2be3c3cee83e179de 100644 (file)
@@ -3,11 +3,14 @@
 
 #include <sys/sysctl.h>
 
-#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)
 {