From d2af61701b7c47f441c69758dc3909f5b31d5731 Mon Sep 17 00:00:00 2001 From: Vladimir Kobal Date: Fri, 2 Dec 2016 14:34:56 +0200 Subject: [PATCH] Preparations in the source tree for FreeBSD plugin --- configure.ac | 11 ++ src/Makefile.am | 41 ++++--- src/common.h | 4 + src/ipc.c | 14 --- src/main.c | 5 + src/plugin_freebsd.c | 262 +++++++++++++++++++++++++++++++++++++++++++ src/plugin_freebsd.h | 28 +++++ 7 files changed, 336 insertions(+), 29 deletions(-) create mode 100644 src/plugin_freebsd.c create mode 100644 src/plugin_freebsd.h diff --git a/configure.ac b/configure.ac index 8d554db3..11ab9170 100644 --- a/configure.ac +++ b/configure.ac @@ -36,6 +36,17 @@ PKG_PROG_PKG_CONFIG AC_USE_SYSTEM_EXTENSIONS AC_CHECK_FUNCS_ONCE(accept4) +# Check system type +case "$host_os" in +freebsd*) + build_target=freebsd + ;; +*) + ;; +esac + +AM_CONDITIONAL([FREEBSD], [test x$build_target = xfreebsd]) + AC_ARG_ENABLE( [plugin-nfacct], [AS_HELP_STRING([--enable-plugin-nfacct], [enable nfacct plugin, requires root])], diff --git a/src/Makefile.am b/src/Makefile.am index b3b3223a..0472f997 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -36,16 +36,36 @@ netdata_SOURCES = \ eval.c eval.h \ global_statistics.c global_statistics.h \ health.c health.h \ - ipc.c ipc.h \ log.c log.h \ main.c main.h \ plugin_checks.c plugin_checks.h \ plugin_idlejitter.c plugin_idlejitter.h \ plugin_nfacct.c plugin_nfacct.h \ - plugin_proc.c plugin_proc.h \ plugin_tc.c plugin_tc.h \ plugins_d.c plugins_d.h \ popen.c popen.h \ + sys_fs_cgroup.c \ + procfile.c procfile.h \ + proc_self_mountinfo.c proc_self_mountinfo.h \ + registry.c registry.h \ + rrd.c rrd.h \ + rrd2json.c rrd2json.h \ + storage_number.c storage_number.h \ + unit_test.c unit_test.h \ + url.c url.h \ + web_buffer.c web_buffer.h \ + web_buffer_svg.c web_buffer_svg.h \ + web_client.c web_client.h \ + web_server.c web_server.h \ + $(NULL) + +if FREEBSD +netdata_SOURCES += \ + plugin_freebsd.c plugin_freebsd.h \ + $(NULL) +else +netdata_SOURCES += \ + plugin_proc.c plugin_proc.h \ proc_diskstats.c \ proc_interrupts.c \ proc_softirqs.c \ @@ -62,23 +82,14 @@ netdata_SOURCES = \ proc_net_stat_conntrack.c \ proc_net_stat_synproxy.c \ proc_stat.c \ - proc_self_mountinfo.c proc_self_mountinfo.h \ proc_sys_kernel_random_entropy_avail.c \ proc_vmstat.c \ + ipc.c ipc.h \ sys_kernel_mm_ksm.c \ - sys_fs_cgroup.c \ - procfile.c procfile.h \ - registry.c registry.h \ - rrd.c rrd.h \ - rrd2json.c rrd2json.h \ - storage_number.c storage_number.h \ - unit_test.c unit_test.h \ - url.c url.h \ - web_buffer.c web_buffer.h \ - web_buffer_svg.c web_buffer_svg.h \ - web_client.c web_client.h \ - web_server.c web_server.h \ $(NULL) +endif + + netdata_LDADD = \ $(OPTIONAL_MATH_LIBS) \ $(OPTIONAL_NFACCT_LIBS) \ diff --git a/src/common.h b/src/common.h index abcdfcfe..b1b98447 100644 --- a/src/common.h +++ b/src/common.h @@ -117,7 +117,11 @@ #include "plugin_checks.h" #include "plugin_idlejitter.h" #include "plugin_nfacct.h" +#ifndef __FreeBSD__ #include "plugin_proc.h" +#else +#include "plugin_freebsd.h" +#endif /* __FreeBSD__ */ #include "plugin_tc.h" #include "plugins_d.h" diff --git a/src/ipc.c b/src/ipc.c index 54ebe817..3cf76513 100644 --- a/src/ipc.c +++ b/src/ipc.c @@ -41,7 +41,6 @@ struct ipc_status { * tells us to define it ourselves, but until recently Linux include files * would also define it. */ -#ifndef __FreeBSD__ #ifndef HAVE_UNION_SEMUN /* according to X/OPEN we have to define it ourselves */ union semun { @@ -51,19 +50,6 @@ union semun { struct seminfo *__buf; }; #endif -#else /* __FreeBSD__ */ -struct seminfo { - int semmni, /* # of semaphore identifiers */ - semmns, /* # of semaphores in system */ - semmnu, /* # of undo structures in system */ - semmsl, /* max # of semaphores per id */ - semopm, /* max # of operations per semop call */ - semume, /* max # of undo entries per process */ - semusz, /* size in bytes of undo structure */ - semvmx, /* semaphore maximum value */ - semaem; /* adjust on exit max value */ -}; -#endif /* __FreeBSD__ */ static inline int ipc_sem_get_limits(struct ipc_limits *lim) { static procfile *ff = NULL; diff --git a/src/main.c b/src/main.c index 6f3efb1f..99d03e6b 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,12 @@ struct netdata_static_thread { {"tc", "plugins", "tc", 1, NULL, NULL, tc_main}, {"idlejitter", "plugins", "idlejitter", 1, NULL, NULL, cpuidlejitter_main}, +#ifndef __FreeBSD__ {"proc", "plugins", "proc", 1, NULL, NULL, proc_main}, +#else + {"freebsd", "plugins", "freebsd", 1, NULL, NULL, freebsd_main}, +#endif /* __FreeBSD__ */ + {"cgroups", "plugins", "cgroups", 1, NULL, NULL, cgroups_main}, {"check", "plugins", "checks", 0, NULL, NULL, checks_main}, {"backends", NULL, NULL, 1, NULL, NULL, backends_main}, diff --git a/src/plugin_freebsd.c b/src/plugin_freebsd.c new file mode 100644 index 00000000..834d7b72 --- /dev/null +++ b/src/plugin_freebsd.c @@ -0,0 +1,262 @@ +#include "common.h" + +void *freebsd_main(void *ptr) +{ + (void)ptr; + + info("FREEBSD Plugin thread created with task id %d", gettid()); + + if(pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL) != 0) + error("Cannot set pthread cancel type to DEFERRED."); + + if(pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) != 0) + error("Cannot set pthread cancel state to ENABLE."); + + // disable (by default) various interface that are not needed + /* + config_get_boolean("plugin:proc:/proc/net/dev:lo", "enabled", 0); + config_get_boolean("plugin:proc:/proc/net/dev:fireqos_monitor", "enabled", 0); + */ + + // when ZERO, attempt to do it + /* + int vdo_proc_net_dev = !config_get_boolean("plugin:proc", "/proc/net/dev", 1); + int vdo_proc_diskstats = !config_get_boolean("plugin:proc", "/proc/diskstats", 1); + int vdo_proc_net_snmp = !config_get_boolean("plugin:proc", "/proc/net/snmp", 1); + int vdo_proc_net_snmp6 = !config_get_boolean("plugin:proc", "/proc/net/snmp6", 1); + int vdo_proc_net_netstat = !config_get_boolean("plugin:proc", "/proc/net/netstat", 1); + int vdo_proc_net_stat_conntrack = !config_get_boolean("plugin:proc", "/proc/net/stat/conntrack", 1); + int vdo_proc_net_ip_vs_stats = !config_get_boolean("plugin:proc", "/proc/net/ip_vs/stats", 1); + int vdo_proc_net_stat_synproxy = !config_get_boolean("plugin:proc", "/proc/net/stat/synproxy", 1); + int vdo_proc_stat = !config_get_boolean("plugin:proc", "/proc/stat", 1); + int vdo_proc_meminfo = !config_get_boolean("plugin:proc", "/proc/meminfo", 1); + int vdo_proc_vmstat = !config_get_boolean("plugin:proc", "/proc/vmstat", 1); + int vdo_proc_net_rpc_nfs = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfs", 1); + int vdo_proc_net_rpc_nfsd = !config_get_boolean("plugin:proc", "/proc/net/rpc/nfsd", 1); + int vdo_proc_sys_kernel_random_entropy_avail = !config_get_boolean("plugin:proc", "/proc/sys/kernel/random/entropy_avail", 1); + int vdo_proc_interrupts = !config_get_boolean("plugin:proc", "/proc/interrupts", 1); + int vdo_proc_softirqs = !config_get_boolean("plugin:proc", "/proc/softirqs", 1); + int vdo_proc_net_softnet_stat = !config_get_boolean("plugin:proc", "/proc/net/softnet_stat", 1); + int vdo_proc_loadavg = !config_get_boolean("plugin:proc", "/proc/loadavg", 1); + int vdo_ipc = !config_get_boolean("plugin:proc", "ipc", 1); + int vdo_sys_kernel_mm_ksm = !config_get_boolean("plugin:proc", "/sys/kernel/mm/ksm", 1); + */ + int vdo_cpu_netdata = !config_get_boolean("plugin:proc", "netdata server resources", 1); + + + // keep track of the time each module was called + /* + unsigned long long sutime_proc_net_dev = 0ULL; + unsigned long long sutime_proc_diskstats = 0ULL; + unsigned long long sutime_proc_net_snmp = 0ULL; + unsigned long long sutime_proc_net_snmp6 = 0ULL; + unsigned long long sutime_proc_net_netstat = 0ULL; + unsigned long long sutime_proc_net_stat_conntrack = 0ULL; + unsigned long long sutime_proc_net_ip_vs_stats = 0ULL; + unsigned long long sutime_proc_net_stat_synproxy = 0ULL; + unsigned long long sutime_proc_stat = 0ULL; + unsigned long long sutime_proc_meminfo = 0ULL; + unsigned long long sutime_proc_vmstat = 0ULL; + unsigned long long sutime_proc_net_rpc_nfs = 0ULL; + unsigned long long sutime_proc_net_rpc_nfsd = 0ULL; + unsigned long long sutime_proc_sys_kernel_random_entropy_avail = 0ULL; + unsigned long long sutime_proc_interrupts = 0ULL; + unsigned long long sutime_proc_softirqs = 0ULL; + unsigned long long sutime_proc_net_softnet_stat = 0ULL; + unsigned long long sutime_proc_loadavg = 0ULL; + unsigned long long sutime_ipc = 0ULL; + unsigned long long sutime_sys_kernel_mm_ksm = 0ULL; + */ + + unsigned long long step = rrd_update_every * 1000000ULL; + for(;;) { + unsigned long long now = time_usec(); + unsigned long long next = now - (now % step) + step; + + while(now < next) { + sleep_usec(next - now); + now = time_usec(); + } + + if(unlikely(netdata_exit)) break; + + // BEGIN -- the job to be done + /* + + if(!vdo_sys_kernel_mm_ksm) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_sys_kernel_mm_ksm()."); + + now = time_usec(); + 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); + sutime_sys_kernel_mm_ksm = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_loadavg) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_loadavg()."); + now = time_usec(); + vdo_proc_loadavg = do_proc_loadavg(rrd_update_every, (sutime_proc_loadavg > 0)?now - sutime_proc_loadavg:0ULL); + sutime_proc_loadavg = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_ipc) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_ipc()."); + now = time_usec(); + vdo_ipc = do_ipc(rrd_update_every, (sutime_ipc > 0)?now - sutime_ipc:0ULL); + sutime_ipc = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_interrupts) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_interrupts()."); + now = time_usec(); + vdo_proc_interrupts = do_proc_interrupts(rrd_update_every, (sutime_proc_interrupts > 0)?now - sutime_proc_interrupts:0ULL); + sutime_proc_interrupts = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_softirqs) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_softirqs()."); + now = time_usec(); + vdo_proc_softirqs = do_proc_softirqs(rrd_update_every, (sutime_proc_softirqs > 0)?now - sutime_proc_softirqs:0ULL); + sutime_proc_softirqs = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_softnet_stat) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_softnet_stat()."); + now = time_usec(); + 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); + sutime_proc_net_softnet_stat = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_sys_kernel_random_entropy_avail) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_sys_kernel_random_entropy_avail()."); + now = time_usec(); + 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); + sutime_proc_sys_kernel_random_entropy_avail = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_dev) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_dev()."); + now = time_usec(); + vdo_proc_net_dev = do_proc_net_dev(rrd_update_every, (sutime_proc_net_dev > 0)?now - sutime_proc_net_dev:0ULL); + sutime_proc_net_dev = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_diskstats) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_diskstats()."); + now = time_usec(); + vdo_proc_diskstats = do_proc_diskstats(rrd_update_every, (sutime_proc_diskstats > 0)?now - sutime_proc_diskstats:0ULL); + sutime_proc_diskstats = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_snmp) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp()."); + now = time_usec(); + vdo_proc_net_snmp = do_proc_net_snmp(rrd_update_every, (sutime_proc_net_snmp > 0)?now - sutime_proc_net_snmp:0ULL); + sutime_proc_net_snmp = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_snmp6) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_snmp6()."); + now = time_usec(); + vdo_proc_net_snmp6 = do_proc_net_snmp6(rrd_update_every, (sutime_proc_net_snmp6 > 0)?now - sutime_proc_net_snmp6:0ULL); + sutime_proc_net_snmp6 = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_netstat) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_netstat()."); + now = time_usec(); + vdo_proc_net_netstat = do_proc_net_netstat(rrd_update_every, (sutime_proc_net_netstat > 0)?now - sutime_proc_net_netstat:0ULL); + sutime_proc_net_netstat = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_stat_conntrack) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_stat_conntrack()."); + now = time_usec(); + 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); + sutime_proc_net_stat_conntrack = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_ip_vs_stats) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_ip_vs_stats()."); + now = time_usec(); + 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); + sutime_proc_net_ip_vs_stats = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_stat_synproxy) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_net_stat_synproxy()."); + now = time_usec(); + 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); + sutime_proc_net_stat_synproxy = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_stat) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_stat()."); + now = time_usec(); + vdo_proc_stat = do_proc_stat(rrd_update_every, (sutime_proc_stat > 0)?now - sutime_proc_stat:0ULL); + sutime_proc_stat = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_meminfo) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_meminfo()."); + now = time_usec(); + vdo_proc_meminfo = do_proc_meminfo(rrd_update_every, (sutime_proc_meminfo > 0)?now - sutime_proc_meminfo:0ULL); + sutime_proc_meminfo = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_vmstat) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling vdo_proc_vmstat()."); + now = time_usec(); + vdo_proc_vmstat = do_proc_vmstat(rrd_update_every, (sutime_proc_vmstat > 0)?now - sutime_proc_vmstat:0ULL); + sutime_proc_vmstat = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_rpc_nfsd) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfsd()."); + now = time_usec(); + 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); + sutime_proc_net_rpc_nfsd = now; + } + if(unlikely(netdata_exit)) break; + + if(!vdo_proc_net_rpc_nfs) { + debug(D_PROCNETDEV_LOOP, "PROCNETDEV: calling do_proc_net_rpc_nfs()."); + now = time_usec(); + 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); + sutime_proc_net_rpc_nfs = now; + } + if(unlikely(netdata_exit)) break; + */ + + // END -- the job is done + + // -------------------------------------------------------------------- + + if(!vdo_cpu_netdata) { + global_statistics_charts(); + registry_statistics(); + } + } + + info("FREEBSD thread exiting"); + + pthread_exit(NULL); + return NULL; +} diff --git a/src/plugin_freebsd.h b/src/plugin_freebsd.h new file mode 100644 index 00000000..6607a288 --- /dev/null +++ b/src/plugin_freebsd.h @@ -0,0 +1,28 @@ +#ifndef NETDATA_PLUGIN_FREEBSD_H +#define NETDATA_PLUGIN_FREEBSD_H 1 + +void *freebsd_main(void *ptr); + +/* +extern int do_proc_net_dev(int update_every, unsigned long long dt); +extern int do_proc_diskstats(int update_every, unsigned long long dt); +extern int do_proc_net_snmp(int update_every, unsigned long long dt); +extern int do_proc_net_snmp6(int update_every, unsigned long long dt); +extern int do_proc_net_netstat(int update_every, unsigned long long dt); +extern int do_proc_net_stat_conntrack(int update_every, unsigned long long dt); +extern int do_proc_net_ip_vs_stats(int update_every, unsigned long long dt); +extern int do_proc_stat(int update_every, unsigned long long dt); +extern int do_proc_meminfo(int update_every, unsigned long long dt); +extern int do_proc_vmstat(int update_every, unsigned long long dt); +extern int do_proc_net_rpc_nfs(int update_every, unsigned long long dt); +extern int do_proc_net_rpc_nfsd(int update_every, unsigned long long dt); +extern int do_proc_sys_kernel_random_entropy_avail(int update_every, unsigned long long dt); +extern int do_proc_interrupts(int update_every, unsigned long long dt); +extern int do_proc_softirqs(int update_every, unsigned long long dt); +extern int do_sys_kernel_mm_ksm(int update_every, unsigned long long dt); +extern int do_proc_loadavg(int update_every, unsigned long long dt); +extern int do_proc_net_stat_synproxy(int update_every, unsigned long long dt); +extern int do_proc_net_softnet_stat(int update_every, unsigned long long dt); +*/ + +#endif /* NETDATA_FREEBSD_PROC_H */ -- 2.39.2