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
{