Merge pull request #2618 from ajssmith/amqp1_dev1_branch
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Thu, 24 May 2018 09:06:55 +0000 (11:06 +0200)
committerGitHub <noreply@github.com>
Thu, 24 May 2018 09:06:55 +0000 (11:06 +0200)
Write amqp1 plugin

1  2 
Makefile.am
README
configure.ac
contrib/redhat/collectd.spec
src/collectd.conf.in
src/collectd.conf.pod

diff --combined Makefile.am
@@@ -61,7 -61,6 +61,7 @@@ EXTRA_DIST = 
        src/types.db \
        src/types.db.pod \
        src/valgrind.FreeBSD.suppress \
 +      src/valgrind.suppress \
        testwrapper.sh \
        version-gen.sh
  
@@@ -142,8 -141,7 +142,8 @@@ check_PROGRAMS = 
        test_utils_subst \
        test_utils_time \
        test_utils_vl_lookup \
 -      test_libcollectd_network_parse
 +      test_libcollectd_network_parse \
 +      test_utils_config_cores
  
  
  TESTS = $(check_PROGRAMS)
@@@ -328,11 -326,6 +328,11 @@@ test_utils_subst_SOURCES = 
        src/daemon/utils_subst.h
  test_utils_subst_LDADD = libplugin_mock.la
  
 +test_utils_config_cores_SOURCES = \
 +      src/utils_config_cores_test.c \
 +      src/testing.h
 +test_utils_config_cores_LDADD = libplugin_mock.la
 +
  libavltree_la_SOURCES = \
        src/daemon/utils_avltree.c \
        src/daemon/utils_avltree.h
@@@ -490,8 -483,7 +490,8 @@@ libcollectdclient_la_SOURCES = 
        src/libcollectdclient/network.c \
        src/libcollectdclient/network_buffer.c \
        src/libcollectdclient/network_parse.c \
 -      src/libcollectdclient/server.c
 +      src/libcollectdclient/server.c \
 +      src/libcollectdclient/collectd/stdendian.h
  libcollectdclient_la_CPPFLAGS = \
        $(AM_CPPFLAGS) \
        -I$(srcdir)/src/libcollectdclient \
@@@ -550,6 -542,20 +550,20 @@@ amqp_la_LIBADD = 
        libformat_json.la
  endif
  
+ if BUILD_PLUGIN_AMQP1
+ pkglib_LTLIBRARIES += amqp1.la
+ amqp1_la_SOURCES = \
+       src/amqp1.c \
+       src/utils_deq.h
+ amqp1_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBQPIDPROTON_CPPFLAGS)
+ amqp1_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBQPIDPROTON_LDFLAGS)
+ amqp1_la_LIBADD = \
+       $(BUILD_WITH_LIBQPIDPROTON_LIBS) \
+       libcmds.la \
+       libformat_graphite.la \
+       libformat_json.la
+ endif
  if BUILD_PLUGIN_APACHE
  pkglib_LTLIBRARIES += apache.la
  apache_la_SOURCES = src/apache.c
@@@ -600,7 -606,7 +614,7 @@@ if BUILD_PLUGIN_BAROMETE
  pkglib_LTLIBRARIES += barometer.la
  barometer_la_SOURCES = src/barometer.c
  barometer_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 -barometer_la_LIBADD = -lm
 +barometer_la_LIBADD = -lm $(BUILD_WITH_LIBI2C_LIBS)
  endif
  
  if BUILD_PLUGIN_BATTERY
@@@ -921,10 -927,7 +935,10 @@@ endi
  
  if BUILD_PLUGIN_INTEL_PMU
  pkglib_LTLIBRARIES += intel_pmu.la
 -intel_pmu_la_SOURCES = src/intel_pmu.c
 +intel_pmu_la_SOURCES = \
 +      src/intel_pmu.c \
 +      src/utils_config_cores.h \
 +      src/utils_config_cores.c
  intel_pmu_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBJEVENTS_CPPFLAGS)
  intel_pmu_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBJEVENTS_LDFLAGS)
  intel_pmu_la_LIBADD = $(BUILD_WITH_LIBJEVENTS_LIBS)
@@@ -932,10 -935,7 +946,10 @@@ endi
  
  if BUILD_PLUGIN_INTEL_RDT
  pkglib_LTLIBRARIES += intel_rdt.la
 -intel_rdt_la_SOURCES = src/intel_rdt.c
 +intel_rdt_la_SOURCES = \
 +      src/intel_rdt.c \
 +      src/utils_config_cores.h \
 +      src/utils_config_cores.c
  intel_rdt_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBPQOS_CPPFLAGS)
  intel_rdt_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBPQOS_LDFLAGS)
  intel_rdt_la_LIBADD = $(BUILD_WITH_LIBPQOS_LIBS)
@@@ -1772,15 -1772,18 +1786,15 @@@ virt_la_CFLAGS = $(AM_CFLAGS) 
  virt_la_LDFLAGS = $(PLUGIN_LDFLAGS)
  virt_la_LIBADD = libignorelist.la $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
  
 -# TODO: enable once we support only modern libvirts which depends on libnl-3
 -# the libvirt on wheezy is linked in libnl v1, and there is a small leak here,
 -# triggered by the library initialization. There are no means to avoid it,
 -# and libvirt switched to libnl3 anyway
 -#test_plugin_virt_SOURCES = src/virt_test.c
 -#test_plugin_virt_CPPFLAGS = $(AM_CPPFLAGS) \
 -#     $(BUILD_WITH_LIBVIRT_CFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
 -#test_plugin_virt_LDFLAGS = $(PLUGIN_LDFLAGS)
 -#test_plugin_virt_LDADD = libplugin_mock.la \
 -#     $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
 -#check_PROGRAMS += test_plugin_virt
 -#TESTS += test_plugin_virt
 +test_plugin_virt_SOURCES = src/virt_test.c
 +test_plugin_virt_CPPFLAGS = $(AM_CPPFLAGS) \
 +      $(BUILD_WITH_LIBVIRT_CPPFLAGS) $(BUILD_WITH_LIBXML2_CFLAGS)
 +test_plugin_virt_LDFLAGS = $(PLUGIN_LDFLAGS) \
 +      $(BUILD_WITH_LIBVIRT_LDFLAGS) $(BUILD_WITH_LIBXML2_LDFLAGS)
 +test_plugin_virt_LDADD = libplugin_mock.la \
 +      $(BUILD_WITH_LIBVIRT_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
 +check_PROGRAMS += test_plugin_virt
 +TESTS += test_plugin_virt
  endif
  
  if BUILD_PLUGIN_VMEM
diff --combined README
--- 1/README
--- 2/README
+++ b/README
@@@ -100,9 -100,6 +100,9 @@@ Feature
        Collect DPDK interface statistics.
        See docs/BUILD.dpdkstat.md for detailed build instructions.
  
 +      This plugin should be compiled with compiler defenses enabled, for
 +      example -fstack-protector.
 +
      - drbd
        Collect individual drbd resource statistics.
  
        hugepages can be found here:
        https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt.
  
 +      This plugin should be compiled with compiler defenses enabled, for
 +      example -fstack-protector.
 +
      - intel_pmu
        The intel_pmu plugin reads performance counters provided by the Linux
        kernel perf interface. The plugin uses jevents library to resolve named
  
      - amqp
        Sends JSON-encoded data to an Advanced Message Queuing Protocol (AMQP)
-       server, such as RabbitMQ.
+       0.9.1 server, such as RabbitMQ.
+     - amqp1
+       Sends JSON-encoded data to an Advanced Message Queuing Protocol (AMQP)
+       1.0 server, such as Qpid Dispatch Router or Apache Artemis Broker.
  
      - csv
        Write to comma separated values (CSV) files. This needs lots of
@@@ -908,8 -906,14 +912,14 @@@ Prerequisite
      are supported.
      <http://www.python.org/>
  
+   * libqpid-proton (optional)
+     Used by the `amqp1' plugin for AMQP 1.0 connections, for example to
+     Qdrouterd.
+     <http://qpid.apache.org/>
    * librabbitmq (optional; also called “rabbitmq-c”)
-     Used by the `amqp' plugin for AMQP connections, for example to RabbitMQ.
+     Used by the `amqp' plugin for AMQP 0.9.1 connections, for example to
+     RabbitMQ.
      <http://hg.rabbitmq.com/rabbitmq-c/>
  
    * librdkafka (optional; also called “rdkafka”)
@@@ -987,8 -991,9 +997,8 @@@ Configuring / Compiling / Installin
  ------------------------------------
  
    To configure, build and install collectd with the default settings, run
 -  `./configure && make && make install'.  For detailed, generic instructions
 -  see INSTALL. For a complete list of configure options and their description,
 -  run `./configure --help'.
 +  `./configure && make && make install'.  For a complete list of configure
 +  options and their description, run `./configure --help'.
  
    By default, the configure script will check for all build dependencies and
    disable all plugins whose requirements cannot be fulfilled (any other plugin
diff --combined configure.ac
@@@ -766,7 -766,10 +766,7 @@@ AC_CHECK_FUNCS_ONCE([ 
  AC_FUNC_STRERROR_R
  
  SAVE_CFLAGS="$CFLAGS"
 -# Emulate behavior of src/Makefile.am
 -if test "x$GCC" = "xyes"; then
 -  CFLAGS="$CFLAGS -Wall -Werror"
 -fi
 +CFLAGS="-Wall -Werror"
  
  AC_CACHE_CHECK([for strtok_r],
    [c_cv_have_strtok_r_default],
@@@ -1564,7 -1567,7 +1564,7 @@@ if test "x$have_getmntent" = "xlibc"; t
                struct mntent *me;
                fh = setmntent ("/etc/mtab", "r");
                me = getmntent (fh);
 -              return(me->mnt_passno);
 +              return me->mnt_passno;
              ]]
            )
          ],
                int status;
                fh = fopen ("/etc/mnttab", "r");
                status = getmntent (fh, &mt);
 -              return(status);
 +              return status;
              ]]
            )
          ],
  
  # libi2c-dev
  if test "x$ac_system" = "xLinux"; then
 +  with_libi2c_libs=""
 +  AC_CHECK_HEADERS([i2c/smbus.h],
 +    [with_libi2c_libs="-li2c"]
 +  )
    AC_CHECK_DECL([i2c_smbus_read_i2c_block_data],
      [with_libi2c="yes"],
      [with_libi2c="no (symbol i2c_smbus_read_i2c_block_data not found - have you installed libi2c-dev ?)"],
      [[
        #include <stdlib.h>
        #include <linux/i2c-dev.h>
 +      #if HAVE_I2C_SMBUS_H
 +      # include <i2c/smbus.h>
 +      #endif
      ]]
    )
 +  BUILD_WITH_LIBI2C_LIBS="$with_libi2c_libs"
 +  AC_SUBST([BUILD_WITH_LIBI2C_LIBS])
  else
    with_libi2c="no (Linux only)"
  fi
            PKG_CHECK_MODULES([LUA], [lua5.3],
              [with_liblua="yes"],
              [
 -              PKG_CHECK_MODULES([LUA], [lua-5.2],
 +              PKG_CHECK_MODULES([LUA], [lua53],
                  [with_liblua="yes"],
                  [
 -                  PKG_CHECK_MODULES([LUA], [lua5.2],
 +                  PKG_CHECK_MODULES([LUA], [lua-5.2],
                      [with_liblua="yes"],
                      [
 -                      PKG_CHECK_MODULES([LUA], [lua-5.1],
 +                      PKG_CHECK_MODULES([LUA], [lua5.2],
                          [with_liblua="yes"],
                          [
 -                          PKG_CHECK_MODULES([LUA], [lua5.1],
 +                          PKG_CHECK_MODULES([LUA], [lua52],
                              [with_liblua="yes"],
 -                            [with_liblua="no (pkg-config cannot find liblua)"]
 +                            [
 +                              PKG_CHECK_MODULES([LUA], [lua-5.1],
 +                                [with_liblua="yes"],
 +                                [
 +                                  PKG_CHECK_MODULES([LUA], [lua5.1],
 +                                    [with_liblua="yes"],
 +                                    [
 +                                      PKG_CHECK_MODULES([LUA], [lua51],
 +                                        [with_liblua="yes"],
 +                                        [with_liblua="no (pkg-config cannot find liblua)"]
 +                                      )
 +                                    ]
 +                                  )
 +                                ]
 +                              )
 +                            ]
                            )
                          ]
                        )
@@@ -3681,18 -3660,6 +3681,18 @@@ if test "x$with_libmnl" = "xyes"; the
      [[#include <linux/if_link.h>]]
    )
  
 +  AC_CHECK_MEMBERS([struct rtnl_link_stats.rx_nohandler],
 +    [],
 +    [],
 +    [[#include <linux/if_link.h>]]
 +  )
 +
 +  AC_CHECK_MEMBERS([struct rtnl_link_stats64.rx_nohandler],
 +    [],
 +    [],
 +    [[#include <linux/if_link.h>]]
 +  )
 +
    AC_CHECK_LIB([mnl], [mnl_nlmsg_get_payload],
      [with_libmnl="yes"],
      [with_libmnl="no (symbol 'mnl_nlmsg_get_payload' not found)"],
@@@ -4114,7 -4081,7 +4114,7 @@@ if test "x$with_libpcap" = "xyes"; the
              [[#include <pcap.h>]],
              [[
                int val = PCAP_ERROR_IFACE_NOT_UP;
 -              return(val);
 +              return val;
              ]]
            )
          ],
@@@ -4719,6 -4686,56 +4719,56 @@@ if test "$with_libpython" != "xno"; the
  fi
  # }}} --with-libpython
  
+ # --with-libqpid_proton {{{
+ AC_ARG_WITH([libqpid_proton],
+   [AS_HELP_STRING([--with-libqpid_proton@<:@=PREFIX@:>@], [Path to libqpid_proton.])],
+   [
+     if test "x$withval" != "xno" && test "x$withval" != "xyes"; then
+       with_libqpid_proton_cppflags="-I$withval/include"
+       with_libqpid_proton_ldflags="-L$withval/lib"
+       with_libqpid_proton="yes"
+     else
+       with_libqpid_proton="$withval"
+     fi
+   ],
+   [with_libqpid_proton="yes"]
+ )
+ if test "x$with_libqpid_proton" = "xyes"; then
+   SAVE_CPPFLAGS="$CPPFLAGS"
+   CPPFLAGS="$CPPFLAGS $with_libqpid_proton_cppflags"
+   AC_CHECK_HEADERS([proton/proactor.h],
+     [with_libqpid_proton="yes"],
+     [with_libqpid_proton="no (proton/proactor.h not found)"]
+   )
+   CPPFLAGS="$SAVE_CPPFLAGS"
+ fi
+ if test "x$with_libqpid_proton" = "xyes"; then
+   SAVE_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $with_libqpid_proton_ldflags"
+   AC_CHECK_LIB([qpid-proton], [pn_connection],
+     [with_libqpid_proton="yes"],
+     [with_libqpid_proton="no (Symbol 'pn_connection' not found)"])
+   LDFLAGS="$SAVE_LDFLAGS"
+ fi
+ if test "x$with_libqpid_proton" = "xyes"; then
+   BUILD_WITH_LIBQPIDPROTON_CPPFLAGS="$with_libqpid_proton_cppflags"
+   BUILD_WITH_LIBQPIDPROTON_LDFLAGS="$with_libqpid_proton_ldflags"
+   BUILD_WITH_LIBQPIDPROTON_LIBS="-lqpid-proton"
+ fi
+ AC_SUBST(BUILD_WITH_LIBQPIDPROTON_CPPFLAGS)
+ AC_SUBST(BUILD_WITH_LIBQPIDPROTON_LDFLAGS)
+ AC_SUBST(BUILD_WITH_LIBQPIDPROTON_LIBS)
+ # }}}
  # --with-librabbitmq {{{
  AC_ARG_WITH([librabbitmq],
    [AS_HELP_STRING([--with-librabbitmq@<:@=PREFIX@:>@], [Path to librabbitmq.])],
@@@ -6544,6 -6561,7 +6594,7 @@@ 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])
@@@ -6932,6 -6950,7 +6983,7 @@@ AC_MSG_RESULT([    libpqos . . . . . . 
  AC_MSG_RESULT([    libprotobuf . . . . . $with_libprotobuf])
  AC_MSG_RESULT([    libprotobuf-c . . . . $with_libprotobuf_c])
  AC_MSG_RESULT([    libpython . . . . . . $with_libpython])
+ AC_MSG_RESULT([    libqpid-proton .  . . $with_libqpid_proton])
  AC_MSG_RESULT([    librabbitmq . . . . . $with_librabbitmq])
  AC_MSG_RESULT([    libriemann-client . . $with_libriemann_client])
  AC_MSG_RESULT([    librdkafka  . . . . . $with_librdkafka])
@@@ -6963,6 -6982,7 +7015,7 @@@ AC_MSG_RESULT(
  AC_MSG_RESULT([  Modules:])
  AC_MSG_RESULT([    aggregation . . . . . $enable_aggregation])
  AC_MSG_RESULT([    amqp    . . . . . . . $enable_amqp])
+ AC_MSG_RESULT([    amqp1   . . . . . . . $enable_amqp1])
  AC_MSG_RESULT([    apache  . . . . . . . $enable_apache])
  AC_MSG_RESULT([    apcups  . . . . . . . $enable_apcups])
  AC_MSG_RESULT([    apple_sensors . . . . $enable_apple_sensors])
  %global _hardened_build 1
  %{?perl_default_filter}
  
 +# disable collectd debug by default
 +%bcond_with debug
 +
  # plugins enabled by default
  %define with_aggregation 0%{!?_without_aggregation:1}
  %define with_amqp 0%{!?_without_amqp:1}
+ %define with_amqp1 0%{!?_without_amqp1:1}
  %define with_apache 0%{!?_without_apache:1}
  %define with_apcups 0%{!?_without_apcups:1}
  %define with_ascent 0%{!?_without_ascent:1}
  Summary:      Statistics collection and monitoring daemon
  Name:         collectd
  Version:      5.7.1
 -Release:      8%{?dist}
 +Release:      9%{?dist}
  URL:          https://collectd.org
  Source:               https://collectd.org/files/%{name}-%{version}.tar.bz2
  License:      GPLv2
@@@ -280,13 -278,24 +281,24 @@@ every 10 seconds by default
  
  %if %{with_amqp}
  %package amqp
- Summary:      AMQP plugin for collectd
+ Summary:      AMQP 0.9 plugin for collectd
  Group:                System Environment/Daemons
  Requires:     %{name}%{?_isa} = %{version}-%{release}
  BuildRequires:        librabbitmq-devel
  %description amqp
- The AMQP plugin transmits or receives values collected by collectd via the
- Advanced Message Queuing Protocol (AMQP).
+ The AMQP 0.9 plugin transmits or receives values collected by collectd via the
+ Advanced Message Queuing Protocol v0.9 (AMQP).
+ %endif
+ %if %{with_amqp1}
+ %package amqp1
+ Summary:      AMQP 1.0 plugin for collectd
+ Group:                System Environment/Daemons
+ Requires:     %{name}%{?_isa} = %{version}-%{release}
+ BuildRequires:        qpid-proton-c-devel
+ %description amqp1
+ The AMQP 1.0 plugin transmits or receives values collected by collectd via the
+ Advanced Message Queuing Protocol v1.0 (AMQP1).
  %endif
  
  %if %{with_apache}
@@@ -1018,6 -1027,12 +1030,12 @@@ Collectd utilitie
  %define _with_amqp --disable-amqp
  %endif
  
+ %if %{with_amqp1}
+ %define _with_amqp1 --enable-amqp1
+ %else
+ %define _with_amqp1 --disable-amqp1
+ %endif
  %if %{with_apache}
  %define _with_apache --enable-apache
  %else
  %if %{with_mcelog}
  %define _with_mcelog --enable-mcelog
  %else
 -%define _with_mbmon --disable-mcelog
 +%define _with_mcelog --disable-mcelog
  %endif
  
  %if %{with_md}
  %define _with_zookeeper --disable-zookeeper
  %endif
  
 +%if %{with debug}
 +%define _feature_debug --enable-debug
 +%else
 +%define _feature_debug --disable-debug
 +%endif
 +
  %configure CFLAGS="%{optflags} -DLT_LAZY_OR_NOW=\"RTLD_LAZY|RTLD_GLOBAL\"" \
        %{?_python_config} \
 +      %{?_feature_debug} \
        --disable-static \
        --enable-all-plugins=yes \
        --enable-match_empty_counter \
        --enable-target_v5upgrade \
        %{?_with_aggregation} \
        %{?_with_amqp} \
+       %{?_with_amqp1} \
        %{?_with_apache} \
        %{?_with_apcups} \
        %{?_with_apple_sensors} \
  %{_libdir}/%{name}/amqp.so
  %endif
  
+ %if %{with_amqp1}
+ %files amqp1
+ %{_libdir}/%{name}/amqp1.so
+ %endif
  %if %{with_apache}
  %files apache
  %{_libdir}/%{name}/apache.so
  %doc contrib/
  
  %changelog
 +* Thu Sep 28 2017 Jakub Jankowski <shasta@toxcorp.com> - 5.7.1-9
 +- Fix mbmon/mcelog build options
 +
  * Thu Sep 28 2017 xakru <calvinxakru@gmail.com> - 5.7.1-8
  - Add new libcollectdclient/network_parse
  - Add new libcollectdclient/server
diff --combined src/collectd.conf.in
@@@ -90,6 -90,7 +90,7 @@@
  
  #@BUILD_PLUGIN_AGGREGATION_TRUE@LoadPlugin aggregation
  #@BUILD_PLUGIN_AMQP_TRUE@LoadPlugin amqp
+ #@BUILD_PLUGIN_AMQP1_TRUE@LoadPlugin amqp1
  #@BUILD_PLUGIN_APACHE_TRUE@LoadPlugin apache
  #@BUILD_PLUGIN_APCUPS_TRUE@LoadPlugin apcups
  #@BUILD_PLUGIN_APPLE_SENSORS_TRUE@LoadPlugin apple_sensors
  #  </Publish>
  #</Plugin>
  
+ #<Plugin amqp1>
+ #  <Transport "name">
+ #    Host "localhost"
+ #    Port "5672"
+ #    User "guest"
+ #    Password "guest"
+ #    Address "collectd"
+ #    RetryDelay 1
+ #    <Instance "log">
+ #        Format JSON
+ #        PreSettle false
+ #    </Instance>
+ #    <Instance "notify">
+ #        Format JSON
+ #        PreSettle true
+ #    </Instance>
+ #    <Instance "telemetry">
+ #        Format JSON
+ #        PreSettle false
+ #    </Instance>
+ #  </Transport>
+ #</Plugin>
  #<Plugin apache>
  #  <Instance "local">
  #    URL "http://localhost/status?auto"
  #    ReportSoftwareEvents true
  #    EventList "/var/cache/pmu/GenuineIntel-6-2D-core.json"
  #    HardwareEvents "L2_RQSTS.CODE_RD_HIT,L2_RQSTS.CODE_RD_MISS" "L2_RQSTS.ALL_CODE_RD"
 +#    Cores "[0-3]"
  #</Plugin>
  
  #<Plugin "intel_rdt">
  #     Timeout 0.9
  #     TTL 255
  #     SourceAddress "1.2.3.4"
 +#     AddressFamily "any"
  #     Device "eth0"
  #     MaxMissed -1
  #</Plugin>
  #     PluginInstanceFormat name
  #     Instances 1
  #     ExtraStats "cpu_util disk disk_err domain_state fs_info job_stats_background pcpu perf vcpupin"
 +#     PersistentNotification false
  #</Plugin>
  
  #<Plugin vmem>
diff --combined src/collectd.conf.pod
@@@ -530,9 -530,9 +530,9 @@@ are disabled by default
  =head2 Plugin C<amqp>
  
  The I<AMQP plugin> can be used to communicate with other instances of
- I<collectd> or third party applications using an AMQP message broker. Values
- are sent to or received from the broker, which handles routing, queueing and
- possibly filtering out messages.
+ I<collectd> or third party applications using an AMQP 0.9.1 message broker.
+ Values are sent to or received from the broker, which handles routing,
queueing and possibly filtering out messages.
  
  B<Synopsis:>
  
@@@ -729,6 -729,171 +729,171 @@@ instance) are put into one component, f
  If set to B<true>, append the name of the I<Data Source> (DS) to the "metric"
  identifier. If set to B<false> (the default), this is only done when there is
  more than one DS.
+ =item B<GraphitePreserveSeparator> B<false>|B<true>
+ If set to B<false> (the default) the C<.> (dot) character is replaced with
+ I<GraphiteEscapeChar>. Otherwise, if set to B<true>, the C<.> (dot) character
+ is preserved, i.e. passed through.
+ =back
+ =head2 Plugin C<amqp1>
+ The I<AMQP1 plugin> can be used to communicate with other instances of
+ I<collectd> or third party applications using an AMQP 1.0 message
+ intermediary. Metric values or notifications are sent to the
+ messaging intermediary which may handle direct messaging or
+ queue based transfer.
+ B<Synopsis:>
+  <Plugin "amqp1">
+    # Send values to an AMQP 1.0 intermediary
+   <Transport "name">
+     Host "localhost"
+     Port "5672"
+     User "guest"
+     Password "guest"
+     Address "collectd"
+ #    RetryDelay 1
+     <Instance "some_name">
+         Format "command"
+         PreSettle false
+         Notify false
+  #      StoreRates false
+  #      GraphitePrefix "collectd."
+  #      GraphiteEscapeChar "_"
+  #      GraphiteSeparateInstances false
+  #      GraphiteAlwaysAppendDS false
+  #      GraphitePreserveSeparator false
+     </Instance>
+   </Transport>
+  </Plugin>
+ The plugin's configuration consists of a I<Transport> that configures
+ communications to the AMQP 1.0 messaging bus and one or more I<Instance>
+ corresponding to metric or event publishers to the messaging system.
+ The address in the I<Transport> block concatenated with the name given in the
+ I<Instance> block starting tag will be used as the send-to address for
+ communications over the messaging link.
+ The following options are accepted within each I<Transport> block:
+ =over 4
+ =item B<Host> I<Host>
+ Hostname or IP-address of the AMQP 1.0 intermediary. Defaults to the
+ default behavior of the underlying communications library,
+ I<libqpid-proton>, which is "localhost".
+ =item B<Port> I<Port>
+ Service name or port number on which the AMQP 1.0 intermediary accepts
+ connections. This argument must be a string, even if the numeric form
+ is used. Defaults to "5672".
+ =item B<User> I<User>
+ =item B<Password> I<Password>
+ Credentials used to authenticate to the AMQP 1.0 intermediary. By
+ default "guest"/"guest" is used.
+ =item B<Address> I<Address>
+ This option specifies the prefix for the send-to value in the message.
+ By default, "collectd" will be used.
+ =item B<RetryDelay> I<RetryDelay>
+ When the AMQP1 connection is lost, defines the time in seconds to wait
+ before attempting to reconnect. Defaults to 1, which implies attempt
+ to reconnect at 1 second intervals.
+ =back
+ The following options are accepted within each I<Instance> block:
+ =over 4
+ =item B<Format> B<Command>|B<JSON>|B<Graphite>
+ Selects the format in which messages are sent to the intermediary. If set to
+ B<Command> (the default), values are sent as C<PUTVAL> commands which are
+ identical to the syntax used by the I<Exec> and I<UnixSock plugins>. In this
+ case, the C<Content-Type> header field will be set to C<text/collectd>.
+ If set to B<JSON>, the values are encoded in the I<JavaScript Object Notation>,
+ an easy and straight forward exchange format. The C<Content-Type> header field
+ will be set to C<application/json>.
+ If set to B<Graphite>, values are encoded in the I<Graphite> format, which is
+ "<metric> <value> <timestamp>\n". The C<Content-Type> header field will be set to
+ C<text/graphite>.
+ A subscribing client I<should> use the C<Content-Type> header field to
+ determine how to decode the values.
+ =item B<PreSettle> B<true>|B<false>
+ If set to B<false> (the default), the plugin will wait for a message
+ acknowledgement from the messaging bus before sending the next
+ message. This indicates transfer of ownership to the messaging
+ system. If set to B<true>, the plugin will not wait for a message
+ acknowledgement and the message may be dropped prior to transfer of
+ ownership.
+ =item B<Notify> B<true>|B<false>
+ If set to B<false> (the default), the plugin will service the
+ instance write call back as a value list. If set to B<true> the
+ plugin will service the instance as a write notification callback
+ for alert formatting.
+ =item B<StoreRates> B<true>|B<false>
+ Determines whether or not C<COUNTER>, C<DERIVE> and C<ABSOLUTE> data sources
+ are converted to a I<rate> (i.e. a C<GAUGE> value). If set to B<false> (the
+ default), no conversion is performed. Otherwise the conversion is performed
+ using the internal value cache.
+ Please note that currently this option is only used if the B<Format> option has
+ been set to B<JSON>.
+ =item B<GraphitePrefix>
+ A prefix can be added in the metric name when outputting in the I<Graphite> format.
+ It's added before the I<Host> name.
+ Metric name will be "<prefix><host><postfix><plugin><type><name>"
+ =item B<GraphitePostfix>
+ A postfix can be added in the metric name when outputting in the I<Graphite> format.
+ It's added after the I<Host> name.
+ Metric name will be "<prefix><host><postfix><plugin><type><name>"
+ =item B<GraphiteEscapeChar>
+ Specify a character to replace dots (.) in the host part of the metric name.
+ In I<Graphite> metric name, dots are used as separators between different
+ metric parts (host, plugin, type).
+ Default is "_" (I<Underscore>).
+ =item B<GraphiteSeparateInstances> B<true>|B<false>
+ If set to B<true>, the plugin instance and type instance will be in their own
+ path component, for example C<host.cpu.0.cpu.idle>. If set to B<false> (the
+ default), the plugin and plugin instance (and likewise the type and type
+ instance) are put into one component, for example C<host.cpu-0.cpu-idle>.
+ =item B<GraphiteAlwaysAppendDS> B<true>|B<false>
+ If set to B<true>, append the name of the I<Data Source> (DS) to the "metric"
+ identifier. If set to B<false> (the default), this is only done when there is
+ more than one DS.
  
  =item B<GraphitePreserveSeparator> B<false>|B<true>
  
@@@ -3182,7 -3347,6 +3347,7 @@@ B<Synopsis:
      ReportSoftwareEvents true
      EventList "/var/cache/pmu/GenuineIntel-6-2D-core.json"
      HardwareEvents "L2_RQSTS.CODE_RD_HIT,L2_RQSTS.CODE_RD_MISS" "L2_RQSTS.ALL_CODE_RD"
 +    Cores "0-3" "4,6" "[12-15]"
    </Plugin>
  
  B<Options:>
@@@ -3254,23 -3418,6 +3419,23 @@@ event_download.py script to download ev
  This field is a list of event names or groups of comma separated event names.
  This option requires B<EventList> option to be configured.
  
 +=item B<Cores> I<cores groups>
 +
 +All events are reported on a per core basis. Monitoring of the events can be
 +configured for a group of cores (aggregated statistics). This field defines
 +groups of cores on which to monitor supported events. The field is represented
 +as list of strings with core group values. Each string represents a list of
 +cores in a group. If a group is enclosed in square brackets each core is added
 +individually to a separate group (that is statistics are not aggregated).
 +Allowed formats are:
 +    0,1,2,3
 +    0-10,20-18
 +    1,3,5-8,10,0x10-12
 +    [4-15,32-63]
 +
 +If an empty string is provided as value for this field default cores
 +configuration is applied - that is separate group is created for each core.
 +
  =back
  
  =head2 Plugin C<intel_rdt>
@@@ -4146,19 -4293,11 +4311,19 @@@ Configures the base register to read fr
  B<RegisterType> has been set to B<Uint32> or B<Float>, this and the next
  register will be read (the register number is increased by one).
  
 -=item B<RegisterType> B<Int16>|B<Int32>|B<Uint16>|B<Uint32>|B<Float>
 +=item B<RegisterType> B<Int16>|B<Int32>|B<Uint16>|B<Uint32>|B<Float>|B<Int32LE>|B<Uint32LE>|B<FloatLE>
  
 -Specifies what kind of data is returned by the device. If the type is B<Int32>,
 -B<Uint32> or B<Float>, two 16E<nbsp>bit registers will be read and the data is
 -combined into one value. Defaults to B<Uint16>.
 +Specifies what kind of data is returned by the device. This defaults to
 +B<Uint16>.  If the type is B<Int32>, B<Int32LE>, B<Uint32>, B<Uint32LE>,
 +B<Float> or B<FloatLE>, two 16E<nbsp>bit registers at B<RegisterBase>
 +and B<RegisterBase+1> will be read and the data is combined into one
 +32E<nbsp>value. For B<Int32>, B<Uint32> and B<Float> the most significant
 +16E<nbsp>bits are in the register at B<RegisterBase> and the least
 +significant 16E<nbsp>bits are in the register at B<RegisterBase+1>.
 +For B<Int32LE>, B<Uint32LE>, or B<Float32LE>, the high and low order
 +registers are swapped with the most significant 16E<nbsp>bits in
 +the B<RegisterBase+1> and the least significant 16E<nbsp>bits in
 +B<RegisterBase>.
  
  =item B<RegisterCmd> B<ReadHolding>|B<ReadInput>
  
@@@ -6203,11 -6342,6 +6368,11 @@@ long string is used so that the packet 
  Sets the source address to use. I<host> may either be a numerical network
  address or a network hostname.
  
 +=item B<AddressFamily> I<af>
 +
 +Sets the address family to use. I<af> may be "any", "ipv4" or "ipv6". This
 +option will be ignored if you set a B<SourceAddress>.
 +
  =item B<Device> I<name>
  
  Sets the outgoing network device to be used. I<name> has to specify an
@@@ -6898,8 -7032,8 +7063,8 @@@ B<Synopsis:
     </Process>
     <ProcessMatch "name" "regex">
       CollectFileDescriptor false
 -     CollectContextSwitch  true
 -   </Process>
 +     CollectContextSwitch true
 +   </ProcessMatch>
   </Plugin>
  
  =over 4
@@@ -8941,12 -9075,6 +9106,12 @@@ B<Note>: I<perf> metrics can't be colle
  
  =back
  
 +=item B<PersistentNotification> B<true>|B<false>
 +Override default configuration to only send notifications when there is a change
 +in the lifecycle state of a domain. When set to true notifications will be sent
 +for every read cycle. Default is false. Does not affect the stats being
 +dispatched.
 +
  =back
  
  =head2 Plugin C<vmem>