diff --git a/utils/collectd/Makefile b/utils/collectd/Makefile index 3bf51d8dd..74fa9c42a 100644 --- a/utils/collectd/Makefile +++ b/utils/collectd/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=collectd -PKG_VERSION:=5.9.0 -PKG_RELEASE:=4 +PKG_VERSION:=5.10.0 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=https://collectd.org/files/ \ https://github.com/collectd/collectd/releases/download/collectd-$(PKG_VERSION) -PKG_HASH:=7b220f8898a061f6e7f29a8c16697d1a198277f813da69474a67911097c0626b +PKG_HASH:=a03359f563023e744c2dc743008a00a848f4cd506e072621d86b6d8313c0375b PKG_FIXUP:=autoreconf PKG_REMOVE_FILES:=aclocal.m4 libltdl/aclocal.m4 @@ -82,6 +82,7 @@ COLLECTD_PLUGINS_DISABLED:= \ perl \ pf \ pinba \ + procevent \ python \ redis \ rrdcached \ @@ -92,6 +93,7 @@ COLLECTD_PLUGINS_DISABLED:= \ statsd \ swap \ synproxy \ + sysevent \ tape \ tokyotyrant \ turbostat \ @@ -177,6 +179,7 @@ COLLECTD_PLUGINS_SELECTED:= \ teamspeak2 \ ted \ thermal \ + threshold \ unixsock \ uptime \ users \ @@ -419,6 +422,7 @@ $(eval $(call BuildPlugin,teamspeak2,TeamSpeak2 input,teamspeak2,)) $(eval $(call BuildPlugin,ted,The Energy Detective input,ted,)) $(eval $(call BuildPlugin,tcpconns,TCP connection tracking input,tcpconns,)) $(eval $(call BuildPlugin,thermal,system temperatures input,thermal,)) +$(eval $(call BuildPlugin,threshold,Notifications and thresholds,threshold,)) $(eval $(call BuildPlugin,unixsock,unix socket output,unixsock,)) $(eval $(call BuildPlugin,uptime,uptime status input,uptime,)) $(eval $(call BuildPlugin,users,user logged in status input,users,)) diff --git a/utils/collectd/files/collectd.init b/utils/collectd/files/collectd.init index a0029267a..89af365c2 100644 --- a/utils/collectd/files/collectd.init +++ b/utils/collectd/files/collectd.init @@ -1,8 +1,6 @@ #!/bin/sh /etc/rc.common # Copyright (C) 2006-2016 OpenWrt.org -. "/usr/share/libubox/jshn.sh" - START=80 STOP=10 @@ -46,6 +44,129 @@ process_exec_sections() { fi } +process_curl() { + printf "\n" >> "$COLLECTD_CONF" + config_foreach process_curl_page curl_page + printf "\n\n" >> "$COLLECTD_CONF" +} + +process_curl_page() { + local cfg="$1" + + local name url + + config_get name "$cfg" name + [ -z "$name" ] && { + $LOG notice "No name option in config $cfg defined" + return 0 + } + + config_get url "$cfg" url + [ -z "$url" ] && { + $LOG notice "No URL option in config $cfg defined" + return 0 + } + + printf "\\t\n" "${name}" >> "$COLLECTD_CONF" + printf "\\t\\tURL \"%s\"\n" "${url}" >> "$COLLECTD_CONF" + printf "\\t\\tMeasureResponseTime true\n" >> "$COLLECTD_CONF" + printf "\\t\n" >> "$COLLECTD_CONF" +} + +process_network() { + local cfg="$1" + + local TimeToLive Forward CacheFlush + + printf "\n" >> "$COLLECTD_CONF" + config_foreach process_network_sections network_listen "listen" + config_foreach process_network_sections network_server "server" + + config_get TimeToLive "$cfg" TimeToLive + [ -z "$TimeToLive" ] || { + printf "\\tTimeToLive %s\n" "${TimeToLive}" >> "$COLLECTD_CONF" + } + + config_get CacheFlush "$cfg" CacheFlush + [ -z "$CacheFlush" ] || { + printf "\\tCacheFlush %s\n" "${CacheFlush}" >> "$COLLECTD_CONF" + } + + config_get_bool Forward "$cfg" Forward + if [ "$value" = "0" ]; then + printf "\\tForward false\n" >> "$COLLECTD_CONF" + else + printf "\\tForward true\n" >> "$COLLECTD_CONF" + fi + + printf "\n\n" >> "$COLLECTD_CONF" +} + +process_network_sections() { + local cfg="$1" + local section="$2" + + local host port output + + config_get host "$cfg" host + [ -z "$host" ] && { + $LOG notice "No host option in config $cfg defined" + return 0 + } + + if [ "$section" = "server" ]; then + output="Server \"$host\"" + else + output="Listen \"$host\"" + fi + + config_get port "$cfg" port + if [ -z "$port" ]; then + printf "\\t%s\n" "${output}" >> "$COLLECTD_CONF" + else + printf "\\t%s \"%s\"\n" "${output}" "${port}" >> "$COLLECTD_CONF" + fi +} + +process_iptables() { + local cfg="$1" + + printf "\n" >> "$COLLECTD_CONF" + config_foreach process_iptables_sections iptables_match + printf "\n\n" >> "$COLLECTD_CONF" +} + +process_iptables_sections() { + local cfg="$1" + + local table chain + + config_get table "$cfg" table + [ -z "$table" ] && { + $LOG notice "No table option in config $cfg defined" + return 0 + } + + config_get chain "$cfg" chain + [ -z "$chain" ] && { + $LOG notice "No chain option in config $cfg defined" + return 0 + } + + config_get index "$cfg" index + [ -z "$index" ] && { + $LOG notice "No index option in config $cfg defined" + return 0 + } + + config_get name "$cfg" name + if [ -z "$name" ]; then + printf "\\tChain %s %s %s\n" "${table}" "${chain}" "${index}" >> "$COLLECTD_CONF" + else + printf "\\tChain %s %s %s \"%s\"\n" "${table}" "${chain}" "${index}" "${name}">> "$COLLECTD_CONF" + fi +} + CONFIG_LIST="" add_list_option() { local value="$1" @@ -62,6 +183,7 @@ process_generic() { local config="" + . /usr/share/libubox/jshn.sh json_init json_load_file "$json" @@ -140,6 +262,18 @@ process_plugins() { CONFIG_STRING="" process_exec ;; + curl) + CONFIG_STRING="" + process_curl + ;; + network) + CONFIG_STRING="" + process_network "$cfg" + ;; + iptables) + CONFIG_STRING="" + process_iptables + ;; *) CONFIG_STRING="" process_generic "$cfg" "\\t" "/usr/share/collectd/plugin/$cfg.json" @@ -190,7 +324,7 @@ process_config() { config_get ReadThreads globals ReadThreads 2 printf "ReadThreads \"%s\"\n" "$ReadThreads" >> "$COLLECTD_CONF" - config_get Hostname globals Hostname "$(hostname)" + config_get Hostname globals Hostname "$(uname -n)" printf "Hostname \"%s\"\n" "$Hostname" >> "$COLLECTD_CONF" printf "\n" >> "$COLLECTD_CONF" @@ -199,17 +333,24 @@ process_config() { config_foreach process_plugins plugin } +service_triggers() +{ + procd_add_reload_trigger "collectd" +} + start_service() { + process_config + procd_open_instance procd_set_param command /usr/sbin/collectd procd_append_param command -C "$COLLECTD_CONF" - procd_append_param command -f # don't daemonize, procd will handle that for us + procd_append_param command -f # don't daemonize procd_set_param nice "$NICEPRIO" - - process_config - - # set auto respawn behavior + procd_set_param stderr 1 procd_set_param respawn procd_close_instance } +reload_service() { + restart "$@" +} diff --git a/utils/collectd/files/collectd.uci b/utils/collectd/files/collectd.uci index 73e2c2ab5..a04cbc31a 100644 --- a/utils/collectd/files/collectd.uci +++ b/utils/collectd/files/collectd.uci @@ -8,6 +8,11 @@ config globals 'globals' # option Interval '30' # option ReadThreads '2' +#config plugin 'apcups' +# option enable '0' +# option Host 'localhost' +# option Port '3551' + #config plugin 'conntrack' # option enable '0' @@ -25,6 +30,13 @@ config globals 'globals' # option StoreRates '0' # option DataDir '/tmp' +#config plugin 'curl' +# option enable '0' + +#config curl_page +# option name 'test' +# option url 'http://finance.google.com/finance?q=NYSE%3AAMD%22' + #config plugin 'df' # option enable '0' # list Device '/dev/mtdblock/4' @@ -69,6 +81,15 @@ config globals 'globals' # list Interface 'br-lan' # option IgnoreSelected '0' +#config plugin 'iptables' +# option enable '1' + +#config iptables_match +# option table 'nat' +# option chain 'zone_wan_postrouting' +# option index '1' +# option name 'WLAN-Clients traffic' + #config plugin 'irq' # option enable '0' # list Irq '2' @@ -96,6 +117,20 @@ config globals 'globals' # list VerboseInterface 'br-lan' # list QDisc 'br-lan' +#config plugin 'network' +# option enable '1' +# option TimeToLive '128' +# option Forward '1' +# option CacheFlush '86400' + +#config network_listen +# option host '0.0.0.0' +# option port '25826' + +#config network_server +# option host '1.1.1.1' +# option port '25826' + #config plugin 'nut' # option enable '0' # option UPS 'myupsname' diff --git a/utils/collectd/files/usr/share/collectd/plugin/apcups.json b/utils/collectd/files/usr/share/collectd/plugin/apcups.json new file mode 100644 index 000000000..15a31df9f --- /dev/null +++ b/utils/collectd/files/usr/share/collectd/plugin/apcups.json @@ -0,0 +1,6 @@ +{ + "string": [ + "Host", + "Port" + ] +} diff --git a/utils/collectd/files/usr/share/collectd/plugin/cpu.json b/utils/collectd/files/usr/share/collectd/plugin/cpu.json index 2c63c0851..ef28a43e8 100644 --- a/utils/collectd/files/usr/share/collectd/plugin/cpu.json +++ b/utils/collectd/files/usr/share/collectd/plugin/cpu.json @@ -1,2 +1,7 @@ { + "bool": [ + "ValuesPercentage", + "ReportByCpu", + "ReportByState" + ] } diff --git a/utils/collectd/files/usr/share/collectd/plugin/curl.json b/utils/collectd/files/usr/share/collectd/plugin/curl.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/utils/collectd/files/usr/share/collectd/plugin/curl.json @@ -0,0 +1,2 @@ +{ +} diff --git a/utils/collectd/files/usr/share/collectd/plugin/iptables.json b/utils/collectd/files/usr/share/collectd/plugin/iptables.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/utils/collectd/files/usr/share/collectd/plugin/iptables.json @@ -0,0 +1,2 @@ +{ +} diff --git a/utils/collectd/files/usr/share/collectd/plugin/logfile.json b/utils/collectd/files/usr/share/collectd/plugin/logfile.json new file mode 100644 index 000000000..fd1608497 --- /dev/null +++ b/utils/collectd/files/usr/share/collectd/plugin/logfile.json @@ -0,0 +1,9 @@ +{ + "string": [ + "LogLevel", + "File" + ], + "bool": [ + "Timestamp" + ] +} diff --git a/utils/collectd/files/usr/share/collectd/plugin/memory.json b/utils/collectd/files/usr/share/collectd/plugin/memory.json index 2c63c0851..fc43e2fe9 100644 --- a/utils/collectd/files/usr/share/collectd/plugin/memory.json +++ b/utils/collectd/files/usr/share/collectd/plugin/memory.json @@ -1,2 +1,6 @@ { + "bool": [ + "ValuesPercentage", + "ValuesAbsolute" + ] } diff --git a/utils/collectd/files/usr/share/collectd/plugin/network.json b/utils/collectd/files/usr/share/collectd/plugin/network.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/utils/collectd/files/usr/share/collectd/plugin/network.json @@ -0,0 +1,2 @@ +{ +} diff --git a/utils/collectd/patches/300-delay-first-read-cycle.patch b/utils/collectd/patches/300-delay-first-read-cycle.patch index 6c6d1b116..d4eb82666 100644 --- a/utils/collectd/patches/300-delay-first-read-cycle.patch +++ b/utils/collectd/patches/300-delay-first-read-cycle.patch @@ -1,6 +1,6 @@ --- a/src/daemon/plugin.c +++ b/src/daemon/plugin.c -@@ -1085,7 +1085,7 @@ static int plugin_insert_read(read_func_ +@@ -1092,7 +1092,7 @@ static int plugin_insert_read(read_func_ int status; llentry_t *le; diff --git a/utils/collectd/patches/320-reaction-to-ntp-time-change-at-boot.patch b/utils/collectd/patches/320-reaction-to-ntp-time-change-at-boot.patch new file mode 100644 index 000000000..9b0d0338c --- /dev/null +++ b/utils/collectd/patches/320-reaction-to-ntp-time-change-at-boot.patch @@ -0,0 +1,61 @@ +Adjust the reaction to a polling interval timestamp that references +to a past time. + +Past timestamps can happen when ntpd adjusts router's time after network +connectivity is obtained after boot. Collectd shows warnings for each plugin +as it tries to enter new values with the same timestamp as the previous one. + +This patch adjusts the next polling time to be now+2 seconds for the main +loop and for the plugin-specific read loops. That avoids the warnings, but +does not overreact in case there are shorter polling intervals or the time +gets adjusted for other reasons. + +Additionally some debug statements are added, but they are visible only +when --enable-debug configure option is used in Makefile. + + +--- a/src/daemon/collectd.c ++++ b/src/daemon/collectd.c +@@ -274,20 +274,23 @@ static int do_loop(void) { + update_kstat(); + #endif + ++ DEBUG("do_loop before plugin_read_all: now = %.3f", CDTIME_T_TO_DOUBLE(cdtime())); + /* Issue all plugins */ + plugin_read_all(); + + cdtime_t now = cdtime(); ++ DEBUG("do_loop after plugin_read_all: now = %.3f, wait_until= %.3f", CDTIME_T_TO_DOUBLE(now), CDTIME_T_TO_DOUBLE(wait_until)); + if (now >= wait_until) { +- WARNING("Not sleeping because the next interval is " ++ WARNING("Sleeping only 2s because the next interval is " + "%.3f seconds in the past!", + CDTIME_T_TO_DOUBLE(now - wait_until)); +- wait_until = now + interval; +- continue; ++ wait_until = now + DOUBLE_TO_CDTIME_T(2); ++ DEBUG("do_loop: wait_until adjusted to now+2 = %.3f", CDTIME_T_TO_DOUBLE(wait_until)); + } + + struct timespec ts_wait = CDTIME_T_TO_TIMESPEC(wait_until - now); + wait_until = wait_until + interval; ++ DEBUG("do_loop ends: wait_until set to %.3f", CDTIME_T_TO_DOUBLE(wait_until)); + + while ((loop == 0) && (nanosleep(&ts_wait, &ts_wait) != 0)) { + if (errno != EINTR) { +--- a/src/daemon/plugin.c ++++ b/src/daemon/plugin.c +@@ -585,10 +585,11 @@ static void *plugin_read_thread(void __a + + /* Check, if `rf_next_read' is in the past. */ + if (rf->rf_next_read < now) { +- /* `rf_next_read' is in the past. Insert `now' ++ /* `rf_next_read' is in the past. Insert `now'+2s + * so this value doesn't trail off into the + * past too much. */ +- rf->rf_next_read = now; ++ rf->rf_next_read = now + DOUBLE_TO_CDTIME_T(2); ++ DEBUG("plugin_read_thread: Next read is in the past. Adjusted to now+2s"); + } + + DEBUG("plugin_read_thread: Next read of the `%s' plugin at %.3f.", diff --git a/utils/collectd/patches/600-fix-libmodbus-detection.patch b/utils/collectd/patches/600-fix-libmodbus-detection.patch index 7b22b6a89..464605762 100644 --- a/utils/collectd/patches/600-fix-libmodbus-detection.patch +++ b/utils/collectd/patches/600-fix-libmodbus-detection.patch @@ -18,7 +18,7 @@ Reversed patch to be applied: --- a/configure.ac +++ b/configure.ac -@@ -3399,9 +3399,9 @@ if test "x$with_libmodbus" = "xyes"; the +@@ -3389,9 +3389,9 @@ if test "x$with_libmodbus" = "xyes"; the SAVE_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $with_libmodbus_cflags" diff --git a/utils/collectd/patches/700-disable-sys-capability-check.patch b/utils/collectd/patches/700-disable-sys-capability-check.patch index c5126731e..8b3068707 100644 --- a/utils/collectd/patches/700-disable-sys-capability-check.patch +++ b/utils/collectd/patches/700-disable-sys-capability-check.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -531,11 +531,7 @@ if test "x$ac_system" = "xLinux"; then +@@ -532,11 +532,7 @@ if test "x$ac_system" = "xLinux"; then [have_cpuid_h="no (cpuid.h not found)"] ) diff --git a/utils/collectd/patches/900-add-iwinfo-plugin.patch b/utils/collectd/patches/900-add-iwinfo-plugin.patch index ff0269b83..318cfb78b 100644 --- a/utils/collectd/patches/900-add-iwinfo-plugin.patch +++ b/utils/collectd/patches/900-add-iwinfo-plugin.patch @@ -1,6 +1,6 @@ --- a/configure.ac +++ b/configure.ac -@@ -721,6 +721,11 @@ AC_CACHE_CHECK([whether clock_boottime a +@@ -712,6 +712,11 @@ AC_CACHE_CHECK([whether clock_boottime a ] ) @@ -12,7 +12,7 @@ # # Checks for typedefs, structures, and compiler characteristics. -@@ -6392,6 +6397,7 @@ plugin_ipc="no" +@@ -6397,6 +6402,7 @@ plugin_ipc="no" plugin_ipmi="no" plugin_ipvs="no" plugin_irq="no" @@ -20,7 +20,7 @@ plugin_load="no" plugin_log_logstash="no" plugin_mcelog="no" -@@ -6826,6 +6832,7 @@ AC_PLUGIN([ipmi], [$plugi +@@ -6841,6 +6847,7 @@ AC_PLUGIN([ipmi], [$plugi AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters]) AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics]) AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics]) @@ -28,7 +28,7 @@ AC_PLUGIN([java], [$with_java], [Embed the Java Virtual Machine]) AC_PLUGIN([load], [$plugin_load], [System load]) AC_PLUGIN([log_logstash], [$plugin_log_logstash], [Logstash json_event compatible logging]) -@@ -7193,6 +7200,7 @@ AC_MSG_RESULT([ libyajl . . . . . . . +@@ -7212,6 +7219,7 @@ AC_MSG_RESULT([ libyajl . . . . . . . AC_MSG_RESULT([ oracle . . . . . . . $with_oracle]) AC_MSG_RESULT([ protobuf-c . . . . . $have_protoc_c]) AC_MSG_RESULT([ protoc 3 . . . . . . $have_protoc3]) @@ -36,7 +36,7 @@ AC_MSG_RESULT() AC_MSG_RESULT([ Features:]) AC_MSG_RESULT([ daemon mode . . . . . $enable_daemon]) -@@ -7253,6 +7261,7 @@ AC_MSG_RESULT([ ipmi . . . . . . . . +@@ -7274,6 +7282,7 @@ AC_MSG_RESULT([ ipmi . . . . . . . . AC_MSG_RESULT([ iptables . . . . . . $enable_iptables]) AC_MSG_RESULT([ ipvs . . . . . . . . $enable_ipvs]) AC_MSG_RESULT([ irq . . . . . . . . . $enable_irq]) @@ -46,7 +46,7 @@ AC_MSG_RESULT([ logfile . . . . . . . $enable_logfile]) --- a/src/collectd.conf.in +++ b/src/collectd.conf.in -@@ -138,6 +138,7 @@ +@@ -140,6 +140,7 @@ #@BUILD_PLUGIN_IPTABLES_TRUE@LoadPlugin iptables #@BUILD_PLUGIN_IPVS_TRUE@LoadPlugin ipvs #@BUILD_PLUGIN_IRQ_TRUE@LoadPlugin irq @@ -54,7 +54,7 @@ #@BUILD_PLUGIN_JAVA_TRUE@LoadPlugin java @BUILD_PLUGIN_LOAD_TRUE@@BUILD_PLUGIN_LOAD_TRUE@LoadPlugin load #@BUILD_PLUGIN_LPAR_TRUE@LoadPlugin lpar -@@ -767,6 +768,12 @@ +@@ -775,6 +776,12 @@ # IgnoreSelected true # @@ -69,7 +69,7 @@ # JVMArg "-Djava.class.path=@prefix@/share/collectd/java/collectd-api.jar" --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod -@@ -3803,6 +3803,27 @@ and all other interrupts are collected. +@@ -3873,6 +3873,27 @@ and all other interrupts are collected. =back @@ -252,17 +252,17 @@ +} --- a/src/types.db +++ b/src/types.db -@@ -240,6 +240,7 @@ voltage_threshold value:GAUGE:U:U, +@@ -240,6 +240,7 @@ snr value:GAUGE:0:U spam_check value:GAUGE:0:U spam_score value:GAUGE:U:U spl value:GAUGE:U:U +stations value:GAUGE:0:256 swap value:GAUGE:0:1099511627776 swap_io value:DERIVE:0:U - tcp_connections value:GAUGE:0:4294967295 + sysevent value:GAUGE:0:1 --- a/Makefile.am +++ b/Makefile.am -@@ -1149,6 +1149,14 @@ irq_la_LDFLAGS = $(PLUGIN_LDFLAGS) +@@ -1165,6 +1165,14 @@ irq_la_LDFLAGS = $(PLUGIN_LDFLAGS) irq_la_LIBADD = libignorelist.la endif