From: Andrew Bays Date: Fri, 9 Nov 2018 12:25:46 +0000 (-0500) Subject: Merge branch 'master' into connectivity X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=24b87484c7fd2e0998682db6f77e54d8cdc459d4;hp=c254a038fea8b4fc2deb72bbe7c886c4ee5f3f7f Merge branch 'master' into connectivity --- diff --git a/.github/issue_template.md b/.github/issue_template.md index 49d24b30..05d29875 100644 --- a/.github/issue_template.md +++ b/.github/issue_template.md @@ -1,5 +1,6 @@ * Version of collectd: * Operating system / distribution: +* Kernel version (if applicable): ## Expected behavior diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..009ae439 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "gnulib"] + path = gnulib + url = git://git.savannah.gnu.org/gnulib.git diff --git a/.travis.yml b/.travis.yml index 1bd6142d..97115d14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -75,7 +75,7 @@ before_script: autoreconf -fi script: - if [[ "${TRAVIS_BRANCH}" == "coverity_scan" ]]; then exit 0; fi - ./configure - - make -j 4 + - make -j $(nproc) - make check addons: @@ -85,5 +85,5 @@ addons: description: "Build submitted via Travis CI" notification_email: collectd-changes@verplant.org build_command_prepend: "./configure; make clean" - build_command: "make -j 4" + build_command: "make -j $(nproc)" branch_pattern: coverity_scan diff --git a/ChangeLog b/ChangeLog index 5c7c42f8..e9a8415b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,78 @@ +2018-10-23, Version 5.8.1 + * collectd: Fix "BaseDir" option. Thanks to Mariusz Białończyk and + Pavel Rochnyak. #2857 + * collectd: improve error handling, check return values. Thanks to + Florian Forster. + * Build System: use "kstat.h", when available. Thanks to Dagobert + Michelsen and Pavel Rochnyak. #2784 + * Build System: Fix distcheck on MacOS. Thanks to Ruben Kerkhof. + * Build System: add missing include of ""collectd.h"" to fix builds on + Solaris. Thanks to Pavel Rochnyak. + * Build System: add endianess checks for AIX, fix GCC issue on Mac + byteorder, fix byteorder on Solaris, add fallback for endianess + conversion. Thanks to Dagobert Michelsen (multiple cherry picks from + master). + * Build System: Out-of-tree builds have been fixed. Thanks to Florian + Forster. #2602 + * Configuration: Error handling in the config parsing code has been + improved. Thanks to Florian Forster. + * Documentation: Fix typo in collectd.conf(5). Thanks to Pavel Rochnyak. + #2760 + * Documentation: update note on dpdkstat. Thanks to Maryam Tahhan. #2613 + * Various plugins: Errors found by the static code analysis tool + Coverity were fixed. Thanks to Florian Forster. #2559, #2560, #2561, + #2562, #2563, #2565, #2568, #2575, #2579, #2580, #2588, #2589 + * Ceph plugin: A segfault has been fixed. Thanks to Aleksei Zakharov and + Matthias Runge. #2572 + * DF plugin: fix memory leak in error case. Thanks to Takahashi tsc. + * Exec plugin: check return value of "plugin_thread_create()". Thanks to + Florian Forster. + * Exec plugin: Handling of large groups has been fixed. Thanks to + Sridhar Mallem. #2696 + * Exec plugin: Incorrect use of *putenv(3)* has been fixed. Thanks to + Daniel Vrátil. + * Exec plugin: A deadlock related to setting environment variables after + *fork()* has been fixed. Thanks to Daniel Vrátil. + * Intel PMU plugin: add core groups feature. Thanks to Kamil Wiatrowski. + #2681 + * Intel PMU plugin: fix compatibility issue with collectd 5.8. Thanks to + Kamil Wiatrowski. + * Intel PMU plugin: fix possible "NULL" pointer dereference. Thanks to + Kamil Wiatrowski. #2676 + * IPMI plugin: A segfault caused by a wrong data type has been fixed. + Thanks to Mariusz Szafrański. #2742 + * IPMI plugin: The sensor configuration option has been fixed. Thanks to + Pavel Rochnyak. #2629 + * memcached plugin: A deadlock situation has been fixed. Thanks to Pavel + Rochnyak. #2612 + * NFS plugin: Support for NFSv4 has been fixed. Thanks to Jan-Philipp + Litza. #2076 + * NTPd plugin: A memory leak in the error handling path has been fixed. + Thanks to Ruben Kerkhof. #2942 + * OVS Stats plugin: A deadlock situation has been fixed. Thanks to + Volodymyr Mytnyk. #2590 + * OVS Stats plugin: Fix reconnect after thread terminated. Thanks to + Volodymyr Mytnyk and Maram Tahhan. #2574 + * Perl plugin: A compilation failure has been fixed. Thanks to Pavel + Rochnyak. #2732 + * Perl plugin: Fix exporting notification meta data. Thanks to Florian + Forster. + * RRDtool plugin: Handling of very large "GAUGE" metrics has been fixed. + Thanks to Miroslav Lichvar. #2566 + * Tail plugin: Several regressions have been fixed. Thanks to Pavel + Rochnyak. #2535, #2587, #2611 + * turbostat plugin: A potential segfault due to an incorrect *free()* + has been fixed. Thanks to Ruben Kerkhof. #2948 + * UUID plugin: Fix hostname setting. Thanks to Pavel Rochnyak. #2723 + * virt plugin: A segfault during error handling has been fixed. Thanks + to Ruben Kerkhof. {{Issue|2919]} + * Write Kafka plugin: A build failure due to a deprecated API call has + been fixed. Thanks to Pavel Rochnyak. #2607, #2628, #2640 + * Write Prometheus plugin: Fix "MHD_USE_INTERNAL_POLLING_THREAD" flag in + newer libmicrohttpd. Thanks to Pavel Rochnyak. #2849 + * Write Prometheus plugin: set "SO_REUSEADDRESS" on listening socket. + Thanks to Pavel Rochnyak. #2570, #2673 + 2017-11-17, Version 5.8.0 * collectd: The core daemon is now completely licensed under the MIT license. diff --git a/Makefile.am b/Makefile.am index 6c6b30af..f60efd36 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,15 @@ ACLOCAL_AMFLAGS = -I m4 AM_YFLAGS = -d +if BUILD_WIN32 +cpkgdatadir=$(datadir) +cpkglibdir=$(libdir)/plugins +cpkglocalstatedir=${localstatedir} +else +cpkgdatadir=$(pkgdatadir) +cpkglibdir=$(pkglibdir) +cpkglocalstatedir=${localstatedir}/lib/${PACKAGE_NAME} +endif BUILT_SOURCES = \ src/libcollectdclient/collectd/lcc_features.h \ @@ -99,7 +108,13 @@ pkginclude_HEADERS = \ lib_LTLIBRARIES = libcollectdclient.la +if BUILD_WIN32 +# TODO: Build all executables on Windows as well. +sbin_PROGRAMS = \ + collectd +bin_PROGRAMS = +else sbin_PROGRAMS = \ collectd \ collectdmon @@ -109,6 +124,7 @@ bin_PROGRAMS = \ collectd-nagios \ collectd-tg \ collectdctl +endif # BUILD_WIN32 noinst_LTLIBRARIES = \ @@ -151,7 +167,7 @@ TESTS = $(check_PROGRAMS) LOG_COMPILER = env VALGRIND="@VALGRIND@" $(abs_srcdir)/testwrapper.sh -jardir = $(pkgdatadir)/java +jardir = $(cpkgdatadir)/java pkglib_LTLIBRARIES = @@ -160,6 +176,9 @@ PLUGIN_LDFLAGS = \ -module \ -avoid-version \ -export-symbols-regex '\' +if BUILD_WIN32 +PLUGIN_LDFLAGS += -shared -no-undefined -lcollectd -L. +endif AM_CPPFLAGS = \ @@ -167,13 +186,26 @@ AM_CPPFLAGS = \ -DPREFIX='"${prefix}"' \ -DCONFIGFILE='"${sysconfdir}/${PACKAGE_NAME}.conf"' \ -DLOCALSTATEDIR='"${localstatedir}"' \ - -DPKGLOCALSTATEDIR='"${localstatedir}/lib/${PACKAGE_NAME}"' \ - -DPLUGINDIR='"${pkglibdir}"' \ - -DPKGDATADIR='"${pkgdatadir}"' + -DPKGLOCALSTATEDIR='"${cpkglocalstatedir}"' \ + -DPLUGINDIR='"${cpkglibdir}"' \ + -DPKGDATADIR='"${cpkgdatadir}"' +if BUILD_WIN32 +AM_CPPFLAGS += -DNOGDI +endif +COMMON_DEPS = +if BUILD_WIN32 +COMMON_DEPS += collectd.exe +endif # Link to these libraries.. COMMON_LIBS = $(PTHREAD_LIBS) +if BUILD_WIN32 +COMMON_LIBS += -lws2_32 +endif +if BUILD_WITH_GNULIB +COMMON_LIBS += -lgnu +endif if BUILD_WITH_CAPABILITY COMMON_LIBS += -lcap endif @@ -195,7 +227,6 @@ endif collectd_SOURCES = \ - src/daemon/cmd.c \ src/daemon/cmd.h \ src/daemon/collectd.c \ src/daemon/collectd.h \ @@ -239,6 +270,13 @@ collectd_LDADD = \ $(COMMON_LIBS) \ $(DLOPEN_LIBS) +if BUILD_WIN32 +collectd_SOURCES += src/daemon/cmd_windows.c +collectd_LDFLAGS += -ldl -Wl,--out-implib,libcollectd.a +else +collectd_SOURCES += src/daemon/cmd.c +endif + if BUILD_FEATURE_DAEMON collectd_CPPFLAGS += -DPIDFILE='"${localstatedir}/run/${PACKAGE_NAME}.pid"' endif @@ -250,6 +288,9 @@ collectd_CFLAGS += $(BUILD_WITH_LIBSTATGRAB_CFLAGS) collectd_LDADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS) endif +if BUILD_WIN32 +collectd_LDFLAGS += -Wl,--out-implib,libcollectd.a +endif collectdmon_SOURCES = src/collectdmon.c @@ -501,6 +542,10 @@ libcollectdclient_la_CPPFLAGS = \ -I$(srcdir)/src/daemon libcollectdclient_la_LDFLAGS = -version-info 2:0:1 libcollectdclient_la_LIBADD = -lm +if BUILD_WIN32 +libcollectdclient_la_LDFLAGS += -shared -no-undefined +libcollectdclient_la_LIBADD += -lgnu -lws2_32 -liphlpapi +endif if BUILD_WITH_LIBGCRYPT libcollectdclient_la_CPPFLAGS += $(GCRYPT_CPPFLAGS) libcollectdclient_la_LDFLAGS += $(GCRYPT_LDFLAGS) @@ -529,6 +574,68 @@ liboconfig_la_SOURCES = \ liboconfig_la_CPPFLAGS = -I$(srcdir)/src/liboconfig $(AM_CPPFLAGS) liboconfig_la_LDFLAGS = -avoid-version $(LEXLIB) +if BUILD_WITH_LIBCURL +if BUILD_WITH_LIBSSL +if BUILD_WITH_LIBYAJL2 +noinst_LTLIBRARIES += liboauth.la +liboauth_la_SOURCES = \ + src/utils_oauth.c \ + src/utils_oauth.h +liboauth_la_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(BUILD_WITH_LIBCURL_CFLAGS) \ + $(BUILD_WITH_LIBSSL_CFLAGS) \ + $(BUILD_WITH_LIBYAJL_CPPFLAGS) +liboauth_la_LIBADD = \ + $(BUILD_WITH_LIBCURL_LIBS) \ + $(BUILD_WITH_LIBSSL_LIBS) \ + $(BUILD_WITH_LIBYAJL_LIBS) + +check_PROGRAMS += test_utils_oauth +TESTS += test_utils_oauth +test_utils_oauth_SOURCES = \ + src/utils_oauth_test.c +test_utils_oauth_LDADD = \ + liboauth.la \ + libcommon.la \ + libplugin_mock.la + +noinst_LTLIBRARIES += libgce.la +libgce_la_SOURCES = \ + src/utils_gce.c \ + src/utils_gce.h +libgce_la_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(BUILD_WITH_LIBCURL_CFLAGS) +libgce_la_LIBADD = \ + $(BUILD_WITH_LIBCURL_LIBS) +endif +endif +endif + +if BUILD_WITH_LIBYAJL2 +noinst_LTLIBRARIES += libformat_stackdriver.la +libformat_stackdriver_la_SOURCES = \ + src/utils_format_stackdriver.c \ + src/utils_format_stackdriver.h +libformat_stackdriver_la_CPPFLAGS = \ + $(AM_CPPFLAGS) \ + $(BUILD_WITH_LIBYAJL_CPPFLAGS) +libformat_stackdriver_la_LIBADD = \ + libavltree.la \ + $(BUILD_WITH_LIBSSL_LIBS) \ + $(BUILD_WITH_LIBYAJL_LIBS) + +check_PROGRAMS += test_format_stackdriver +TESTS += test_format_stackdriver +test_format_stackdriver_SOURCES = \ + src/utils_format_stackdriver_test.c \ + src/testing.h +test_format_stackdriver_LDADD = \ + libformat_stackdriver.la \ + libplugin_mock.la \ + -lm +endif if BUILD_PLUGIN_AGGREGATION pkglib_LTLIBRARIES += aggregation.la @@ -916,6 +1023,13 @@ gps_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBGPS_LDFLAGS) gps_la_LIBADD = -lpthread $(BUILD_WITH_LIBGPS_LIBS) endif +if BUILD_PLUGIN_GPU_NVIDIA +pkglib_LTLIBRARIES += gpu_nvidia.la +gpu_nvidia_la_SOURCES = src/gpu_nvidia.c +gpu_nvidia_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_GPU_CUDA_LDFLAGS) +gpu_nvidia_la_LIBADD = $(BUILD_WITH_CUDA_LIBS) +endif + if BUILD_PLUGIN_GRPC pkglib_LTLIBRARIES += grpc.la grpc_la_SOURCES = src/grpc.cc @@ -1051,6 +1165,7 @@ if BUILD_PLUGIN_LOGFILE pkglib_LTLIBRARIES += logfile.la logfile_la_SOURCES = src/logfile.c logfile_la_LDFLAGS = $(PLUGIN_LDFLAGS) +logfile_la_DEPENDENCIES = $(COMMON_DEPS) endif if BUILD_PLUGIN_LOG_LOGSTASH @@ -1390,6 +1505,24 @@ ovs_stats_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS) ovs_stats_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS) endif +if BUILD_PLUGIN_PCIE_ERRORS +pkglib_LTLIBRARIES += pcie_errors.la +pcie_errors_la_SOURCES = src/pcie_errors.c +pcie_errors_la_CPPFLAGS = $(AM_CPPFLAGS) +pcie_errors_la_LDFLAGS = $(PLUGIN_LDFLAGS) + +test_plugin_pcie_errors_SOURCES = \ + src/pcie_errors_test.c \ + src/daemon/utils_llist.c \ + src/daemon/configfile.c \ + src/daemon/types_list.c +test_plugin_pcie_errors_CPPFLAGS = $(AM_CPPFLAGS) +test_plugin_pcie_errors_LDFLAGS = $(PLUGIN_LDFLAGS) +test_plugin_pcie_errors_LDADD = liboconfig.la libplugin_mock.la +check_PROGRAMS += test_plugin_pcie_errors +TESTS += test_plugin_pcie_errors +endif + if BUILD_PLUGIN_PERL pkglib_LTLIBRARIES += perl.la perl_la_SOURCES = src/perl.c @@ -1922,6 +2055,15 @@ write_sensu_la_SOURCES = src/write_sensu.c write_sensu_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif +if BUILD_PLUGIN_WRITE_STACKDRIVER +pkglib_LTLIBRARIES += write_stackdriver.la +write_stackdriver_la_SOURCES = src/write_stackdriver.c +write_stackdriver_la_LDFLAGS = $(PLUGIN_LDFLAGS) +write_stackdriver_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBCURL_CFLAGS) +write_stackdriver_la_LIBADD = libformat_stackdriver.la libgce.la liboauth.la \ + $(BUILD_WITH_LIBCURL_LIBS) +endif + if BUILD_PLUGIN_WRITE_TSDB pkglib_LTLIBRARIES += write_tsdb.la write_tsdb_la_SOURCES = src/write_tsdb.c @@ -2041,15 +2183,15 @@ install-exec-hook: else \ $(INSTALL) -m 0640 $(builddir)/src/collectd.conf $(DESTDIR)$(sysconfdir)/collectd.conf; \ fi; \ - $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) - $(INSTALL) -m 0644 $(srcdir)/src/types.db $(DESTDIR)$(pkgdatadir)/types.db; + $(mkinstalldirs) $(DESTDIR)$(cpkgdatadir) + $(INSTALL) -m 0644 $(srcdir)/src/types.db $(DESTDIR)$(cpkgdatadir)/types.db; $(INSTALL) -m 0644 $(srcdir)/src/postgresql_default.conf \ - $(DESTDIR)$(pkgdatadir)/postgresql_default.conf; + $(DESTDIR)$(cpkgdatadir)/postgresql_default.conf; uninstall-hook: - rm -f $(DESTDIR)$(pkgdatadir)/types.db; + rm -f $(DESTDIR)$(cpkgdatadir)/types.db; rm -f $(DESTDIR)$(sysconfdir)/collectd.conf - rm -f $(DESTDIR)$(pkgdatadir)/postgresql_default.conf; + rm -f $(DESTDIR)$(cpkgdatadir)/postgresql_default.conf; all-local: @PERL_BINDINGS@ @@ -2129,3 +2271,4 @@ generic-jmx.jar: $(JAVA_TIMESTAMP_FILE) jar_DATA = collectd-api.jar generic-jmx.jar endif + diff --git a/README b/README index bd577f7c..9de6cbf6 100644 --- a/README +++ b/README @@ -138,6 +138,9 @@ Features - gps Monitor gps related data through gpsd. + - gpu_nvidia + Monitor NVIDIA GPU statistics available through NVML. + - hddtemp Hard disk temperatures using hddtempd. @@ -317,6 +320,10 @@ Features OVS documentation. + - pcie_errors + Read errors from PCI Express Device Status and AER extended capabilities. + + - perl The perl plugin implements a Perl-interpreter into collectd. You can write your own plugins in Perl and return arbitrary values using this @@ -748,6 +755,10 @@ Prerequisites particular. + * CUDA (optional) + Used by the `gpu_nvidia' plugin + + * libatasmart (optional) Used by the `smart' plugin. @@ -1043,6 +1054,37 @@ To generate the `configure` script, you'll need the following dependencies: The `build.sh' script takes no arguments. +Building on Windows +----------------------------------------------- + +Collectd can be built on Windows using Cygwin, and the result is a binary that +runs natively on Windows. That is, Cygwin is only needed for building, not running, +collectd. + +You will need to install the following Cygwin packages: +- automake +- bison +- flex +- git +- libtool +- make +- mingw64-x86_64-dlfcn +- mingw64-x86_64-gcc-core +- mingw64-x86_64-zlib +- pkg-config + +To build, just run the `build.sh' script in your Cygwin terminal. By default, it installs +to "C:/Program Files/collectd". You can change the location by setting the INSTALL_DIR +variable: + +$ export INSTALL_DIR="C:/some/other/install/directory" +$ ./build.sh + +or: + +$ INSTALL_DIR="C:/some/other/install/directory" ./build.sh + + Crosscompiling -------------- diff --git a/build.sh b/build.sh index bd4c1a31..c0ccce3a 100755 --- a/build.sh +++ b/build.sh @@ -18,34 +18,156 @@ EOF done } -check_for_application lex bison autoheader aclocal automake autoconf pkg-config - -libtoolize="" -libtoolize --version >/dev/null 2>/dev/null -if test $? -eq 0; then - libtoolize=libtoolize -else - glibtoolize --version >/dev/null 2>/dev/null +setup_libtool() +{ + libtoolize="" + libtoolize --version >/dev/null 2>/dev/null if test $? -eq 0; then - libtoolize=glibtoolize + libtoolize=libtoolize else - cat >&2 </dev/null 2>/dev/null + if test $? -eq 0; then + libtoolize=glibtoolize + else + cat >&2 <" >> src/gnulib_config.h + + cp libtool libtool_bak + sed -i "s%\$LTCC \$LTCFLAGS\(.*cwrapper.*\)%\$LTCC \1%" libtool + + make + make install + + cp "${GNULIB_DIR}/libgnu.dll" "${INSTALL_DIR}" + cp "${MINGW_ROOT}/bin/zlib1.dll" "${INSTALL_DIR}" + cp "${MINGW_ROOT}/bin/libwinpthread-1.dll" "${INSTALL_DIR}" + cp "${MINGW_ROOT}/bin/libdl.dll" "${INSTALL_DIR}" + + echo "Done." +} + +os_name="$(uname)" +if test "${os_name#CYGWIN}" != "$os_name"; then + build_cygwin +else + build +fi -autoheader \ -&& aclocal -I m4 \ -&& $libtoolize --copy --force \ -&& automake --add-missing --copy \ -&& autoconf diff --git a/configure.ac b/configure.ac index 992527d2..2daa7d59 100644 --- a/configure.ac +++ b/configure.ac @@ -99,6 +99,10 @@ case $host_os in AC_DEFINE([KERNEL_SOLARIS], [1], [True if program is to be compiled for a Solaris kernel]) ac_system="Solaris" ;; + *mingw32*) + AC_DEFINE([KERNEL_WIN32], [1], [True if program is to be compiled for a Windows kernel]) + ac_system="Windows" + ;; *) ac_system="unknown" ;; @@ -111,6 +115,7 @@ AM_CONDITIONAL([BUILD_FREEBSD], [test "x$ac_system" = "xFreeBSD"]) AM_CONDITIONAL([BUILD_LINUX], [test "x$ac_system" = "xLinux"]) AM_CONDITIONAL([BUILD_OPENBSD], [test "x$ac_system" = "xOpenBSD"]) AM_CONDITIONAL([BUILD_SOLARIS], [test "x$ac_system" = "xSolaris"]) +AM_CONDITIONAL([BUILD_WIN32], [test "x$ac_system" = "xWindows"]) if test "x$ac_system" = "xSolaris"; then AC_DEFINE([_POSIX_PTHREAD_SEMANTICS], [1], [Define to enforce POSIX thread semantics under Solaris.]) @@ -550,6 +555,12 @@ if test "x$ac_system" = "xLinux"; then AC_DEFINE([HAVE_CAPABILITY], [1], [Define to 1 if you have cap_get_proc() (-lcap).]) fi + # For pcie_errors plugin + AC_CHECK_HEADERS([linux/pci_regs.h], + [have_pci_regs_h="yes"], + [have_pci_regs_h="no (linux/pci_regs.h not found)"] + ) + else have_linux_raid_md_u_h="no" have_linux_wireless_h="no" @@ -745,6 +756,7 @@ AC_CHECK_FUNCS_ONCE([ \ getaddrinfo \ getgrnam_r \ getnameinfo \ + getpwnam \ getpwnam_r \ gettimeofday \ if_indextoname \ @@ -767,8 +779,12 @@ AC_FUNC_STRERROR_R SAVE_CFLAGS="$CFLAGS" CFLAGS="-Wall -Werror" -SAVE_LDFAGS="$LDFLAGS" +SAVE_LDFLAGS="$LDFLAGS" LDFLAGS="" +if test "x$ac_system" = "xWindows"; then + # This is exported from build.sh + LDFLAGS="$LDFLAGS -L${GNULIB_DIR}" +fi AC_CACHE_CHECK([for strtok_r], [c_cv_have_strtok_r_default], @@ -851,11 +867,17 @@ AC_CHECK_FUNCS([socket], [ AC_CHECK_LIB([socket], [socket], [socket_needs_socket="yes"], - [AC_MSG_ERROR([cannot find socket() in libsocket])] + [ + AC_CHECK_LIB([gnu], [rpl_socket], + [socket_needs_gnulib="yes"], + [AC_MSG_ERROR([cannot find socket() in libsocket])] + ) + ] ) ] ) AM_CONDITIONAL([BUILD_WITH_LIBSOCKET], [test "x$socket_needs_socket" = "xyes"]) +AM_CONDITIONAL([BUILD_WITH_GNULIB], [test "x$socket_needs_gnulib" = "xyes"]) clock_gettime_needs_posix4="no" AC_CHECK_FUNCS([clock_gettime], @@ -2052,6 +2074,58 @@ if test "x$with_kvm_openfiles" = "xyes"; then with_libkvm="yes" fi +# --with-cuda {{{ +# only CUDA provides the nvml.h header +AC_ARG_WITH([cuda], + [AS_HELP_STRING([--with-cuda@<:@=PREFIX@:>@], [Path to cuda.])], + [ + if test "x$withval" = "xyes"; then + with_cuda="yes" + else if test "x$withval" = "xno"; then + with_cuda="no" + else + with_cuda="yes" + CUDA_CFLAGS="$CUDA_CFLAGS -I$withval/include" + CUDA_LDFLAGS="$CUDA_LDFLAGS -L$withval/lib" + fi; fi + ], + [ with_cuda="yes" + CUDA_CFLAGS="$CUDA_CFLAGS -I/opt/cuda/include" + CUDA_LDFLAGS="$CUDA_LDFLAGS -L/opt/cuda/lib64" + ] +) + +SAVE_CFLAGS="$CFLAGS" +SAVE_LDFLAGS="$LDFLAGS" +CFLAGS="$CFLAGS $CUDA_CFLAGS" +LDFLAGS="$LDFLAGS $CUDA_LDFLAGS" + +if test "x$with_cuda" = "xyes"; then + AC_CHECK_HEADERS([nvml.h], + [with_cuda="yes"], + [with_cuda="no (header file missing)"] + ) +fi + +if test "x$with_cuda" = "xpkgconfig"; then + AC_CHECK_HEADERS([nvml.h], + [], + [with_cuda="no (header file missing)"] + ) +fi + +if test "x$with_cuda" = "xyes"; then + BUILD_WITH_CUDA_CFLAGS="$CUDA_CFLAGS" + BUILD_WITH_CUDA_LDFLAGS="$CUDA_LDFLAGS" + BUILD_WITH_CUDA_LIBS="-lnvidia-ml" +fi + +AC_SUBST([BUILD_WITH_CUDA_CFLAGS]) +AC_SUBST([BUILD_WITH_CUDA_LDFLAGS]) +AC_SUBST([BUILD_WITH_CUDA_LIBS]) + +# }}} + # --with-libaquaero5 {{{ AC_ARG_WITH([libaquaero5], [AS_HELP_STRING([--with-libaquaero5@<:@=PREFIX@:>@], [Path to aquatools-ng source code.])], @@ -2282,6 +2356,8 @@ fi AC_SUBST(BUILD_WITH_LIBCURL_CFLAGS) AC_SUBST(BUILD_WITH_LIBCURL_LIBS) + +AM_CONDITIONAL([BUILD_WITH_LIBCURL], [test "x$with_libcurl" = "xyes"]) # }}} # --with-libdbi {{{ @@ -5212,6 +5288,55 @@ PKG_CHECK_MODULES([LIBSIGROK], [libsigrok < 0.4], ) # }}} +# --with-libssl {{{ +with_libssl_cflags="" +with_libssl_ldflags="" +AC_ARG_WITH([libssl], [AS_HELP_STRING([--with-libssl@<:@=PREFIX@:>@], [Path to libssl.])], +[ + if test "x$withval" != "xno" && test "x$withval" != "xyes"; then + with_libssl_cppflags="-I$withval/include" + with_libssl_ldflags="-L$withval/lib" + with_libssl="yes" + else + with_libssl="$withval" + fi +], +[ + with_libssl="yes" +]) +if test "x$with_libssl" = "xyes"; then + SAVE_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $with_libssl_cppflags" + + AC_CHECK_HEADERS([openssl/sha.h openssl/blowfish.h openssl/rand.h], + [with_libssl="yes"], + [with_libssl="no (ssl header not found)"]) + + CPPFLAGS="$SAVE_CPPFLAGS" +fi +if test "x$with_libssl" = "xyes"; then + SAVE_CPPFLAGS="$CPPFLAGS" + SAVE_LDFLAGS="$LDFLAGS" + CPPFLAGS="$CPPFLAGS $with_libssl_cppflags" + LDFLAGS="$LDFLAGS $with_libssl_ldflags" + + AC_CHECK_LIB([ssl], [OPENSSL_init_ssl], [with_libssl="yes"], [with_libssl="no (Symbol 'SSL_library_init' not found)"]) + + CPPFLAGS="$SAVE_CPPFLAGS" + LDFLAGS="$SAVE_LDFLAGS" +fi +if test "x$with_libssl" = "xyes"; then + BUILD_WITH_LIBSSL_CFLAGS="$with_libssl_cflags" + BUILD_WITH_LIBSSL_LDFLAGS="$with_libssl_ldflags" + BUILD_WITH_LIBSSL_LIBS="-lssl -lcrypto" + AC_SUBST([BUILD_WITH_LIBSSL_CFLAGS]) + AC_SUBST([BUILD_WITH_LIBSSL_LDFLAGS]) + AC_SUBST([BUILD_WITH_LIBSSL_LIBS]) + AC_DEFINE([HAVE_LIBSSL], [1], [Define if libssl is present and usable.]) +fi +AM_CONDITIONAL(BUILD_WITH_LIBSSL, test "x$with_libssl" = "xyes") +# }}} + # --with-libstatgrab {{{ AC_ARG_WITH([libstatgrab], [AS_HELP_STRING([--with-libstatgrab@<:@=PREFIX@:>@], [Path to libstatgrab.])], @@ -5672,15 +5797,15 @@ if test "x$with_libxmms" = "xyes"; then fi if test "x$with_libxmms" = "xyes"; then - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$with_xmms_cflags" + SAVE_CPPFLAGS="$CFLAGS" + CPPFLAGS="$with_xmms_cflags" AC_CHECK_HEADER([xmmsctrl.h], [with_libxmms="yes"], [with_libxmms="no"], ) - CFLAGS="$SAVE_CFLAGS" + CPPFLAGS="$SAVE_CPPFLAGS" fi if test "x$with_libxmms" = "xyes"; then @@ -5767,6 +5892,7 @@ AC_SUBST([BUILD_WITH_LIBYAJL_LDFLAGS]) AC_SUBST([BUILD_WITH_LIBYAJL_LIBS]) AM_CONDITIONAL([BUILD_WITH_LIBYAJL], [test "x$with_libyajl" = "xyes"]) +AM_CONDITIONAL([BUILD_WITH_LIBYAJL2], [test "x$with_libyajl$with_libyajl2" = "xyesyes"]) # }}} # --with-mic {{{ @@ -5898,32 +6024,41 @@ AC_SUBST([BUILD_WITH_LIBVARNISH_CFLAGS]) AC_SUBST([BUILD_WITH_LIBVARNISH_LIBS]) # }}} -# pkg-config --exists 'libxml-2.0'; pkg-config --exists libvirt {{{ -$PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null -if test $? -eq 0; then - with_libxml2="yes" -else - with_libxml2="no (pkg-config doesn't know libxml-2.0)" -fi - -$PKG_CONFIG --exists libvirt 2>/dev/null -if test $? = 0; then - with_libvirt="yes" -else - with_libvirt="no (pkg-config doesn't know libvirt)" -fi - -if test "x$with_libxml2" = "xyes"; then - with_libxml2_cflags="`$PKG_CONFIG --cflags libxml-2.0`" - if test $? -ne 0; then - with_libxml2="no" - fi - - with_libxml2_ldflags="`$PKG_CONFIG --libs libxml-2.0`" - if test $? -ne 0; then - with_libxml2="no" - fi -fi +# --with-libxml2 {{{ +AC_ARG_WITH(libxml2, + [AS_HELP_STRING([--with-libxml2@<:@=PREFIX@:>@], [Path to libxml2.])], + [ + if test "x$withval" = "xno"; then + with_libxml2="no" + else if test "x$withval" = "xyes"; then + $PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null + if test $? -eq 0; then + with_libxml2="yes" + with_libxml2_cflags="`$PKG_CONFIG --cflags libxml-2.0`" + with_libxml2_ldflags="`$PKG_CONFIG --libs libxml-2.0`" + else + with_libxml2="no (pkg-config doesn't know libxml-2.0)" + fi + else + with_libxml2="yes" + with_libxml2_cflags="-I$withval/include" + with_libxml2_ldflags="-L$withval/lib" + fi; fi + ], + dnl if no argument --with-libxml2 was passed, find the library locations + dnl with pkg-config just like above, when --with-libxml2=yes. + [ + with_libxml2="yes" + $PKG_CONFIG --exists 'libxml-2.0' 2>/dev/null + if test $? -eq 0; then + with_libxml2="yes" + with_libxml2_cflags="`$PKG_CONFIG --cflags libxml-2.0`" + with_libxml2_ldflags="`$PKG_CONFIG --libs libxml-2.0`" + else + with_libxml2="no (pkg-config doesn't know libxml-2.0)" + fi + ] +) if test "x$with_libxml2" = "xyes"; then SAVE_CPPFLAGS="$CPPFLAGS" @@ -5956,6 +6091,15 @@ fi AC_SUBST([BUILD_WITH_LIBXML2_CFLAGS]) AC_SUBST([BUILD_WITH_LIBXML2_LIBS]) +# }}} + +# pkg-config --exists libvirt {{{ +$PKG_CONFIG --exists libvirt 2>/dev/null +if test $? = 0; then + with_libvirt="yes" +else + with_libvirt="no (pkg-config doesn't know libvirt)" +fi if test "x$with_libvirt" = "xyes"; then with_libvirt_cflags="`$PKG_CONFIG --cflags libvirt`" @@ -6271,6 +6415,7 @@ plugin_ethstat="no" plugin_fhcount="no" plugin_fscache="no" plugin_gps="no" +plugin_gpu_nvidia="no" plugin_grpc="no" plugin_hugepages="no" plugin_intel_pmu="no" @@ -6289,6 +6434,7 @@ plugin_nfs="no" plugin_numa="no" plugin_ovs_events="no" plugin_ovs_stats="no" +plugin_pcie_errors="no" plugin_perl="no" plugin_pinba="no" plugin_processes="no" @@ -6310,6 +6456,7 @@ plugin_vmem="no" plugin_vserver="no" plugin_wireless="no" plugin_write_prometheus="no" +plugin_write_stackdriver="no" plugin_xencpu="no" plugin_zfs_arc="no" plugin_zone="no" @@ -6371,6 +6518,10 @@ if test "x$ac_system" = "xLinux"; then plugin_connectivity="yes" fi fi + + if test "x$have_pci_regs_h" = "xyes"; then + plugin_pcie_errors="yes" + fi fi if test "x$ac_system" = "xOpenBSD"; then @@ -6468,6 +6619,10 @@ if test "x$with_libcurl" = "xyes" && test "x$with_libyajl" = "xyes"; then plugin_curl_json="yes" fi +if test "x$with_libcurl" = "xyes" && test "x$with_libssl" = "xyes" && test "x$with_libyajl" = "xyes" && test "x$with_libyajl2" = "xyes"; then + plugin_write_stackdriver="yes" +fi + if test "x$with_libcurl" = "xyes" && test "x$with_libxml2" = "xyes"; then plugin_curl_xml="yes" fi @@ -6656,163 +6811,166 @@ AC_ARG_ENABLE([all-plugins], m4_divert_once([HELP_ENABLE], []) -AC_PLUGIN([aggregation], [yes], [Aggregation plugin]) -AC_PLUGIN([amqp], [$with_librabbitmq], [AMQP output plugin]) -AC_PLUGIN([amqp1], [$with_libqpid_proton], [AMQP 1.0 output plugin]) -AC_PLUGIN([apache], [$with_libcurl], [Apache httpd statistics]) -AC_PLUGIN([apcups], [yes], [Statistics of UPSes by APC]) -AC_PLUGIN([apple_sensors], [$with_libiokit], [Apple hardware sensors]) -AC_PLUGIN([aquaero], [$with_libaquaero5], [Aquaero hardware sensors]) -AC_PLUGIN([ascent], [$plugin_ascent], [AscentEmu player statistics]) -AC_PLUGIN([barometer], [$plugin_barometer], [Barometer sensor on I2C]) -AC_PLUGIN([battery], [$plugin_battery], [Battery statistics]) -AC_PLUGIN([bind], [$plugin_bind], [ISC Bind nameserver statistics]) -AC_PLUGIN([ceph], [$plugin_ceph], [Ceph daemon statistics]) -AC_PLUGIN([cgroups], [$plugin_cgroups], [CGroups CPU usage accounting]) -AC_PLUGIN([chrony], [yes], [Chrony statistics]) -AC_PLUGIN([connectivity], [$plugin_connectivity], [Network interface up/down events]) -AC_PLUGIN([conntrack], [$plugin_conntrack], [nf_conntrack statistics]) -AC_PLUGIN([contextswitch], [$plugin_contextswitch], [context switch statistics]) -AC_PLUGIN([cpu], [$plugin_cpu], [CPU usage statistics]) -AC_PLUGIN([cpufreq], [$plugin_cpufreq], [CPU frequency statistics]) -AC_PLUGIN([cpusleep], [$plugin_cpusleep], [CPU sleep statistics]) -AC_PLUGIN([csv], [yes], [CSV output plugin]) -AC_PLUGIN([curl], [$with_libcurl], [CURL generic web statistics]) -AC_PLUGIN([curl_json], [$plugin_curl_json], [CouchDB statistics]) -AC_PLUGIN([curl_xml], [$plugin_curl_xml], [CURL generic xml statistics]) -AC_PLUGIN([dbi], [$with_libdbi], [General database statistics]) -AC_PLUGIN([df], [$plugin_df], [Filesystem usage statistics]) -AC_PLUGIN([disk], [$plugin_disk], [Disk usage statistics]) -AC_PLUGIN([dns], [$with_libpcap], [DNS traffic analysis]) -AC_PLUGIN([dpdkevents], [$plugin_dpdkevents], [Events from DPDK]) -AC_PLUGIN([dpdkstat], [$plugin_dpdkstat], [Stats from DPDK]) -AC_PLUGIN([drbd], [$plugin_drbd], [DRBD statistics]) -AC_PLUGIN([email], [yes], [EMail statistics]) -AC_PLUGIN([entropy], [$plugin_entropy], [Entropy statistics]) -AC_PLUGIN([ethstat], [$plugin_ethstat], [Stats from NIC driver]) -AC_PLUGIN([exec], [yes], [Execution of external programs]) -AC_PLUGIN([fhcount], [$plugin_fhcount], [File handles statistics]) -AC_PLUGIN([filecount], [yes], [Count files in directories]) -AC_PLUGIN([fscache], [$plugin_fscache], [fscache statistics]) -AC_PLUGIN([gmond], [$with_libganglia], [Ganglia plugin]) -AC_PLUGIN([gps], [$plugin_gps], [GPS plugin]) -AC_PLUGIN([grpc], [$plugin_grpc], [gRPC plugin]) -AC_PLUGIN([hddtemp], [yes], [Query hddtempd]) -AC_PLUGIN([hugepages], [$plugin_hugepages], [Hugepages statistics]) -AC_PLUGIN([intel_pmu], [$with_libjevents], [Intel performance monitor plugin]) -AC_PLUGIN([intel_rdt], [$with_libpqos], [Intel RDT monitor plugin]) -AC_PLUGIN([interface], [$plugin_interface], [Interface traffic statistics]) -AC_PLUGIN([ipc], [$plugin_ipc], [IPC statistics]) -AC_PLUGIN([ipmi], [$plugin_ipmi], [IPMI sensor statistics]) -AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters]) -AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics]) -AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics]) -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]) -AC_PLUGIN([logfile], [yes], [File logging plugin]) -AC_PLUGIN([lpar], [$with_perfstat], [AIX logical partitions statistics]) -AC_PLUGIN([lua], [$with_liblua], [Lua plugin]) -AC_PLUGIN([lvm], [$with_liblvm2app], [LVM statistics]) -AC_PLUGIN([madwifi], [$have_linux_wireless_h], [Madwifi wireless statistics]) -AC_PLUGIN([match_empty_counter], [yes], [The empty counter match]) -AC_PLUGIN([match_hashed], [yes], [The hashed match]) -AC_PLUGIN([match_regex], [yes], [The regex match]) -AC_PLUGIN([match_timediff], [yes], [The timediff match]) -AC_PLUGIN([match_value], [yes], [The value match]) -AC_PLUGIN([mbmon], [yes], [Query mbmond]) -AC_PLUGIN([mcelog], [$plugin_mcelog], [Machine Check Exceptions notifications]) -AC_PLUGIN([md], [$have_linux_raid_md_u_h], [md (Linux software RAID) devices]) -AC_PLUGIN([memcachec], [$with_libmemcached], [memcachec statistics]) -AC_PLUGIN([memcached], [yes], [memcached statistics]) -AC_PLUGIN([memory], [$plugin_memory], [Memory usage]) -AC_PLUGIN([mic], [$with_mic], [Intel Many Integrated Core stats]) -AC_PLUGIN([modbus], [$with_libmodbus], [Modbus plugin]) -AC_PLUGIN([mqtt], [$with_libmosquitto], [MQTT output plugin]) -AC_PLUGIN([multimeter], [$plugin_multimeter], [Read multimeter values]) -AC_PLUGIN([mysql], [$with_libmysql], [MySQL statistics]) -AC_PLUGIN([netapp], [$with_libnetapp], [NetApp plugin]) -AC_PLUGIN([netlink], [$with_libmnl], [Enhanced Linux network statistics]) -AC_PLUGIN([network], [yes], [Network communication plugin]) -AC_PLUGIN([nfs], [$plugin_nfs], [NFS statistics]) -AC_PLUGIN([nginx], [$with_libcurl], [nginx statistics]) -AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications]) -AC_PLUGIN([notify_email], [$with_libesmtp], [Email notifier]) -AC_PLUGIN([notify_nagios], [yes], [Nagios notification plugin]) -AC_PLUGIN([ntpd], [yes], [NTPd statistics]) -AC_PLUGIN([numa], [$plugin_numa], [NUMA virtual memory statistics]) -AC_PLUGIN([nut], [$with_libupsclient], [Network UPS tools statistics]) -AC_PLUGIN([olsrd], [yes], [olsrd statistics]) -AC_PLUGIN([onewire], [$with_libowcapi], [OneWire sensor statistics]) -AC_PLUGIN([openldap], [$with_libldap], [OpenLDAP statistics]) -AC_PLUGIN([openvpn], [yes], [OpenVPN client statistics]) -AC_PLUGIN([oracle], [$with_oracle], [Oracle plugin]) -AC_PLUGIN([ovs_events], [$plugin_ovs_events], [OVS events plugin]) -AC_PLUGIN([ovs_stats], [$plugin_ovs_stats], [OVS statistics plugin]) -AC_PLUGIN([perl], [$plugin_perl], [Embed a Perl interpreter]) -AC_PLUGIN([pf], [$have_net_pfvar_h], [BSD packet filter (PF) statistics]) +AC_PLUGIN([aggregation], [yes], [Aggregation plugin]) +AC_PLUGIN([amqp], [$with_librabbitmq], [AMQP output plugin]) +AC_PLUGIN([amqp1], [$with_libqpid_proton], [AMQP 1.0 output plugin]) +AC_PLUGIN([apache], [$with_libcurl], [Apache httpd statistics]) +AC_PLUGIN([apcups], [yes], [Statistics of UPSes by APC]) +AC_PLUGIN([apple_sensors], [$with_libiokit], [Apple hardware sensors]) +AC_PLUGIN([aquaero], [$with_libaquaero5], [Aquaero hardware sensors]) +AC_PLUGIN([ascent], [$plugin_ascent], [AscentEmu player statistics]) +AC_PLUGIN([barometer], [$plugin_barometer], [Barometer sensor on I2C]) +AC_PLUGIN([battery], [$plugin_battery], [Battery statistics]) +AC_PLUGIN([bind], [$plugin_bind], [ISC Bind nameserver statistics]) +AC_PLUGIN([ceph], [$plugin_ceph], [Ceph daemon statistics]) +AC_PLUGIN([cgroups], [$plugin_cgroups], [CGroups CPU usage accounting]) +AC_PLUGIN([chrony], [yes], [Chrony statistics]) +AC_PLUGIN([connectivity], [$plugin_connectivity], [Network interface up/down events]) +AC_PLUGIN([conntrack], [$plugin_conntrack], [nf_conntrack statistics]) +AC_PLUGIN([contextswitch], [$plugin_contextswitch], [context switch statistics]) +AC_PLUGIN([cpu], [$plugin_cpu], [CPU usage statistics]) +AC_PLUGIN([cpufreq], [$plugin_cpufreq], [CPU frequency statistics]) +AC_PLUGIN([cpusleep], [$plugin_cpusleep], [CPU sleep statistics]) +AC_PLUGIN([csv], [yes], [CSV output plugin]) +AC_PLUGIN([curl], [$with_libcurl], [CURL generic web statistics]) +AC_PLUGIN([curl_json], [$plugin_curl_json], [CouchDB statistics]) +AC_PLUGIN([curl_xml], [$plugin_curl_xml], [CURL generic xml statistics]) +AC_PLUGIN([dbi], [$with_libdbi], [General database statistics]) +AC_PLUGIN([df], [$plugin_df], [Filesystem usage statistics]) +AC_PLUGIN([disk], [$plugin_disk], [Disk usage statistics]) +AC_PLUGIN([dns], [$with_libpcap], [DNS traffic analysis]) +AC_PLUGIN([dpdkevents], [$plugin_dpdkevents], [Events from DPDK]) +AC_PLUGIN([dpdkstat], [$plugin_dpdkstat], [Stats from DPDK]) +AC_PLUGIN([drbd], [$plugin_drbd], [DRBD statistics]) +AC_PLUGIN([email], [yes], [EMail statistics]) +AC_PLUGIN([entropy], [$plugin_entropy], [Entropy statistics]) +AC_PLUGIN([ethstat], [$plugin_ethstat], [Stats from NIC driver]) +AC_PLUGIN([exec], [yes], [Execution of external programs]) +AC_PLUGIN([fhcount], [$plugin_fhcount], [File handles statistics]) +AC_PLUGIN([filecount], [yes], [Count files in directories]) +AC_PLUGIN([fscache], [$plugin_fscache], [fscache statistics]) +AC_PLUGIN([gmond], [$with_libganglia], [Ganglia plugin]) +AC_PLUGIN([gps], [$plugin_gps], [GPS plugin]) +AC_PLUGIN([gpu_nvidia], [$with_cuda], [NVIDIA GPU plugin]) +AC_PLUGIN([grpc], [$plugin_grpc], [gRPC plugin]) +AC_PLUGIN([hddtemp], [yes], [Query hddtempd]) +AC_PLUGIN([hugepages], [$plugin_hugepages], [Hugepages statistics]) +AC_PLUGIN([intel_pmu], [$with_libjevents], [Intel performance monitor plugin]) +AC_PLUGIN([intel_rdt], [$with_libpqos], [Intel RDT monitor plugin]) +AC_PLUGIN([interface], [$plugin_interface], [Interface traffic statistics]) +AC_PLUGIN([ipc], [$plugin_ipc], [IPC statistics]) +AC_PLUGIN([ipmi], [$plugin_ipmi], [IPMI sensor statistics]) +AC_PLUGIN([iptables], [$with_libiptc], [IPTables rule counters]) +AC_PLUGIN([ipvs], [$plugin_ipvs], [IPVS connection statistics]) +AC_PLUGIN([irq], [$plugin_irq], [IRQ statistics]) +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]) +AC_PLUGIN([logfile], [yes], [File logging plugin]) +AC_PLUGIN([lpar], [$with_perfstat], [AIX logical partitions statistics]) +AC_PLUGIN([lua], [$with_liblua], [Lua plugin]) +AC_PLUGIN([lvm], [$with_liblvm2app], [LVM statistics]) +AC_PLUGIN([madwifi], [$have_linux_wireless_h], [Madwifi wireless statistics]) +AC_PLUGIN([match_empty_counter], [yes], [The empty counter match]) +AC_PLUGIN([match_hashed], [yes], [The hashed match]) +AC_PLUGIN([match_regex], [yes], [The regex match]) +AC_PLUGIN([match_timediff], [yes], [The timediff match]) +AC_PLUGIN([match_value], [yes], [The value match]) +AC_PLUGIN([mbmon], [yes], [Query mbmond]) +AC_PLUGIN([mcelog], [$plugin_mcelog], [Machine Check Exceptions notifications]) +AC_PLUGIN([md], [$have_linux_raid_md_u_h], [md (Linux software RAID) devices]) +AC_PLUGIN([memcachec], [$with_libmemcached], [memcachec statistics]) +AC_PLUGIN([memcached], [yes], [memcached statistics]) +AC_PLUGIN([memory], [$plugin_memory], [Memory usage]) +AC_PLUGIN([mic], [$with_mic], [Intel Many Integrated Core stats]) +AC_PLUGIN([modbus], [$with_libmodbus], [Modbus plugin]) +AC_PLUGIN([mqtt], [$with_libmosquitto], [MQTT output plugin]) +AC_PLUGIN([multimeter], [$plugin_multimeter], [Read multimeter values]) +AC_PLUGIN([mysql], [$with_libmysql], [MySQL statistics]) +AC_PLUGIN([netapp], [$with_libnetapp], [NetApp plugin]) +AC_PLUGIN([netlink], [$with_libmnl], [Enhanced Linux network statistics]) +AC_PLUGIN([network], [yes], [Network communication plugin]) +AC_PLUGIN([nfs], [$plugin_nfs], [NFS statistics]) +AC_PLUGIN([nginx], [$with_libcurl], [nginx statistics]) +AC_PLUGIN([notify_desktop], [$with_libnotify], [Desktop notifications]) +AC_PLUGIN([notify_email], [$with_libesmtp], [Email notifier]) +AC_PLUGIN([notify_nagios], [yes], [Nagios notification plugin]) +AC_PLUGIN([ntpd], [yes], [NTPd statistics]) +AC_PLUGIN([numa], [$plugin_numa], [NUMA virtual memory statistics]) +AC_PLUGIN([nut], [$with_libupsclient], [Network UPS tools statistics]) +AC_PLUGIN([olsrd], [yes], [olsrd statistics]) +AC_PLUGIN([onewire], [$with_libowcapi], [OneWire sensor statistics]) +AC_PLUGIN([openldap], [$with_libldap], [OpenLDAP statistics]) +AC_PLUGIN([openvpn], [yes], [OpenVPN client statistics]) +AC_PLUGIN([oracle], [$with_oracle], [Oracle plugin]) +AC_PLUGIN([ovs_events], [$plugin_ovs_events], [OVS events plugin]) +AC_PLUGIN([ovs_stats], [$plugin_ovs_stats], [OVS statistics plugin]) +AC_PLUGIN([pcie_errors], [$plugin_pcie_errors], [PCIe errors plugin]) +AC_PLUGIN([perl], [$plugin_perl], [Embed a Perl interpreter]) +AC_PLUGIN([pf], [$have_net_pfvar_h], [BSD packet filter (PF) statistics]) # FIXME: Check for libevent, too. -AC_PLUGIN([pinba], [$plugin_pinba], [Pinba statistics]) -AC_PLUGIN([ping], [$with_liboping], [Network latency statistics]) -AC_PLUGIN([postgresql], [$with_libpq], [PostgreSQL database statistics]) -AC_PLUGIN([powerdns], [yes], [PowerDNS statistics]) -AC_PLUGIN([processes], [$plugin_processes], [Process statistics]) -AC_PLUGIN([protocols], [$plugin_protocols], [Protocol (IP, TCP, ...) statistics]) -AC_PLUGIN([python], [$plugin_python], [Embed a Python interpreter]) -AC_PLUGIN([redis], [$with_libhiredis], [Redis plugin]) -AC_PLUGIN([routeros], [$with_librouteros], [RouterOS plugin]) -AC_PLUGIN([rrdcached], [$librrd_rrdc_update], [RRDTool output plugin]) -AC_PLUGIN([rrdtool], [$with_librrd], [RRDTool output plugin]) -AC_PLUGIN([sensors], [$with_libsensors], [lm_sensors statistics]) -AC_PLUGIN([serial], [$plugin_serial], [serial port traffic]) -AC_PLUGIN([sigrok], [$with_libsigrok], [sigrok acquisition sources]) -AC_PLUGIN([smart], [$plugin_smart], [SMART statistics]) -AC_PLUGIN([snmp], [$with_libnetsnmp], [SNMP querying plugin]) -AC_PLUGIN([snmp_agent], [$with_libnetsnmpagent], [SNMP agent plugin]) -AC_PLUGIN([statsd], [yes], [StatsD plugin]) -AC_PLUGIN([swap], [$plugin_swap], [Swap usage statistics]) -AC_PLUGIN([synproxy], [$plugin_synproxy], [Synproxy stats plugin]) -AC_PLUGIN([syslog], [$have_syslog], [Syslog logging plugin]) -AC_PLUGIN([table], [yes], [Parsing of tabular data]) -AC_PLUGIN([tail], [yes], [Parsing of logfiles]) -AC_PLUGIN([tail_csv], [yes], [Parsing of CSV files]) -AC_PLUGIN([tape], [$plugin_tape], [Tape drive statistics]) -AC_PLUGIN([target_notification], [yes], [The notification target]) -AC_PLUGIN([target_replace], [yes], [The replace target]) -AC_PLUGIN([target_scale], [yes], [The scale target]) -AC_PLUGIN([target_set], [yes], [The set target]) -AC_PLUGIN([target_v5upgrade], [yes], [The v5upgrade target]) -AC_PLUGIN([tcpconns], [$plugin_tcpconns], [TCP connection statistics]) -AC_PLUGIN([teamspeak2], [yes], [TeamSpeak2 server statistics]) -AC_PLUGIN([ted], [$plugin_ted], [Read The Energy Detective values]) -AC_PLUGIN([thermal], [$plugin_thermal], [Linux ACPI thermal zone statistics]) -AC_PLUGIN([threshold], [yes], [Threshold checking plugin]) -AC_PLUGIN([tokyotyrant], [$with_libtokyotyrant], [TokyoTyrant database statistics]) -AC_PLUGIN([turbostat], [$plugin_turbostat], [Advanced statistic on Intel cpu states]) -AC_PLUGIN([unixsock], [yes], [Unixsock communication plugin]) -AC_PLUGIN([uptime], [$plugin_uptime], [Uptime statistics]) -AC_PLUGIN([users], [$plugin_users], [User statistics]) -AC_PLUGIN([uuid], [yes], [UUID as hostname plugin]) -AC_PLUGIN([varnish], [$with_libvarnish], [Varnish cache statistics]) -AC_PLUGIN([virt], [$plugin_virt], [Virtual machine statistics]) -AC_PLUGIN([vmem], [$plugin_vmem], [Virtual memory statistics]) -AC_PLUGIN([vserver], [$plugin_vserver], [Linux VServer statistics]) -AC_PLUGIN([wireless], [$plugin_wireless], [Wireless statistics]) -AC_PLUGIN([write_graphite], [yes], [Graphite / Carbon output plugin]) -AC_PLUGIN([write_http], [$with_libcurl], [HTTP output plugin]) -AC_PLUGIN([write_kafka], [$with_librdkafka], [Kafka output plugin]) -AC_PLUGIN([write_log], [yes], [Log output plugin]) -AC_PLUGIN([write_mongodb], [$with_libmongoc], [MongoDB output plugin]) -AC_PLUGIN([write_prometheus], [$plugin_write_prometheus], [Prometheus write plugin]) -AC_PLUGIN([write_redis], [$with_libhiredis], [Redis output plugin]) -AC_PLUGIN([write_riemann], [$with_libriemann_client], [Riemann output plugin]) -AC_PLUGIN([write_sensu], [yes], [Sensu output plugin]) -AC_PLUGIN([write_tsdb], [yes], [TSDB output plugin]) -AC_PLUGIN([xencpu], [$plugin_xencpu], [Xen Host CPU usage]) -AC_PLUGIN([xmms], [$with_libxmms], [XMMS statistics]) -AC_PLUGIN([zfs_arc], [$plugin_zfs_arc], [ZFS ARC statistics]) -AC_PLUGIN([zone], [$plugin_zone], [Solaris container statistics]) -AC_PLUGIN([zookeeper], [yes], [Zookeeper statistics]) +AC_PLUGIN([pinba], [$plugin_pinba], [Pinba statistics]) +AC_PLUGIN([ping], [$with_liboping], [Network latency statistics]) +AC_PLUGIN([postgresql], [$with_libpq], [PostgreSQL database statistics]) +AC_PLUGIN([powerdns], [yes], [PowerDNS statistics]) +AC_PLUGIN([processes], [$plugin_processes], [Process statistics]) +AC_PLUGIN([protocols], [$plugin_protocols], [Protocol (IP, TCP, ...) statistics]) +AC_PLUGIN([python], [$plugin_python], [Embed a Python interpreter]) +AC_PLUGIN([redis], [$with_libhiredis], [Redis plugin]) +AC_PLUGIN([routeros], [$with_librouteros], [RouterOS plugin]) +AC_PLUGIN([rrdcached], [$librrd_rrdc_update], [RRDTool output plugin]) +AC_PLUGIN([rrdtool], [$with_librrd], [RRDTool output plugin]) +AC_PLUGIN([sensors], [$with_libsensors], [lm_sensors statistics]) +AC_PLUGIN([serial], [$plugin_serial], [serial port traffic]) +AC_PLUGIN([sigrok], [$with_libsigrok], [sigrok acquisition sources]) +AC_PLUGIN([smart], [$plugin_smart], [SMART statistics]) +AC_PLUGIN([snmp], [$with_libnetsnmp], [SNMP querying plugin]) +AC_PLUGIN([snmp_agent], [$with_libnetsnmpagent], [SNMP agent plugin]) +AC_PLUGIN([statsd], [yes], [StatsD plugin]) +AC_PLUGIN([swap], [$plugin_swap], [Swap usage statistics]) +AC_PLUGIN([synproxy], [$plugin_synproxy], [Synproxy stats plugin]) +AC_PLUGIN([syslog], [$have_syslog], [Syslog logging plugin]) +AC_PLUGIN([table], [yes], [Parsing of tabular data]) +AC_PLUGIN([tail], [yes], [Parsing of logfiles]) +AC_PLUGIN([tail_csv], [yes], [Parsing of CSV files]) +AC_PLUGIN([tape], [$plugin_tape], [Tape drive statistics]) +AC_PLUGIN([target_notification], [yes], [The notification target]) +AC_PLUGIN([target_replace], [yes], [The replace target]) +AC_PLUGIN([target_scale], [yes], [The scale target]) +AC_PLUGIN([target_set], [yes], [The set target]) +AC_PLUGIN([target_v5upgrade], [yes], [The v5upgrade target]) +AC_PLUGIN([tcpconns], [$plugin_tcpconns], [TCP connection statistics]) +AC_PLUGIN([teamspeak2], [yes], [TeamSpeak2 server statistics]) +AC_PLUGIN([ted], [$plugin_ted], [Read The Energy Detective values]) +AC_PLUGIN([thermal], [$plugin_thermal], [Linux ACPI thermal zone statistics]) +AC_PLUGIN([threshold], [yes], [Threshold checking plugin]) +AC_PLUGIN([tokyotyrant], [$with_libtokyotyrant], [TokyoTyrant database statistics]) +AC_PLUGIN([turbostat], [$plugin_turbostat], [Advanced statistic on Intel cpu states]) +AC_PLUGIN([unixsock], [yes], [Unixsock communication plugin]) +AC_PLUGIN([uptime], [$plugin_uptime], [Uptime statistics]) +AC_PLUGIN([users], [$plugin_users], [User statistics]) +AC_PLUGIN([uuid], [yes], [UUID as hostname plugin]) +AC_PLUGIN([varnish], [$with_libvarnish], [Varnish cache statistics]) +AC_PLUGIN([virt], [$plugin_virt], [Virtual machine statistics]) +AC_PLUGIN([vmem], [$plugin_vmem], [Virtual memory statistics]) +AC_PLUGIN([vserver], [$plugin_vserver], [Linux VServer statistics]) +AC_PLUGIN([wireless], [$plugin_wireless], [Wireless statistics]) +AC_PLUGIN([write_graphite], [yes], [Graphite / Carbon output plugin]) +AC_PLUGIN([write_http], [$with_libcurl], [HTTP output plugin]) +AC_PLUGIN([write_stackdriver], [$plugin_write_stackdriver], [Google Stackdriver Monitoring output plugin]) +AC_PLUGIN([write_kafka], [$with_librdkafka], [Kafka output plugin]) +AC_PLUGIN([write_log], [yes], [Log output plugin]) +AC_PLUGIN([write_mongodb], [$with_libmongoc], [MongoDB output plugin]) +AC_PLUGIN([write_prometheus], [$plugin_write_prometheus], [Prometheus write plugin]) +AC_PLUGIN([write_redis], [$with_libhiredis], [Redis output plugin]) +AC_PLUGIN([write_riemann], [$with_libriemann_client], [Riemann output plugin]) +AC_PLUGIN([write_sensu], [yes], [Sensu output plugin]) +AC_PLUGIN([write_tsdb], [yes], [TSDB output plugin]) +AC_PLUGIN([xencpu], [$plugin_xencpu], [Xen Host CPU usage]) +AC_PLUGIN([xmms], [$with_libxmms], [XMMS statistics]) +AC_PLUGIN([zfs_arc], [$plugin_zfs_arc], [ZFS ARC statistics]) +AC_PLUGIN([zone], [$plugin_zone], [Solaris container statistics]) +AC_PLUGIN([zookeeper], [yes], [Zookeeper statistics]) dnl Default configuration file # Load either syslog or logfile @@ -7004,6 +7162,7 @@ AC_MSG_RESULT([ YACC . . . . . . . . $YACC]) AC_MSG_RESULT([ YFLAGS . . . . . . . $YFLAGS]) AC_MSG_RESULT() AC_MSG_RESULT([ Libraries:]) +AC_MSG_RESULT([ cuda . . . . . . . . $with_cuda]) AC_MSG_RESULT([ intel mic . . . . . . $with_mic]) AC_MSG_RESULT([ libaquaero5 . . . . . $with_libaquaero5]) AC_MSG_RESULT([ libatasmart . . . . . $with_libatasmart]) @@ -7056,6 +7215,7 @@ AC_MSG_RESULT([ librouteros . . . . . $with_librouteros]) AC_MSG_RESULT([ librrd . . . . . . . $with_librrd]) AC_MSG_RESULT([ libsensors . . . . . $with_libsensors]) AC_MSG_RESULT([ libsigrok . . . . . $with_libsigrok]) +AC_MSG_RESULT([ libssl . . . . . . . $with_libssl]) AC_MSG_RESULT([ libstatgrab . . . . . $with_libstatgrab]) AC_MSG_RESULT([ libtokyotyrant . . . $with_libtokyotyrant]) AC_MSG_RESULT([ libudev . . . . . . . $with_libudev]) @@ -7118,6 +7278,7 @@ AC_MSG_RESULT([ filecount . . . . . . $enable_filecount]) AC_MSG_RESULT([ fscache . . . . . . . $enable_fscache]) AC_MSG_RESULT([ gmond . . . . . . . . $enable_gmond]) AC_MSG_RESULT([ gps . . . . . . . . . $enable_gps]) +AC_MSG_RESULT([ gpu_nvidia . . . . . $enable_gpu_nvidia]) AC_MSG_RESULT([ grpc . . . . . . . . $enable_grpc]) AC_MSG_RESULT([ hddtemp . . . . . . . $enable_hddtemp]) AC_MSG_RESULT([ hugepages . . . . . . $enable_hugepages]) @@ -7171,6 +7332,7 @@ AC_MSG_RESULT([ openvpn . . . . . . . $enable_openvpn]) AC_MSG_RESULT([ oracle . . . . . . . $enable_oracle]) AC_MSG_RESULT([ ovs_events . . . . . $enable_ovs_events]) AC_MSG_RESULT([ ovs_stats . . . . . . $enable_ovs_stats]) +AC_MSG_RESULT([ pcie_errors . . . . . $enable_pcie_errors]) AC_MSG_RESULT([ perl . . . . . . . . $enable_perl]) AC_MSG_RESULT([ pf . . . . . . . . . $enable_pf]) AC_MSG_RESULT([ pinba . . . . . . . . $enable_pinba]) @@ -7228,6 +7390,7 @@ AC_MSG_RESULT([ write_prometheus. . . $enable_write_prometheus]) AC_MSG_RESULT([ write_redis . . . . . $enable_write_redis]) AC_MSG_RESULT([ write_riemann . . . . $enable_write_riemann]) AC_MSG_RESULT([ write_sensu . . . . . $enable_write_sensu]) +AC_MSG_RESULT([ write_stackdriver . . $enable_write_stackdriver]) AC_MSG_RESULT([ write_tsdb . . . . . $enable_write_tsdb]) AC_MSG_RESULT([ xencpu . . . . . . . $enable_xencpu]) AC_MSG_RESULT([ xmms . . . . . . . . $enable_xmms]) @@ -7245,3 +7408,4 @@ if test "x$dependency_warning" = "xyes"; then fi # vim: set fdm=marker sw=2 sts=2 ts=2 et : + diff --git a/contrib/docker/50docker-apt-conf b/contrib/docker/50docker-apt-conf index 3f898b3b..1b71704f 100644 --- a/contrib/docker/50docker-apt-conf +++ b/contrib/docker/50docker-apt-conf @@ -1,4 +1,4 @@ -APT::Install-Recommends "0"; +APT::Install-Recommends "1"; APT::Install-Suggests "0"; APT::Get::Assume-Yes "1"; APT::Get::AutomaticRemove "1"; diff --git a/contrib/docker/rootfs_prefix/rootfs_prefix.c b/contrib/docker/rootfs_prefix/rootfs_prefix.c index 2b831518..fdacf743 100644 --- a/contrib/docker/rootfs_prefix/rootfs_prefix.c +++ b/contrib/docker/rootfs_prefix/rootfs_prefix.c @@ -1,3 +1,33 @@ +/** + * collectd - contrib/docker/rootfs_prefix/rootfs_prefix.c + * Copyright (C) 2016-2018 Marc Fournier + * Copyright (C) 2016-2018 Ruben Kerkhof + * + * MIT License: + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Marc Fournier + * Ruben Kerkhof + **/ + #define _GNU_SOURCE #include diff --git a/docs/review_comments.md b/docs/review_comments.md new file mode 100644 index 00000000..9bad458e --- /dev/null +++ b/docs/review_comments.md @@ -0,0 +1,96 @@ +# Code Review Comments + +This is a collection of frequent code review comments, collected here for +reference and discussed in more depth than a typical code review would allow. + +The intended use for this document is to point to it from a code review to make +a point quickly while still providing the contributor with enough information +to resolve the issue. For example, a good review comment would be: + +![Please initialize variables at declaration. Link to comment.](review_comments_example.png) + +A link to each paragraph is provided at the beginning for easy copy'n'pasting. + +## Initialize variables + +→ [https://collectd.org/review-comments#initialize-variables](https://collectd.org/review-comments#initialize-variables) + +Initialize variables when declaring them. By default, C does not initialize +local variables when they are defined. If a code path ends up reading the +variable before it is initialized, for example because a loop body is never +executed, it will read random data, causing undefined behavior. Worst case, +pointers will point to random memory causing a segmentation fault. + +**Examples:** + +```c +/* Initialize scalar with to literal: */ +int status = 0; + +/* Initialize pointer with function call: */ +char *buffer = calloc(1, buffer_size); + +/* Initialize struct with struct initializer: */ +struct addrinfo ai = { + .ai_family = AF_UNSPEC, + .ai_flags = AI_ADDRCONFIG, + .ai_socktype = SOCK_STREAM, +}; + +/* Initialize struct with zero: */ +struct stat statbuf = {0}; +``` + +In the last example, `{0}` is the universal struct initializer that, in theory, +should be able to zero-initialize any struct. In practise, however, some +compilers don't implement this correctly and will get confused when the first +member is a struct or a union. Our *continuous integration* framework will +catch these cases. + +## Define variables on first use + +→ [https://collectd.org/review-comments#define-variables-on-first-use](https://collectd.org/review-comments#define-variables-on-first-use) + +Local variables should be defined when they are first used, ideally when they +can be initialized. For example: + +```c +struct foo *f = calloc(1, sizeof(*f)); +if (f == NULL) { + return ENOMEM; +} + +/* GOOD: status defiened and initialized late. */ +int status = function_call(f); +``` + +Sometimes variables are initialized by passing a pointer to them to a function. +In that case define them as close to the function call as you can and +zero-initialize them. The function may only partially initialize a struct or +not initialize a struct at all in some circumstances. + +**Example:** + +```c +char const *path = determine_path(); + +struct stat s = {0}; +int status = stat(path, &s); +``` + +Old C standards (C89 and ealier) required variables to be defined at the +beginning of a scope block. The following *bad* style is still frequently +found: + +```c +/* BAD: local variables defined at beginning of block. */ +struct foo *f; +int status; + +f = calloc(1, sizeof(*f)); +if (f == NULL) { + return ENOMEM; +} + +status = function_call(f); +``` diff --git a/docs/review_comments_example.png b/docs/review_comments_example.png new file mode 100644 index 00000000..81eb4582 Binary files /dev/null and b/docs/review_comments_example.png differ diff --git a/gnulib b/gnulib new file mode 160000 index 00000000..2f8140bc --- /dev/null +++ b/gnulib @@ -0,0 +1 @@ +Subproject commit 2f8140bc8ce5501e31dcc665b42b5df64f84c20c diff --git a/src/amqp1.c b/src/amqp1.c index 635af0f7..87bb50cf 100644 --- a/src/amqp1.c +++ b/src/amqp1.c @@ -372,7 +372,7 @@ static int amqp1_notify(notification_t const *n, } cd_message_t *cdm = malloc(sizeof(*cdm)); - if (cdm == NULL ){ + if (cdm == NULL) { ERROR("amqp1 plugin: notify failed"); return -1; } @@ -471,15 +471,16 @@ static int amqp1_write(const data_set_t *ds, const value_list_t *vl, /* {{{ */ format_json_initialize((char *)cdm->mbuf.start, &bfill, &bfree); format_json_value_list((char *)cdm->mbuf.start, &bfill, &bfree, ds, vl, instance->store_rates); - status= format_json_finalize((char *)cdm->mbuf.start, &bfill, &bfree); + status = format_json_finalize((char *)cdm->mbuf.start, &bfill, &bfree); if (status != 0) { - ERROR("amqp1 plugin: format_json_finalize failed with status %i.", status); + ERROR("amqp1 plugin: format_json_finalize failed with status %i.", + status); cd_message_free(cdm); - return(status); + return status; } cdm->mbuf.size = strlen(cdm->mbuf.start); if (cdm->mbuf.size >= BUFSIZE) { - ERROR("amqp1 plugin: format graphite failed"); + ERROR("amqp1 plugin: format json failed"); cd_message_free(cdm); return -1; } diff --git a/src/chrony.c b/src/chrony.c index 6fb369a2..913aab94 100644 --- a/src/chrony.c +++ b/src/chrony.c @@ -38,6 +38,11 @@ #include /* ntohs/ntohl */ #endif +/* AIX doesn't have MSG_DONTWAIT */ +#ifndef MSG_DONTWAIT +#define MSG_DONTWAIT MSG_NONBLOCK +#endif + #define CONFIG_KEY_HOST "Host" #define CONFIG_KEY_PORT "Port" #define CONFIG_KEY_TIMEOUT "Timeout" @@ -440,6 +445,15 @@ static int chrony_recv_response(tChrony_Response *p_resp, } } +static void chrony_flush_recv_queue(void) { + char buf[1]; + + if (g_chrony_is_connected) { + while (recv(g_chrony_socket, buf, sizeof(buf), MSG_DONTWAIT) > 0) + ; + } +} + static int chrony_query(const int p_command, tChrony_Request *p_req, tChrony_Response *p_resp, size_t *p_resp_size) { /* Check connection. We simply perform one try as collectd already handles @@ -964,6 +978,9 @@ static int chrony_read(void) { g_chrony_seq_is_initialized = 1; } + /* Ignore late responses that may have been received */ + chrony_flush_recv_queue(); + /* Get daemon stats */ rc = chrony_request_daemon_stats(); if (rc != CHRONY_RC_OK) diff --git a/src/collectd-python.pod b/src/collectd-python.pod index 1f46f6f3..3e44d546 100644 --- a/src/collectd-python.pod +++ b/src/collectd-python.pod @@ -126,6 +126,13 @@ normally and spawning processes from Python will work as intended. =back +=item B I + +Imports the python script I and loads it into the collectd +python process. If your python script is not found, be sure its +directory exists in python's B. You can prepend to the +B using the B configuration option. + =item EB IE block This block may be used to pass on configuration settings to a Python module. diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 4fd507ae..c8a47d56 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -174,6 +174,7 @@ #@BUILD_PLUGIN_ORACLE_TRUE@LoadPlugin oracle #@BUILD_PLUGIN_OVS_EVENTS_TRUE@LoadPlugin ovs_events #@BUILD_PLUGIN_OVS_STATS_TRUE@LoadPlugin ovs_stats +#@BUILD_PLUGIN_PCIE_ERRORS_TRUE@LoadPlugin pcie_errors #@BUILD_PLUGIN_PERL_TRUE@LoadPlugin perl #@BUILD_PLUGIN_PINBA_TRUE@LoadPlugin pinba #@BUILD_PLUGIN_PING_TRUE@LoadPlugin ping @@ -222,6 +223,7 @@ #@BUILD_PLUGIN_WRITE_REDIS_TRUE@LoadPlugin write_redis #@BUILD_PLUGIN_WRITE_RIEMANN_TRUE@LoadPlugin write_riemann #@BUILD_PLUGIN_WRITE_SENSU_TRUE@LoadPlugin write_sensu +#@BUILD_PLUGIN_WRITE_STACKDRIVER_TRUE@LoadPlugin write_stackdriver #@BUILD_PLUGIN_WRITE_TSDB_TRUE@LoadPlugin write_tsdb #@BUILD_PLUGIN_XENCPU_TRUE@LoadPlugin xencpu #@BUILD_PLUGIN_XMMS_TRUE@LoadPlugin xmms @@ -660,6 +662,12 @@ # PauseConnect 5 # +# +# GPUIndex 0 +# GPUIndex 2 +# IgnoreSelected false +# + # # # EnableSSL true @@ -1135,6 +1143,12 @@ # Bridges "br0" "br_ext" # +# +# Source "sysfs" +# ReportMasked false +# PersistentNotifications false +# + # # IncludeDir "/my/include/path" # BaseName "Collectd::Plugins" @@ -1274,6 +1288,7 @@ # # Host "redis.example.com" # Port "6379" +# #Socket "/var/run/redis/redis.sock" # Timeout 2000 # # #Database 0 @@ -1295,6 +1310,7 @@ # CollectMemory true # CollectDF true # CollectDisk true +# CollectHealth true # # @@ -1783,6 +1799,16 @@ # Attribute "foo" "bar" # +# +# Project "stackdriver-account" +# CredentialFile "/path/to/gcp-project-id-12345.json" +# Email "123456789012@developer.gserviceaccount.com" +# +# Label "project_id" "gcp-project-id" +# +# Url "https://monitoring.googleapis.com/v3" +# + # # # Host "localhost" diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index a681fa55..e4bcbc26 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -1703,6 +1703,10 @@ installed) to get the current CPU frequency. If this file does not exist make sure B (L) or a similar tool is installed and an "cpu governor" (that's a kernel module) is loaded. +If the system has the I kernel module loaded, this plugin reports +the rate of p-state (cpu frequency) transitions and the percentage of time spent +in each p-state. + =head2 Plugin C This plugin doesn't have any options. It reads CLOCK_BOOTTIME and @@ -1949,6 +1953,11 @@ plugin below on how matches are defined. If the B or B options are set to B, B blocks are optional. +=item B I + +Sets the interval (in seconds) in which the values will be collected from this +URL. By default the global B setting will be used. + =item B I The B option sets the overall timeout for HTTP requests to B, in @@ -2145,6 +2154,11 @@ Use I as the plugin instance when submitting values. May be overridden by B option inside B blocks. Defaults to an empty string (no plugin instance). +=item B I + +Sets the interval (in seconds) in which the values will be collected from this +URL. By default the global B setting will be used. + =item B I I If an XPath expression references namespaces, they must be specified @@ -3237,6 +3251,30 @@ Pause to apply between attempts of connection to gpsd in seconds (default 5 sec) =back +=head2 Plugin C + +Efficiently collects various statistics from the system's NVIDIA GPUs using the +NVML library. Currently collected are fan speed, core temperature, percent +load, percent memory used, compute and memory frequencies, and power +consumption. + +=over 4 + +=item B + +If one or more of these options is specified, only GPUs at that index (as +determined by nvidia-utils through I) have statistics collected. +If no instance of this option is specified, all GPUs are monitored. + +=item B + +If set to true, all detected GPUs B the ones at indices specified by +B entries are collected. For greater clarity, setting IgnoreSelected +without any GPUIndex directives will result in B statistics being +collected. + +=back + =head2 Plugin C The I plugin provides an RPC interface to submit values to or query @@ -6312,6 +6350,52 @@ Default: empty (monitor all bridges) =back +=head2 Plugin C + +The I plugin collects PCI Express errors from Device Status in Capability +structure and from Advanced Error Reporting Extended Capability where available. +At every read it polls config space of PCI Express devices and dispatches +notification for every error that is set. It checks for new errors at every read. +The device is indicated in plugin_instance according to format "domain:bus:dev.fn". +Errors are divided into categories indicated by type_instance: "correctable", and +for uncorrectable errors "non_fatal" or "fatal". +Fatal errors are reported as I and all others as I. + +B + + + Source "sysfs" + AccessDir "/sys/bus/pci" + ReportMasked false + PersistentNotifications false + + +B + +=over 4 + +=item B B|B + +Use B or B to read data from /sysfs or /proc. +The default value is B. + +=item B I + +Directory used to access device config space. It is optional and defaults to +/sys/bus/pci for B and to /proc/bus/pci for B. + +=item B B|B + +If true plugin will notify about errors that are set to masked in Error Mask register. +Such errors are not reported to the PCI Express Root Complex. Defaults to B. + +=item B B|B + +If false plugin will dispatch notification only on set/clear of error. +The ones already reported will be ignored. Defaults to B. + +=back + =head2 Plugin C This plugin embeds a Perl-interpreter into collectd and provides an interface @@ -7264,6 +7348,7 @@ multiple routers: CollectRegistrationTable true CollectDF true CollectDisk true + CollectHealth true @@ -7324,6 +7409,12 @@ Defaults to B. When enabled, the number of sectors written and bad blocks will be collected. Defaults to B. +=item B B|B + +When enabled, the health statistics will be collected. This includes the +voltage and temperature on supported hardware. +Defaults to B. + =back =head2 Plugin C @@ -7337,6 +7428,7 @@ parameters and set of user-defined queries for this node. Host "localhost" Port "6379" + #Socket "/var/run/redis/redis.sock" Timeout 2000 ReportCommandStats false ReportCpuUsage true @@ -7370,6 +7462,11 @@ The B option is the TCP port on which the Redis instance accepts connections. Either a service name of a port number may be given. Please note that numerical port numbers must be given as a string, too. +=item B I + +Connect to Redis using the UNIX domain socket at I. If this +setting is given, the B and B settings are ignored. + =item B I Use I to authenticate when connecting to I. @@ -8480,13 +8577,14 @@ B Type "percent" Instance "dropped" - Index 1 + ValueFrom 1 Plugin "snortstats" Instance "eth0" Interval 600 Collect "snort-dropped" + #TimeFrom 0 @@ -8808,6 +8906,33 @@ dynamic number assigned by the kernel. Otherwise, CnE> is used if there is only one package and CnE-coreEmE> if there is more than one, where I is the n-th core of package I. +=item B I|I + +Reading data from CPU has side-effect: collectd process's CPU affinity mask +changes. After reading data is completed, affinity mask needs to be restored. +This option allows to set restore policy. + +B (the default): Restore the affinity by setting affinity to any/all +CPUs. + +B: Save affinity using sched_getaffinity() before reading data and +restore it after. + +On some systems, sched_getaffinity() will fail due to inconsistency of the CPU +set size between userspace and kernel. In these cases plugin will detect the +unsuccessful call and fail with an error, preventing data collection. +Most of configurations does not need to save affinity as Collectd process is +allowed to run on any/all available CPUs. + +If you need to save and restore affinity and get errors like 'Unable to save +the CPU affinity', setting 'possible_cpus' kernel boot option may also help. + +See following links for details: + +L +L +L + =back =head2 Plugin C @@ -9077,6 +9202,40 @@ only on the host system. Only I is required. +Consider the following example config: + + + Connection "qemu:///system" + HostnameFormat "hostname" + InterfaceFormat "address" + PluginInstanceFormat "name" + + +It will generate the following values: + + node42.example.com/virt-instance-0006f26c/disk_octets-vda + node42.example.com/virt-instance-0006f26c/disk_ops-vda + node42.example.com/virt-instance-0006f26c/if_dropped-ca:fe:ca:fe:ca:fe + node42.example.com/virt-instance-0006f26c/if_errors-ca:fe:ca:fe:ca:fe + node42.example.com/virt-instance-0006f26c/if_octets-ca:fe:ca:fe:ca:fe + node42.example.com/virt-instance-0006f26c/if_packets-ca:fe:ca:fe:ca:fe + node42.example.com/virt-instance-0006f26c/memory-actual_balloon + node42.example.com/virt-instance-0006f26c/memory-available + node42.example.com/virt-instance-0006f26c/memory-last_update + node42.example.com/virt-instance-0006f26c/memory-major_fault + node42.example.com/virt-instance-0006f26c/memory-minor_fault + node42.example.com/virt-instance-0006f26c/memory-rss + node42.example.com/virt-instance-0006f26c/memory-swap_in + node42.example.com/virt-instance-0006f26c/memory-swap_out + node42.example.com/virt-instance-0006f26c/memory-total + node42.example.com/virt-instance-0006f26c/memory-unused + node42.example.com/virt-instance-0006f26c/memory-usable + node42.example.com/virt-instance-0006f26c/virt_cpu_total + node42.example.com/virt-instance-0006f26c/virt_vcpu-0 + +You can get information on the metric's units from the online libvirt documentation. +For instance, I is in nanoseconds. + =over 4 =item B I @@ -9179,7 +9338,8 @@ B means use the guest's UUID. This is useful if you want to track the same guest across migrations. B means to use the global B setting, which is probably not -useful on its own because all guests will appear to have the same name. +useful on its own because all guests will appear to have the same name. This is +useful in conjunction with B though. You can also specify combinations of these fields. For example B means to concatenate the guest name and UUID (with a literal colon character @@ -9325,6 +9485,7 @@ Synopsis: Protocol "tcp" LogSendErrors true Prefix "collectd" + UseTags false @@ -9362,13 +9523,20 @@ approach and logging errors fills syslog with unneeded messages. =item B I -When set, I is added in front of the host name. Dots and whitespace are -I escaped in this string (see B below). +When B is I, B value is added in front of the host name. +When B is I, B value is added in front of series name. + +Dots and whitespace are I escaped in this string (see B +below). =item B I -When set, I is appended to the host name. Dots and whitespace are -I escaped in this string (see B below). +When B is I, B value appended to the host name. +When B is I, B value appended to the end of series name +(before the first ; that separates the name from the tags). + +Dots and whitespace are I escaped in this string (see B +below). =item B I @@ -9390,6 +9558,8 @@ path component, for example C. If set to B (the default), the plugin and plugin instance (and likewise the type and type instance) are put into one component, for example C. +Option value is not used when B is I. + =item B B|B If set to B, append the name of the I (DS) to the "metric" @@ -9402,12 +9572,31 @@ If set to B (the default) the C<.> (dot) character is replaced with I. Otherwise, if set to B, the C<.> (dot) character is preserved, i.e. passed through. +Option value is not used when B is I. + =item B B|B If set to B, detect and remove duplicate components in Graphite metric names. For example, the metric name C will be shortened to C. +=item B B|B + +If set to B, Graphite metric names will be generated as tagged series. +This allows for much more flexibility than the traditional hierarchical layout. + +Example: +C + +You can use B option to add more tags by specifying it like +C<;tag1=value1;tag2=value2>. Note what tagging support was added since Graphite +version 1.1.x. + +If set to B, the B and B settings +are not used. + +Default value: B. + =back =head2 Plugin C @@ -9576,6 +9765,13 @@ B =over 4 +=item B I + +Bind to the hostname / address I. By default, the plugin will bind to the +"any" address, i.e. accept packets sent to any of the hosts addresses. + +This option is supported only for libmicrohttpd newer than 0.9.0. + =item B I Port the embedded webserver should listen on. Defaults to B<9103>. @@ -9833,17 +10029,26 @@ been set to B. =item B (B=I only) A prefix can be added in the metric name when outputting in the I -format. It's added before the I name. +format. + +When B is I, prefix is added before the I name. Metric name will be CprefixEEhostEEpostfixEEpluginEEtypeEEnameE> +When B is I, prefix is added in front of series name. + =item B (B=I only) A postfix can be added in the metric name when outputting in the I -format. It's added after the I name. +format. + +When B is I, postfix is added after the I name. Metric name will be CprefixEEhostEEpostfixEEpluginEEtypeEEnameE> +When B is I, prefix value appended to the end of series +name (before the first ; that separates the name from the tags). + =item B (B=I only) Specify a character to replace dots (.) in the host part of the metric name. @@ -9858,6 +10063,8 @@ path component, for example C. If set to B (the default), the plugin and plugin instance (and likewise the type and type instance) are put into one component, for example C. +Option value is not used when B is I. + =item B B|B If set to B, append the name of the I (DS) to the "metric" @@ -9870,6 +10077,14 @@ If set to B (the default) the C<.> (dot) character is replaced with I. Otherwise, if set to B, the C<.> (dot) character is preserved, i.e. passed through. +Option value is not used when B is I. + +=item B B|B + +If set to B Graphite metric names will be generated as tagged series. + +Default value: B. + =item B B|B If set to B (the default), convert counter values to rates. If set to @@ -10230,6 +10445,133 @@ attribute for each metric being sent out to I. =back +=head2 Plugin C + +The C plugin writes metrics to the +I service. + +This plugin supports two authentication methods: When configured, credentials +are read from the JSON credentials file specified with B. +Alternatively, when running on +I (GCE), an I token is retrieved from the +I and used to authenticate to GCM. + +B + + + CredentialFile "/path/to/service_account.json" + + Label "project_id" "monitored_project" + + + +=over 4 + +=item B I + +Path to a JSON credentials file holding the credentials for a GCP service +account. + +If B is not specified, the plugin uses I. That means which credentials are used depends on the environment: + +=over 4 + +=item + +The environment variable C is checked. If this +variable is specified it should point to a JSON file that defines the +credentials. + +=item + +The path C<${HOME}/.config/gcloud/application_default_credentials.json> is +checked. This where credentials used by the I command line utility are +stored. You can use C to create these +credentials. + +Please note that these credentials are often of your personal account, not a +service account, and are therefore unfit to be used in a production +environment. + +=item + +When running on GCE, the built-in service account associated with the virtual +machine instance is used. +See also the B option below. + +=back + +=item B I + +The I or the I of the I. The +I is a string identifying the GCP project, which you can chose +freely when creating a new project. The I is a 12-digit decimal +number. You can look up both on the I. + +This setting is optional. If not set, the project ID is read from the +credentials file or determined from the GCE's metadata service. + +=item B I (GCE only) + +Choses the GCE I used for authentication. + +Each GCE instance has a C I but may also be +associated with additional I. This is often used to restrict +the permissions of services running on the GCE instance to the required +minimum. The I requires the +C scope. When multiple I are available, this option selects which one is used by +I. + +=item B I + +Configures the I to use when storing metrics. +More information on I and I are +available at L. + +This block takes one string argument, the I. Inside the block are +one or more B