Merge branch 'collectd-5.4'
authorMarc Fournier <marc.fournier@camptocamp.com>
Wed, 8 Apr 2015 23:14:40 +0000 (01:14 +0200)
committerMarc Fournier <marc.fournier@camptocamp.com>
Wed, 8 Apr 2015 23:14:40 +0000 (01:14 +0200)
1  2 
contrib/redhat/collectd.spec
src/bind.c
src/collectd-perl.pod
src/collectd.conf.in
src/collectd.conf.pod
src/curl.c
src/powerdns.c

  %{?el6:%global _has_ip_vs_h 1}
  %{?el6:%global _has_lvm2app_h 1}
  %{?el6:%global _has_libmodbus 1}
 +%{?el6:%global _has_libudev 1}
  %{?el6:%global _has_iproute 1}
 +%{?el6:%global _has_atasmart 1}
 +%{?el6:%global _has_hiredis 1}
  
  %{?el7:%global _has_libyajl 1}
  %{?el7:%global _has_recent_libpcap 1}
  %{?el7:%global _has_working_libiptc 1}
  %{?el7:%global _has_ip_vs_h 1}
  %{?el7:%global _has_lvm2app_h 1}
 +%{?el7:%global _has_libudev 1}
  %{?el7:%global _has_recent_librrd 1}
  %{?el7:%global _has_varnish4 1}
  %{?el7:%global _has_broken_libmemcached 1}
  %{?el7:%global _has_iproute 1}
 +%{?el7:%global _has_atasmart 1}
 +%{?el7:%global _has_hiredis 1}
  
  # plugins enabled by default
  %define with_aggregation 0%{!?_without_aggregation:1}
@@@ -75,7 -69,6 +75,7 @@@
  %define with_ascent 0%{!?_without_ascent:1}
  %define with_battery 0%{!?_without_battery:1}
  %define with_bind 0%{!?_without_bind:1}
 +%define with_ceph 0%{!?_without_ceph:0%{?_has_libyajl}}
  %define with_cgroups 0%{!?_without_cgroups:1}
  %define with_conntrack 0%{!?_without_conntrack:1}
  %define with_contextswitch 0%{!?_without_contextswitch:1}
@@@ -89,7 -82,6 +89,7 @@@
  %define with_df 0%{!?_without_df:1}
  %define with_disk 0%{!?_without_disk:1}
  %define with_dns 0%{!?_without_dns:0%{?_has_recent_libpcap}}
 +%define with_drbd 0%{!?_without_drbd:1}
  %define with_email 0%{!?_without_email:1}
  %define with_entropy 0%{!?_without_entropy:1}
  %define with_ethstat 0%{!?_without_ethstat:0%{?_has_recent_sockios_h}}
  %define with_gmond 0%{!?_without_gmond:0%{?_has_recent_libganglia}}
  %define with_hddtemp 0%{!?_without_hddtemp:1}
  %define with_interface 0%{!?_without_interface:1}
 +%define with_ipc 0%{!?_without_ipc:1}
  %define with_ipmi 0%{!?_without_ipmi:1}
  %define with_iptables 0%{!?_without_iptables:0%{?_has_working_libiptc}}
  %define with_ipvs 0%{!?_without_ipvs:0%{?_has_ip_vs_h}}
  %define with_irq 0%{!?_without_irq:1}
  %define with_java 0%{!?_without_java:1}
 -%define with_libvirt 0%{!?_without_libvirt:1}
 +%define with_virt 0%{!?_without_virt:1}
  %define with_load 0%{!?_without_load:1}
  %define with_logfile 0%{!?_without_logfile:1}
 +%define with_log_logstash 0%{!?_without_log_logstash:0%{?_has_libyajl}}
  %define with_lvm 0%{!?_without_lvm:0%{?_has_lvm2app_h}}
  %define with_madwifi 0%{!?_without_madwifi:1}
  %define with_mbmon 0%{!?_without_mbmon:1}
  %define with_numa 0%{!?_without_numa:1}
  %define with_nut 0%{!?_without_nut:1}
  %define with_olsrd 0%{!?_without_olsrd:1}
 +%define with_openldap 0%{!?_without_openldap:1}
  %define with_openvpn 0%{!?_without_openvpn:1}
  %define with_perl 0%{!?_without_perl:1}
  %define with_pinba 0%{!?_without_pinba:1}
  %define with_processes 0%{!?_without_processes:1}
  %define with_protocols 0%{!?_without_protocols:1}
  %define with_python 0%{!?_without_python:1}
 +%define with_redis 0%{!?_without_redis:0%{?_has_hiredis}}
  %define with_rrdcached 0%{!?_without_rrdcached:0%{?_has_recent_librrd}}
  %define with_rrdtool 0%{!?_without_rrdtool:1}
  %define with_sensors 0%{!?_without_sensors:1}
  %define with_serial 0%{!?_without_serial:1}
 +%define with_smart 0%{!?_without_smart:0%{?_has_atasmart}}
  %define with_snmp 0%{!?_without_snmp:1}
  %define with_statsd 0%{!?_without_statsd:1}
  %define with_swap 0%{!?_without_swap:1}
  %define with_wireless 0%{!?_without_wireless:1}
  %define with_write_graphite 0%{!?_without_write_graphite:1}
  %define with_write_http 0%{!?_without_write_http:1}
 +%define with_write_log 0%{!?_without_write_log:1}
 +%define with_write_redis 0%{!?_without_write_redis:0%{?_has_hiredis}}
  %define with_write_riemann 0%{!?_without_write_riemann:1}
 +%define with_write_sensu 0%{!?_without_write_sensu:1}
 +%define with_write_tsdb 0%{!?_without_write_tsdb:1}
 +%define with_zfs_arc 0%{!?_without_zfs_arc:1}
 +%define with_zookeeper 0%{!?_without_zookeeper:1}
  
  # Plugins not built by default because of dependencies on libraries not
  # available in RHEL or EPEL:
  %define with_apple_sensors 0%{!?_without_apple_sensors:0}
  # plugin aquaero disabled, requires a libaquaero5
  %define with_aquaero 0%{!?_without_aquaero:0}
 +# plugin barometer disabled, requires a libi2c
 +%define with_barometer 0%{!?_without_barometer:0}
  # plugin lpar disabled, requires AIX
  %define with_lpar 0%{!?_without_lpar:0}
  # plugin mic disabled, requires Mic
  %define with_oracle 0%{!?_without_oracle:0}
  # plugin oracle disabled, requires BSD
  %define with_pf 0%{!?_without_pf:0}
 -# plugin redis disabled, requires credis
 -%define with_redis 0%{!?_without_redis:0}
  # plugin routeros disabled, requires librouteros
  %define with_routeros 0%{!?_without_routeros:0}
  # plugin sigrok disabled, requires libsigrok
  %define with_tape 0%{!?_without_tape:0}
  # plugin tokyotyrant disabled, requires tcrdb.h
  %define with_tokyotyrant 0%{!?_without_tokyotyrant:0}
 +# plugin write_kafka disabled, requires librdkafka
 +%define with_write_kafka 0%{!?_without_write_kafka:0}
  # plugin write_mongodb disabled, requires libmongoc
  %define with_write_mongodb 0%{!?_without_write_mongodb:0}
 -# plugin write_redis disabled, requires credis
 -%define with_write_redis 0%{!?_without_write_redis:0}
  # plugin xmms disabled, requires xmms
  %define with_xmms 0%{!?_without_xmms:0}
 -# plugin zfs_arc disabled, requires FreeBSD/Solaris
 -%define with_zfs_arc 0%{!?_without_zfs_arc:0}
  
  Summary:      Statistics collection daemon for filling RRD files
  Name:         collectd
- Version:      5.4.0
+ Version:      5.4.2
  Release:      1%{?dist}
  URL:          http://collectd.org
  Source:               http://collectd.org/files/%{name}-%{version}.tar.bz2
@@@ -223,16 -206,9 +223,16 @@@ BuildRoot:       %{_tmppath}/%{name}-%{versio
  BuildRequires:        libgcrypt-devel, kernel-headers, libtool-ltdl-devel
  Vendor:               collectd development team <collectd@verplant.org>
  
 +%if 0%{?el7:1}
 +Requires(pre):                initscripts
 +Requires(post):               systemd
 +Requires(preun):      systemd
 +Requires(postun):     systemd
 +%else
  Requires(post):               chkconfig
  Requires(preun):      chkconfig, initscripts
  Requires(postun):     initscripts
 +%endif
  
  %description
  collectd is a small daemon which collects system information periodically and
@@@ -284,15 -260,6 +284,15 @@@ open-source server software for the gam
  Entertainment.
  %endif
  
 +%if %{with_barometer}
 +%package barometer
 +Summary:       barometer plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +%description barometer
 +Collects pressure and temperature from digital barometers.
 +%endif
 +
  %if %{with_bind}
  %package bind
  Summary:      Bind plugin for collectd
@@@ -304,16 -271,6 +304,16 @@@ The BIND plugin retrieves this informat
  via HTTP and submits the values to collectd.
  %endif
  
 +%if %{with_ceph}
 +%package ceph
 +Summary:       Ceph plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires: yajl-devel
 +%description ceph
 +Ceph plugin for collectd
 +%endif
 +
  %if %{with_curl}
  %package curl
  Summary:      Curl plugin for collectd
@@@ -358,17 -315,6 +358,17 @@@ The DBI plugin uses libdbi, a database 
  statements on a database and read back the result.
  %endif
  
 +%if %{with_disk}
 +%package disk
 +Summary:      disk plugin for collectd
 +Group:                System Environment/Daemons
 +Requires:     %{name}%{?_isa} = %{version}-%{release}
 +%{?_has_libudev:BuildRequires:  libudev-devel}
 +%description disk
 +The "disk" plugin collects information about the usage of physical disks and
 +logical disks (partitions).
 +%endif
 +
  %if %{with_dns}
  %package dns
  Summary:      DNS plugin for collectd
@@@ -446,14 -392,14 +446,14 @@@ This plugin for collectd allows plugin
  in an embedded JVM.
  %endif
  
 -%if %{with_libvirt}
 -%package libvirt
 -Summary:      Libvirt plugin for collectd
 -Group:                System Environment/Daemons
 -Requires:     %{name}%{?_isa} = %{version}-%{release}
 -BuildRequires:        libvirt-devel
 -%description libvirt
 -This plugin collects information from virtualized guests.
 +%if %{with_log_logstash}
 +%package log_logstash
 +Summary:       log_logstash plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires: yajl-devel
 +%description log_logstash
 +This plugin logs in logstash JSON format
  %endif
  
  %if %{with_lvm}
@@@ -562,27 -508,17 +562,27 @@@ BuildRequires:  nut-deve
  This plugin for collectd provides Network UPS Tools support.
  %endif
  
 +%if %{with_openldap}
 +%package openldap
 +Summary:       Openldap plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires: openldap-devel
 +%description openldap
 +This plugin reads monitoring information from OpenLDAP's cn=Monitor subtree.
 +%endif
 +
  %if %{with_perl}
  %package perl
  Summary:      Perl plugin for collectd
  Group:                System Environment/Daemons
  Requires:     %{name}%{?_isa} = %{version}-%{release}
  Requires:     perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
 -%if 0%{?rhel} >= 6
 +      %if 0%{?rhel} >= 6
  BuildRequires:        perl-ExtUtils-Embed
 -%else
 +      %else
  BuildRequires:        perl
 -%endif
 +      %endif
  %description perl
  The Perl plugin embeds a Perl interpreter into collectd and exposes the
  application programming interface (API) to Perl-scripts.
@@@ -626,11 -562,11 +626,11 @@@ database
  Summary:      Python plugin for collectd
  Group:                System Environment/Daemons
  Requires:     %{name}%{?_isa} = %{version}-%{release}
 -%if 0%{?rhel} >= 6
 +      %if 0%{?rhel} >= 6
  BuildRequires: python-devel
 -%else
 +      %else
  BuildRequires: python26-devel
 -%endif
 +      %endif
  %description python
  The Python plugin embeds a Python interpreter into collectd and exposes the
  application programming interface (API) to Python-scripts.
  Summary:      Redis plugin for collectd
  Group:                System Environment/Daemons
  Requires:     %{name}%{?_isa} = %{version}-%{release}
 -BuildRequires:        credis-devel
 +BuildRequires:        hiredis-devel
  %description redis
  The Redis plugin connects to one or more instances of Redis, a key-value store,
 -and collects usage information using the credis library.
 +and collects usage information using the hiredis library.
  %endif
  
  %if %{with_rrdcached}
@@@ -689,17 -625,6 +689,17 @@@ measurements fed to collectd. This incl
  thermometers, and much more.
  %endif
  
 +%if %{with_smart}
 +%package smart
 +Summary:       SMART plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires: libatasmart-devel
 +%description smart
 +Collect SMART statistics, notably load cycle count, temperature and bad
 +sectors.
 +%endif
 +
  %if %{with_snmp}
  %package snmp
  Summary:      SNMP plugin for collectd
@@@ -720,16 -645,6 +720,16 @@@ BuildRequires:   varnish-libs-deve
  The Varnish plugin collects information about Varnish, an HTTP accelerator.
  %endif
  
 +%if %{with_virt}
 +%package virt
 +Summary:      Virt plugin for collectd
 +Group:                System Environment/Daemons
 +Requires:     %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires:        libvirt-devel
 +%description virt
 +This plugin collects information from virtualized guests.
 +%endif
 +
  %if %{with_write_http}
  %package write_http
  Summary:      Write-HTTP plugin for collectd
@@@ -741,22 -656,12 +741,22 @@@ The Write-HTTP plugin sends the values 
  using HTTP POST requests.
  %endif
  
 +%if %{with_write_kafka}
 +%package write_kafka
 +Summary:       Write-kafka plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires: rdkafka-devel
 +%description write_kafka
 +The write_kafka plugin sends values to kafka, a distributed messaging system.
 +%endif
 +
  %if %{with_write_redis}
  %package write_redis
  Summary:      Write-Redis plugin for collectd
  Group:                System Environment/Daemons
  Requires:     %{name}%{?_isa} = %{version}-%{release}
 -BuildRequires:        credis-devel
 +BuildRequires:        hiredis-devel
  %description write_redis
  The Write Redis plugin stores values in Redis, a “data structures server”.
  %endif
@@@ -813,13 -718,6 +813,13 @@@ Requires:        libcollectdclient%{?_isa} = %
  %description -n libcollectdclient-devel
  Development files for libcollectdclient
  
 +%package -n collectd-utils
 +Summary:      Collectd utilities
 +Group:                System Environment/Daemons
 +Requires:     libcollectdclient%{?_isa} = %{version}-%{release}
 +Requires:     collectd%{?_isa} = %{version}-%{release}
 +%description -n collectd-utils
 +Collectd utilities
  
  %prep
  %setup -q
  %define _with_ascent --disable-ascent
  %endif
  
 +%if %{with_barometer}
 +%define _with_barometer --enable-barometer
 +%else
 +%define _with_barometer --disable-barometer
 +%endif
 +
  %if %{with_battery}
  %define _with_battery --enable-battery
  %else
  %define _with_csv --disable-csv
  %endif
  
 +%if %{with_ceph}
 +%define _with_ceph --enable-ceph
 +%else
 +%define _with_ceph --disable-ceph
 +%endif
 +
  %if %{with_curl}
  %define _with_curl --enable-curl
  %else
  %define _with_dns --disable-dns
  %endif
  
 +%if %{with_drbd}
 +%define _with_drbd --enable-drbd
 +%else
 +%define _with_drbd --disable-drbd
 +%endif
 +
  %if %{with_email}
  %define _with_email --enable-email
  %else
  %define _with_interface --disable-interface
  %endif
  
 +%if %{with_ipc}
 +%define _with_ipc --enable-ipc
 +%else
 +%define _with_ipc --disable-ipc
 +%endif
 +
  %if %{with_ipmi}
  %define _with_ipmi --enable-ipmi
  %else
  %define _with_java --disable-java
  %endif
  
 -%if %{with_libvirt}
 -%define _with_libvirt --enable-libvirt
 +%if %{with_virt}
 +%define _with_virt --enable-virt
  %else
 -%define _with_libvirt --disable-libvirt
 +%define _with_virt --disable-virt
  %endif
  
  %if %{with_load}
  %define _with_logfile --disable-logfile
  %endif
  
 +%if %{with_log_logstash}
 +%define _with_log_logstash --enable-log_logstash
 +%else
 +%define _with_log_logstash --disable-log_logstash
 +%endif
 +
  %if %{with_lpar}
  %define _with_lpar --enable-lpar
  %else
  %define _with_onewire --disable-onewire
  %endif
  
 +%if %{with_openldap}
 +%define _with_openldap --enable-openldap
 +%else
 +%define _with_openldap --disable-openldap
 +%endif
 +
  %if %{with_openvpn}
  %define _with_openvpn --enable-openvpn
  %else
  %endif
  
  %if %{with_python}
 -%if 0%{?rhel} >= 6
 +      %if 0%{?rhel} >= 6
  %define _with_python --enable-python
 -%else
 +      %else
  %define _with_python --enable-python --with-python=%{_bindir}/python2.6
 -%endif
 +      %endif
  %else
  %define _with_python --disable-python
  %endif
  %define _with_sigrok --disable-sigrok
  %endif
  
 +%if %{with_smart}
 +%define _with_smart --enable-smart
 +%else
 +%define _with_smart --disable-smart
 +%endif
 +
  %if %{with_snmp}
  %define _with_snmp --enable-snmp
  %else
  %define _with_write_http --disable-write_http
  %endif
  
 +%if %{with_write_kafka}
 +%define _with_write_kafka --enable-write_kafka
 +%else
 +%define _with_write_kafka --disable-write_kafka
 +%endif
 +
 +%if %{with_write_log}
 +%define _with_write_log --enable-write_log
 +%else
 +%define _with_write_log --disable-write_log
 +%endif
 +
  %if %{with_write_mongodb}
  %define _with_write_mongodb --enable-write_mongodb
  %else
  %if %{with_write_redis}
  %define _with_write_redis --enable-write_redis
  %else
 -%define _with_write_redis --disable-write_redis --without-libcredis
 +%define _with_write_redis --disable-write_redis
  %endif
  
  %if %{with_write_riemann}
  %define _with_write_riemann --disable-write_riemann
  %endif
  
 +%if %{with_write_sensu}
 +%define _with_write_sensu --enable-write_sensu
 +%else
 +%define _with_write_sensu --disable-write_sensu
 +%endif
 +
 +%if %{with_write_tsdb}
 +%define _with_write_tsdb --enable-write_tsdb
 +%else
 +%define _with_write_tsdb --disable-write_tsdb
 +%endif
 +
  %if %{with_xmms}
  %define _with_xmms --enable-xmms
  %else
  %define _with_zfs_arc --disable-zfs_arc
  %endif
  
 +%if %{with_zookeeper}
 +%define _with_zookeeper --enable-zookeeper
 +%else
 +%define _with_zookeeper --disable-zookeeper
 +%endif
 +
  %configure CFLAGS="%{optflags} -DLT_LAZY_OR_NOW=\"RTLD_LAZY|RTLD_GLOBAL\"" \
        --disable-static \
        --without-included-ltdl \
        %{?_with_apple_sensors} \
        %{?_with_aquaero} \
        %{?_with_ascent} \
 +      %{?_with_barometer} \
        %{?_with_battery} \
        %{?_with_bind} \
 +      %{?_with_ceph} \
        %{?_with_cgroups} \
        %{?_with_conntrack} \
        %{?_with_contextswitch} \
        %{?_with_df} \
        %{?_with_disk} \
        %{?_with_dns} \
 +      %{?_with_drbd} \
        %{?_with_email} \
        %{?_with_entropy} \
        %{?_with_ethstat} \
        %{?_with_gmond} \
        %{?_with_hddtemp} \
        %{?_with_interface} \
 +      %{?_with_ipc} \
        %{?_with_ipmi} \
        %{?_with_iptables} \
        %{?_with_ipvs} \
        %{?_with_java} \
 -      %{?_with_libvirt} \
 +      %{?_with_virt} \
 +      %{?_with_log_logstash} \
        %{?_with_lpar} \
        %{?_with_lvm} \
        %{?_with_memcachec} \
        %{?_with_notify_email} \
        %{?_with_nut} \
        %{?_with_onewire} \
 +      %{?_with_openldap} \
        %{?_with_oracle} \
        %{?_with_perl} \
        %{?_with_pf} \
        %{?_with_rrdtool} \
        %{?_with_sensors} \
        %{?_with_sigrok} \
 +      %{?_with_smart} \
        %{?_with_snmp} \
        %{?_with_tape} \
        %{?_with_tokyotyrant} \
        %{?_with_varnish} \
        %{?_with_write_http} \
 +      %{?_with_write_kafka} \
        %{?_with_write_mongodb} \
        %{?_with_write_redis} \
        %{?_with_xmms} \
        %{?_with_zfs_arc} \
 +      %{?_with_zookeeper} \
        %{?_with_irq} \
        %{?_with_load} \
        %{?_with_logfile} \
        %{?_with_wireless}\
        %{?_with_write_graphite} \
        %{?_with_write_http} \
 -      %{?_with_write_riemann}
 +      %{?_with_write_log} \
 +      %{?_with_write_riemann} \
 +      %{?_with_write_sensu} \
 +      %{?_with_write_tsdb}
  
  
  %{__make} %{?_smp_mflags}
  %install
  rm -rf %{buildroot}
  %{__make} install DESTDIR=%{buildroot}
 -%{__install} -Dp -m 0755 contrib/redhat/init.d-collectd %{buildroot}%{_initrddir}/collectd
 +%if 0%{?el7:1}
 +%{__install} -Dp -m0644 contrib/systemd.collectd.service %{buildroot}%{_unitdir}/collectd.service
 +%else
 +%{__install} -Dp -m0755 contrib/redhat/init.d-collectd %{buildroot}%{_initrddir}/collectd
 +%endif
  %{__install} -Dp -m0644 src/collectd.conf %{buildroot}%{_sysconfdir}/collectd.conf
  %{__install} -d %{buildroot}%{_sharedstatedir}/collectd/
  %{__install} -d %{buildroot}%{_sysconfdir}/collectd.d/
@@@ -1762,44 -1572,19 +1762,44 @@@ rm -f %{buildroot}%{_mandir}/man5/colle
  %clean
  rm -rf %{buildroot}
  
 +%pre
 +%if 0%{?el7:1}
 +# stop sysv-based instance before upgrading to systemd
 +if [ $1 -eq 2 ] && [ -f /var/lock/subsys/collectd ]; then
 +      SYSTEMCTL_SKIP_REDIRECT=1 %{_initddir}/collectd stop >/dev/null 2>&1 || :
 +fi
 +%endif
 +
  %post
 -/sbin/chkconfig --add collectd
 +%if 0%{?el7:1}
 +if [ $1 -eq 2 ]; then
 +      /usr/bin/systemctl daemon-reload >/dev/null 2>&1 || :
 +fi
 +%systemd_post collectd.service
 +%else
 +/sbin/chkconfig --add collectd || :
 +%endif
  
  %preun
 +%if 0%{?el7:1}
 +%systemd_preun collectd.service
 +%else
 +# stop collectd only when uninstalling
  if [ $1 -eq 0 ]; then
 -      /sbin/service collectd stop &>/dev/null
 -      /sbin/chkconfig --del collectd
 +      /sbin/service collectd stop >/dev/null 2>&1 || :
 +      /sbin/chkconfig --del collectd || :
  fi
 +%endif
  
  %postun
 -if [ $1 -ge 1 ]; then
 -      /sbin/service collectd condrestart &>/dev/null || :
 +%if 0%{?el7:1}
 +%systemd_postun_with_restart collectd.service
 +%else
 +# restart collectd only when upgrading
 +if [ $1 -eq 1 ]; then
 +      /sbin/service collectd condrestart >/dev/null 2>&1 || :
  fi
 +%endif
  
  %post -n libcollectdclient -p /sbin/ldconfig
  %postun -n libcollectdclient -p /sbin/ldconfig
  %files
  %doc AUTHORS COPYING ChangeLog README
  %config(noreplace) %{_sysconfdir}/collectd.conf
 +%if 0%{?el7:1}
 +%{_unitdir}/collectd.service
 +%else
  %{_initrddir}/collectd
 +%endif
  %{_sbindir}/collectd
 -%{_bindir}/collectd-nagios
 -%{_bindir}/collectd-tg
 -%{_bindir}/collectdctl
  %{_sbindir}/collectdmon
  %{_datadir}/collectd/types.db
  %{_sharedstatedir}/collectd
 -%{_mandir}/man1/collectd-nagios.1*
  %{_mandir}/man1/collectd.1*
 -%{_mandir}/man1/collectdctl.1*
  %{_mandir}/man1/collectdmon.1*
 -%{_mandir}/man1/collectd-tg.1*
  %{_mandir}/man5/collectd-email.5*
  %{_mandir}/man5/collectd-exec.5*
  %{_mandir}/man5/collectd-threshold.5*
  %if %{with_df}
  %{_libdir}/%{name}/df.so
  %endif
 -%if %{with_disk}
 -%{_libdir}/%{name}/disk.so
 +%if %{with_drbd}
 +%{_libdir}/%{name}/drbd.so
  %endif
  %if %{with_ethstat}
  %{_libdir}/%{name}/ethstat.so
  %if %{with_interface}
  %{_libdir}/%{name}/interface.so
  %endif
 +%if %{with_ipc}
 +%{_libdir}/%{name}/ipc.so
 +%endif
  %if %{with_ipvs}
  %{_libdir}/%{name}/ipvs.so
  %endif
  %if %{with_write_graphite}
  %{_libdir}/%{name}/write_graphite.so
  %endif
 -
 +%if %{with_write_log}
 +%{_libdir}/%{name}/write_log.so
 +%endif
 +%if %{with_write_sensu}
 +%{_libdir}/%{name}/write_sensu.so
 +%endif
 +%if %{with_write_tsdb}
 +%{_libdir}/%{name}/write_tsdb.so
 +%endif
 +%if %{with_zfs_arc}
 +%{_libdir}/%{name}/zfs_arc.so
 +%endif
 +%if %{with_zookeeper}
 +%{_libdir}/%{name}/zookeeper.so
 +%endif
  
  %files -n libcollectdclient-devel
  %{_includedir}/collectd/client.h
  %{_libdir}/libcollectdclient.so
  %{_libdir}/libcollectdclient.so.*
  
 +%files -n collectd-utils
 +%{_bindir}/collectd-nagios
 +%{_bindir}/collectd-tg
 +%{_bindir}/collectdctl
 +%{_mandir}/man1/collectdctl.1*
 +%{_mandir}/man1/collectd-nagios.1*
 +%{_mandir}/man1/collectd-tg.1*
 +
  %if %{with_amqp}
  %files amqp
  %{_libdir}/%{name}/amqp.so
  %{_libdir}/%{name}/ascent.so
  %endif
  
 +%if %{with_barometer}
 +%files barometer
 +%{_libdir}/%{name}/barometer.so
 +%endif
 +
  %if %{with_bind}
  %files bind
  %{_libdir}/%{name}/bind.so
  %endif
  
 +%if %{with_ceph}
 +%files ceph
 +%{_libdir}/%{name}/ceph.so
 +%endif
 +
  %if %{with_curl}
  %files curl
  %{_libdir}/%{name}/curl.so
  %{_libdir}/%{name}/curl_xml.so
  %endif
  
 +%if %{with_disk}
 +%files disk
 +%{_libdir}/%{name}/disk.so
 +%endif
 +
  %if %{with_dns}
  %files dns
  %{_libdir}/%{name}/dns.so
  %{_mandir}/man5/collectd-java.5*
  %endif
  
 -%if %{with_libvirt}
 -%files libvirt
 -%{_libdir}/%{name}/libvirt.so
 +%if %{with_virt}
 +%files virt
 +%{_libdir}/%{name}/virt.so
 +%endif
 +
 +%if %{with_log_logstash}
 +%files log_logstash
 +%{_libdir}/%{name}/log_logstash.so
  %endif
  
  %if %{with_lvm}
  %{_libdir}/%{name}/nut.so
  %endif
  
 +%if %{with_openldap}
 +%files openldap
 +%{_libdir}/%{name}/openldap.so
 +%endif
 +
  %if %{with_perl}
  %files perl
  %{perl_vendorlib}/Collectd.pm
  %{_libdir}/%{name}/sigrok.so
  %endif
  
 +%if %{with_smart}
 +%files smart
 +%{_libdir}/%{name}/smart.so
 +%endif
 +
  %if %{with_snmp}
  %files snmp
  %{_mandir}/man5/collectd-snmp.5*
  %{_libdir}/%{name}/write_http.so
  %endif
  
 +%if %{with_write_kafka}
 +%files write_kafka
 +%{_libdir}/%{name}/write_kafka.so
 +%endif
 +
  %if %{with_write_redis}
  %files write_redis
  %{_libdir}/%{name}/write_redis.so
  %doc contrib/
  
  %changelog
 +# * TODO 5.5.0-1
 +# - New upstream version
 +# - New plugins enabled by default: ceph, drbd, log_logstash, write_tsdb, smart, openldap, redis, write_redis, zookeeper, write_log, write_sensu, ipc
 +# - New plugins disabled by default: barometer, write_kafka
 +# - Enable zfs_arc, now supported on Linux
 +# - Install disk plugin in a dedicated package, as it depends on libudev
 +# - use systemd on EL7, sysvinit on EL6 & EL5
 +# - Install collectdctl, collectd-tg and collectd-nagios in collectd-utils.rpm
 +
  * Mon Aug 19 2013 Marc Fournier <marc.fournier@camptocamp.com> 5.4.0-1
  - New upstream version
  - Build netlink plugin by default
  * Sat Nov 17 2012 Ruben Kerkhof <ruben@tilaa.nl> 5.1.0-2
  - Move perl stuff to perl_vendorlib
  - Replace hardcoded paths with macros
 -- Remove unneccesary Requires
 +- Remove unnecessary Requires
  - Removed .a and .la files
  - Some other small cleanups
  
  - New upstream version
  - Changes to support 5.1.0
  - Enabled all buildable plugins based on libraries available on EL6 + EPEL
 -- All plugins requiring external libraries are now shipped in seperate
 +- All plugins requiring external libraries are now shipped in separate
    packages.
  - No longer treat Java plugin as an exception, correctly set $JAVA_HOME during
    the build process + ensure build deps are installed.
diff --combined src/bind.c
@@@ -109,7 -109,6 +109,7 @@@ static int global_server_stats     = 1
  static int global_zone_maint_stats = 1;
  static int global_resolver_stats   = 0;
  static int global_memory_stats     = 1;
 +static int timeout                 = -1;
  
  static cb_view_t *views = NULL;
  static size_t     views_num = 0;
@@@ -267,7 -266,7 +267,7 @@@ static void submit (time_t ts, const ch
    if (type_instance) {
      sstrncpy(vl.type_instance, type_instance,
          sizeof(vl.type_instance));
-     replace_special (vl.plugin_instance, sizeof (vl.plugin_instance));
+     replace_special (vl.type_instance, sizeof (vl.type_instance));
    }
    plugin_dispatch_values(&vl);
  } /* }}} void submit */
@@@ -370,11 -369,9 +370,11 @@@ static int bind_xml_read_derive (xmlDo
    {
      ERROR ("bind plugin: Parsing string \"%s\" to derive value failed.",
          str_ptr);
 +    xmlFree(str_ptr);
      return (-1);
    }
  
 +  xmlFree(str_ptr);
    *ret_value = value.derive;
    return (0);
  } /* }}} int bind_xml_read_derive */
@@@ -630,84 -627,6 +630,84 @@@ static int bind_parse_generic_value_lis
    return (0);
  } /* }}} int bind_parse_generic_value_list */
  
 +/*
 + * bind_parse_generic_name_attr_value_list
 + *
 + * Reads statistics in the form:
 + * <foo>
 + *   <counter name="name0">123</counter>
 + *   <counter name="name1">234</counter>
 + *   <counter name="name2">345</counter>
 + *   :
 + * </foo>
 + */
 +static int bind_parse_generic_name_attr_value_list (const char *xpath_expression, /* {{{ */
 +    list_callback_t list_callback,
 +    void *user_data,
 +    xmlDoc *doc, xmlXPathContext *xpathCtx,
 +    time_t current_time, int ds_type)
 +{
 +  xmlXPathObject *xpathObj = NULL;
 +  int num_entries;
 +  int i;
 +
 +  xpathObj = xmlXPathEvalExpression(BAD_CAST xpath_expression, xpathCtx);
 +  if (xpathObj == NULL)
 +  {
 +    ERROR("bind plugin: Unable to evaluate XPath expression `%s'.",
 +        xpath_expression);
 +    return (-1);
 +  }
 +
 +  num_entries = 0;
 +  /* Iterate over all matching nodes. */
 +  for (i = 0; xpathObj->nodesetval && (i < xpathObj->nodesetval->nodeNr); i++)
 +  {
 +    xmlNode *child;
 +
 +    /* Iterate over all child nodes. */
 +    for (child = xpathObj->nodesetval->nodeTab[i]->xmlChildrenNode;
 +        child != NULL;
 +        child = child->next)
 +    {
 +      if (child->type != XML_ELEMENT_NODE)
 +        continue;
 +
 +      if (strncmp ("counter", (char *) child->name, strlen ("counter")) != 0)
 +        continue;
 +
 +      char *attr_name;
 +      value_t value;
 +      int status;
 +
 +      attr_name = (char *) xmlGetProp (child, BAD_CAST "name");
 +      if (attr_name == NULL)
 +      {
 +        DEBUG ("bind plugin: found <counter> without name.");
 +        continue;
 +      }
 +      if (ds_type == DS_TYPE_GAUGE)
 +        status = bind_xml_read_gauge (doc, child, &value.gauge);
 +      else
 +        status = bind_xml_read_derive (doc, child, &value.derive);
 +      if (status != 0)
 +        continue;
 +
 +      status = (*list_callback) (attr_name, value, current_time, user_data);
 +      if (status == 0)
 +        num_entries++;
 +    }
 +  }
 +
 +  DEBUG ("bind plugin: Found %d %s for XPath expression `%s'",
 +      num_entries, (num_entries == 1) ? "entry" : "entries",
 +      xpath_expression);
 +
 +  xmlXPathFreeObject(xpathObj);
 +
 +  return (0);
 +} /* }}} int bind_parse_generic_name_attr_value_list */
 +
  static int bind_xml_stats_handle_zone (int version, xmlDoc *doc, /* {{{ */
      xmlXPathContext *path_ctx, xmlNode *node, cb_view_t *view,
      time_t current_time)
    int i;
    size_t j;
  
 -  path_obj = xmlXPathEvalExpression (BAD_CAST "name", path_ctx);
 -  if (path_obj == NULL)
 +  if (version >= 3)
    {
 -    ERROR ("bind plugin: xmlXPathEvalExpression failed.");
 -    return (-1);
 +    char *n = (char *) xmlGetProp (node, BAD_CAST "name");
 +    char *c = (char *) xmlGetProp (node, BAD_CAST "rdataclass");
 +    if (n && c)
 +    {
 +      zone_name = (char *) xmlMalloc(strlen(n) + strlen(c) + 2);
 +      snprintf(zone_name, strlen(n) + strlen(c) + 2, "%s/%s", n, c);
 +    }
 +    xmlFree(n);
 +    xmlFree(c);
    }
 -
 -  for (i = 0; path_obj->nodesetval && (i < path_obj->nodesetval->nodeNr); i++)
 +  else
    {
 -    zone_name = (char *) xmlNodeListGetString (doc,
 -        path_obj->nodesetval->nodeTab[i]->xmlChildrenNode, 1);
 -    if (zone_name != NULL)
 -      break;
 +    path_obj = xmlXPathEvalExpression (BAD_CAST "name", path_ctx);
 +    if (path_obj == NULL)
 +    {
 +      ERROR ("bind plugin: xmlXPathEvalExpression failed.");
 +      return (-1);
 +    }
 +
 +    for (i = 0; path_obj->nodesetval && (i < path_obj->nodesetval->nodeNr); i++)
 +    {
 +      zone_name = (char *) xmlNodeListGetString (doc,
 +          path_obj->nodesetval->nodeTab[i]->xmlChildrenNode, 1);
 +      if (zone_name != NULL)
 +        break;
 +    }
 +    xmlXPathFreeObject (path_obj);
    }
  
    if (zone_name == NULL)
    {
      ERROR ("bind plugin: Could not determine zone name.");
 -    xmlXPathFreeObject (path_obj);
      return (-1);
    }
  
    xmlFree (zone_name);
    zone_name = NULL;
  
 -  if (j >= views_num)
 -  {
 -    xmlXPathFreeObject (path_obj);
 +  if (j >= views->zones_num)
      return (0);
 -  }
  
    zone_name = view->zones[j];
  
      ssnprintf (plugin_instance, sizeof (plugin_instance), "%s-zone-%s",
          view->name, zone_name);
  
 -    bind_parse_generic_value_list (/* xpath = */ "counters",
 +    if (version == 3)
 +    {
 +      list_info_ptr_t list_info =
 +      {
 +        plugin_instance,
 +        /* type = */ "dns_qtype"
 +      };
 +      bind_parse_generic_name_attr_value_list (/* xpath = */ "counters[@type='rcode']",
          /* callback = */ bind_xml_table_callback,
          /* user_data = */ &table_ptr,
          doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +      bind_parse_generic_name_attr_value_list (/* xpath = */ "counters[@type='qtype']",
 +        /* callback = */ bind_xml_list_callback,
 +        /* user_data = */ &list_info,
 +        doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    }
 +    else
 +    {
 +      bind_parse_generic_value_list (/* xpath = */ "counters",
 +          /* callback = */ bind_xml_table_callback,
 +          /* user_data = */ &table_ptr,
 +          doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    }
    } /* }}} */
  
 -  xmlXPathFreeObject (path_obj);
 -
    return (0);
  } /* }}} int bind_xml_stats_handle_zone */
  
@@@ -855,68 -745,45 +855,68 @@@ static int bind_xml_stats_search_zones 
  static int bind_xml_stats_handle_view (int version, xmlDoc *doc, /* {{{ */
      xmlXPathContext *path_ctx, xmlNode *node, time_t current_time)
  {
 -  xmlXPathObject *path_obj;
    char *view_name = NULL;
    cb_view_t *view;
    int i;
    size_t j;
  
 -  path_obj = xmlXPathEvalExpression (BAD_CAST "name", path_ctx);
 -  if (path_obj == NULL)
 +  if (version == 3)
    {
 -    ERROR ("bind plugin: xmlXPathEvalExpression failed.");
 -    return (-1);
 -  }
 +    view_name = (char*) xmlGetProp(node, BAD_CAST "name");
  
 -  for (i = 0; path_obj->nodesetval && (i < path_obj->nodesetval->nodeNr); i++)
 -  {
 -    view_name = (char *) xmlNodeListGetString (doc,
 -        path_obj->nodesetval->nodeTab[i]->xmlChildrenNode, 1);
 -    if (view_name != NULL)
 -      break;
 -  }
 +    if (view_name == NULL)
 +    {
 +      ERROR ("bind plugin: Could not determine view name.");
 +      return (-1);
 +    }
 +
 +    for (j = 0; j < views_num; j++)
 +    {
 +      if (strcasecmp (view_name, views[j].name) == 0)
 +        break;
 +    }
  
 -  if (view_name == NULL)
 +    xmlFree (view_name);
 +    view_name = NULL;
 +  }
 +  else
    {
 -    ERROR ("bind plugin: Could not determine view name.");
 +    xmlXPathObject *path_obj;
 +    path_obj = xmlXPathEvalExpression (BAD_CAST "name", path_ctx);
 +    if (path_obj == NULL)
 +    {
 +      ERROR ("bind plugin: xmlXPathEvalExpression failed.");
 +      return (-1);
 +    }
 +
 +    for (i = 0; path_obj->nodesetval && (i < path_obj->nodesetval->nodeNr); i++)
 +    {
 +      view_name = (char *) xmlNodeListGetString (doc,
 +          path_obj->nodesetval->nodeTab[i]->xmlChildrenNode, 1);
 +      if (view_name != NULL)
 +        break;
 +    }
 +
 +    if (view_name == NULL)
 +    {
 +      ERROR ("bind plugin: Could not determine view name.");
 +      xmlXPathFreeObject (path_obj);
 +      return (-1);
 +    }
 +
 +    for (j = 0; j < views_num; j++)
 +    {
 +      if (strcasecmp (view_name, views[j].name) == 0)
 +        break;
 +    }
 +
 +    xmlFree (view_name);
      xmlXPathFreeObject (path_obj);
 -    return (-1);
 -  }
  
 -  for (j = 0; j < views_num; j++)
 -  {
 -    if (strcasecmp (view_name, views[j].name) == 0)
 -      break;
 +    view_name = NULL;
 +    path_obj = NULL;
    }
  
 -  xmlFree (view_name);
 -  xmlXPathFreeObject (path_obj);
 -
 -  view_name = NULL;
 -  path_obj = NULL;
  
    if (j >= views_num)
      return (0);
  
      ssnprintf (plugin_instance, sizeof (plugin_instance), "%s-qtypes",
          view->name);
 -
 -    bind_parse_generic_name_value (/* xpath = */ "rdtype",
 +    if (version == 3)
 +    {
 +      bind_parse_generic_name_attr_value_list (/* xpath = */ "counters[@type='resqtype']",
 +        /* callback = */ bind_xml_list_callback,
 +        /* user_data = */ &list_info,
 +        doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    }
 +    else
 +    {
 +      bind_parse_generic_name_value (/* xpath = */ "rdtype",
          /* callback = */ bind_xml_list_callback,
          /* user_data = */ &list_info,
          doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    }
    } /* }}} */
  
    if (view->resolver_stats != 0) /* {{{ */
  
      ssnprintf (plugin_instance, sizeof (plugin_instance),
          "%s-resolver_stats", view->name);
 -
 -    bind_parse_generic_name_value ("resstat",
 -        /* callback = */ bind_xml_table_callback,
 -        /* user_data = */ &table_ptr,
 -        doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    if (version == 3)
 +    {
 +      bind_parse_generic_name_attr_value_list ("counters[@type='resstats']",
 +          /* callback = */ bind_xml_table_callback,
 +          /* user_data = */ &table_ptr,
 +          doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    }
 +    else
 +    {
 +      bind_parse_generic_name_value ("resstat",
 +          /* callback = */ bind_xml_table_callback,
 +          /* user_data = */ &table_ptr,
 +          doc, path_ctx, current_time, DS_TYPE_COUNTER);
 +    }
    } /* }}} */
  
    /* Record types in the cache */
@@@ -1047,145 -896,28 +1047,145 @@@ static int bind_xml_stats_search_views 
    return (0);
  } /* }}} int bind_xml_stats_search_views */
  
 -static int bind_xml_stats (int version, xmlDoc *doc, /* {{{ */
 -    xmlXPathContext *xpathCtx, xmlNode *statsnode)
 +static void bind_xml_stats_v3 (xmlDoc *doc, /* {{{ */
 +    xmlXPathContext *xpathCtx, xmlNode *statsnode, time_t current_time)
  {
 -  time_t current_time = 0;
 -  int status;
 +  /* XPath:     server/counters[@type='opcode']
 +   * Variables: QUERY, IQUERY, NOTIFY, UPDATE, ...
 +   * Layout v3:
 +   *   <counters type="opcode">
 +   *     <counter name="A">1</counter>
 +   *     :
 +   *   </counters>
 +   */
 +  if (global_opcodes != 0)
 +  {
 +    list_info_ptr_t list_info =
 +    {
 +      /* plugin instance = */ "global-opcodes",
 +      /* type = */ "dns_opcode"
 +    };
 +    bind_parse_generic_name_attr_value_list (/* xpath = */ "server/counters[@type='opcode']",
 +      /* callback = */ bind_xml_list_callback,
 +      /* user_data = */ &list_info,
 +      doc, xpathCtx, current_time, DS_TYPE_COUNTER);
 +  }
  
 -  xpathCtx->node = statsnode;
 +  /* XPath:     server/counters[@type='qtype']
 +   * Variables: RESERVED0, A, NS, CNAME, SOA, MR, PTR, HINFO, MX, TXT, RP,
 +   *            X25, PX, AAAA, LOC, SRV, NAPTR, A6, DS, RRSIG, NSEC, DNSKEY,
 +   *            SPF, TKEY, IXFR, AXFR, ANY, ..., Others
 +   * Layout v3:
 +   *   <counters type="opcode">
 +   *     <counter name="A">1</counter>
 +   *     :
 +   *   </counters>
 +   */
 +  if (global_qtypes != 0)
 +  {
 +    list_info_ptr_t list_info =
 +    {
 +      /* plugin instance = */ "global-qtypes",
 +      /* type = */ "dns_qtype"
 +    };
  
 -  /* TODO: Check `server/boot-time' to recognize server restarts. */
 +    bind_parse_generic_name_attr_value_list (/* xpath = */ "server/counters[@type='qtype']",
 +        /* callback = */ bind_xml_list_callback,
 +        /* user_data = */ &list_info,
 +        doc, xpathCtx, current_time, DS_TYPE_COUNTER);
 +  }
  
 -  status = bind_xml_read_timestamp ("server/current-time",
 -      doc, xpathCtx, &current_time);
 -  if (status != 0)
 +  /* XPath:     server/counters[@type='nsstat']
 +   * Variables: Requestv4, Requestv6, ReqEdns0, ReqBadEDNSVer, ReqTSIG,
 +   *            ReqSIG0, ReqBadSIG, ReqTCP, AuthQryRej, RecQryRej, XfrRej,
 +   *            UpdateRej, Response, TruncatedResp, RespEDNS0, RespTSIG,
 +   *            RespSIG0, QrySuccess, QryAuthAns, QryNoauthAns, QryReferral,
 +   *            QryNxrrset, QrySERVFAIL, QryFORMERR, QryNXDOMAIN, QryRecursion,
 +   *            QryDuplicate, QryDropped, QryFailure, XfrReqDone, UpdateReqFwd,
 +   *            UpdateRespFwd, UpdateFwdFail, UpdateDone, UpdateFail,
 +   *            UpdateBadPrereq
 +   * Layout v3:
 +   *   <counters type="nsstat"
 +   *     <counter name="Requestv4">1</counter>
 +   *     <counter name="Requestv6">0</counter>
 +   *     :
 +   *   </counter>
 +   */
 +  if (global_server_stats)
    {
 -    ERROR ("bind plugin: Reading `server/current-time' failed.");
 -    return (-1);
 +    translation_table_ptr_t table_ptr =
 +    {
 +      nsstats_translation_table,
 +      nsstats_translation_table_length,
 +      /* plugin_instance = */ "global-server_stats"
 +    };
 +
 +    bind_parse_generic_name_attr_value_list ("server/counters[@type='nsstat']",
 +        /* callback = */ bind_xml_table_callback,
 +        /* user_data = */ &table_ptr,
 +        doc, xpathCtx, current_time, DS_TYPE_COUNTER);
    }
 -  DEBUG ("bind plugin: Current server time is %i.", (int) current_time);
  
 -  /* XPath:     server/requests/opcode
 +  /* XPath:     server/zonestats, server/zonestat, server/counters[@type='zonestat']
 +   * Variables: NotifyOutv4, NotifyOutv6, NotifyInv4, NotifyInv6, NotifyRej,
 +   *            SOAOutv4, SOAOutv6, AXFRReqv4, AXFRReqv6, IXFRReqv4, IXFRReqv6,
 +   *            XfrSuccess, XfrFail
 +   * Layout v3:
 +   *   <counters type="zonestat"
 +   *     <counter name="NotifyOutv4">0</counter>
 +   *     <counter name="NotifyOutv6">0</counter>
 +   *     :
 +   *   </counter>
 +   */
 +  if (global_zone_maint_stats)
 +  {
 +    translation_table_ptr_t table_ptr =
 +    {
 +      zonestats_translation_table,
 +      zonestats_translation_table_length,
 +      /* plugin_instance = */ "global-zone_maint_stats"
 +    };
 +
 +    bind_parse_generic_name_attr_value_list ("server/counters[@type='zonestat']",
 +        /* callback = */ bind_xml_table_callback,
 +        /* user_data = */ &table_ptr,
 +        doc, xpathCtx, current_time, DS_TYPE_COUNTER);
 +  }
 +
 +  /* XPath:     server/resstats, server/counters[@type='resstat']
 +   * Variables: Queryv4, Queryv6, Responsev4, Responsev6, NXDOMAIN, SERVFAIL,
 +   *            FORMERR, OtherError, EDNS0Fail, Mismatch, Truncated, Lame,
 +   *            Retry, GlueFetchv4, GlueFetchv6, GlueFetchv4Fail,
 +   *            GlueFetchv6Fail, ValAttempt, ValOk, ValNegOk, ValFail
 +   * Layout v3:
 +   *   <counters type="resstat"
 +   *     <counter name="Queryv4">0</counter>
 +   *     <counter name="Queryv6">0</counter>
 +   *     :
 +   *   </counter>
 +   */
 +  if (global_resolver_stats != 0)
 +  {
 +    translation_table_ptr_t table_ptr =
 +    {
 +      resstats_translation_table,
 +      resstats_translation_table_length,
 +      /* plugin_instance = */ "global-resolver_stats"
 +    };
 +
 +    bind_parse_generic_name_attr_value_list ("server/counters[@type='resstat']",
 +        /* callback = */ bind_xml_table_callback,
 +        /* user_data = */ &table_ptr,
 +        doc, xpathCtx, current_time, DS_TYPE_COUNTER);
 +  }
 +} /* }}} bind_xml_stats_v3 */
 +
 +static void bind_xml_stats_v1_v2 (int version, xmlDoc *doc, /* {{{ */
 +    xmlXPathContext *xpathCtx, xmlNode *statsnode, time_t current_time)
 +{
 +  /* XPath:     server/requests/opcode, server/counters[@type='opcode']
     * Variables: QUERY, IQUERY, NOTIFY, UPDATE, ...
 -   * Layout:
 +   * Layout V1 and V2:
     *   <opcode>
     *     <name>A</name>
     *     <counter>1</counter>
          doc, xpathCtx, current_time, DS_TYPE_COUNTER);
    }
  
 -  /* XPath:     server/queries-in/rdtype
 +  /* XPath:     server/queries-in/rdtype, server/counters[@type='qtype']
     * Variables: RESERVED0, A, NS, CNAME, SOA, MR, PTR, HINFO, MX, TXT, RP,
     *            X25, PX, AAAA, LOC, SRV, NAPTR, A6, DS, RRSIG, NSEC, DNSKEY,
     *            SPF, TKEY, IXFR, AXFR, ANY, ..., Others
 -   * Layout:
 +   * Layout v1 or v2:
     *   <rdtype>
     *     <name>A</name>
     *     <counter>1</counter>
          /* user_data = */ &list_info,
          doc, xpathCtx, current_time, DS_TYPE_COUNTER);
    }
 -  
 -  /* XPath:     server/nsstats, server/nsstat
 +
 +  /* XPath:     server/nsstats, server/nsstat, server/counters[@type='nsstat']
     * Variables: Requestv4, Requestv6, ReqEdns0, ReqBadEDNSVer, ReqTSIG,
     *            ReqSIG0, ReqBadSIG, ReqTCP, AuthQryRej, RecQryRej, XfrRej,
     *            UpdateRej, Response, TruncatedResp, RespEDNS0, RespTSIG,
    if (global_server_stats)
    {
      translation_table_ptr_t table_ptr =
 -    { 
 +    {
        nsstats_translation_table,
        nsstats_translation_table_length,
        /* plugin_instance = */ "global-server_stats"
      }
    }
  
 -  /* XPath:     server/zonestats, server/zonestat
 +  /* XPath:     server/zonestats, server/zonestat, server/counters[@type='zonestat']
     * Variables: NotifyOutv4, NotifyOutv6, NotifyInv4, NotifyInv6, NotifyRej,
     *            SOAOutv4, SOAOutv6, AXFRReqv4, AXFRReqv6, IXFRReqv4, IXFRReqv6,
     *            XfrSuccess, XfrFail
    if (global_zone_maint_stats)
    {
      translation_table_ptr_t table_ptr =
 -    { 
 +    {
        zonestats_translation_table,
        zonestats_translation_table_length,
        /* plugin_instance = */ "global-zone_maint_stats"
      }
    }
  
 -  /* XPath:     server/resstats
 +  /* XPath:     server/resstats, server/counters[@type='resstat']
     * Variables: Queryv4, Queryv6, Responsev4, Responsev6, NXDOMAIN, SERVFAIL,
     *            FORMERR, OtherError, EDNS0Fail, Mismatch, Truncated, Lame,
     *            Retry, GlueFetchv4, GlueFetchv6, GlueFetchv4Fail,
    if (global_resolver_stats != 0)
    {
      translation_table_ptr_t table_ptr =
 -    { 
 +    {
        resstats_translation_table,
        resstats_translation_table_length,
        /* plugin_instance = */ "global-resolver_stats"
            doc, xpathCtx, current_time, DS_TYPE_COUNTER);
      }
    }
 +} /* }}} bind_xml_stats_v1_v2 */
 +
 +static int bind_xml_stats (int version, xmlDoc *doc, /* {{{ */
 +    xmlXPathContext *xpathCtx, xmlNode *statsnode)
 +{
 +  time_t current_time = 0;
 +  int status;
 +
 +  xpathCtx->node = statsnode;
 +
 +  /* TODO: Check `server/boot-time' to recognize server restarts. */
 +
 +  status = bind_xml_read_timestamp ("server/current-time",
 +      doc, xpathCtx, &current_time);
 +  if (status != 0)
 +  {
 +    ERROR ("bind plugin: Reading `server/current-time' failed.");
 +    return (-1);
 +  }
 +  DEBUG ("bind plugin: Current server time is %i.", (int) current_time);
 +
 +  if (version == 3)
 +  {
 +    bind_xml_stats_v3(doc, xpathCtx, statsnode, current_time);
 +  }
 +  else
 +  {
 +    bind_xml_stats_v1_v2(version, doc, xpathCtx, statsnode, current_time);
 +  }
  
    /* XPath:  memory/summary
     * Variables: TotalUse, InUse, BlockSize, ContextSize, Lost
 -   * Layout: v2:
 +   * Layout: v2 and v3:
     *   <summary>
     *     <TotalUse>6587096</TotalUse>
     *     <InUse>1345424</InUse>
@@@ -1460,64 -1163,6 +1460,64 @@@ static int bind_xml (const char *data) 
      return (-1);
    }
  
 +  //
 +  // version 3.* of statistics XML (since BIND9.9)
 +  //
 +
 +  xpathObj = xmlXPathEvalExpression (BAD_CAST "/statistics", xpathCtx);
 +  if (xpathObj == NULL || xpathObj->nodesetval == NULL || xpathObj->nodesetval->nodeNr == 0)
 +  {
 +    DEBUG ("bind plugin: Statistics appears not to be v3");
 +    // we will fallback to v1 or v2 detection
 +    if (xpathObj != NULL) { xmlXPathFreeObject (xpathObj); }
 +  }
 +  else
 +  {
 +    for (i = 0; i < xpathObj->nodesetval->nodeNr; i++)
 +    {
 +      xmlNode *node;
 +      char *attr_version;
 +
 +      node = xpathObj->nodesetval->nodeTab[i];
 +      assert (node != NULL);
 +
 +      attr_version = (char *) xmlGetProp (node, BAD_CAST "version");
 +      if (attr_version == NULL)
 +      {
 +        NOTICE ("bind plugin: Found <statistics> tag doesn't have a "
 +            "`version' attribute.");
 +        continue;
 +      }
 +      DEBUG ("bind plugin: Found: <statistics version=\"%s\">", attr_version);
 +
 +      if (strncmp ("3.", attr_version, strlen ("3.")) != 0)
 +      {
 +        /* TODO: Use the complaint mechanism here. */
 +        NOTICE ("bind plugin: Found <statistics> tag with version `%s'. "
 +            "Unfortunately I have no clue how to parse that. "
 +            "Please open a bug report for this.", attr_version);
 +        xmlFree (attr_version);
 +        continue;
 +      }
 +      ret = bind_xml_stats (3, doc, xpathCtx, node);
 +
 +      xmlFree (attr_version);
 +      /* One <statistics> node ought to be enough. */
 +      break;
 +    }
 +
 +    // we are finished, early-return
 +    xmlXPathFreeObject (xpathObj);
 +    xmlXPathFreeContext (xpathCtx);
 +    xmlFreeDoc (doc);
 +
 +    return (ret);
 +  }
 +
 +  //
 +  // versions 1.* or 2.* of statistics XML
 +  //
 +
    xpathObj = xmlXPathEvalExpression (BAD_CAST "/isc/bind/statistics", xpathCtx);
    if (xpathObj == NULL)
    {
@@@ -1726,8 -1371,6 +1726,8 @@@ static int bind_config (oconfig_item_t 
        bind_config_add_view (child);
      else if (strcasecmp ("ParseTime", child->key) == 0)
        cf_util_get_boolean (child, &config_parse_time);
 +    else if (strcasecmp ("Timeout", child->key) == 0)
 +      cf_util_get_int (child, &timeout);
      else
      {
        WARNING ("bind plugin: Unknown configuration option "
@@@ -1752,16 -1395,11 +1752,16 @@@ static int bind_init (void) /* {{{ *
  
    curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L);
    curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, bind_curl_callback);
 -  curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
 +  curl_easy_setopt (curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, bind_curl_error);
    curl_easy_setopt (curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
    curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L);
    curl_easy_setopt (curl, CURLOPT_MAXREDIRS, 50L);
 +#ifdef HAVE_CURLOPT_TIMEOUT_MS
 +  curl_easy_setopt (curl, CURLOPT_TIMEOUT_MS, (timeout >= 0) ?
 +      (long) timeout : CDTIME_T_TO_MS(plugin_get_interval()));
 +#endif
 +
  
    return (0);
  } /* }}} int bind_init */
diff --combined src/collectd-perl.pod
@@@ -27,12 -27,6 +27,6 @@@ for collectd in Perl. This is a lot mor
  Perl-script every time you want to read a value with the C<exec plugin> (see
  L<collectd-exec(5)>) and provides a lot more functionality, too.
  
- When loading the C<perl plugin>, the B<Globals> option should be enabled.
- Else, the perl plugin will fail to load any Perl modules implemented in C,
- which includes, amongst many others, the B<threads> module used by the plugin
- itself. See the documentation of the B<Globals> option in L<collectd.conf(5)>
- for details.
  =head1 CONFIGURATION
  
  =over 4
@@@ -714,7 -708,7 +708,7 @@@ types used by the read, write and matc
  =item
  
  Please feel free to send in new plugins to collectd's mailing list at
 -E<lt>collectdE<nbsp>atE<nbsp>verplant.orgE<gt> for review and, possibly,
 +E<lt>collectdE<nbsp>atE<nbsp>collectd.orgE<gt> for review and, possibly,
  inclusion in the main distribution. In the latter case, we will take care of
  keeping the plugin up to date and adapting it to new versions of collectd.
  
@@@ -794,7 -788,7 +788,7 @@@ The C<perl plugin> has been written by 
  E<lt>shE<nbsp>atE<nbsp>tokkee.orgE<gt>.
  
  This manpage has been written by Florian Forster
 -E<lt>octoE<nbsp>atE<nbsp>verplant.orgE<gt> and Sebastian Harl
 +E<lt>octoE<nbsp>atE<nbsp>collectd.orgE<gt> and Sebastian Harl
  E<lt>shE<nbsp>atE<nbsp>tokkee.orgE<gt>.
  
  =cut
diff --combined src/collectd.conf.in
  #AutoLoadPlugin false
  
  #----------------------------------------------------------------------------#
 +# When enabled, internal statistics are collected, using "collectd" as the   #
 +# plugin name.                                                               #
 +# Disabled by default.                                                       #
 +#----------------------------------------------------------------------------#
 +#CollectInternalStats false
 +
 +#----------------------------------------------------------------------------#
  # Interval at which to query values. This may be overwritten on a per-plugin #
  # base by using the 'Interval' option of the LoadPlugin block:               #
  #   <LoadPlugin foo>                                                         #
  #----------------------------------------------------------------------------#
  #Interval     10
  
 -#Timeout      2
 -#ReadThreads  5
 -#WriteThreads 5
 +#MaxReadInterval 86400
 +#Timeout         2
 +#ReadThreads     5
 +#WriteThreads    5
  
  # Limit the size of the write queue. Default is no limit. Setting up a limit is
  # recommended for servers handling a high volume of traffic.
@@@ -60,7 -52,6 +60,7 @@@
  
  @LOAD_PLUGIN_SYSLOG@LoadPlugin syslog
  @LOAD_PLUGIN_LOGFILE@LoadPlugin logfile
 +@LOAD_PLUGIN_LOG_LOGSTASH@LoadPlugin log_logstash
  
  #<Plugin logfile>
  #     LogLevel @DEFAULT_LOG_LEVEL@
  #     PrintSeverity false
  #</Plugin>
  
 +#<Plugin log_logstash>
 +#     LogLevel @DEFAULT_LOG_LEVEL@
 +#     File "@localstatedir@/log/@PACKAGE_NAME@.json.log"
 +#</Plugin>
 +
  #<Plugin syslog>
  #     LogLevel @DEFAULT_LOG_LEVEL@
  #</Plugin>
  #@BUILD_PLUGIN_APPLE_SENSORS_TRUE@LoadPlugin apple_sensors
  #@BUILD_PLUGIN_AQUAERO_TRUE@LoadPlugin aquaero
  #@BUILD_PLUGIN_ASCENT_TRUE@LoadPlugin ascent
 +#@BUILD_PLUGIN_BAROMETER_TRUE@LoadPlugin barometer
  #@BUILD_PLUGIN_BATTERY_TRUE@LoadPlugin battery
  #@BUILD_PLUGIN_BIND_TRUE@LoadPlugin bind
 +#@BUILD_PLUGIN_CEPH_TRUE@LoadPlugin ceph
  #@BUILD_PLUGIN_CONNTRACK_TRUE@LoadPlugin conntrack
  #@BUILD_PLUGIN_CONTEXTSWITCH_TRUE@LoadPlugin contextswitch
  #@BUILD_PLUGIN_CGROUPS_TRUE@LoadPlugin cgroups
  #@BUILD_PLUGIN_DF_TRUE@LoadPlugin df
  #@BUILD_PLUGIN_DISK_TRUE@LoadPlugin disk
  #@BUILD_PLUGIN_DNS_TRUE@LoadPlugin dns
 +#@BUILD_PLUGIN_DRBD_TRUE@LoadPlugin drbd
  #@BUILD_PLUGIN_EMAIL_TRUE@LoadPlugin email
  #@BUILD_PLUGIN_ENTROPY_TRUE@LoadPlugin entropy
  #@BUILD_PLUGIN_ETHSTAT_TRUE@LoadPlugin ethstat
  #@BUILD_PLUGIN_GMOND_TRUE@LoadPlugin gmond
  #@BUILD_PLUGIN_HDDTEMP_TRUE@LoadPlugin hddtemp
  @BUILD_PLUGIN_INTERFACE_TRUE@@BUILD_PLUGIN_INTERFACE_TRUE@LoadPlugin interface
 +#@BUILD_PLUGIN_IPC_TRUE@@BUILD_PLUGIN_IPC_TRUE@LoadPlugin ipc
  #@BUILD_PLUGIN_IPTABLES_TRUE@LoadPlugin iptables
  #@BUILD_PLUGIN_IPMI_TRUE@LoadPlugin ipmi
  #@BUILD_PLUGIN_IPVS_TRUE@LoadPlugin ipvs
  #@BUILD_PLUGIN_IRQ_TRUE@LoadPlugin irq
  #@BUILD_PLUGIN_JAVA_TRUE@LoadPlugin java
 -#@BUILD_PLUGIN_LIBVIRT_TRUE@LoadPlugin libvirt
  @BUILD_PLUGIN_LOAD_TRUE@@BUILD_PLUGIN_LOAD_TRUE@LoadPlugin load
  #@BUILD_PLUGIN_LPAR_TRUE@LoadPlugin lpar
  #@BUILD_PLUGIN_LVM_TRUE@LoadPlugin lvm
  #@BUILD_PLUGIN_NUT_TRUE@LoadPlugin nut
  #@BUILD_PLUGIN_OLSRD_TRUE@LoadPlugin olsrd
  #@BUILD_PLUGIN_ONEWIRE_TRUE@LoadPlugin onewire
 +#@BUILD_PLUGIN_OPENLDAP_TRUE@LoadPlugin openldap
  #@BUILD_PLUGIN_OPENVPN_TRUE@LoadPlugin openvpn
  #@BUILD_PLUGIN_ORACLE_TRUE@LoadPlugin oracle
- #@BUILD_PLUGIN_PERL_TRUE@<LoadPlugin perl>
- #@BUILD_PLUGIN_PERL_TRUE@  Globals true
- #@BUILD_PLUGIN_PERL_TRUE@</LoadPlugin>
+ #@BUILD_PLUGIN_PERL_TRUE@LoadPlugin perl
  #@BUILD_PLUGIN_PINBA_TRUE@LoadPlugin pinba
  #@BUILD_PLUGIN_PING_TRUE@LoadPlugin ping
  #@BUILD_PLUGIN_POSTGRESQL_TRUE@LoadPlugin postgresql
  #@BUILD_PLUGIN_POWERDNS_TRUE@LoadPlugin powerdns
  #@BUILD_PLUGIN_PROCESSES_TRUE@LoadPlugin processes
  #@BUILD_PLUGIN_PROTOCOLS_TRUE@LoadPlugin protocols
- #@BUILD_PLUGIN_PYTHON_TRUE@<LoadPlugin python>
- #@BUILD_PLUGIN_PYTHON_TRUE@  Globals true
- #@BUILD_PLUGIN_PYTHON_TRUE@</LoadPlugin>
+ #@BUILD_PLUGIN_PYTHON_TRUE@LoadPlugin python
  #@BUILD_PLUGIN_REDIS_TRUE@LoadPlugin redis
  #@BUILD_PLUGIN_ROUTEROS_TRUE@LoadPlugin routeros
  #@BUILD_PLUGIN_RRDCACHED_TRUE@LoadPlugin rrdcached
  #@BUILD_PLUGIN_SENSORS_TRUE@LoadPlugin sensors
  #@BUILD_PLUGIN_SERIAL_TRUE@LoadPlugin serial
  #@BUILD_PLUGIN_SIGROK_TRUE@LoadPlugin sigrok
 +#@BUILD_PLUGIN_SMART_TRUE@LoadPlugin smart
  #@BUILD_PLUGIN_SNMP_TRUE@LoadPlugin snmp
  #@BUILD_PLUGIN_STATSD_TRUE@LoadPlugin statsd
  #@BUILD_PLUGIN_SWAP_TRUE@LoadPlugin swap
  #@BUILD_PLUGIN_UUID_TRUE@LoadPlugin uuid
  #@BUILD_PLUGIN_VARNISH_TRUE@LoadPlugin varnish
  #@BUILD_PLUGIN_MIC_TRUE@LoadPlugin mic
 +#@BUILD_PLUGIN_VIRT_TRUE@LoadPlugin virt
  #@BUILD_PLUGIN_VMEM_TRUE@LoadPlugin vmem
  #@BUILD_PLUGIN_VSERVER_TRUE@LoadPlugin vserver
  #@BUILD_PLUGIN_WIRELESS_TRUE@LoadPlugin wireless
  #@BUILD_PLUGIN_WRITE_GRAPHITE_TRUE@LoadPlugin write_graphite
  #@BUILD_PLUGIN_WRITE_HTTP_TRUE@LoadPlugin write_http
 +#@BUILD_PLUGIN_WRITE_KAFKA_TRUE@LoadPlugin write_kafka
 +#@BUILD_PLUGIN_WRITE_LOG_TRUE@LoadPlugin write_log
  #@BUILD_PLUGIN_WRITE_MONGODB_TRUE@LoadPlugin write_mongodb
  #@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_TSDB_TRUE@LoadPlugin write_tsdb
  #@BUILD_PLUGIN_XMMS_TRUE@LoadPlugin xmms
  #@BUILD_PLUGIN_ZFS_ARC_TRUE@LoadPlugin zfs_arc
 +#@BUILD_PLUGIN_ZOOKEEPER_TRUE@LoadPlugin zookeeper
  
  ##############################################################################
  # Plugin configuration                                                       #
  # ription of those options is available in the collectd.conf(5) manual page. #
  ##############################################################################
  
 -#<Plugin "aggregation">
 +#<Plugin aggregation>
  #  <Aggregation>
  #    #Host "unspecified"
  #    Plugin "cpu"
  #  </Aggregation>
  #</Plugin>
  
 -#<Plugin "amqp">
 +#<Plugin amqp>
  #  <Publish "name">
  #    Host "localhost"
  #    Port "5672"
  #    RoutingKey "collectd"
  #    Persistent false
  #    StoreRates false
 +#    ConnectionRetryDelay 0
  #  </Publish>
  #</Plugin>
  
  #     CACert "/etc/ssl/ca.crt"
  #</Plugin>
  
 +#<Plugin "barometer">
 +#   Device            "/dev/i2c-0";
 +#   Oversampling      512
 +#   PressureOffset    0.0
 +#   TemperatureOffset 0.0
 +#   Normalization     2
 +#   Altitude          238.0
 +#   TemperatureSensor "myserver/onewire-F10FCA000800/temperature"
 +#</Plugin>
 +
 +#<Plugin "battery">
 +#  ValuesPercentage false
 +#  ReportDegraded
 +#</Plugin>
 +
  #<Plugin "bind">
  #  URL "http://localhost:8053/"
  #  ParseTime       false
  #  </View>
  #</Plugin>
  
 +#<Plugin ceph>
 +#  LongRunAvgLatency false
 +#  ConvertSpecialMetricTypes true
 +#  <Daemon "osd.0">
 +#    SocketPath "/var/run/ceph/ceph-osd.0.asok"
 +#  </Daemon>
 +#  <Daemon "osd.1">
 +#    SocketPath "/var/run/ceph/ceph-osd.1.asok"
 +#  </Daemon>
 +#  <Daemon "mon.a">
 +#    SocketPath "/var/run/ceph/ceph-mon.ceph1.asok"
 +#  </Daemon>
 +#  <Daemon "mds.a">
 +#    SocketPath "/var/run/ceph/ceph-mds.ceph1.asok"
 +#  </Daemon>
 +#</Plugin>
 +
  #<Plugin cgroups>
  #  CGroup "libvirt"
  #  IgnoreSelected false
  #</Plugin>
  
 +#<Plugin cpu>
 +#  ReportByCpu true
 +#  ReportByState true
 +#  ValuesPercentage false
 +#</Plugin>
 +#
  #<Plugin csv>
  #     DataDir "@localstatedir@/lib/@PACKAGE_NAME@/csv"
  #     StoreRates false
  #    URL "http://finance.google.com/finance?q=NYSE%3AAMD"
  #    User "foo"
  #    Password "bar"
 +#    Digest false
 +#    VerifyPeer true
 +#    VerifyHost true
 +#    CACert "/path/to/ca.crt"
 +#    Header "X-Custom-Header: foobar"
 +#    Post "foo=bar"
 +#
  #    MeasureResponseTime false
 +#    MeasureResponseCode false
  #    <Match>
  #      Regex "<span +class=\"pr\"[^>]*> *([0-9]*\\.[0-9]+) *</span>"
  #      DSType "GaugeAverage"
  #  </URL>
  #</Plugin>
  
 -#<Plugin "curl_xml">
 +#<Plugin curl_xml>
  #  <URL "http://localhost/stats.xml">
  #    Host "my_host"
  #    Instance "some_instance"
  #    User "collectd"
  #    Password "thaiNg0I"
 +#    Digest false
  #    VerifyPeer true
  #    VerifyHost true
  #    CACert "/path/to/ca.crt"
 +#    Header "X-Custom-Header: foobar"
 +#    Post "foo=bar"
  #
  #    <XPath "table[@id=\"magic_level\"]/tr">
  #      Type "magic_level"
  #<Plugin disk>
  #     Disk "/^[hs]d[a-f][0-9]?$/"
  #     IgnoreSelected false
 +#     UseBSDName false
 +#     UdevNameAttr "DEVNAME"
  #</Plugin>
  
  #<Plugin dns>
  #     </Directory>
  #</Plugin>
  
 -#<Plugin "gmond">
 +#<Plugin gmond>
  #  MCReceiveFrom "239.2.11.71" "8649"
  #  <Metric "swap_total">
  #    Type "swap"
  #     IgnoreSelected true
  #</Plugin>
  
 -#<Plugin "java">
 +#<Plugin java>
  #     JVMArg "-verbose:jni"
  #     JVMArg "-Djava.class.path=@prefix@/share/collectd/java/collectd-api.jar"
  #
  #     </Plugin>
  #</Plugin>
  
 -#<Plugin libvirt>
 -#     Connection "xen:///"
 -#     RefreshInterval 60
 -#     Domain "name"
 -#     BlockDevice "name:device"
 -#     InterfaceDevice "name:device"
 -#     IgnoreSelected false
 -#     HostnameFormat name
 -#     InterfaceFormat name
 +#<Plugin load>
 +#        ReportRelative true
  #</Plugin>
  
  #<Plugin lpar>
  #     </Instance>
  #</Plugin>
  
 +#<Plugin memory>
 +#     ValuesAbsolute true
 +#     ValuesPercentage false
 +#</Plugin>
 +
  #<Plugin modbus>
  #     <Data "data_name">
  #             RegisterBase 1234
 +#             RegisterCmd ReadHolding
  #             RegisterType float
  #             Type gauge
  #             Instance "..."
  #             Password "secret"
  #             Database "db_name"
  #             MasterStats true
 +#             ConnectTimeout 10
 +#             InnodbStats true
  #     </Database>
  #
  #     <Database db_name2>
 +#             Alias "squeeze"
  #             Host "localhost"
  #             Socket "/var/run/mysql/mysqld.sock"
  #             SlaveStats true
  #             Username "user"
  #             Password "secret"
  #             Interface "eth0"
 +#             ResolveInterval 14400
  @LOAD_PLUGIN_NETWORK@ </Server>
  #     TimeToLive 128
  #
  #     IgnoreSelected false
  #</Plugin>
  
 +#<Plugin openldap>
 +#  <Instance "localhost">
 +#    URL "ldap://localhost:389"
 +#    StartTLS false
 +#    VerifyHost true
 +#    CACert "/path/to/ca.crt"
 +#    Timeout -1
 +#    Version 3
 +#  </Instance>
 +#</Plugin>
 +
  #<Plugin openvpn>
  #     StatusFile "/etc/openvpn/openvpn-status.log"
  #     ImprovedNamingSchema false
  #  </Device>
  #</Plugin>
  
 +#<Plugin smart>
 +#  Disk "/^[hs]d[a-f][0-9]?$/"
 +#  IgnoreSelected false
 +#</Plugin>
 +
  #<Plugin snmp>
  #   <Data "powerplus_voltge_input">
  #       Type "voltage"
  #  TimerCount     false
  #</Plugin>
  
 -#<Plugin "swap">
 +#<Plugin swap>
  #     ReportByDevice false
  #     ReportBytes true
 +#     ValuesAbsolute true
 +#     ValuesPercentage false
  #</Plugin>
  
 -#<Plugin "table">
 +#<Plugin table>
  #     <Table "/proc/slabinfo">
  #             Instance "slabinfo"
  #             Separator " "
  #     </Table>
  #</Plugin>
  
 -#<Plugin "tail">
 +#<Plugin tail>
  #  <File "/var/log/exim4/mainlog">
  #    Instance "exim"
 +#    Interval 60
  #    <Match>
  #      Regex "S=([1-9][0-9]*)"
  #      DSType "CounterAdd"
  #  </File>
  #</Plugin>
  
 -#<Plugin "tail_csv">
 +#<Plugin tail_csv>
  #   <Metric "dropped">
  #       Type "percent"
  #       Instance "dropped"
  
  #<Plugin tcpconns>
  #     ListeningPorts false
 +#     AllPortsSummary false
  #     LocalPort "25"
  #     RemotePort "25"
  #</Plugin>
  #   If you prefer defining another instance you can do
  #   so by using <Instance "myinstance">
  #   <Instance>
 -#      CollectCache true
  #      CollectBackend true
 -#      CollectBan false           # Varnish 3 only
 +#      CollectBan false           # Varnish 3 and above
 +#      CollectCache true
  #      CollectConnections true
  #      CollectDirectorDNS false   # Varnish 3 only
 -#      CollectSHM true
  #      CollectESI false
  #      CollectFetch false
  #      CollectHCB false
  #      CollectObjects false
  #      CollectPurge false         # Varnish 2 only
  #      CollectSession false
 +#      CollectSHM true
  #      CollectSMA false           # Varnish 2 only
  #      CollectSMS false
  #      CollectSM false            # Varnish 2 only
  #      CollectStruct false
  #      CollectTotals false
 -#      CollectUptime false
 +#      CollectUptime false        # Varnish 3 and above
  #      CollectVCL false
 +#      CollectVSM false           # Varnish 4 only
  #      CollectWorkers false
  #   </Instance>
  #</Plugin>
  
 +#<Plugin virt>
 +#     Connection "xen:///"
 +#     RefreshInterval 60
 +#     Domain "name"
 +#     BlockDevice "name:device"
 +#     InterfaceDevice "name:device"
 +#     IgnoreSelected false
 +#     HostnameFormat name
 +#     InterfaceFormat name
 +#     PluginInstanceFormat name
 +#</Plugin>
 +
  #<Plugin vmem>
  #     Verbose false
  #</Plugin>
  #</Plugin>
  
  #<Plugin write_http>
 -#     <URL "http://example.com/collectd-post">
 +#     <Node "example">
 +#             URL "http://example.com/collectd-post"
  #             User "collectd"
  #             Password "weCh3ik0"
  #             VerifyPeer true
  #             VerifyHost true
  #             CACert "/etc/ssl/ca.crt"
 +#             CAPath "/etc/ssl/certs/"
 +#             ClientKey "/etc/ssl/client.pem"
 +#             ClientCert "/etc/ssl/client.crt"
 +#             ClientKeyPass "secret"
 +#             SSLVersion "TLSv1"
  #             Format "Command"
  #             StoreRates false
 -#     </URL>
 +#             BufferSize 4096
 +#             LowSpeedLimit 0
 +#             Timeout 0
 +#     </Node>
 +#</Plugin>
 +
 +#<Plugin write_kafka>
 +#  Property "metadata.broker.list" "localhost:9092"
 +#  <Topic "collectd">
 +#    Format JSON
 +#  </Topic>
  #</Plugin>
  
  #<Plugin write_mongodb>
  #     <Node "example">
  #             Host "localhost"
  #             Port 5555
 -#             Protocol UDP
 +#             Protocol TCP
 +#             Batch true
 +#             BatchMaxSize 8192
  #             StoreRates true
  #             AlwaysAppendDS false
  #             TTLFactor 2.0
 +#             Notifications true
 +#             CheckThresholds false
 +#             EventServicePrefix ""
 +#     </Node>
 +#     Tag "foobar"
 +#     Attribute "foo" "bar"
 +#</Plugin>
 +
 +#<Plugin write_sensu>
 +#     <Node "example">
 +#             Host "localhost"
 +#             Port 3030
 +#             StoreRates true
 +#             AlwaysAppendDS false
 +#             Notifications true
 +#             Metrics true
 +#             EventServicePrefix ""
 +#             MetricHandler "influx"
 +#             MetricHandler "default"
 +#             NotificationHandler "flapjack"
 +#             NotificationHandler "howling_monkey"
  #     </Node>
  #     Tag "foobar"
 +#     Attribute "foo" "bar"
 +#</Plugin>
 +
 +#<Plugin write_tsdb>
 +#     <Node>
 +#             Host "localhost"
 +#             Port "4242"
 +#             HostTags "status=production"
 +#             StoreRates false
 +#             AlwaysAppendDS false
 +#     </Node>
 +#</Plugin>
 +
 +#<Plugin zookeeper>
 +#    Host "localhost"
 +#    Port "2181"
  #</Plugin>
  
  ##############################################################################
  ##############################################################################
  
  #@BUILD_PLUGIN_THRESHOLD_TRUE@LoadPlugin "threshold"
 -#<Plugin "threshold">
 +#<Plugin threshold>
  #  <Type "foo">
  #    WarningMin    0.00
  #    WarningMax 1000.00
diff --combined src/collectd.conf.pod
@@@ -9,17 -9,17 +9,17 @@@ collectd.conf - Configuration for the s
    BaseDir "/var/lib/collectd"
    PIDFile "/run/collectd.pid"
    Interval 10.0
 -  
 +
    LoadPlugin cpu
    LoadPlugin load
 -  
 +
    <LoadPlugin df>
      Interval 3600
    </LoadPlugin>
    <Plugin df>
      ValuesPercentage true
    </Plugin>
 -  
 +
    LoadPlugin ping
    <Plugin ping>
      Host "example.org"
@@@ -98,7 -98,6 +98,6 @@@ Options inside a B<LoadPlugin> block ca
  influence the way plugins are loaded, e.g.:
  
   <LoadPlugin perl>
-    Globals true
     Interval 60
   </LoadPlugin>
  
@@@ -146,18 -145,6 +145,18 @@@ B<E<lt>PluginE<nbsp>...E<gt>> block act
  B<LoadPlugin> statement. B<LoadPlugin> statements are still required for
  plugins that don't provide any configuration, e.g. the I<Load plugin>.
  
 +=item B<CollectInternalStats> B<false>|B<true>
 +
 +When set to B<true>, various statistics about the I<collectd> daemon will be
 +collected, with "collectd" as the I<plugin name>. Defaults to B<false>.
 +
 +The "write_queue" I<plugin instance> reports the number of elements currently
 +queued and the number of elements dropped off the queue by the
 +B<WriteQueueLimitLow>/B<WriteQueueLimitHigh> mechanism.
 +
 +The "cache" I<plugin instance> reports the number of elements in the value list
 +cache (the cache you can interact with using L<collectd-unixsock(5)>).
 +
  =item B<Include> I<Path> [I<pattern>]
  
  If I<Path> points to a file, includes that file. If I<Path> points to a
@@@ -230,14 -217,6 +229,14 @@@ B<Warning:> You should set this once an
  I<you will have to delete all your RRD files> or know some serious RRDtool
  magic! (Assuming you're using the I<RRDtool> or I<RRDCacheD> plugin.)
  
 +=item B<MaxReadInterval> I<Seconds>
 +
 +Read plugin doubles interval between queries after each failed attempt
 +to get data.
 +
 +This options limits the maximum value of the interval. The default value is
 +B<86400>.
 +
  =item B<Timeout> I<Iterations>
  
  Consider a value list "missing" when no update has been read or received for
@@@ -288,11 -267,8 +287,11 @@@ If B<WriteQueueLimitHigh> is set to non
  unset, the latter will default to half of B<WriteQueueLimitHigh>.
  
  If you do not want to randomly drop values when the queue size is between
 -I<LowNum> and I<HighNum>, set If B<WriteQueueLimitHigh> and
 -B<WriteQueueLimitLow> to same value.
 +I<LowNum> and I<HighNum>, set B<WriteQueueLimitHigh> and B<WriteQueueLimitLow>
 +to the same value.
 +
 +Enabling the B<CollectInternalStats> option is of great help to figure out the
 +values to set B<WriteQueueLimitHigh> and B<WriteQueueLimitLow> to.
  
  =item B<Hostname> I<Name>
  
@@@ -370,10 -346,10 +369,10 @@@ The full example configuration looks li
     <Aggregation>
       Plugin "cpu"
       Type "cpu"
 -     
 +
       GroupBy "Host"
       GroupBy "TypeInstance"
 -     
 +
       CalculateSum true
       CalculateAverage true
     </Aggregation>
@@@ -449,13 -425,13 +448,13 @@@ The following example calculates the av
       Plugin "cpu"
       PluginInstance "/[0,2,4,6,8]$/"
       Type "cpu"
 -     
 +
       SetPlugin "cpu"
       SetPluginInstance "even-%{aggregation}"
 -     
 +
       GroupBy "Host"
       GroupBy "TypeInstance"
 -     
 +
       CalculateAverage true
     </Aggregation>
   </Plugin>
@@@ -519,7 -495,6 +518,7 @@@ possibly filtering or messages
   #   ExchangeType "fanout"
   #   RoutingKey "collectd"
   #   Persistent false
 + #   ConnectionRetryDelay 0
   #   Format "command"
   #   StoreRates false
   #   GraphitePrefix "collectd."
   #   GraphiteSeparateInstances false
   #   GraphiteAlwaysAppendDS false
     </Publish>
 -   
 +
     # Receive values from an AMQP broker
     <Subscribe "some_name">
       Host "localhost"
       Exchange "amq.fanout"
   #   ExchangeType "fanout"
   #   Queue "queue_name"
 + #   QueueDurable false
 + #   QueueAutoDelete true
   #   RoutingKey "collectd.#"
 + #   ConnectionRetryDelay 0
     </Subscribe>
   </Plugin>
  
@@@ -593,23 -565,9 +592,23 @@@ be bound to this exchange
  
  =item B<Queue> I<Queue> (Subscribe only)
  
 -Configures the I<queue> name to subscribe to. If no queue name was configures
 +Configures the I<queue> name to subscribe to. If no queue name was configured
  explicitly, a unique queue name will be created by the broker.
  
 +=item B<QueueDurable> B<true>|B<false> (Subscribe only)
 +
 +Defines if the I<queue> subscribed to is durable (saved to persistent storage)
 +or transient (will disappear if the AMQP broker is restarted). Defaults to
 +"false".
 +
 +This option should be used in conjunction with the I<Persistent> option on the
 +publish side.
 +
 +=item B<QueueAutoDelete> B<true>|B<false> (Subscribe only)
 +
 +Defines if the I<queue> subscribed to will be deleted once the last consumer
 +unsubscribes. Defaults to "true".
 +
  =item B<RoutingKey> I<Key>
  
  In I<Publish> blocks, this configures the routing key to set on all outgoing
@@@ -632,13 -590,6 +631,13 @@@ mode will be used, i.e. delivery is gua
  default), the I<transient> delivery mode will be used, i.e. messages may be
  lost due to high load, overflowing queues or similar issues.
  
 +=item B<ConnectionRetryDelay> I<Delay>
 +
 +When the connection to the AMQP broker is lost, defines the time in seconds to
 +wait before attempting to reconnect. Defaults to 0, which implies collectd will
 +attempt to reconnect at each read interval (in Subscribe mode) or each time
 +values are ready for submission (in Publish mode).
 +
  =item B<Format> B<Command>|B<JSON>|B<Graphite> (Publish only)
  
  Selects the format in which messages are sent to the broker. If set to
@@@ -775,18 -726,6 +774,18 @@@ File that holds one or more SSL certifi
  possibly need this option. What CA certificates come bundled with C<libcurl>
  and are checked by default depends on the distribution you use.
  
 +=item B<SSLCiphers> I<list of ciphers>
 +
 +Specifies which ciphers to use in the connection. The list of ciphers
 +must specify valid ciphers. See
 +L<http://www.openssl.org/docs/apps/ciphers.html> for details.
 +
 +=item B<Timeout> I<Milliseconds>
 +
 +The B<Timeout> option sets the overall timeout for HTTP requests to B<URL>, in
 +milliseconds. By default, the configured B<Interval> is used to set the
 +timeout.
 +
  =back
  
  =head2 Plugin C<apcups>
@@@ -875,204 -814,6 +874,204 @@@ File that holds one or more SSL certifi
  possibly need this option. What CA certificates come bundled with C<libcurl>
  and are checked by default depends on the distribution you use.
  
 +=item B<Timeout> I<Milliseconds>
 +
 +The B<Timeout> option sets the overall timeout for HTTP requests to B<URL>, in
 +milliseconds. By default, the configured B<Interval> is used to set the
 +timeout.
 +
 +=back
 +
 +=head2 Plugin C<barometer>
 +
 +This plugin reads absolute air pressure using digital barometer sensor on a I2C
 +bus. Supported sensors are:
 +
 +=over 5
 +
 +=item I<MPL115A2> from Freescale,
 +see L<http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPL115A>.
 +
 +
 +=item I<MPL3115> from Freescale
 +see L<http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MPL3115A2>.
 +
 +
 +=item I<BMP085> from Bosch Sensortec
 +
 +=back
 +
 +The sensor type - one of the above - is detected automatically by the plugin
 +and indicated in the plugin_instance (you will see subdirectory
 +"barometer-mpl115" or "barometer-mpl3115", or "barometer-bmp085"). The order of
 +detection is BMP085 -> MPL3115 -> MPL115A2, the first one found will be used
 +(only one sensor can be used by the plugin).
 +
 +The plugin provides absolute barometric pressure, air pressure reduced to sea
 +level (several possible approximations) and as an auxiliary value also internal
 +sensor temperature. It uses (expects/provides) typical metric units - pressure
 +in [hPa], temperature in [C], altitude in [m].
 +
 +It was developed and tested under Linux only. The only platform dependency is
 +the standard Linux i2c-dev interface (the particular bus driver has to
 +support the SM Bus command subset).
 +
 +The reduction or normalization to mean sea level pressure requires (depending
 +on selected method/approximation) also altitude and reference to temperature
 +sensor(s).  When multiple temperature sensors are configured the minumum of
 +their values is always used (expecting that the warmer ones are affected by
 +e.g. direct sun light at that moment).
 +
 +Synopsis:
 +
 +  <Plugin "barometer">
 +     Device            "/dev/i2c-0";
 +     Oversampling      512
 +     PressureOffset    0.0
 +     TemperatureOffset 0.0
 +     Normalization     2
 +     Altitude          238.0
 +     TemperatureSensor "myserver/onewire-F10FCA000800/temperature"
 +  </Plugin>
 +
 +=over 4
 +
 +=item B<Device> I<device>
 +
 +The only mandatory configuration parameter.
 +
 +Device name of the I2C bus to which the sensor is connected. Note that
 +typically you need to have loaded the i2c-dev module.
 +Using i2c-tools you can check/list i2c buses available on your system by:
 +
 +  i2cdetect -l
 +
 +Then you can scan for devices on given bus. E.g. to scan the whole bus 0 use:
 +
 +  i2cdetect -y -a 0
 +
 +This way you should be able to verify that the pressure sensor (either type) is
 +connected and detected on address 0x60.
 +
 +=item B<Oversampling> I<value>
 +
 +Optional parameter controlling the oversampling/accuracy. Default value
 +is 1 providing fastest and least accurate reading.
 +
 +For I<MPL115> this is the size of the averaging window. To filter out sensor
 +noise a simple averaging using floating window of this configurable size is
 +used. The plugin will use average of the last C<value> measurements (value of 1
 +means no averaging).  Minimal size is 1, maximal 1024.
 +
 +For I<MPL3115> this is the oversampling value. The actual oversampling is
 +performed by the sensor and the higher value the higher accuracy and longer
 +conversion time (although nothing to worry about in the collectd context).
 +Supported values are: 1, 2, 4, 8, 16, 32, 64 and 128. Any other value is
 +adjusted by the plugin to the closest supported one.
 +
 +For I<BMP085> this is the oversampling value. The actual oversampling is
 +performed by the sensor and the higher value the higher accuracy and longer
 +conversion time (although nothing to worry about in the collectd context).
 +Supported values are: 1, 2, 4, 8. Any other value is adjusted by the plugin to
 +the closest supported one.
 +
 +=item B<PressureOffset> I<offset>
 +
 +Optional parameter for MPL3115 only.
 +
 +You can further calibrate the sensor by supplying pressure and/or temperature
 +offsets.  This is added to the measured/caclulated value (i.e. if the measured
 +value is too high then use negative offset).
 +In hPa, default is 0.0.
 +
 +=item B<TemperatureOffset> I<offset>
 +
 +Optional parameter for MPL3115 only.
 +
 +You can further calibrate the sensor by supplying pressure and/or temperature
 +offsets.  This is added to the measured/caclulated value (i.e. if the measured
 +value is too high then use negative offset).
 +In C, default is 0.0.
 +
 +=item B<Normalization> I<method>
 +
 +Optional parameter, default value is 0.
 +
 +Normalization method - what approximation/model is used to compute the mean sea
 +level pressure from the air absolute pressure.
 +
 +Supported values of the C<method> (integer between from 0 to 2) are:
 +
 +=over 5
 +
 +=item B<0> - no conversion, absolute pressure is simply copied over. For this method you
 +       do not need to configure C<Altitude> or C<TemperatureSensor>.
 +
 +=item B<1> - international formula for conversion ,
 +See
 +L<http://en.wikipedia.org/wiki/Atmospheric_pressure#Altitude_atmospheric_pressure_variation>.
 +For this method you have to configure C<Altitude> but do not need
 +C<TemperatureSensor> (uses fixed global temperature average instead).
 +
 +=item B<2> - formula as recommended by the Deutsche Wetterdienst (German
 +Meteorological Service).
 +See L<http://de.wikipedia.org/wiki/Barometrische_H%C3%B6henformel#Theorie>
 +For this method you have to configure both  C<Altitude> and
 +C<TemperatureSensor>.
 +
 +=back
 +
 +
 +=item B<Altitude> I<altitude>
 +
 +The altitude (in meters) of the location where you meassure the pressure.
 +
 +=item B<TemperatureSensor> I<reference>
 +
 +Temperature sensor(s) which should be used as a reference when normalizing the
 +pressure using C<Normalization> method 2.
 +When specified more sensors a minumum is found and used each time.  The
 +temperature reading directly from this pressure sensor/plugin is typically not
 +suitable as the pressure sensor will be probably inside while we want outside
 +temperature.  The collectd reference name is something like
 +<hostname>/<plugin_name>-<plugin_instance>/<type>-<type_instance>
 +(<type_instance> is usually omitted when there is just single value type). Or
 +you can figure it out from the path of the output data files.
 +
 +=back
 +
 +=head2 Plugin C<battery>
 +
 +The I<battery plugin> reports the remaining capacity, power and voltage of
 +laptop batteries.
 +
 +=over 4
 +
 +=item B<ValuesPercentage> B<false>|B<true>
 +
 +When enabled, remaining capacity is reported as a percentage, e.g. "42%
 +capacity remaining". Otherwise the capacity is stored as reported by the
 +battery, most likely in "Wh". This option does not work with all input methods,
 +in particular when only C</proc/pmu> is available on an old Linux system.
 +Defaults to B<false>.
 +
 +=item B<ReportDegraded> B<false>|B<true>
 +
 +Typical laptop batteries degrade over time, meaning the capacity decreases with
 +recharge cycles. The maximum charge of the previous charge cycle is tracked as
 +"last full capacity" and used to determine that a battery is "fully charged".
 +
 +When this option is set to B<false>, the default, the I<battery plugin> will
 +only report the remaining capacity. If the B<ValuesPercentage> option is
 +enabled, the relative remaining capacity is calculated as the ratio of the
 +"remaining capacity" and the "last full capacity". This is what most tools,
 +such as the status bar of desktop environments, also do.
 +
 +When set to B<true>, the battery plugin will report three values: B<charged>
 +(remaining capacity), B<discharged> (difference between "last full capacity"
 +and "remaining capacity") and B<degraded> (difference between "design capacity"
 +and "last full capacity").
 +
  =back
  
  =head2 Plugin C<bind>
@@@ -1101,17 -842,17 +1100,17 @@@ Synopsis
     ParseTime       false
     OpCodes         true
     QTypes          true
 - 
 +
     ServerStats     true
     ZoneMaintStats  true
     ResolverStats   false
     MemoryStats     true
 - 
 +
     <View "_default">
       QTypes        true
       ResolverStats true
       CacheRRSets   true
 - 
 +
       Zone "127.in-addr.arpa/IN"
     </View>
   </Plugin>
@@@ -1178,12 -919,6 +1177,12 @@@ Collect global memory statistics
  
  Default: Enabled.
  
 +=item B<Timeout> I<Milliseconds>
 +
 +The B<Timeout> option sets the overall timeout for HTTP requests to B<URL>, in
 +milliseconds. By default, the configured B<Interval> is used to set the
 +timeout.
 +
  =item B<View> I<Name>
  
  Collect statistics about a specific I<"view">. BIND can behave different,
@@@ -1235,74 -970,6 +1234,74 @@@ By default no detailed zone informatio
  
  =back
  
 +=head2 Plugin C<ceph>
 +
 +The ceph plugin collects values from JSON data to be parsed by B<libyajl>
 +(L<https://lloyd.github.io/yajl/>) retrieved from ceph daemon admin sockets.
 +
 +A separate B<Daemon> block must be configured for each ceph daemon to be
 +monitored. The following example will read daemon statistics from four
 +separate ceph daemons running on the same device (two OSDs, one MON, one MDS) :
 +
 +  <Plugin ceph>
 +    LongRunAvgLatency false
 +    ConvertSpecialMetricTypes true
 +    <Daemon "osd.0">
 +      SocketPath "/var/run/ceph/ceph-osd.0.asok"
 +    </Daemon>
 +    <Daemon "osd.1">
 +      SocketPath "/var/run/ceph/ceph-osd.1.asok"
 +    </Daemon>
 +    <Daemon "mon.a">
 +      SocketPath "/var/run/ceph/ceph-mon.ceph1.asok"
 +    </Daemon>
 +    <Daemon "mds.a">
 +      SocketPath "/var/run/ceph/ceph-mds.ceph1.asok"
 +    </Daemon>
 +  </Plugin>
 +
 +The ceph plugin accepts the following configuration options:
 +
 +=over 4
 +
 +=item B<LongRunAvgLatency> B<true>|B<false>
 +
 +If enabled, latency values(sum,count pairs) are calculated as the long run
 +average - average since the ceph daemon was started = (sum / count).
 +When disabled, latency values are calculated as the average since the last
 +collection = (sum_now - sum_last) / (count_now - count_last).
 +
 +Default: Disabled
 +
 +=item B<ConvertSpecialMetricTypes> B<true>|B<false>
 +
 +If enabled, special metrics (metrics that differ in type from similar counters)
 +are converted to the type of those similar counters. This currently only
 +applies to filestore.journal_wr_bytes which is a counter for OSD daemons. The
 +ceph schema reports this metric type as a sum,count pair while similar counters
 +are treated as derive types. When converted, the sum is used as the counter
 +value and is treated as a derive type.
 +When disabled, all metrics are treated as the types received from the ceph schema.
 +
 +Default: Enabled
 +
 +=back
 +
 +Each B<Daemon> block must have a string argument for the plugin instance name.
 +A B<SocketPath> is also required for each B<Daemon> block:
 +
 +=over 4
 +
 +=item B<Daemon> I<DaemonName>
 +
 +Name to be used as the instance name for this daemon.
 +
 +=item B<SocketPath> I<SocketPath>
 +
 +Specifies the path to the UNIX admin socket of the ceph daemon.
 +
 +=back
 +
  =head2 Plugin C<cgroups>
  
  This plugin collects the CPU user/system time for each I<cgroup> by reading the
@@@ -1326,68 -993,6 +1325,68 @@@ at all, B<all> cgroups are selected
  
  =back
  
 +=head2 Plugin C<conntrack>
 +
 +This plugin collects IP conntrack statistics.
 +
 +=over 4
 +
 +=item B<OldFiles>
 +
 +Assume the B<conntrack_count> and B<conntrack_max> files to be found in
 +F</proc/sys/net/ipv4/netfilter> instead of F</proc/sys/net/netfilter/>.
 +
 +=back
 +
 +=head2 Plugin C<cpu>
 +
 +The I<CPU plugin> collects CPU usage metrics. By default, CPU usage is reported
 +as Jiffies, using the C<cpu> type. Two aggregations are available:
 +
 +=over 4
 +
 +=item
 +
 +Sum, per-state, over all CPUs installed in the system; and
 +
 +=item
 +
 +Sum, per-CPU, over all non-idle states of a CPU, creating an "active" state.
 +
 +=back
 +
 +The two aggregations can be combined, leading to I<collectd> only emitting a
 +single "active" metric for the entire system. As soon as one of these
 +aggregations (or both) is enabled, the I<cpu plugin> will report a percentage,
 +rather than Jiffies. In addition, you can request individual, per-state,
 +per-CPU metrics to be reported as percentage.
 +
 +The following configuration options are available:
 +
 +=over 4
 +
 +=item B<ReportByState> B<true>|B<false>
 +
 +When set to B<true>, the default, reports per-state metrics, e.g. "system",
 +"user" and "idle".
 +When set to B<false>, aggregates (sums) all I<non-idle> states into one
 +"active" metric.
 +
 +=item B<ReportByCpu> B<true>|B<false>
 +
 +When set to B<true>, the default, reports per-CPU (per-core) metrics.
 +When set to B<false>, instead of reporting metrics for individual CPUs, only a
 +global sum of CPU states is emitted.
 +
 +=item B<ValuesPercentage> B<false>|B<true>
 +
 +This option is only considered when both, B<ReportByCpu> and B<ReportByState>
 +are set to B<true>. In this case, by default, metrics will be reported as
 +Jiffies. By setting this option to B<true>, you can request percentage values
 +in the un-aggregated (per-CPU, per-state) mode as well.
 +
 +=back
 +
  =head2 Plugin C<cpufreq>
  
  This plugin doesn't have any options. It reads
@@@ -1430,16 -1035,6 +1429,16 @@@ finance page and dispatch the value to 
        URL "http://finance.google.com/finance?q=NYSE%3AAMD"
        User "foo"
        Password "bar"
 +      Digest false
 +      VerifyPeer true
 +      VerifyHost true
 +      CACert "/path/to/ca.crt"
 +      Header "X-Custom-Header: foobar"
 +      Post "foo=bar"
 +
 +      MeasureResponseTime false
 +      MeasureResponseCode false
 +
        <Match>
          Regex "<span +class=\"pr\"[^>]*> *([0-9]*\\.[0-9]+) *</span>"
          DSType "GaugeAverage"
@@@ -1471,10 -1066,6 +1470,10 @@@ Username to use if authorization is req
  
  Password to use if authorization is required to read the page.
  
 +=item B<Digest> B<true>|B<false>
 +
 +Enable HTTP digest authentication.
 +
  =item B<VerifyPeer> B<true>|B<false>
  
  Enable or disable peer SSL certificate verification. See
@@@ -1512,35 -1103,13 +1511,35 @@@ C<application/x-www-form-urlencoded>)
  Measure response time for the request. If this setting is enabled, B<Match>
  blocks (see below) are optional. Disabled by default.
  
 +Beware that requests will get aborted if they take too long to complete. Adjust
 +B<Timeout> accordingly if you expect B<MeasureResponseTime> to report such slow
 +requests.
 +
 +=item B<MeasureResponseCode> B<true>|B<false>
 +
 +Measure response code for the request. If this setting is enabled, B<Match>
 +blocks (see below) are optional. Disabled by default.
 +
  =item B<E<lt>MatchE<gt>>
  
  One or more B<Match> blocks that define how to match information in the data
  returned by C<libcurl>. The C<curl> plugin uses the same infrastructure that's
  used by the C<tail> plugin, so please see the documentation of the C<tail>
 -plugin below on how matches are defined. If the B<MeasureResponseTime> option
 -is set to B<true>, B<Match> blocks are optional.
 +plugin below on how matches are defined. If the B<MeasureResponseTime> or
 +B<MeasureResponseCode> options are set to B<true>, B<Match> blocks are
 +optional.
 +
 +=item B<Timeout> I<Milliseconds>
 +
 +The B<Timeout> option sets the overall timeout for HTTP requests to B<URL>, in
 +milliseconds. By default, the configured B<Interval> is used to set the
 +timeout. Prior to version 5.5.0, there was no timeout and requests could hang
 +indefinitely. This legacy behaviour can be achieved by setting the value of
 +B<Timeout> to 0.
 +
 +If B<Timeout> is 0 or bigger than the B<Interval>, keep in mind that each slow
 +network connection will stall one read thread. Adjust the B<ReadThreads> global
 +setting accordingly to prevent this from blocking other plugins.
  
  =back
  
@@@ -1607,29 -1176,14 +1606,29 @@@ The following options are valid within 
  
  Sets the plugin instance to I<Instance>.
  
 +=item B<Interval> I<Interval>
 +
 +Sets the interval (in seconds) in which the values will be collected from this
 +URL. By default the global B<Interval> setting will be used.
 +
  =item B<User> I<Name>
 +
  =item B<Password> I<Password>
 +
 +=item B<Digest> B<true>|B<false>
 +
  =item B<VerifyPeer> B<true>|B<false>
 +
  =item B<VerifyHost> B<true>|B<false>
 +
  =item B<CACert> I<file>
 +
  =item B<Header> I<Header>
 +
  =item B<Post> I<Body>
  
 +=item B<Timeout> I<Milliseconds>
 +
  These options behave exactly equivalent to the appropriate options of the
  I<cURL> plugin. Please see there for a detailed description.
  
@@@ -1665,8 -1219,6 +1664,8 @@@ The B<curl_xml plugin> uses B<libcurl> 
       VerifyPeer true
       VerifyHost true
       CACert "/path/to/ca.crt"
 +     Header "X-Custom-Header: foobar"
 +     Post "foo=bar"
  
       <XPath "table[@id=\"magic_level\"]/tr">
         Type "magic_level"
@@@ -1718,8 -1270,6 +1717,8 @@@ Examples
  
  =item B<Password> I<Password>
  
 +=item B<Digest> B<true>|B<false>
 +
  =item B<VerifyPeer> B<true>|B<false>
  
  =item B<VerifyHost> B<true>|B<false>
  
  =item B<Post> I<Body>
  
 +=item B<Timeout> I<Milliseconds>
 +
  These options behave exactly equivalent to the appropriate options of the
  I<cURL plugin>. Please see there for a detailed description.
  
@@@ -1961,16 -1509,6 +1960,16 @@@ it should be able to handle integer an 
  
  There must be at least one B<ValuesFrom> option inside each B<Result> block.
  
 +=item B<MetadataFrom> [I<column0> I<column1> ...]
 +
 +Names the columns whose content is used as metadata for the data sets
 +that are dispatched to the daemon.
 +
 +The actual data type in the columns is not that important. The plugin will
 +automatically cast the values to the right type if it know how to do that. So
 +it should be able to handle integer an floating point types, as well as strings
 +(if they include a number at the beginning).
 +
  =back
  
  =head3 B<Database> blocks
@@@ -2085,17 -1623,17 +2084,17 @@@ transfer agents and web caches
  
  =item B<ValuesAbsolute> B<true>|B<false>
  
 -Enables or disables reporting of free, used and used disk space in 1K-blocks. 
 -Defaults to true.
 +Enables or disables reporting of free and used disk space in 1K-blocks.
 +Defaults to B<true>.
  
 -=item B<ValuesPercentage> B<true>|B<false>
 +=item B<ValuesPercentage> B<false>|B<true>
  
 -Enables or disables reporting of free, used and used disk space in percentage.
 -Defaults to false.
 +Enables or disables reporting of free and used disk space in percentage.
 +Defaults to B<false>.
  
 -This is useful for deploying collectd on the cloud, where machines with
 -different disk size may exist. Then it is more practical to configure thresholds
 -based on relative disk size.
 +This is useful for deploying I<collectd> on the cloud, where machines with
 +different disk size may exist. Then it is more practical to configure
 +thresholds based on relative disk size.
  
  =back
  
@@@ -2131,20 -1669,6 +2130,20 @@@ collected. If at least one B<Disk> opti
  set to B<false>, B<only> matching disks will be collected. If B<IgnoreSelected>
  is set to B<true>, all disks are collected B<except> the ones matched.
  
 +=item B<UseBSDName> B<true>|B<false>
 +
 +Whether to use the device's "BSD Name", on MacE<nbsp>OSE<nbsp>X, instead of the
 +default major/minor numbers. Requires collectd to be built with Apple's
 +IOKitLib support.
 +
 +=item B<UdevNameAttr> I<Attribute>
 +
 +Attempt to override disk instance name with the value of a specified udev
 +attribute when built with B<libudev>.  If the attribute is not defined for the
 +given device, the default name is used. Example:
 +
 +  UdevNameAttr "DM_NAME"
 +
  =back
  
  =head2 Plugin C<dns>
@@@ -2608,63 -2132,94 +2607,63 @@@ independent from the I<JavaClass> argum
  
  =back
  
 -=head2 Plugin C<libvirt>
 +=head2 Plugin C<load>
  
 -This plugin allows CPU, disk and network load to be collected for virtualized
 -guests on the machine. This means that these characteristics can be collected
 -for guest systems without installing any software on them - collectd only runs
 -on the hosting system. The statistics are collected through libvirt
 -(L<http://libvirt.org/>).
 +The I<Load plugin> collects the system load. These numbers give a rough overview
 +over the utilization of a machine. The system load is defined as the number of
 +runnable tasks in the run-queue and is provided by many operating systems as a
 +one, five or fifteen minute average.
  
 -Only I<Connection> is required.
 +The following configuration options are available:
  
  =over 4
  
 -=item B<Connection> I<uri>
 +=item B<ReportRelative> B<false>|B<true>
  
 -Connect to the hypervisor given by I<uri>. For example if using Xen use:
 +When enabled, system load divided by number of available CPU cores is reported
 +for intervals 1 min, 5 min and 15 min. Defaults to false.
  
 - Connection "xen:///"
 +=back
  
 -Details which URIs allowed are given at L<http://libvirt.org/uri.html>.
  
 -=item B<RefreshInterval> I<seconds>
 +=head2 Plugin C<logfile>
  
 -Refresh the list of domains and devices every I<seconds>. The default is 60
 -seconds. Setting this to be the same or smaller than the I<Interval> will cause
 -the list of domains and devices to be refreshed on every iteration.
 +=over 4
  
 -Refreshing the devices in particular is quite a costly operation, so if your
 -virtualization setup is static you might consider increasing this. If this
 -option is set to 0, refreshing is disabled completely.
 +=item B<LogLevel> B<debug|info|notice|warning|err>
  
 -=item B<Domain> I<name>
 +Sets the log-level. If, for example, set to B<notice>, then all events with
 +severity B<notice>, B<warning>, or B<err> will be written to the logfile.
  
 -=item B<BlockDevice> I<name:dev>
 +Please note that B<debug> is only available if collectd has been compiled with
 +debugging support.
  
 -=item B<InterfaceDevice> I<name:dev>
 +=item B<File> I<File>
  
 -=item B<IgnoreSelected> I<true>|I<false>
 +Sets the file to write log messages to. The special strings B<stdout> and
 +B<stderr> can be used to write to the standard output and standard error
 +channels, respectively. This, of course, only makes much sense when I<collectd>
 +is running in foreground- or non-daemon-mode.
  
 -Select which domains and devices are collected.
 +=item B<Timestamp> B<true>|B<false>
  
 -If I<IgnoreSelected> is not given or I<false> then only the listed domains and
 -disk/network devices are collected.
 +Prefix all lines printed by the current time. Defaults to B<true>.
  
 -If I<IgnoreSelected> is I<true> then the test is reversed and the listed
 -domains and disk/network devices are ignored, while the rest are collected.
 +=item B<PrintSeverity> B<true>|B<false>
  
 -The domain name and device names may use a regular expression, if the name is
 -surrounded by I</.../> and collectd was compiled with support for regexps.
 +When enabled, all lines are prefixed by the severity of the log message, for
 +example "warning". Defaults to B<false>.
  
 -The default is to collect statistics for all domains and all their devices.
 +=back
  
 -Example:
 +B<Note>: There is no need to notify the daemon after moving or removing the
 +log file (e.E<nbsp>g. when rotating the logs). The plugin reopens the file
 +for each line it writes.
  
 - BlockDevice "/:hdb/"
 - IgnoreSelected "true"
 +=head2 Plugin C<log_logstash>
  
 -Ignore all I<hdb> devices on any domain, but other block devices (eg. I<hda>)
 -will be collected.
 -
 -=item B<HostnameFormat> B<name|uuid|hostname|...>
 -
 -When the libvirt plugin logs data, it sets the hostname of the collected data
 -according to this setting. The default is to use the guest name as provided by
 -the hypervisor, which is equal to setting B<name>.
 -
 -B<uuid> means use the guest's UUID. This is useful if you want to track the
 -same guest across migrations.
 -
 -B<hostname> means to use the global B<Hostname> setting, which is probably not
 -useful on its own because all guests will appear to have the same name.
 -
 -You can also specify combinations of these fields. For example B<name uuid>
 -means to concatenate the guest name and UUID (with a literal colon character
 -between, thus I<"foo:1234-1234-1234-1234">).
 -
 -=item B<InterfaceFormat> B<name>|B<address>
 -
 -When the libvirt plugin logs interface data, it sets the name of the collected
 -data according to this setting. The default is to use the path as provided by
 -the hypervisor (the "dev" property of the target node), which is equal to
 -setting B<name>.
 -
 -B<address> means use the interface's mac address. This is useful since the
 -interface path might change between reboots of a guest or across migrations.
 -
 -=back
 -
 -=head2 Plugin C<logfile>
 +The I<log logstash plugin> behaves like the logfile plugin but formats
 +messages as JSON events for logstash to parse and input.
  
  =over 4
  
@@@ -2683,6 -2238,15 +2682,6 @@@ B<stderr> can be used to write to the s
  channels, respectively. This, of course, only makes much sense when I<collectd>
  is running in foreground- or non-daemon-mode.
  
 -=item B<Timestamp> B<true>|B<false>
 -
 -Prefix all lines printed by the current time. Defaults to B<true>.
 -
 -=item B<PrintSeverity> B<true>|B<false>
 -
 -When enabled, all lines are prefixed by the severity of the log message, for
 -example "warning". Defaults to B<false>.
 -
  =back
  
  B<Note>: There is no need to notify the daemon after moving or removing the
@@@ -2862,7 -2426,7 +2861,7 @@@ B<Synopsis:
     ShowCPU true
     ShowCPUCores true
     ShowMemory true
 -   
 +
     ShowTemperatures true
     Temperature vddg
     Temperature vddq
     ShowPower true
     Power total0
     Power total1
 -   IgnoreSelectedPower true   
 +   IgnoreSelectedPower true
   </Plugin>
  
  The following options are valid inside the B<PluginE<nbsp>mic> block:
  
  =item B<ShowCPU> B<true>|B<false>
  
 -If enabled (the default) a sum of the CPU usage accross all cores is reported.
 +If enabled (the default) a sum of the CPU usage across all cores is reported.
  
  =item B<ShowCPUCores> B<true>|B<false>
  
@@@ -2928,7 -2492,7 +2927,7 @@@ Fan I
  
  =item fout
  
 -Fan Out 
 +Fan Out
  
  =item vccp
  
@@@ -2969,11 -2533,11 +2968,11 @@@ Known power names are
  
  =item total0
  
 -Total power utilization averaged over Time Window 0 (uWatts). 
 +Total power utilization averaged over Time Window 0 (uWatts).
  
  =item total1
  
 -Total power utilization averaged over Time Window 0 (uWatts). 
 +Total power utilization averaged over Time Window 0 (uWatts).
  
  =item inst
  
@@@ -2981,61 -2545,40 +2980,61 @@@ Instantaneous power (uWatts)
  
  =item imax
  
 -Max instantaneous power (uWatts). 
 +Max instantaneous power (uWatts).
  
  =item pcie
  
 -PCI-E connector power (uWatts). 
 +PCI-E connector power (uWatts).
  
  =item c2x3
  
 -2x3 connector power (uWatts). 
 +2x3 connector power (uWatts).
  
  =item c2x4
  
 -2x4 connector power (uWatts). 
 +2x4 connector power (uWatts).
  
  =item vccp
  
 -Core rail (uVolts). 
 +Core rail (uVolts).
  
  =item vddg
  
 -Uncore rail (uVolts). 
 +Uncore rail (uVolts).
  
  =item vddq
  
 -Memory subsystem rail (uVolts). 
 +Memory subsystem rail (uVolts).
  
  =back
  
  =back
  
 +=head2 Plugin C<memory>
 +
 +The I<memory plugin> provides the following configuration options:
 +
 +=over 4
 +
 +=item B<ValuesAbsolute> B<true>|B<false>
 +
 +Enables or disables reporting of physical memory usage in absolute numbers,
 +i.e. bytes. Defaults to B<true>.
 +
 +=item B<ValuesPercentage> B<false>|B<true>
 +
 +Enables or disables reporting of physical memory usage in percentages, e.g.
 +percent of physical memory used. Defaults to B<false>.
 +
 +This is useful for deploying I<collectd> in a heterogeneous environment in
 +which the sizes of physical memory vary.
 +
 +=back
 +
  =head2 Plugin C<modbus>
  
 -The B<modbus plugin> connects to a Modbus "slave" via Modbus/TCP and reads
 -register values. It supports reading single registers (unsigned 16E<nbsp>bit
 +The B<modbus plugin> connects to a Modbus "slave" via Modbus/TCP or Modbus/RTU and
 +reads register values. It supports reading single registers (unsigned 16E<nbsp>bit
  values), large integer values (unsigned 32E<nbsp>bit values) and floating point
  values (two registers interpreted as IEEE floats in big endian notation).
  
@@@ -3044,32 -2587,22 +3043,32 @@@ B<Synopsis:
   <Data "voltage-input-1">
     RegisterBase 0
     RegisterType float
 +   RegisterCmd ReadHolding
     Type voltage
     Instance "input-1"
   </Data>
 - 
 +
   <Data "voltage-input-2">
     RegisterBase 2
     RegisterType float
 +   RegisterCmd ReadHolding
     Type voltage
     Instance "input-2"
   </Data>
 - 
 +
 + <Data "supply-temperature-1">
 +   RegisterBase 0
 +   RegisterType Int16
 +   RegisterCmd ReadHolding
 +   Type temperature
 +   Instance "temp-1"
 + </Data>
 +
   <Host "modbus.example.com">
     Address "192.168.0.42"
     Port    "502"
     Interval 60
 -   
 +
     <Slave 1>
       Instance "power-supply"
       Collect  "voltage-input-1"
     </Slave>
   </Host>
  
 + <Host "localhost">
 +   Device "/dev/ttyUSB0"
 +   Baudrate 38400
 +   Interval 20
 +
 +   <Slave 1>
 +     Instance "temperature"
 +     Collect  "supply-temperature-1"
 +   </Slave>
 + </Host>
 +
  =over 4
  
  =item E<lt>B<Data> I<Name>E<gt> blocks
@@@ -3111,11 -2633,6 +3110,11 @@@ Specifies what kind of data is returne
  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>.
  
 +=item B<RegisterCmd> B<ReadHolding>|B<ReadInput>
 +
 +Specifies register type to be collected from device. Works only with libmodbus
 +2.9.2 or higher. Defaults to B<ReadHolding>.
 +
  =item B<Type> I<Type>
  
  Specifies the "type" (data set) to use when dispatching the value to
@@@ -3141,25 -2658,15 +3140,25 @@@ Within E<lt>HostE<nbsp>/E<gt> blocks, t
  
  =item B<Address> I<Hostname>
  
 -Specifies the node name (the actual network address) used to connect to the
 -host. This may be an IP address or a hostname. Please note that the used
 -I<libmodbus> library only supports IPv4 at the moment.
 +For Modbus/TCP, specifies the node name (the actual network address) used to
 +connect to the host. This may be an IP address or a hostname. Please note that
 +the used I<libmodbus> library only supports IPv4 at the moment.
  
  =item B<Port> I<Service>
  
 -Specifies the port used to connect to the host. The port can either be given as
 -a number or as a service name. Please note that the I<Service> argument must be
 -a string, even if ports are given in their numerical form. Defaults to "502".
 +for Modbus/TCP, specifies the port used to connect to the host. The port can
 +either be given as a number or as a service name. Please note that the
 +I<Service> argument must be a string, even if ports are given in their numerical
 +form. Defaults to "502".
 +
 +=item B<Device> I<Devicenode>
 +
 +For Modbus/RTU, specifies the path to the serial device being used.
 +
 +=item B<Baudrate> I<Baudrate>
 +
 +For Modbus/RTU, specifies the baud rate of the serial device.
 +Note, connections currently support only 8/N/1.
  
  =item B<Interval> I<Interval>
  
@@@ -3168,7 -2675,7 +3167,7 @@@ host. By default the global B<Interval
  
  =item E<lt>B<Slave> I<ID>E<gt>
  
 -Over each TCP connection, multiple Modbus devices may be reached. The slave ID
 +Over each connection, multiple Modbus devices may be reached. The slave ID
  is used to specify which device should be addressed. For each device you want
  to query, one B<Slave> block must be given.
  
@@@ -3226,11 -2733,9 +3225,11 @@@ Synopsis
        Password "password"
        Port "3306"
        MasterStats true
 +      ConnectTimeout 10
      </Database>
  
      <Database bar>
 +      Alias "squeeze"
        Host "localhost"
        Socket "/var/run/mysql/mysqld.sock"
        SlaveStats true
@@@ -3245,11 -2750,6 +3244,11 @@@ section "mysql_real_connect()" in the B
  
  =over 4
  
 +=item B<Alias> I<Alias>
 +
 +Alias to use as sender instead of hostname when reporting. This may be useful
 +when having cryptic hostnames.
 +
  =item B<Host> I<Hostname>
  
  Hostname of the database server. Defaults to B<localhost>.
@@@ -3288,11 -2788,6 +3287,11 @@@ only has any effect, if B<Host> is set 
  Otherwise, use the B<Port> option above. See the documentation for the
  C<mysql_real_connect> function for details.
  
 +=item B<InnodbStats> I<true|false>
 +
 +If enabled, metrics about the InnoDB storage engine are collected.
 +Disabled by default.
 +
  =item B<MasterStats> I<true|false>
  
  =item B<SlaveStats> I<true|false>
@@@ -3306,10 -2801,6 +3305,10 @@@ privileges. See the B<User> documentati
  If enabled, the plugin sends a notification if the replication slave I/O and /
  or SQL threads are not running. Defaults to B<false>.
  
 +=item B<ConnectTimeout> I<Seconds>
 +
 +Sets the connect timeout for the MySQL client.
 +
  =back
  
  =head2 Plugin C<netapp>
@@@ -3344,7 -2835,7 +3343,7 @@@ Required capabilities are documented be
      User          "username"
      Password      "aef4Aebe"
      Interval      30
 -    
 +
      <WAFL>
        Interval 30
        GetNameCache   true
        GetBufferCache true
        GetInodeCache  true
      </WAFL>
 -    
 +
      <Disks>
        Interval 30
        GetBusy true
      </Disks>
 -    
 +
      <VolumePerf>
        Interval 30
        GetIO      "volume0"
        GetLatency "volume0"
        IgnoreSelectedLatency false
      </VolumePerf>
 -    
 +
      <VolumeUsage>
        Interval 30
        GetCapacity "vol0"
        GetSnapshot "vol3"
        IgnoreSelectedSnapshot false
      </VolumeUsage>
 -    
 +
      <Quota>
        Interval 60
      </Quota>
 -    
 +
      <Snapvault>
        Interval 30
      </Snapvault>
 -    
 +
      <System>
        Interval 30
        GetCPULoad     true
@@@ -3946,7 -3437,7 +3945,7 @@@ signature)
     # Export to an internal server
     # (demonstrates usage without additional options)
     Server "collectd.internal.tld"
 -   
 +
     # Export to an external server
     # (demonstrates usage with signature options)
     <Server "collectd.external.tld">
@@@ -4009,12 -3500,6 +4008,12 @@@ behavior is to let the kernel choose th
  that the manual selection of an interface for unicast traffic is only
  necessary in rare cases.
  
 +=item B<ResolveInterval> I<Seconds>
 +
 +Sets the interval at which to re-resolve the DNS for the I<Host>. This is
 +useful to force a regular DNS lookup to support a high availability setup. If
 +not specified, re-resolves are never attempted.
 +
  =back
  
  =item B<E<lt>Listen> I<Host> [I<Port>]B<E<gt>>
@@@ -4159,12 -3644,6 +4158,12 @@@ File that holds one or more SSL certifi
  possibly need this option. What CA certificates come bundled with C<libcurl>
  and are checked by default depends on the distribution you use.
  
 +=item B<Timeout> I<Milliseconds>
 +
 +The B<Timeout> option sets the overall timeout for HTTP requests to B<URL>, in
 +milliseconds. By default, the configured B<Interval> is used to set the
 +timeout.
 +
  =back
  
  =head2 Plugin C<notify_desktop>
@@@ -4347,36 -3826,13 +4346,36 @@@ B<EXPERIMENTAL!> See notes below
  The C<onewire> plugin uses the B<owcapi> library from the B<owfs> project
  L<http://owfs.org/> to read sensors connected via the onewire bus.
  
 -Currently only temperature sensors (sensors with the family code C<10>,
 -e.E<nbsp>g. DS1820, DS18S20, DS1920) can be read. If you have other sensors you
 -would like to have included, please send a sort request to the mailing list.
 +It can be used in two possible modes - standard or advanced.
 +
 +In the standard mode only temperature sensors (sensors with the family code
 +C<10>, C<22> and C<28> - e.g. DS1820, DS18S20, DS1920) can be read. If you have
 +other sensors you would like to have included, please send a sort request to
 +the mailing list. You can select sensors to be read or to be ignored depending
 +on the option B<IgnoreSelected>). When no list is provided the whole bus is
 +walked and all sensors are read.
  
  Hubs (the DS2409 chips) are working, but read the note, why this plugin is
  experimental, below.
  
 +In the advanced mode you can configure any sensor to be read (only numerical
 +value) using full OWFS path (e.g. "/uncached/10.F10FCA000800/temperature").
 +In this mode you have to list all the sensors. Neither default bus walk nor
 +B<IgnoreSelected> are used here. Address and type (file) is extracted from
 +the path automatically and should produce compatible structure with the "standard"
 +mode (basically the path is expected as for example
 +"/uncached/10.F10FCA000800/temperature" where it would extract address part
 +"F10FCA000800" and the rest after the slash is considered the type - here
 +"temperature").
 +There are two advantages to this mode - you can access virtually any sensor
 +(not just temperature), select whether to use cached or directly read values
 +and it is slighlty faster. The downside is more complex configuration.
 +
 +The two modes are distinguished automatically by the format of the address.
 +It is not possible to mix the two modes. Once a full path is detected in any
 +B<Sensor> then the whole addressing (all sensors) is considered to be this way
 +(and as standard addresses will fail parsing they will be ignored).
 +
  =over 4
  
  =item B<Device> I<Device>
@@@ -4397,23 -3853,14 +4396,23 @@@ This directive is B<required> and does 
  
  =item B<Sensor> I<Sensor>
  
 -Selects sensors to collect or to ignore, depending on B<IgnoreSelected>, see
 -below. Sensors are specified without the family byte at the beginning, to you'd
 -use C<F10FCA000800>, and B<not> include the leading C<10.> family byte and
 -point.
 +In the standard mode selects sensors to collect or to ignore
 +(depending on B<IgnoreSelected>, see below). Sensors are specified without
 +the family byte at the beginning, so you have to use for example C<F10FCA000800>,
 +and B<not> include the leading C<10.> family byte and point.
 +When no B<Sensor> is configured the whole Onewire bus is walked and all supported
 +sensors (see above) are read.
 +
 +In the advanced mode the B<Sensor> specifies full OWFS path - e.g.
 +C</uncached/10.F10FCA000800/temperature> (or when cached values are OK
 +C</10.F10FCA000800/temperature>). B<IgnoreSelected> is not used.
 +
 +As there can be multiple devices on the bus you can list multiple sensor (use
 +multiple B<Sensor> elements).
  
  =item B<IgnoreSelected> I<true>|I<false>
  
 -If no configuration if given, the B<onewire> plugin will collect data from all
 +If no configuration is given, the B<onewire> plugin will collect data from all
  sensors found. This may not be practical, especially if sensors are added and
  removed regularly. Sometimes, however, it's easier/preferred to collect only
  specific sensors or all sensors I<except> a few specified ones. This option
@@@ -4421,8 -3868,6 +4420,8 @@@ enables you to do that: By setting B<Ig
  B<Sensor> is inverted: All selected interfaces are ignored and all other
  interfaces are collected.
  
 +Used only in the standard mode - see above.
 +
  =item B<Interval> I<Seconds>
  
  Sets the interval in which all sensors should be read. If not specified, the
@@@ -4441,70 -3886,6 +4440,70 @@@ short: If it works for you: Great! But 
  change, though this is unlikely. Oh, and if you want to help improving this
  plugin, just send a short notice to the mailing list. ThanksE<nbsp>:)
  
 +=head2 Plugin C<openldap>
 +
 +To use the C<openldap> plugin you first need to configure the I<OpenLDAP>
 +server correctly. The backend database C<monitor> needs to be loaded and
 +working. See slapd-monitor(5) for the details.
 +
 +The configuration of the C<openldap> plugin consists of one or more B<Instance>
 +blocks. Each block requires one string argument as the instance name. For
 +example:
 +
 + <Plugin "openldap">
 +   <Instance "foo">
 +     URL "ldap://localhost/"
 +   </Instance>
 +   <Instance "bar">
 +     URL "ldaps://localhost/"
 +   </Instance>
 + </Plugin>
 +
 +The instance name will be used as the I<plugin instance>. To emulate the old
 +(versionE<nbsp>4) behavior, you can use an empty string (""). In order for the
 +plugin to work correctly, each instance name must be unique. This is not
 +enforced by the plugin and it is your responsibility to ensure it is.
 +
 +The following options are accepted within each B<Instance> block:
 +
 +=over 4
 +
 +=item B<URL> I<ldap://host/binddn>
 +
 +Sets the URL to use to connect to the I<OpenLDAP> server. This option is
 +I<mandatory>.
 +
 +=item B<StartTLS> B<true|false>
 +
 +Defines whether TLS must be used when connecting to the I<OpenLDAP> server.
 +Disabled by default.
 +
 +=item B<VerifyHost> B<true|false>
 +
 +Enables or disables peer host name verification. If enabled, the plugin checks
 +if the C<Common Name> or a C<Subject Alternate Name> field of the SSL
 +certificate matches the host name provided by the B<URL> option. If this
 +identity check fails, the connection is aborted. Enabled by default.
 +
 +=item B<CACert> I<File>
 +
 +File that holds one or more SSL certificates. If you want to use TLS/SSL you
 +may possibly need this option. What CA certificates are checked by default
 +depends on the distribution you use and can be changed with the usual ldap
 +client configuration mechanisms. See ldap.conf(5) for the details.
 +
 +=item B<Timeout> I<Seconds>
 +
 +Sets the timeout value for ldap operations. Defaults to B<-1> which results in
 +an infinite timeout.
 +
 +=item B<Version> I<Version>
 +
 +An integer which sets the LDAP protocol version number to use when connecting
 +to the I<OpenLDAP> server. Defaults to B<3> for using I<LDAPv3>.
 +
 +=back
 +
  =head2 Plugin C<openvpn>
  
  The OpenVPN plugin reads a status file maintained by OpenVPN and gathers
@@@ -5133,6 -4514,13 +5132,13 @@@ activating this option. The draw-back i
  amount of time will be lost, for example, if a single statement within the
  transaction fails or if the database server crashes.
  
+ =item B<Instance> I<name>
+ Specify the plugin instance name that should be used instead of the database
+ name (which is the default, if this option has not been specified). This
+ allows to query multiple databases of the same name on the same host (e.g.
+ when running multiple database server versions in parallel).
  =item B<Host> I<hostname>
  
  Specify the hostname or IP of the PostgreSQL server to connect to. If the
@@@ -5158,10 -4546,6 +5164,10 @@@ Specify the username to be used when co
  
  Specify the password to be used when connecting to the server.
  
 +=item B<ExpireDelay> I<delay>
 +
 +Skip expired values in query output.
 +
  =item B<SSLMode> I<disable>|I<allow>|I<prefer>|I<require>
  
  Specify whether to use an SSL connection when contacting the server. The
@@@ -5187,13 -4571,6 +5193,13 @@@ Use SSL only
  
  =back
  
 +=item B<Instance> I<name>
 +
 +Specify the plugin instance name that should be used instead of the database
 +name (which is the default, if this option has not been specified). This
 +allows to query multiple databases of the same name on the same host (e.g.
 +when running multiple database server versions in parallel).
 +
  =item B<KRBSrvName> I<kerberos_service_name>
  
  Specify the Kerberos service name to use when authenticating with Kerberos 5
@@@ -5533,10 -4910,6 +5539,10 @@@ which configures the connection paramet
          Host "localhost"
          Port "6379"
          Timeout 2000
 +        <Query "LLEN myqueue">
 +          Type "queue_length"
 +          Instance "myqueue"
 +        <Query>
      </Node>
    </Plugin>
  
@@@ -5567,29 -4940,13 +5573,29 @@@ that numerical port numbers must be giv
  
  Use I<Password> to authenticate when connecting to I<Redis>.
  
- =item B<Timeout> I<Timeout in miliseconds>
+ =item B<Timeout> I<Milliseconds>
  
  The B<Timeout> option set the socket timeout for node response. Since the Redis
  read function is blocking, you should keep this value as low as possible. Keep
  in mind that the sum of all B<Timeout> values for all B<Nodes> should be lower
  than B<Interval> defined globally.
  
 +=item B<Query> I<Querystring>
 +
 +The B<Query> block identifies a query to execute against the redis server.
 +There may be an arbitrary number of queries to execute.
 +
 +=item B<Type> I<Collectd type>
 +
 +Within a query definition, a valid collectd type to use as when submitting
 +the result of the query. When not supplied, will default to B<gauge>.
 +
 +=item B<Instance> I<Type instance>
 +
 +Within a query definition, an optional type instance to use when submitting
 +the result of the query. When not supplied will default to the escaped
 +command, up to 64 chars.
 +
  =back
  
  =head2 Plugin C<rrdcached>
@@@ -5931,40 -5288,6 +5937,40 @@@ measurements are discarded
  
  =back
  
 +=head2 Plugin C<smart>
 +
 +The C<smart> plugin collects SMART information from physical
 +disks. Values collectd include temperature, power cycle count, poweron
 +time and bad sectors. Also, all SMART attributes are collected along
 +with the normalized current value, the worst value, the threshold and
 +a human readable value.
 +
 +Using the following two options you can ignore some disks or configure the
 +collection only of specific disks.
 +
 +=over 4
 +
 +=item B<Disk> I<Name>
 +
 +Select the disk I<Name>. Whether it is collected or ignored depends on the
 +B<IgnoreSelected> setting, see below. As with other plugins that use the
 +daemon's ignorelist functionality, a string that starts and ends with a slash
 +is interpreted as a regular expression. Examples:
 +
 +  Disk "sdd"
 +  Disk "/hda[34]/"
 +
 +=item B<IgnoreSelected> B<true>|B<false>
 +
 +Sets whether selected disks, i.E<nbsp>e. the ones matches by any of the B<Disk>
 +statements, are ignored or if all other disks are ignored. The behavior
 +(hopefully) is intuitive: If no B<Disk> option is configured, all disks are
 +collected. If at least one B<Disk> option is given and no B<IgnoreSelected> or
 +set to B<false>, B<only> matching disks will be collected. If B<IgnoreSelected>
 +is set to B<true>, all disks are collected B<except> the ones matched.
 +
 +=back
 +
  =head2 Plugin C<snmp>
  
  Since the configuration of the C<snmp plugin> is a little more complicated than
@@@ -6055,19 -5378,6 +6061,19 @@@ This option is only available if the I<
  When enabled, the I<swap I/O> is reported in bytes. When disabled, the default,
  I<swap I/O> is reported in pages. This option is available under Linux only.
  
 +=item B<ValuesAbsolute> B<true>|B<false>
 +
 +Enables or disables reporting of absolute swap metrics, i.e. number of I<bytes>
 +available and used. Defaults to B<true>.
 +
 +=item B<ValuesPercentage> B<false>|B<true>
 +
 +Enables or disables reporting of relative swap metrics, i.e. I<percent>
 +available and free. Defaults to B<false>.
 +
 +This is useful for deploying I<collectd> in a heterogeneous environment, where
 +swap sizes differ and you want to specify generic thresholds or similar.
 +
  =back
  
  =head2 Plugin C<syslog>
@@@ -6203,7 -5513,6 +6209,7 @@@ user using (extended) regular expressio
    <Plugin "tail">
      <File "/var/log/exim4/mainlog">
        Instance "exim"
 +      Interval 60
        <Match>
          Regex "S=([1-9][0-9]*)"
          DSType "CounterAdd"
@@@ -6230,9 -5539,6 +6236,9 @@@ This plugin instance is for all B<Match
  next B<Instance> option. This way you can extract several plugin instances from
  one logfile, handy when parsing syslog and the like.
  
 +The B<Interval> option allows you to define the length of time between reads. If
 +this is not set, the default Interval will be used.
 +
  Each B<Match> block has the following options to describe how the match should
  be performed:
  
@@@ -6288,8 -5594,6 +6294,8 @@@ Use the last number found
  The matched number is a counter. Simply I<sets> the internal counter to this
  value. Variants exist for C<COUNTER>, C<DERIVE>, and C<ABSOLUTE> data sources.
  
 +=item B<GaugeAdd>
 +
  =item B<CounterAdd>
  
  =item B<DeriveAdd>
@@@ -6298,8 -5602,6 +6304,8 @@@ Add the matched value to the internal c
  matched number may be negative, which will effectively subtract from the
  internal counter.
  
 +=item B<GaugeInc>
 +
  =item B<CounterInc>
  
  =item B<DeriveInc>
@@@ -6519,11 -5821,6 +6525,11 @@@ connections a mail server or news serve
  how many connections a web proxy holds to web servers. You have to give the
  port in numeric form.
  
 +=item B<AllPortsSummary> I<true>|I<false>
 +
 +If this option is set to I<true> a summary of statistics from all connections
 +are collectd. This option defaults to I<false>.
 +
  =back
  
  =head2 Plugin C<thermal>
@@@ -6653,35 -5950,22 +6659,35 @@@ Take the UUID from the given file (defa
  =head2 Plugin C<varnish>
  
  The I<varnish plugin> collects information about Varnish, an HTTP accelerator.
 +It collects a subset of the values displayed by L<varnishstat(1)>, and
 +organizes them in categories which can be enabled or disabled. Currently only
 +metrics shown in L<varnishstat(1)>'s I<MAIN> section are collected. The exact
 +meaning of each metric can be found in L<varnish-counters(7)>.
  
  Synopsis:
  
   <Plugin "varnish">
     <Instance "example">
 +     CollectBackend     true
 +     CollectBan         false
       CollectCache       true
       CollectConnections true
 -     CollectBackend     true
 -     CollectSHM         true
 +     CollectDirectorDNS false
       CollectESI         false
       CollectFetch       false
       CollectHCB         false
 +     CollectObjects     false
 +     CollectPurge       false
 +     CollectSession     false
 +     CollectSHM         true
       CollectSMA         false
       CollectSMS         false
       CollectSM          false
 +     CollectStruct      false
       CollectTotals      false
 +     CollectUptime      false
 +     CollectVCL         false
 +     CollectVSM         false
       CollectWorkers     false
     </Instance>
   </Plugin>
@@@ -6695,24 -5979,29 +6701,24 @@@ Inside each E<lt>B<Instance>E<gt> block
  
  =over 4
  
 -=item B<CollectCache> B<true>|B<false>
 -
 -Cache hits and misses. True by default.
 -
 -=item B<CollectConnections> B<true>|B<false>
 -
 -Number of client connections received, accepted and dropped. True by default.
 -
  =item B<CollectBackend> B<true>|B<false>
  
  Back-end connection statistics, such as successful, reused,
  and closed connections. True by default.
  
 -=item B<CollectSHM> B<true>|B<false>
 -
 -Statistics about the shared memory log, a memory region to store
 -log messages which is flushed to disk when full. True by default.
 -
  =item B<CollectBan> B<true>|B<false>
  
  Statistics about ban operations, such as number of bans added, retired, and
  number of objects tested against ban operations. Only available with Varnish
 -3.x. False by default.
 +3.x and above. False by default.
 +
 +=item B<CollectCache> B<true>|B<false>
 +
 +Cache hits and misses. True by default.
 +
 +=item B<CollectConnections> B<true>|B<false>
 +
 +Number of client connections received, accepted and dropped. True by default.
  
  =item B<CollectDirectorDNS> B<true>|B<false>
  
@@@ -6746,14 -6035,7 +6752,14 @@@ number of objects tested against purge 
  =item B<CollectSession> B<true>|B<false>
  
  Client session statistics. Number of past and current sessions, session herd and
 -linger counters, etc. False by default.
 +linger counters, etc. False by default. Note that if using Varnish 4.x, some
 +metrics found in the Connections and Threads sections with previous versions of
 +Varnish have been moved here.
 +
 +=item B<CollectSHM> B<true>|B<false>
 +
 +Statistics about the shared memory log, a memory region to store
 +log messages which is flushed to disk when full. True by default.
  
  =item B<CollectSMA> B<true>|B<false>
  
@@@ -6784,156 -6066,56 +6790,156 @@@ the number of requests and bytes transf
  
  =item B<CollectUptime> B<true>|B<false>
  
 -Varnish uptime. False by default.
 +Varnish uptime. Only available with Varnish 3.x and above. False by default.
  
  =item B<CollectVCL> B<true>|B<false>
  
  Number of total (available + discarded) VCL (config files). False by default.
  
 +=item B<CollectVSM> B<true>|B<false>
 +
 +Collect statistics about Varnish's shared memory usage (used by the logging and
 +statistics subsystems). Only available with Varnish 4.x. False by default.
 +
  =item B<CollectWorkers> B<true>|B<false>
  
  Collect statistics about worker threads. False by default.
  
  =back
  
 -=head2 Plugin C<vmem>
 +=head2 Plugin C<virt>
  
 -The C<vmem> plugin collects information about the usage of virtual memory.
 -Since the statistics provided by the Linux kernel are very detailed, they are
 -collected very detailed. However, to get all the details, you have to switch
 -them on manually. Most people just want an overview over, such as the number of
 -pages read from swap space.
 +This plugin allows CPU, disk and network load to be collected for virtualized
 +guests on the machine. This means that these metrics can be collected for guest
 +systems without installing any software on them - I<collectd> only runs on the
 +host system. The statistics are collected through libvirt
 +(L<http://libvirt.org/>).
 +
 +Only I<Connection> is required.
  
  =over 4
  
 -=item B<Verbose> B<true>|B<false>
 +=item B<Connection> I<uri>
  
 -Enables verbose collection of information. This will start collecting page
 -"actions", e.E<nbsp>g. page allocations, (de)activations, steals and so on.
 -Part of these statistics are collected on a "per zone" basis.
 +Connect to the hypervisor given by I<uri>. For example if using Xen use:
  
 -=back
 + Connection "xen:///"
  
 -=head2 Plugin C<vserver>
 +Details which URIs allowed are given at L<http://libvirt.org/uri.html>.
  
 -This plugin doesn't have any options. B<VServer> support is only available for
 -Linux. It cannot yet be found in a vanilla kernel, though. To make use of this
 -plugin you need a kernel that has B<VServer> support built in, i.E<nbsp>e. you
 -need to apply the patches and compile your own kernel, which will then provide
 -the F</proc/virtual> filesystem that is required by this plugin.
 +=item B<RefreshInterval> I<seconds>
  
 -The B<VServer> homepage can be found at L<http://linux-vserver.org/>.
 +Refresh the list of domains and devices every I<seconds>. The default is 60
 +seconds. Setting this to be the same or smaller than the I<Interval> will cause
 +the list of domains and devices to be refreshed on every iteration.
  
 -B<Note>: The traffic collected by this plugin accounts for the amount of
 -traffic passing a socket which might be a lot less than the actual on-wire
 -traffic (e.E<nbsp>g. due to headers and retransmission). If you want to
 -collect on-wire traffic you could, for example, use the logging facilities of
 -iptables to feed data for the guest IPs into the iptables plugin.
 +Refreshing the devices in particular is quite a costly operation, so if your
 +virtualization setup is static you might consider increasing this. If this
 +option is set to 0, refreshing is disabled completely.
  
 -=head2 Plugin C<write_graphite>
 +=item B<Domain> I<name>
  
 -The C<write_graphite> plugin writes data to I<Graphite>, an open-source metrics
 -storage and graphing project. The plugin connects to I<Carbon>, the data layer
 +=item B<BlockDevice> I<name:dev>
 +
 +=item B<InterfaceDevice> I<name:dev>
 +
 +=item B<IgnoreSelected> B<true>|B<false>
 +
 +Select which domains and devices are collected.
 +
 +If I<IgnoreSelected> is not given or B<false> then only the listed domains and
 +disk/network devices are collected.
 +
 +If I<IgnoreSelected> is B<true> then the test is reversed and the listed
 +domains and disk/network devices are ignored, while the rest are collected.
 +
 +The domain name and device names may use a regular expression, if the name is
 +surrounded by I</.../> and collectd was compiled with support for regexps.
 +
 +The default is to collect statistics for all domains and all their devices.
 +
 +Example:
 +
 + BlockDevice "/:hdb/"
 + IgnoreSelected "true"
 +
 +Ignore all I<hdb> devices on any domain, but other block devices (eg. I<hda>)
 +will be collected.
 +
 +=item B<HostnameFormat> B<name|uuid|hostname|...>
 +
 +When the virt plugin logs data, it sets the hostname of the collected data
 +according to this setting. The default is to use the guest name as provided by
 +the hypervisor, which is equal to setting B<name>.
 +
 +B<uuid> means use the guest's UUID. This is useful if you want to track the
 +same guest across migrations.
 +
 +B<hostname> means to use the global B<Hostname> setting, which is probably not
 +useful on its own because all guests will appear to have the same name.
 +
 +You can also specify combinations of these fields. For example B<name uuid>
 +means to concatenate the guest name and UUID (with a literal colon character
 +between, thus I<"foo:1234-1234-1234-1234">).
 +
 +=item B<InterfaceFormat> B<name>|B<address>
 +
 +When the virt plugin logs interface data, it sets the name of the collected
 +data according to this setting. The default is to use the path as provided by
 +the hypervisor (the "dev" property of the target node), which is equal to
 +setting B<name>.
 +
 +B<address> means use the interface's mac address. This is useful since the
 +interface path might change between reboots of a guest or across migrations.
 +
 +=item B<PluginInstanceFormat> B<name|uuid>
 +
 +When the virt plugin logs data, it sets the plugin_instance of the collected
 +data according to this setting. The default is to use the guest name as provided
 +by the hypervisor, which is equal to setting B<name>.
 +
 +B<uuid> means use the guest's UUID.
 +
 +=back
 +
 +=head2 Plugin C<vmem>
 +
 +The C<vmem> plugin collects information about the usage of virtual memory.
 +Since the statistics provided by the Linux kernel are very detailed, they are
 +collected very detailed. However, to get all the details, you have to switch
 +them on manually. Most people just want an overview over, such as the number of
 +pages read from swap space.
 +
 +=over 4
 +
 +=item B<Verbose> B<true>|B<false>
 +
 +Enables verbose collection of information. This will start collecting page
 +"actions", e.E<nbsp>g. page allocations, (de)activations, steals and so on.
 +Part of these statistics are collected on a "per zone" basis.
 +
 +=back
 +
 +=head2 Plugin C<vserver>
 +
 +This plugin doesn't have any options. B<VServer> support is only available for
 +Linux. It cannot yet be found in a vanilla kernel, though. To make use of this
 +plugin you need a kernel that has B<VServer> support built in, i.E<nbsp>e. you
 +need to apply the patches and compile your own kernel, which will then provide
 +the F</proc/virtual> filesystem that is required by this plugin.
 +
 +The B<VServer> homepage can be found at L<http://linux-vserver.org/>.
 +
 +B<Note>: The traffic collected by this plugin accounts for the amount of
 +traffic passing a socket which might be a lot less than the actual on-wire
 +traffic (e.E<nbsp>g. due to headers and retransmission). If you want to
 +collect on-wire traffic you could, for example, use the logging facilities of
 +iptables to feed data for the guest IPs into the iptables plugin.
 +
 +=head2 Plugin C<write_graphite>
 +
 +The C<write_graphite> plugin writes data to I<Graphite>, an open-source metrics
 +storage and graphing project. The plugin connects to I<Carbon>, the data layer
  of I<Graphite>, via I<TCP> or I<UDP> and sends data via the "line based"
  protocol (per default using portE<nbsp>2003). The data will be sent in blocks
  of at most 1428 bytes to minimize the number of network packets.
@@@ -7012,59 -6194,6 +7018,59 @@@ more than one DS
  
  =back
  
 +=head2 Plugin C<write_tsdb>
 +
 +The C<write_tsdb> plugin writes data to I<OpenTSDB>, a scalable open-source
 +time series database. The plugin connects to a I<TSD>, a masterless, no shared
 +state daemon that ingests metrics and stores them in HBase. The plugin uses
 +I<TCP> over the "line based" protocol with a default port 4242. The data will
 +be sent in blocks of at most 1428 bytes to minimize the number of network
 +packets.
 +
 +Synopsis:
 +
 + <Plugin write_tsdb>
 +   <Node "example">
 +     Host "tsd-1.my.domain"
 +     Port "4242"
 +     HostTags "status=production"
 +   </Node>
 + </Plugin>
 +
 +The configuration consists of one or more E<lt>B<Node>E<nbsp>I<Name>E<gt>
 +blocks. Inside the B<Node> blocks, the following options are recognized:
 +
 +=over 4
 +
 +=item B<Host> I<Address>
 +
 +Hostname or address to connect to. Defaults to C<localhost>.
 +
 +=item B<Port> I<Service>
 +
 +Service name or port number to connect to. Defaults to C<4242>.
 +
 +
 +=item B<HostTags> I<String>
 +
 +When set, I<HostTags> is added to the end of the metric. It is intended to be
 +used for name=value pairs that the TSD will tag the metric with. Dots and
 +whitespace are I<not> escaped in this string.
 +
 +=item B<StoreRates> B<false>|B<true>
 +
 +If set to B<true>, convert counter values to rates. If set to B<false>
 +(the default) counter values are stored as is, as an increasing
 +integer number.
 +
 +=item B<AlwaysAppendDS> B<false>|B<true>
 +
 +If set the 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.
 +
 +=back
 +
  =head2 Plugin C<write_mongodb>
  
  The I<write_mongodb plugin> will send values to I<MongoDB>, a schema-less
@@@ -7095,7 -6224,7 +7101,7 @@@ Hostname or address to connect to. Defa
  
  Service name or port number to connect to. Defaults to C<27017>.
  
- =item B<Timeout> I<Timeout>
+ =item B<Timeout> I<Milliseconds>
  
  Set the timeout for each operation on I<MongoDB> to I<Timeout> milliseconds.
  Setting this option to zero means no timeout, which is the default.
@@@ -7120,31 -6249,25 +7126,31 @@@ want to use authentication all three fi
  
  =head2 Plugin C<write_http>
  
 -This output plugin submits values to an http server by POST them using the
 -PUTVAL plain-text protocol. Each destination you want to post data to needs to
 -have one B<URL> block, within which the destination can be configured further,
 -for example by specifying authentication data.
 +This output plugin submits values to an HTTP server using POST requests and
 +encoding metrics with JSON or using the C<PUTVAL> command described in
 +L<collectd-unixsock(5)>.
  
  Synopsis:
  
   <Plugin "write_http">
 -   <URL "http://example.com/post-collectd">
 +   <Node "example">
 +     URL "http://example.com/post-collectd"
       User "collectd"
       Password "weCh3ik0"
 -   </URL>
 +     Format JSON
 +   </Node>
   </Plugin>
  
 -B<URL> blocks need one string argument which is used as the URL to which data
 -is posted. The following options are understood within B<URL> blocks.
 +The plugin can send values to multiple HTTP servers by specifying one
 +E<lt>B<Node>E<nbsp>I<Name>E<gt> block for each server. Within each B<Node>
 +block, the following options are available:
  
  =over 4
  
 +=item B<URL> I<URL>
 +
 +URL to which the values are submitted to. Mandatory.
 +
  =item B<User> I<Username>
  
  Optional user name needed for authentication.
@@@ -7172,33 -6295,6 +7178,33 @@@ File that holds one or more SSL certifi
  possibly need this option. What CA certificates come bundled with C<libcurl>
  and are checked by default depends on the distribution you use.
  
 +=item B<CAPath> I<Directory>
 +
 +Directory holding one or more CA certificate files. You can use this if for
 +some reason all the needed CA certificates aren't in the same file and can't be
 +pointed to using the B<CACert> option. Requires C<libcurl> to be built against
 +OpenSSL.
 +
 +=item B<ClientKey> I<File>
 +
 +File that holds the private key in PEM format to be used for certificate-based
 +authentication.
 +
 +=item B<ClientCert> I<File>
 +
 +File that holds the SSL certificate to be used for certificate-based
 +authentication.
 +
 +=item B<ClientKeyPass> I<Password>
 +
 +Password required to load the private key in B<ClientKey>.
 +
 +=item B<SSLVersion> B<SSLv2>|B<SSLv3>|B<TLSv1>|B<TLSv1_0>|B<TLSv1_1>|B<TLSv1_2>
 +
 +Define which SSL protocol version must be used. By default C<libcurl> will
 +attempt to figure out the remote SSL protocol version. See
 +L<curl_easy_setopt(3)> for more details.
 +
  =item B<Format> B<Command>|B<JSON>
  
  Format of the output to generate. If set to B<Command>, will create output that
@@@ -7210,143 -6306,8 +7216,143 @@@ Defaults to B<Command>
  =item B<StoreRates> B<true|false>
  
  If set to B<true>, convert counter values to rates. If set to B<false> (the
 -default) counter values are stored as is, i.E<nbsp>e. as an increasing integer
 -number.
 +default) counter values are stored as is, i.e. as an increasing integer number.
 +
 +=item B<BufferSize> I<Bytes>
 +
 +Sets the send buffer size to I<Bytes>. By increasing this buffer, less HTTP
 +requests will be generated, but more metrics will be batched / metrics are
 +cached for longer before being sent, introducing additional delay until they
 +are available on the server side. I<Bytes> must be at least 1024 and cannot
 +exceed the size of an C<int>, i.e. 2E<nbsp>GByte.
 +Defaults to C<4096>.
 +
 +=item B<LowSpeedLimit> I<Bytes per Second>
 +
 +Sets the minimal transfer rate in I<Bytes per Second> below which the
 +connection with the HTTP server will be considered too slow and aborted. All
 +the data submitted over this connection will probably be lost. Defaults to 0,
 +which means no minimum transfer rate is enforced.
 +
 +=item B<Timeout> I<Timeout>
 +
 +Sets the maximum time in milliseconds given for HTTP POST operations to
 +complete. When this limit is reached, the POST operation will be aborted, and
 +all the data in the current send buffer will probably be lost. Defaults to 0,
 +which means the connection never times out.
 +
 +The C<write_http> plugin regularly submits the collected values to the HTTP
 +server. How frequently this happens depends on how much data you are collecting
 +and the size of B<BufferSize>. The optimal value to set B<Timeout> to is
 +slightly below this interval, which you can estimate by monitoring the network
 +traffic between collectd and the HTTP server.
 +
 +=back
 +
 +=head2 Plugin C<write_kafka>
 +
 +The I<write_kafka plugin> will send values to a I<Kafka> topic, a distributed
 +queue.
 +Synopsis:
 +
 + <Plugin "write_kafka">
 +   Property "metadata.broker.list" "broker1:9092,broker2:9092"
 +   <Topic "collectd">
 +     Format JSON
 +   </Topic>
 + </Plugin>
 +
 +The following options are understood by the I<write_kafka plugin>:
 +
 +=over 4
 +
 +=item E<lt>B<Topic> I<Name>E<gt>
 +
 +The plugin's configuration consists of one or more B<Topic> blocks. Each block
 +is given a unique I<Name> and specifies one kafka producer.
 +Inside the B<Topic> block, the following per-topic options are
 +understood:
 +
 +=over 4
 +
 +=item B<Property> I<String> I<String>
 +
 +Configure the named property for the current topic. Properties are
 +forwarded to the kafka producer library B<librdkafka>.
 +
 +=item B<Key> I<String>
 +
 +Use the specified string as a partioning key for the topic. Kafka breaks
 +topic into partitions and guarantees that for a given topology, the same
 +consumer will be used for a specific key. The special (case insensitive)
 +string B<Random> can be used to specify that an arbitrary partition should
 +be used.
 +
 +=item B<Format> B<Command>|B<JSON>|B<Graphite>
 +
 +Selects the format in which messages are sent to the broker. 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>.
 +
 +If set to B<JSON>, the values are encoded in the I<JavaScript Object Notation>,
 +an easy and straight forward exchange format.
 +
 +If set to B<Graphite>, values are encoded in the I<Graphite> format, which is
 +C<E<lt>metricE<gt> E<lt>valueE<gt> E<lt>timestampE<gt>\n>.
 +
 +=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> (B<Format>=I<Graphite> only)
 +
 +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
 +C<E<lt>prefixE<gt>E<lt>hostE<gt>E<lt>postfixE<gt>E<lt>pluginE<gt>E<lt>typeE<gt>E<lt>nameE<gt>>
 +
 +=item B<GraphitePostfix> (B<Format>=I<Graphite> only)
 +
 +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
 +C<E<lt>prefixE<gt>E<lt>hostE<gt>E<lt>postfixE<gt>E<lt>pluginE<gt>E<lt>typeE<gt>E<lt>nameE<gt>>
 +
 +=item B<GraphiteEscapeChar> (B<Format>=I<Graphite> only)
 +
 +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 C<_> (I<Underscore>).
 +
 +=item B<GraphiteSeparateInstances> B<false>|B<true>
 +
 +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<StoreRates> B<true>|B<false>
 +
 +If set to B<true> (the default), convert counter values to rates. If set to
 +B<false> counter values are stored as is, i.e. as an increasing integer number.
 +
 +This will be reflected in the C<ds_type> tag: If B<StoreRates> is enabled,
 +converted values will have "rate" appended to the data source type, e.g.
 +C<ds_type:derive:rate>.
 +
 +=back
 +
 +=item B<Property> I<String> I<String>
 +
 +Configure the kafka producer through properties, you almost always will
 +want to set B<metadata.broker.list> to your Kafka broker list.
  
  =back
  
@@@ -7399,7 -6360,7 +7405,7 @@@ The B<Port> option is the TCP port on w
  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<Timeout> I<Timeout in miliseconds>
+ =item B<Timeout> I<Milliseconds>
  
  The B<Timeout> option sets the socket connection timeout, in milliseconds.
  
  
  =head2 Plugin C<write_riemann>
  
 -The I<write_riemann plugin> will send values to I<Riemann>, a powerfull stream
 +The I<write_riemann plugin> will send values to I<Riemann>, a powerful stream
  aggregation and monitoring system. The plugin sends I<Protobuf> encoded data to
  I<Riemann> using UDP packets.
  
@@@ -7423,7 -6384,6 +7429,7 @@@ Synopsis
       TTLFactor 2.0
     </Node>
     Tag "foobar"
 +   Attribute "foo" "bar"
   </Plugin>
  
  The following options are understood by the I<write_riemann plugin>:
@@@ -7450,26 -6410,7 +7456,26 @@@ Service name or port number to connect 
  =item B<Protocol> B<UDP>|B<TCP>
  
  Specify the protocol to use when communicating with I<Riemann>. Defaults to
 -B<UDP>.
 +B<TCP>.
 +
 +=item B<Batch> B<true>|B<false>
 +
 +If set to B<true> and B<Protocol> is set to B<TCP>,
 +events will be batched in memory and flushed at
 +regular intervals or when B<BatchMaxSize> is exceeded.
 +
 +Notifications are not batched and sent as soon as possible.
 +
 +When enabled, it can occur that events get processed by the Riemann server
 +close to or after their expiration time. Tune the B<TTLFactor> and
 +B<BatchMaxSize> settings according to the amount of values collected, if this
 +is an issue.
 +
 +Defaults to true
 +
 +=item B<BatchMaxSize> I<size>
 +
 +Maximum payload size for a riemann packet. Defaults to 8192
  
  =item B<StoreRates> B<true>|B<false>
  
@@@ -7496,23 -6437,6 +7502,23 @@@ interval is multiplied to set the TTL. 
  know exactly what you're doing, you should only increase this setting from its
  default value.
  
 +=item B<Notifications> B<false>|B<true>
 +
 +If set to B<true>, create riemann events for notifications. This is B<true>
 +by default. When processing thresholds from write_riemann, it might prove
 +useful to avoid getting notification events.
 +
 +=item B<CheckThresholds> B<false>|B<true>
 +
 +If set to B<true>, attach state to events based on thresholds defined
 +in the B<Threshold> plugin. Defaults to B<false>.
 +
 +=item B<EventServicePrefix> I<String>
 +
 +Add the given string as a prefix to the event service name.
 +If B<EventServicePrefix> not set or set to an empty string (""),
 +no prefix will be used.
 +
  =back
  
  =item B<Tag> I<String>
  Add the given string as an additional tag to the metric being sent to
  I<Riemann>.
  
 +=item B<Attribute> I<String> I<String>
 +
 +Consider the two given strings to be the key and value of an additional
 +attribute for each metric being sent out to I<Riemann>.
 +
 +=back
 +
 +=head2 Plugin C<write_sensu>
 +
 +The I<write_sensu plugin> will send values to I<Sensu>, a powerful stream
 +aggregation and monitoring system. The plugin sends I<JSON> encoded data to
 +a local I<Sensu> client using a TCP socket.
 +
 +At the moment, the I<write_sensu plugin> does not send over a collectd_host
 +parameter so it is not possible to use one collectd instance as a gateway for
 +others. Each collectd host must pair with one I<Sensu> client.
 +
 +Synopsis:
 +
 + <Plugin "write_sensu">
 +   <Node "example">
 +     Host "localhost"
 +     Port "3030"
 +     StoreRates true
 +     AlwaysAppendDS false
 +     MetricHandler "influx"
 +     MetricHandler "default"
 +     NotificationHandler "flapjack"
 +     NotificationHandler "howling_monkey"
 +     Notifications true
 +   </Node>
 +   Tag "foobar"
 +   Attribute "foo" "bar"
 + </Plugin>
 +
 +The following options are understood by the I<write_sensu plugin>:
 +
 +=over 4
 +
 +=item E<lt>B<Node> I<Name>E<gt>
 +
 +The plugin's configuration consists of one or more B<Node> blocks. Each block
 +is given a unique I<Name> and specifies one connection to an instance of
 +I<Sensu>. Inside the B<Node> block, the following per-connection options are
 +understood:
 +
 +=over 4
 +
 +=item B<Host> I<Address>
 +
 +Hostname or address to connect to. Defaults to C<localhost>.
 +
 +=item B<Port> I<Service>
 +
 +Service name or port number to connect to. Defaults to C<3030>.
 +
 +=item B<StoreRates> B<true>|B<false>
 +
 +If set to B<true> (the default), convert counter values to rates. If set to
 +B<false> counter values are stored as is, i.e. as an increasing integer number.
 +
 +This will be reflected in the C<collectd_data_source_type> tag: If
 +B<StoreRates> is enabled, converted values will have "rate" appended to the
 +data source type, e.g.  C<collectd_data_source_type:derive:rate>.
 +
 +=item B<AlwaysAppendDS> B<false>|B<true>
 +
 +If set the B<true>, append the name of the I<Data Source> (DS) to the
 +"service", i.e. the field that, together with the "host" field, uniquely
 +identifies a metric in I<Sensu>. If set to B<false> (the default), this is
 +only done when there is more than one DS.
 +
 +=item B<Notifications> B<false>|B<true>
 +
 +If set to B<true>, create I<Sensu> events for notifications. This is B<false>
 +by default. At least one of B<Notifications> or B<Metrics> should be enabled.
 +
 +=item B<Metrics> B<false>|B<true>
 +
 +If set to B<true>, create I<Sensu> events for metrics. This is B<false>
 +by default. At least one of B<Notifications> or B<Metrics> should be enabled.
 +
 +
 +=item B<Separator> I<String>
 +
 +Sets the separator for I<Sensu> metrics name or checks. Defaults to "/".
 +
 +=item B<MetricHandler> I<String>
 +
 +Add a handler that will be set when metrics are sent to I<Sensu>. You can add
 +several of them, one per line. Defaults to no handler.
 +
 +=item B<NotificationHandler> I<String>
 +
 +Add a handler that will be set when notifications are sent to I<Sensu>. You can
 +add several of them, one per line. Defaults to no handler.
 +
 +=item B<EventServicePrefix> I<String>
 +
 +Add the given string as a prefix to the event service name.
 +If B<EventServicePrefix> not set or set to an empty string (""),
 +no prefix will be used.
 +
 +=back
 +
 +=item B<Tag> I<String>
 +
 +Add the given string as an additional tag to the metric being sent to
 +I<Sensu>.
 +
 +=item B<Attribute> I<String> I<String>
 +
 +Consider the two given strings to be the key and value of an additional
 +attribute for each metric being sent out to I<Sensu>.
 +
 +=back
 +
 +=head2 Plugin C<zookeeper>
 +
 +The I<zookeeper plugin> will collect statistics from a I<Zookeeper> server
 +using the mntr command.  It requires Zookeeper 3.4.0+ and access to the
 +client port.
 +
 +B<Synopsis:>
 +
 + <Plugin "zookeeper">
 +   Host "127.0.0.1"
 +   Port "2181"
 + </Plugin>
 +
 +=over 4
 +
 +=item B<Host> I<Address>
 +
 +Hostname or address to connect to. Defaults to C<localhost>.
 +
 +=item B<Port> I<Service>
 +
 +Service name or port number to connect to. Defaults to C<2181>.
 +
  =back
  
  =head1 THRESHOLD CONFIGURATION
@@@ -8331,7 -7115,7 +8337,7 @@@ Example
     Max 100
     Satisfy "All"
   </Match>
 - 
 +
   # Match if the value of any data source is outside the range of 0 - 100.
   <Match "value">
     Min   0
@@@ -8513,7 -7297,7 +8519,7 @@@ Example
   <Target "replace">
     # Replace "example.net" with "example.com"
     Host "\\<example.net\\>" "example.com"
 - 
 +
     # Strip "www." from hostnames
     Host "\\<www\\." ""
   </Target>
@@@ -8596,6 -7380,6 +8602,6 @@@ L<sensors(1)
  
  =head1 AUTHOR
  
 -Florian Forster E<lt>octo@verplant.orgE<gt>
 +Florian Forster E<lt>octo@collectd.orgE<gt>
  
  =cut
diff --combined src/curl.c
@@@ -17,7 -17,7 +17,7 @@@
   * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
   *
   * Authors:
 - *   Florian octo Forster <octo at verplant.org>
 + *   Florian octo Forster <octo at collectd.org>
   *   Aman Gupta <aman at tmm1.net>
   **/
  
@@@ -58,7 -58,6 +58,7 @@@ struct web_page_s /* {{{ *
    char *user;
    char *pass;
    char *credentials;
 +  _Bool digest;
    _Bool verify_peer;
    _Bool verify_host;
    char *cacert;
@@@ -66,7 -65,6 +66,7 @@@
    char *post_body;
    _Bool response_time;
    _Bool response_code;
 +  int timeout;
  
    CURL *curl;
    char curl_errbuf[CURL_ERROR_SIZE];
@@@ -366,7 -364,8 +366,7 @@@ static int cc_page_init_curl (web_page_
    curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1L);
    curl_easy_setopt (wp->curl, CURLOPT_WRITEFUNCTION, cc_curl_callback);
    curl_easy_setopt (wp->curl, CURLOPT_WRITEDATA, wp);
 -  curl_easy_setopt (wp->curl, CURLOPT_USERAGENT,
 -      PACKAGE_NAME"/"PACKAGE_VERSION);
 +  curl_easy_setopt (wp->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
    curl_easy_setopt (wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf);
    curl_easy_setopt (wp->curl, CURLOPT_URL, wp->url);
    curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1L);
  
    if (wp->user != NULL)
    {
 +#ifdef HAVE_CURLOPT_USERNAME
 +    curl_easy_setopt (wp->curl, CURLOPT_USERNAME, wp->user);
 +    curl_easy_setopt (wp->curl, CURLOPT_PASSWORD,
 +        (wp->pass == NULL) ? "" : wp->pass);
 +#else
      size_t credentials_size;
  
      credentials_size = strlen (wp->user) + 2;
      ssnprintf (wp->credentials, credentials_size, "%s:%s",
          wp->user, (wp->pass == NULL) ? "" : wp->pass);
      curl_easy_setopt (wp->curl, CURLOPT_USERPWD, wp->credentials);
 +#endif
 +
 +    if (wp->digest)
 +      curl_easy_setopt (wp->curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
    }
  
    curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, (long) wp->verify_peer);
    if (wp->post_body != NULL)
      curl_easy_setopt (wp->curl, CURLOPT_POSTFIELDS, wp->post_body);
  
 +#ifdef HAVE_CURLOPT_TIMEOUT_MS
 +  if (wp->timeout >= 0)
 +    curl_easy_setopt (wp->curl, CURLOPT_TIMEOUT_MS, (long) wp->timeout);
 +  else
 +    curl_easy_setopt (wp->curl, CURLOPT_TIMEOUT_MS,
 +       CDTIME_T_TO_MS(plugin_get_interval()));
 +#endif
 +
    return (0);
  } /* }}} int cc_page_init_curl */
  
@@@ -444,12 -426,10 +444,12 @@@ static int cc_config_add_page (oconfig_
    page->url = NULL;
    page->user = NULL;
    page->pass = NULL;
 +  page->digest = 0;
    page->verify_peer = 1;
    page->verify_host = 1;
    page->response_time = 0;
    page->response_code = 0;
 +  page->timeout = -1;
  
    page->instance = strdup (ci->values[0].value.string);
    if (page->instance == NULL)
        status = cf_util_get_string (child, &page->user);
      else if (strcasecmp ("Password", child->key) == 0)
        status = cf_util_get_string (child, &page->pass);
 +    else if (strcasecmp ("Digest", child->key) == 0)
 +      status = cf_util_get_boolean (child, &page->digest);
      else if (strcasecmp ("VerifyPeer", child->key) == 0)
        status = cf_util_get_boolean (child, &page->verify_peer);
      else if (strcasecmp ("VerifyHost", child->key) == 0)
        status = cc_config_append_string ("Header", &page->headers, child);
      else if (strcasecmp ("Post", child->key) == 0)
        status = cf_util_get_string (child, &page->post_body);
 +    else if (strcasecmp ("Timeout", child->key) == 0)
 +      status = cf_util_get_int (child, &page->timeout);
      else
      {
        WARNING ("curl plugin: Option `%s' not allowed here.", child->key);
@@@ -665,7 -641,7 +665,7 @@@ static int cc_read_page (web_page_t *wp
    status = curl_easy_perform (wp->curl);
    if (status != CURLE_OK)
    {
-     ERROR ("curl plugin: curl_easy_perform failed with staus %i: %s",
+     ERROR ("curl plugin: curl_easy_perform failed with status %i: %s",
          status, wp->curl_errbuf);
      return (-1);
    }
      long response_code = 0;
      status = curl_easy_getinfo(wp->curl, CURLINFO_RESPONSE_CODE, &response_code);
      if(status != CURLE_OK) {
-       ERROR ("curl plugin: Fetching response code failed with staus %i: %s",
+       ERROR ("curl plugin: Fetching response code failed with status %i: %s",
          status, wp->curl_errbuf);
      } else {
        cc_submit_response_code(wp, response_code);
diff --combined src/powerdns.c
@@@ -18,7 -18,7 +18,7 @@@
   *
   * Author:
   *   Luke Heberling <lukeh at c-ware.com>
 - *   Florian Forster <octo at verplant.org>
 + *   Florian Forster <octo at collectd.org>
   *
   * DESCRIPTION
   *   Queries a PowerDNS control socket for statistics
@@@ -84,10 -84,10 +84,10 @@@ typedef struct statname_lookup_s statna
  
  /* Description of statistics returned by the recursor: {{{
  all-outqueries      counts the number of outgoing UDP queries since starting
- answers0-1          counts the number of queries answered within 1 milisecond
+ answers0-1          counts the number of queries answered within 1 millisecond
  answers100-1000     counts the number of queries answered within 1 second
- answers10-100       counts the number of queries answered within 100 miliseconds
- answers1-10         counts the number of queries answered within 10 miliseconds
+ answers10-100       counts the number of queries answered within 100 milliseconds
+ answers1-10         counts the number of queries answered within 10 milliseconds
  answers-slow        counts the number of queries answered after 1 second
  cache-entries       shows the number of entries in the cache
  cache-hits          counts the number of cache hits since starting
@@@ -147,34 -147,22 +147,34 @@@ statname_lookup_t lookup_table[] = /* {
    {"recursing-questions",    "dns_question", "recurse"},
    {"tcp-queries",            "dns_question", "tcp"},
    {"udp-queries",            "dns_question", "udp"},
 +  {"rd-queries",             "dns_question", "rd"},
  
    /* Answers */
    {"recursing-answers",      "dns_answer",   "recurse"},
    {"tcp-answers",            "dns_answer",   "tcp"},
    {"udp-answers",            "dns_answer",   "udp"},
 +  {"recursion-unanswered",   "dns_answer",   "recursion-unanswered"},
 +  {"udp-answers-bytes",      "total_bytes",  "udp-answers-bytes"},
  
    /* Cache stuff */
    {"packetcache-hit",        "cache_result", "packet-hit"},
    {"packetcache-miss",       "cache_result", "packet-miss"},
    {"packetcache-size",       "cache_size",   "packet"},
 +  {"key-cache-size",         "cache_size",   "key"},
 +  {"meta-cache-size",        "cache_size",   "meta"},
 +  {"signature-cache-size",   "cache_size",   "signature"},
    {"query-cache-hit",        "cache_result", "query-hit"},
    {"query-cache-miss",       "cache_result", "query-miss"},
  
    /* Latency */
    {"latency",                "latency",      NULL},
  
 +  /* DNS updates */
 +  {"dnsupdate-answers",      "dns_answer",   "dnsupdate-answer"},
 +  {"dnsupdate-changes",      "dns_question", "dnsupdate-changes"},
 +  {"dnsupdate-queries",      "dns_question", "dnsupdate-queries"},
 +  {"dnsupdate-refused",      "dns_answer",   "dnsupdate-refused"},
 +
    /* Other stuff.. */
    {"corrupt-packets",        "ipt_packets",  "corrupt"},
    {"deferred-cache-inserts", "counter",      "cache-deferred_insert"},
    {"udp4-queries",           "dns_question", "queries-udp4"},
    {"udp6-answers",           "dns_answer",   "udp6"},
    {"udp6-queries",           "dns_question", "queries-udp6"},
 +  {"security-status",        "dns_question", "security-status"},
 +  {"udp-do-queries",         "dns_question", "udp-do_queries"},
 +  {"signatures",             "counter",      "signatures"},
  
    /***********************
     * Recursor statistics *
    {"throttle-entries",    "gauge",        "entries-throttle"},
    {"unauthorized-tcp",    "counter",      "denied-unauthorized_tcp"},
    {"unauthorized-udp",    "counter",      "denied-unauthorized_udp"},
 -  {"unexpected-packets",  "dns_answer",   "unexpected"}
 -  /* {"uptime", "", ""} */
 +  {"unexpected-packets",  "dns_answer",   "unexpected"},
 +  {"uptime",              "uptime",       NULL}
  }; /* }}} */
  int lookup_table_length = STATIC_ARRAY_SIZE (lookup_table);