Preparations in the source tree for FreeBSD plugin
Vladimir Kobal committed
Dec 2, 2016 at 14:34 UTC
d2af61701b7c47f441c69758dc3909f5b31d5731
7 files changed
+336
-29
configure.ac
+11
@@ -36,6 +36,17 @@ PKG_PROG_PKG_CONFIG
36
AC_USE_SYSTEM_EXTENSIONS
37
AC_CHECK_FUNCS_ONCE(accept4)
38
39
+# Check system type
40
+case "$host_os" in
41
+freebsd*)
42
+ build_target=freebsd
43
+ ;;
44
+*)
45
+ ;;
46
+esac
47
+
48
+AM_CONDITIONAL([FREEBSD], [test x$build_target = xfreebsd])
49
+
50
AC_ARG_ENABLE(
51
[plugin-nfacct],
52
[AS_HELP_STRING([--enable-plugin-nfacct], [enable nfacct plugin, requires root])],
src/Makefile.am
+26
-15
@@ -36,16 +36,36 @@ netdata_SOURCES = \
36
eval.c eval.h \
37
global_statistics.c global_statistics.h \
38
health.c health.h \
39
- ipc.c ipc.h \
39
log.c log.h \
40
main.c main.h \
41
plugin_checks.c plugin_checks.h \
42
plugin_idlejitter.c plugin_idlejitter.h \
43
plugin_nfacct.c plugin_nfacct.h \
45
- plugin_proc.c plugin_proc.h \
44
plugin_tc.c plugin_tc.h \
45
plugins_d.c plugins_d.h \
46
popen.c popen.h \
47
+ sys_fs_cgroup.c \
48
+ procfile.c procfile.h \
49
+ proc_self_mountinfo.c proc_self_mountinfo.h \
50
+ registry.c registry.h \
51
+ rrd.c rrd.h \
52
+ rrd2json.c rrd2json.h \
53
+ storage_number.c storage_number.h \
54
+ unit_test.c unit_test.h \
55
+ url.c url.h \
56
+ web_buffer.c web_buffer.h \
57
+ web_buffer_svg.c web_buffer_svg.h \
58
+ web_client.c web_client.h \
59
+ web_server.c web_server.h \
60
+ $(NULL)
61
+
62
+if FREEBSD
63
+netdata_SOURCES += \
64
+ plugin_freebsd.c plugin_freebsd.h \
65
+ $(NULL)
66
+else
67
+netdata_SOURCES += \
68
+ plugin_proc.c plugin_proc.h \
69
proc_diskstats.c \
70
proc_interrupts.c \
71
proc_softirqs.c \
@@ -62,23 +82,14 @@ netdata_SOURCES = \
82
proc_net_stat_conntrack.c \
83
proc_net_stat_synproxy.c \
84
proc_stat.c \
65
- proc_self_mountinfo.c proc_self_mountinfo.h \
85
proc_sys_kernel_random_entropy_avail.c \
86
proc_vmstat.c \
87
+ ipc.c ipc.h \
88
sys_kernel_mm_ksm.c \
69
- sys_fs_cgroup.c \
70
- procfile.c procfile.h \
71
- registry.c registry.h \
72
- rrd.c rrd.h \
73
- rrd2json.c rrd2json.h \
74
- storage_number.c storage_number.h \
75
- unit_test.c unit_test.h \
76
- url.c url.h \
77
- web_buffer.c web_buffer.h \
78
- web_buffer_svg.c web_buffer_svg.h \
79
- web_client.c web_client.h \
80
- web_server.c web_server.h \
89
$(NULL)
90
+endif
91
+
92
+
93
netdata_LDADD = \
94
$(OPTIONAL_MATH_LIBS) \
95
$(OPTIONAL_NFACCT_LIBS) \
src/common.h
+4
@@ -117,7 +117,11 @@
117
#include "plugin_checks.h"
118
#include "plugin_idlejitter.h"
119
#include "plugin_nfacct.h"
120
+#ifndef __FreeBSD__
121
#include "plugin_proc.h"
122
+#else
123
+#include "plugin_freebsd.h"
124
+#endif /* __FreeBSD__ */
125
#include "plugin_tc.h"
126
#include "plugins_d.h"
127
src/ipc.c
-14
@@ -41,7 +41,6 @@ struct ipc_status {
41
* tells us to define it ourselves, but until recently Linux include files
42
* would also define it.
43
*/
44
-#ifndef __FreeBSD__
44
#ifndef HAVE_UNION_SEMUN
45
/* according to X/OPEN we have to define it ourselves */
46
union semun {
@@ -51,19 +50,6 @@ union semun {
50
struct seminfo *__buf;
51
};
52
#endif
54
-#else /* __FreeBSD__ */
55
-struct seminfo {
56
- int semmni, /* # of semaphore identifiers */
57
- semmns, /* # of semaphores in system */
58
- semmnu, /* # of undo structures in system */
59
- semmsl, /* max # of semaphores per id */
60
- semopm, /* max # of operations per semop call */
61
- semume, /* max # of undo entries per process */
62
- semusz, /* size in bytes of undo structure */
63
- semvmx, /* semaphore maximum value */
64
- semaem; /* adjust on exit max value */
65
-};
66
-#endif /* __FreeBSD__ */
53
54
static inline int ipc_sem_get_limits(struct ipc_limits *lim) {
55
static procfile *ff = NULL;
src/main.c
+5
@@ -45,7 +45,12 @@ struct netdata_static_thread {
45
46
{"tc", "plugins", "tc", 1, NULL, NULL, tc_main},
47
{"idlejitter", "plugins", "idlejitter", 1, NULL, NULL, cpuidlejitter_main},
48
+#ifndef __FreeBSD__
49
{"proc", "plugins", "proc", 1, NULL, NULL, proc_main},
50
+#else
51
+ {"freebsd", "plugins", "freebsd", 1, NULL, NULL, freebsd_main},
52
+#endif /* __FreeBSD__ */
53
+
54
{"cgroups", "plugins", "cgroups", 1, NULL, NULL, cgroups_main},
55
{"check", "plugins", "checks", 0, NULL, NULL, checks_main},
56
{"backends", NULL, NULL, 1, NULL, NULL, backends_main},
src/plugin_freebsd.c
new
+262
@@ -0,0 +1,262 @@
1
+#include "common.h"
2
+
3
+void *freebsd_main(void *ptr)
4
+{
5
+ (void)ptr;
6
+
7
+ info("FREEBSD Plugin thread created with task id %d", gettid());
8
+
9
+ if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0)
10
+ error("Cannot set pthread cancel type to DEFERRED.");
11
+
12
+ if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0)
13
+ error("Cannot set pthread cancel state to ENABLE.");
14
+
15
+ // disable (by default) various interface that are not needed
16
+ /*
17
+ config_get_boolean("plugin:proc:/proc/net/dev:lo", "enabled", 0);
18
+ config_get_boolean("plugin:proc:/proc/net/dev:fireqos_monitor", "enabled", 0);
19
+ */
20
+
21
+ // when ZERO, attempt to do it
22
+ /*
23
+ int vdo_proc_net_dev = !config_get_boolean("plugin:proc", "/proc/net/dev", 1);
24
+ int vdo_proc_diskstats = !config_get_boolean("plugin:proc", "/proc/diskstats", 1);
25
+ int vdo_proc_net_snmp = !config_get_boolean("plugin:proc", "/proc/net/snmp", 1);
26
+ int vdo_proc_net_snmp6 = !config_get_boolean("plugin:proc", "/proc/net/snmp6", 1);
27
+ int vdo_proc_net_netstat = !config_get_boolean("plugin:proc", "/proc/net/netstat", 1);
28
+ int vdo_proc_net_stat_conntrack = !config_get_boolean("plugin:proc", "/proc/net/stat/conntrack", 1);
29
+ int vdo_proc_net_ip_vs_stats = !config_get_boolean("plugin:proc", "/proc/net/ip_vs/stats", 1);
30
+ int vdo_proc_net_stat_synproxy = !config_get_boolean("plugin:proc", "/proc/net/stat/synproxy", 1);
31
+ int vdo_proc_stat = !config_get_boolean("plugin:proc", "/proc/stat", 1);
32
+ int vdo_proc_meminfo = !config_get_boolean("plugin:proc", "/proc/meminfo", 1);
33
+ int vdo_proc_vmstat = !config_get_boolean("plugin:proc", "/proc/vmstat", 1);
34
+ int vdo_proc_net_rpc_nfs = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfs", 1);
35
+ int vdo_proc_net_rpc_nfsd = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfsd", 1);
36
+ int vdo_proc_sys_kernel_random_entropy_avail = !config_get_boolean("plugin:proc", "/proc/sys/kernel/random/entropy_avail", 1);
37
+ int vdo_proc_interrupts = !config_get_boolean("plugin:proc", "/proc/interrupts", 1);
38
+ int vdo_proc_softirqs = !config_get_boolean("plugin:proc", "/proc/softirqs", 1);
39
+ int vdo_proc_net_softnet_stat = !config_get_boolean("plugin:proc", "/proc/net/softnet_stat", 1);
40
+ int vdo_proc_loadavg = !config_get_boolean("plugin:proc", "/proc/loadavg", 1);
41
+ int vdo_ipc = !config_get_boolean("plugin:proc", "ipc", 1);
42
+ int vdo_sys_kernel_mm_ksm = !config_get_boolean("plugin:proc", "/sys/kernel/mm/ksm", 1);
43
+ */
44
+ int vdo_cpu_netdata = !config_get_boolean("plugin:proc", "netdata server resources", 1);
45
+
46
+
47
+ // keep track of the time each module was called
48
+ /*
49
+ unsigned long long sutime_proc_net_dev = 0ULL;
50
+ unsigned long long sutime_proc_diskstats = 0ULL;
51
+ unsigned long long sutime_proc_net_snmp = 0ULL;
52
+ unsigned long long sutime_proc_net_snmp6 = 0ULL;
53
+ unsigned long long sutime_proc_net_netstat = 0ULL;
54
+ unsigned long long sutime_proc_net_stat_conntrack = 0ULL;
55
+ unsigned long long sutime_proc_net_ip_vs_stats = 0ULL;
56
+ unsigned long long sutime_proc_net_stat_synproxy = 0ULL;
57
+ unsigned long long sutime_proc_stat = 0ULL;
58
+ unsigned long long sutime_proc_meminfo = 0ULL;
59
+ unsigned long long sutime_proc_vmstat = 0ULL;
60
+ unsigned long long sutime_proc_net_rpc_nfs = 0ULL;
61
+ unsigned long long sutime_proc_net_rpc_nfsd = 0ULL;
62
+ unsigned long long sutime_proc_sys_kernel_random_entropy_avail = 0ULL;
63
+ unsigned long long sutime_proc_interrupts = 0ULL;
64
+ unsigned long long sutime_proc_softirqs = 0ULL;
65
+ unsigned long long sutime_proc_net_softnet_stat = 0ULL;
66
+ unsigned long long sutime_proc_loadavg = 0ULL;
67
+ unsigned long long sutime_ipc = 0ULL;
68
+ unsigned long long sutime_sys_kernel_mm_ksm = 0ULL;
69
+ */
70
+
71
+ unsigned long long step = rrd_update_every * 1000000ULL;
72
+ for(;;) {
73
+ unsigned long long now = time_usec();
74
+ unsigned long long next = now - (now % step) + step;
75
+
76
+ while(now < next) {
77
+ sleep_usec(next - now);
78
+ now = time_usec();
79
+ }
80
+
81
+ if(unlikely(netdata_exit)) break;
82
+
83
+ // BEGIN -- the job to be done
84
+ /*
85
+
86
+ if(!vdo_sys_kernel_mm_ksm) {
87
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_sys_kernel_mm_ksm().");
88
+
89
+ now = time_usec();
90
+ vdo_sys_kernel_mm_ksm = do_sys_kernel_mm_ksm(rrd_update_every, (sutime_sys_kernel_mm_ksm > 0)?now - sutime_sys_kernel_mm_ksm:0ULL);
91
+ sutime_sys_kernel_mm_ksm = now;
92
+ }
93
+ if(unlikely(netdata_exit)) break;
94
+
95
+ if(!vdo_proc_loadavg) {
96
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_loadavg().");
97
+ now = time_usec();
98
+ vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, (sutime_proc_loadavg > 0)?now - sutime_proc_loadavg:0ULL);
99
+ sutime_proc_loadavg = now;
100
+ }
101
+ if(unlikely(netdata_exit)) break;
102
+
103
+ if(!vdo_ipc) {
104
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_ipc().");
105
+ now = time_usec();
106
+ vdo_ipc = do_ipc(rrd_update_every, (sutime_ipc > 0)?now - sutime_ipc:0ULL);
107
+ sutime_ipc = now;
108
+ }
109
+ if(unlikely(netdata_exit)) break;
110
+
111
+ if(!vdo_proc_interrupts) {
112
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_interrupts().");
113
+ now = time_usec();
114
+ vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, (sutime_proc_interrupts > 0)?now - sutime_proc_interrupts:0ULL);
115
+ sutime_proc_interrupts = now;
116
+ }
117
+ if(unlikely(netdata_exit)) break;
118
+
119
+ if(!vdo_proc_softirqs) {
120
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_softirqs().");
121
+ now = time_usec();
122
+ vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, (sutime_proc_softirqs > 0)?now - sutime_proc_softirqs:0ULL);
123
+ sutime_proc_softirqs = now;
124
+ }
125
+ if(unlikely(netdata_exit)) break;
126
+
127
+ if(!vdo_proc_net_softnet_stat) {
128
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_softnet_stat().");
129
+ now = time_usec();
130
+ vdo_proc_net_softnet_stat = do_proc_net_softnet_stat(rrd_update_every, (sutime_proc_net_softnet_stat > 0)?now - sutime_proc_net_softnet_stat:0ULL);
131
+ sutime_proc_net_softnet_stat = now;
132
+ }
133
+ if(unlikely(netdata_exit)) break;
134
+
135
+ if(!vdo_proc_sys_kernel_random_entropy_avail) {
136
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_sys_kernel_random_entropy_avail().");
137
+ now = time_usec();
138
+ vdo_proc_sys_kernel_random_entropy_avail = do_proc_sys_kernel_random_entropy_avail(rrd_update_every, (sutime_proc_sys_kernel_random_entropy_avail > 0)?now - sutime_proc_sys_kernel_random_entropy_avail:0ULL);
139
+ sutime_proc_sys_kernel_random_entropy_avail = now;
140
+ }
141
+ if(unlikely(netdata_exit)) break;
142
+
143
+ if(!vdo_proc_net_dev) {
144
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev().");
145
+ now = time_usec();
146
+ vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, (sutime_proc_net_dev > 0)?now - sutime_proc_net_dev:0ULL);
147
+ sutime_proc_net_dev = now;
148
+ }
149
+ if(unlikely(netdata_exit)) break;
150
+
151
+ if(!vdo_proc_diskstats) {
152
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats().");
153
+ now = time_usec();
154
+ vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, (sutime_proc_diskstats > 0)?now - sutime_proc_diskstats:0ULL);
155
+ sutime_proc_diskstats = now;
156
+ }
157
+ if(unlikely(netdata_exit)) break;
158
+
159
+ if(!vdo_proc_net_snmp) {
160
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp().");
161
+ now = time_usec();
162
+ vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, (sutime_proc_net_snmp > 0)?now - sutime_proc_net_snmp:0ULL);
163
+ sutime_proc_net_snmp = now;
164
+ }
165
+ if(unlikely(netdata_exit)) break;
166
+
167
+ if(!vdo_proc_net_snmp6) {
168
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp6().");
169
+ now = time_usec();
170
+ vdo_proc_net_snmp6 = do_proc_net_snmp6(rrd_update_every, (sutime_proc_net_snmp6 > 0)?now - sutime_proc_net_snmp6:0ULL);
171
+ sutime_proc_net_snmp6 = now;
172
+ }
173
+ if(unlikely(netdata_exit)) break;
174
+
175
+ if(!vdo_proc_net_netstat) {
176
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat().");
177
+ now = time_usec();
178
+ vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, (sutime_proc_net_netstat > 0)?now - sutime_proc_net_netstat:0ULL);
179
+ sutime_proc_net_netstat = now;
180
+ }
181
+ if(unlikely(netdata_exit)) break;
182
+
183
+ if(!vdo_proc_net_stat_conntrack) {
184
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack().");
185
+ now = time_usec();
186
+ vdo_proc_net_stat_conntrack = do_proc_net_stat_conntrack(rrd_update_every, (sutime_proc_net_stat_conntrack > 0)?now - sutime_proc_net_stat_conntrack:0ULL);
187
+ sutime_proc_net_stat_conntrack = now;
188
+ }
189
+ if(unlikely(netdata_exit)) break;
190
+
191
+ if(!vdo_proc_net_ip_vs_stats) {
192
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats().");
193
+ now = time_usec();
194
+ vdo_proc_net_ip_vs_stats = do_proc_net_ip_vs_stats(rrd_update_every, (sutime_proc_net_ip_vs_stats > 0)?now - sutime_proc_net_ip_vs_stats:0ULL);
195
+ sutime_proc_net_ip_vs_stats = now;
196
+ }
197
+ if(unlikely(netdata_exit)) break;
198
+
199
+ if(!vdo_proc_net_stat_synproxy) {
200
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_stat_synproxy().");
201
+ now = time_usec();
202
+ vdo_proc_net_stat_synproxy = do_proc_net_stat_synproxy(rrd_update_every, (sutime_proc_net_stat_synproxy > 0)?now - sutime_proc_net_stat_synproxy:0ULL);
203
+ sutime_proc_net_stat_synproxy = now;
204
+ }
205
+ if(unlikely(netdata_exit)) break;
206
+
207
+ if(!vdo_proc_stat) {
208
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat().");
209
+ now = time_usec();
210
+ vdo_proc_stat = do_proc_stat(rrd_update_every, (sutime_proc_stat > 0)?now - sutime_proc_stat:0ULL);
211
+ sutime_proc_stat = now;
212
+ }
213
+ if(unlikely(netdata_exit)) break;
214
+
215
+ if(!vdo_proc_meminfo) {
216
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo().");
217
+ now = time_usec();
218
+ vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, (sutime_proc_meminfo > 0)?now - sutime_proc_meminfo:0ULL);
219
+ sutime_proc_meminfo = now;
220
+ }
221
+ if(unlikely(netdata_exit)) break;
222
+
223
+ if(!vdo_proc_vmstat) {
224
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat().");
225
+ now = time_usec();
226
+ vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, (sutime_proc_vmstat > 0)?now - sutime_proc_vmstat:0ULL);
227
+ sutime_proc_vmstat = now;
228
+ }
229
+ if(unlikely(netdata_exit)) break;
230
+
231
+ if(!vdo_proc_net_rpc_nfsd) {
232
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd().");
233
+ now = time_usec();
234
+ vdo_proc_net_rpc_nfsd = do_proc_net_rpc_nfsd(rrd_update_every, (sutime_proc_net_rpc_nfsd > 0)?now - sutime_proc_net_rpc_nfsd:0ULL);
235
+ sutime_proc_net_rpc_nfsd = now;
236
+ }
237
+ if(unlikely(netdata_exit)) break;
238
+
239
+ if(!vdo_proc_net_rpc_nfs) {
240
+ debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfs().");
241
+ now = time_usec();
242
+ vdo_proc_net_rpc_nfs = do_proc_net_rpc_nfs(rrd_update_every, (sutime_proc_net_rpc_nfs > 0)?now - sutime_proc_net_rpc_nfs:0ULL);
243
+ sutime_proc_net_rpc_nfs = now;
244
+ }
245
+ if(unlikely(netdata_exit)) break;
246
+ */
247
+
248
+ // END -- the job is done
249
+
250
+ // --------------------------------------------------------------------
251
+
252
+ if(!vdo_cpu_netdata) {
253
+ global_statistics_charts();
254
+ registry_statistics();
255
+ }
256
+ }
257
+
258
+ info("FREEBSD thread exiting");
259
+
260
+ pthread_exit(NULL);
261
+ return NULL;
262
+}
src/plugin_freebsd.h
new
+28
@@ -0,0 +1,28 @@
1
+#ifndef NETDATA_PLUGIN_FREEBSD_H
2
+#define NETDATA_PLUGIN_FREEBSD_H 1
3
+
4
+void *freebsd_main(void *ptr);
5
+
6
+/*
7
+extern int do_proc_net_dev(int update_every, unsigned long long dt);
8
+extern int do_proc_diskstats(int update_every, unsigned long long dt);
9
+extern int do_proc_net_snmp(int update_every, unsigned long long dt);
10
+extern int do_proc_net_snmp6(int update_every, unsigned long long dt);
11
+extern int do_proc_net_netstat(int update_every, unsigned long long dt);
12
+extern int do_proc_net_stat_conntrack(int update_every, unsigned long long dt);
13
+extern int do_proc_net_ip_vs_stats(int update_every, unsigned long long dt);
14
+extern int do_proc_stat(int update_every, unsigned long long dt);
15
+extern int do_proc_meminfo(int update_every, unsigned long long dt);
16
+extern int do_proc_vmstat(int update_every, unsigned long long dt);
17
+extern int do_proc_net_rpc_nfs(int update_every, unsigned long long dt);
18
+extern int do_proc_net_rpc_nfsd(int update_every, unsigned long long dt);
19
+extern int do_proc_sys_kernel_random_entropy_avail(int update_every, unsigned long long dt);
20
+extern int do_proc_interrupts(int update_every, unsigned long long dt);
21
+extern int do_proc_softirqs(int update_every, unsigned long long dt);
22
+extern int do_sys_kernel_mm_ksm(int update_every, unsigned long long dt);
23
+extern int do_proc_loadavg(int update_every, unsigned long long dt);
24
+extern int do_proc_net_stat_synproxy(int update_every, unsigned long long dt);
25
+extern int do_proc_net_softnet_stat(int update_every, unsigned long long dt);
26
+*/
27
+
28
+#endif /* NETDATA_FREEBSD_PROC_H */