@cryptotaxi247 / netdata-1 / commits / 104c3dadd

Prepare FreeBSD plugin for refactoring and update main function

Vladimir Kobal committed Mar 6, 2017 at 11:36 UTC 104c3daddb5f10903997c43fdfa7622d88839238
4 files changed +121 -38
src/freebsd_sysctl.c
+29 -25
@@ -1,42 +1,30 @@
1 #include "common.h"
2
3 -// NEEDED BY: struct vmtotal, struct vmmeter
3 #include <sys/vmmeter.h>
5 -// NEEDED BY: struct devstat
4 #include <sys/devicestat.h>
7 -// NEEDED BY: struct xswdev
5 +#include <sys/mount.h>
6 #include <vm/vm_param.h>
9 -// NEEDED BY: struct semid_kernel, struct shmid_kernel, struct msqid_kernel
7 +
8 #define _KERNEL
9 #include <sys/sem.h>
10 #include <sys/shm.h>
11 #include <sys/msg.h>
12 #undef _KERNEL
15 -// NEEDED BY: struct sysctl_netisr_workstream, struct sysctl_netisr_work
13 +
14 #include <net/netisr.h>
17 -// NEEDED BY: struct ifaddrs, getifaddrs()
15 #include <net/if.h>
16 #include <ifaddrs.h>
20 -// NEEDED BY do_tcp...
21 -#include <netinet/tcp_var.h>
22 -#include <netinet/tcp_fsm.h>
23 -// NEEDED BY do_udp..., do_ip...
24 -#include <netinet/ip_var.h>
25 -// NEEDED BY do_udp...
26 -#include <netinet/udp.h>
27 -#include <netinet/udp_var.h>
28 -// NEEDED BY do_icmp...
17 +
18 #include <netinet/ip.h>
19 +#include <netinet/ip_var.h>
20 #include <netinet/ip_icmp.h>
21 #include <netinet/icmp_var.h>
32 -// NEEDED BY do_ip6...
22 #include <netinet6/ip6_var.h>
34 -// NEEDED BY do_icmp6...
23 #include <netinet/icmp6.h>
36 -// NEEDED BY do_space, do_inodes
37 -#include <sys/mount.h>
38 -// NEEDED BY do_uptime
39 -#include <time.h>
24 +#include <netinet/tcp_var.h>
25 +#include <netinet/tcp_fsm.h>
26 +#include <netinet/udp.h>
27 +#include <netinet/udp_var.h>
28
29 #define KILO_FACTOR 1024
30 #define MEGA_FACTOR 1048576 // 1024 * 1024
@@ -44,16 +32,33 @@
32
33 #define MAX_INT_DIGITS 10 // maximum number of digits for int
34
35 +int system_pagesize = PAGE_SIZE;
36 +
37 // NEEDED BY: do_disk_io
38 #define RRD_TYPE_DISK "disk"
39
40 +// NEEDED BY: do_bandwidth
41 +#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
42 +
43 +// FreeBSD plugin initialization
44 +int freebsd_plugin_init()
45 +{
46 + if (system_pagesize = getpagesize() <= 0) {
47 + error("FREEBSD: can't get system page size");
48 + return 1;
49 + }
50 +
51 + return 0;
52 +}
53 +
54 // FreeBSD calculates load averages once every 5 seconds
55 #define MIN_LOADAVG_UPDATE_EVERY 5
56
53 -// NEEDED BY: do_bandwidth
54 -#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
57 +int do_vm_loadavg(int update_every, usec_t dt){
58 +
59 +}
60
56 -int do_freebsd_sysctl(int update_every, usec_t dt) {
61 +int do_freebsd_sysctl_old(int update_every, usec_t dt) {
62 static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
63 do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
64 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) {
129 RRDSET *st;
130 RRDDIM *rd;
131
127 - int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
132 int i, n;
133 void *p;
134 int common_error = 0;
src/global_statistics.c
+8
@@ -129,11 +129,19 @@ void global_statistics_charts(void) {
129 getrusage(RUSAGE_THREAD, &thread);
130 getrusage(RUSAGE_SELF, &me);
131
132 +#ifdef __FreeBSD__
133 + if (!stcpu_thread) stcpu_thread = rrdset_find_localhost("netdata.plugin_freebsd_cpu");
134 + if (!stcpu_thread) {
135 + stcpu_thread = rrdset_create_localhost("netdata", "plugin_freebsd_cpu", NULL, "freebsd", NULL
136 + , "NetData FreeBSD Plugin CPU usage", "milliseconds/s", 132000
137 + , localhost->rrd_update_every, RRDSET_TYPE_STACKED);
138 +#else
139 if (!stcpu_thread) stcpu_thread = rrdset_find_localhost("netdata.plugin_proc_cpu");
140 if (!stcpu_thread) {
141 stcpu_thread = rrdset_create_localhost("netdata", "plugin_proc_cpu", NULL, "proc", NULL
142 , "NetData Proc Plugin CPU usage", "milliseconds/s", 132000
143 , localhost->rrd_update_every, RRDSET_TYPE_STACKED);
144 +#endif
145
146 rrddim_add(stcpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
147 rrddim_add(stcpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
src/plugin_freebsd.c
+78 -10
@@ -1,5 +1,27 @@
1 #include "common.h"
2
3 +static struct freebsd_module {
4 + const char *name;
5 + const char *dim;
6 +
7 + int enabled;
8 +
9 + int (*func)(int update_every, usec_t dt);
10 + usec_t duration;
11 +
12 + RRDDIM *rd;
13 +
14 +} freebsd_modules[] = {
15 +
16 + { .name = "freebsd_old", .dim = "freebsd_old", .func = do_freebsd_sysctl_old },
17 +
18 + // system metrics
19 + { .name = "vm.loadavg", .dim = "loadavg", .func = do_vm_loadavg },
20 +
21 + // the terminator of this array
22 + { .name = NULL, .dim = NULL, .func = NULL }
23 +};
24 +
25 void *freebsd_main(void *ptr) {
26 struct netdata_static_thread *static_thread = (struct netdata_static_thread *)ptr;
27
@@ -11,34 +33,80 @@ void *freebsd_main(void *ptr) {
33 if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
34 error("Cannot set pthread cancel state to ENABLE.");
35
14 - // when ZERO, attempt to do it
15 - int vdo_cpu_netdata = !config_get_boolean("plugin:freebsd", "netdata server resources", 1);
16 - int vdo_freebsd_sysctl = !config_get_boolean("plugin:freebsd", "sysctl", 1);
36 + int vdo_cpu_netdata = config_get_boolean("plugin:freebsd", "netdata server resources", 1);
37 +
38 + // initialize FreeBSD plugin
39 + if (freebsd_plugin_init())
40 + netdata_exit = 1;
41
18 - // keep track of the time each module was called
19 - unsigned long long sutime_freebsd_sysctl = 0ULL;
42 + // check the enabled status for each module
43 + int i;
44 + for(i = 0 ; freebsd_modules[i].name ;i++) {
45 + struct freebsd_module *pm = &freebsd_modules[i];
46 +
47 + pm->enabled = config_get_boolean("plugin:freebsd", pm->name, 1);
48 + pm->duration = 0ULL;
49 + pm->rd = NULL;
50 + }
51
52 usec_t step = localhost->rrd_update_every * USEC_PER_SEC;
53 heartbeat_t hb;
54 heartbeat_init(&hb);
55 +
56 for(;;) {
57 usec_t hb_dt = heartbeat_next(&hb, step);
58 + usec_t duration = 0ULL;
59
60 if(unlikely(netdata_exit)) break;
61
62 // BEGIN -- the job to be done
63
31 - if(!vdo_freebsd_sysctl) {
32 - debug(D_PROCNETDEV_LOOP, "FREEBSD: calling do_freebsd_sysctl().");
33 - vdo_freebsd_sysctl = do_freebsd_sysctl(localhost->rrd_update_every, hb_dt);
64 + for(i = 0 ; freebsd_modules[i].name ;i++) {
65 + struct freebsd_module *pm = &freebsd_modules[i];
66 + if(unlikely(!pm->enabled)) continue;
67 +
68 + debug(D_PROCNETDEV_LOOP, "FREEBSD calling %s.", pm->name);
69 +
70 + pm->enabled = !pm->func(localhost->rrd_update_every, hb_dt);
71 + pm->duration = heartbeat_dt_usec(&hb) - duration;
72 + duration += pm->duration;
73 +
74 + if(unlikely(netdata_exit)) break;
75 }
35 - if(unlikely(netdata_exit)) break;
76
77 // END -- the job is done
78
79 // --------------------------------------------------------------------
80
41 - if(!vdo_cpu_netdata) {
81 + if(vdo_cpu_netdata) {
82 + static RRDSET *st = NULL;
83 +
84 + if(unlikely(!st)) {
85 + st = rrdset_find_bytype_localhost("netdata", "plugin_freebsd_modules");
86 +
87 + if(!st) {
88 + st = rrdset_create_localhost("netdata", "plugin_freebsd_modules", NULL, "freebsd", NULL
89 + , "NetData FreeBSD Plugin Modules Durations", "milliseconds/run", 132001
90 + , localhost->rrd_update_every, RRDSET_TYPE_STACKED);
91 +
92 + for(i = 0 ; freebsd_modules[i].name ;i++) {
93 + struct freebsd_module *pm = &freebsd_modules[i];
94 + if(unlikely(!pm->enabled)) continue;
95 +
96 + pm->rd = rrddim_add(st, pm->dim, NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
97 + }
98 + }
99 + }
100 + else rrdset_next(st);
101 +
102 + for(i = 0 ; freebsd_modules[i].name ;i++) {
103 + struct freebsd_module *pm = &freebsd_modules[i];
104 + if(unlikely(!pm->enabled)) continue;
105 +
106 + rrddim_set_by_pointer(st, pm->rd, pm->duration);
107 + }
108 + rrdset_done(st);
109 +
110 global_statistics_charts();
111 registry_statistics();
112 }
src/plugin_freebsd.h
+6 -3
@@ -3,11 +3,14 @@
3
4 #include <sys/sysctl.h>
5
6 -#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
7 -
6 void *freebsd_main(void *ptr);
7
10 -extern int do_freebsd_sysctl(int update_every, usec_t dt);
8 +extern int freebsd_plugin_init();
9 +
10 +extern int do_vm_loadavg(int update_every, usec_t dt);
11 +extern int do_freebsd_sysctl_old(int update_every, usec_t dt);
12 +
13 +#define GETSYSCTL(name, var) getsysctl(name, &(var), sizeof(var))
14
15 static inline int getsysctl(const char *name, void *ptr, size_t len)
16 {