@cryptotaxi247 / netdata-1 / commits / d2af61701

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 */