Merge remote-tracking branch 'origin/pr/752' into wh_low_speed_limit
authorMarc Fournier <marc.fournier@camptocamp.com>
Tue, 24 Mar 2015 06:37:18 +0000 (07:37 +0100)
committerMarc Fournier <marc.fournier@camptocamp.com>
Tue, 24 Mar 2015 06:37:18 +0000 (07:37 +0100)
Conflicts:
src/write_http.c

Also slipped in a couple of conding-style consistentcy related changes.

93 files changed:
.gitignore
AUTHORS
ChangeLog
README
bindings/perl/Makefile.PL
bindings/perl/lib/Collectd/MockDaemon.pm [new file with mode: 0644]
bindings/perl/lib/Collectd/Unixsock.pm
bindings/perl/t/00_load.t [new file with mode: 0644]
bindings/perl/t/01_methods.t [new file with mode: 0644]
clean.sh
configure.ac
contrib/exec-nagios.px
contrib/redhat/collectd.spec
contrib/redhat/init.d-collectd
contrib/systemd.collectd.service [new file with mode: 0644]
contrib/upstart.collectd.conf
src/Makefile.am
src/amqp.c
src/apache.c
src/ascent.c
src/battery.c
src/bind.c
src/ceph.c [new file with mode: 0644]
src/collectd-exec.pod
src/collectd-perl.pod
src/collectd-python.pod
src/collectd.conf.in
src/collectd.conf.pod
src/collectd.pod
src/cpu.c
src/curl_json.c
src/curl_xml.c
src/daemon/Makefile.am
src/daemon/collectd.c
src/daemon/common.c
src/daemon/filter_chain.c
src/daemon/plugin.c
src/daemon/plugin.h
src/daemon/types_list.c
src/dbi.c
src/disk.c
src/dns.c
src/exec.c
src/ipmi.c
src/libcollectdclient/Makefile.am
src/libcollectdclient/client.c
src/libcollectdclient/network_buffer.c
src/liboconfig/scanner.l
src/load.c
src/log_logstash.c
src/lvm.c
src/memory.c
src/modbus.c
src/mysql.c
src/netlink.c
src/network.c
src/nfs.c
src/nginx.c
src/ntpd.c
src/openldap.c [new file with mode: 0644]
src/perl.c
src/postgresql.c
src/powerdns.c
src/processes.c
src/python.c
src/pyvalues.c
src/redis.c
src/sensors.c
src/smart.c [new file with mode: 0644]
src/snmp.c
src/swap.c
src/tcpconns.c
src/types.db
src/users.c
src/utils_cmd_flush.c
src/utils_cmd_getval.c
src/utils_cmd_listval.c
src/utils_cmd_putnotif.c
src/utils_cmd_putval.c
src/utils_dns.c
src/utils_latency.c
src/varnish.c
src/virt.c
src/write_graphite.c
src/write_http.c
src/write_kafka.c
src/write_log.c [new file with mode: 0644]
src/write_mongodb.c
src/write_redis.c
src/write_riemann.c
src/write_tsdb.c
src/zookeeper.c [new file with mode: 0644]
version-gen.sh

index 1929b28..f005edd 100644 (file)
@@ -82,3 +82,8 @@ src/tags
 # tests stuff
 src/tests/.deps/
 src/tests/mock/.deps/
+
+# new daemon repo
+src/daemon/.deps/
+src/daemon/.dirstamp
+src/daemon/collectd
diff --git a/AUTHORS b/AUTHORS
index d821d9e..072e7ff 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -81,6 +81,9 @@ Cyril Feraudet <cyril at feraudet.com>
 Dan Berrange <berrange at redhat.com>
  - uuid plugin.
 
+Dan Ryder <daryder at cisco.com>
+ - ceph plugin.
+
 David Bacher <drbacher at gmail.com>
  - serial plugin.
 
@@ -115,12 +118,19 @@ Jason Pepas <cell at ices.utexas.edu>
 J. Javier Maestro <jjmaestro at ieee.org>
  - Write-Graphite plugin: UDP support and LogSendErrors flag.
 
+Jeremy Katz <jeremy at katzbox.net>
+ - percentage reporting in memory and swap plugins.
+ - zookeeper plugin.
+
 Jérôme Renard <jerome.renard at gmail.com>
  - varnish plugin.
 
 Kevin Bowling <kbowling at llnw.com>
  - write_tsdb plugin for http://opentsdb.net/
 
+Kimo Rosenbaum <kimor79 at yahoo.com>
+ - openldap plugin.
+
 Kris Nielander <nielander at fox-it.com>
  - tail_csv plugin.
 
@@ -151,6 +161,7 @@ Marc Fournier <marc.fournier at camptocamp.com>
  - RPM specfile update.
  - libmnl support in the netlink plugin.
  - linux support in the zfs_arc plugin.
+ - openldap plugin.
 
 Marco Chiappero <marco at absence.it>
  - uptime plugin.
@@ -160,6 +171,9 @@ Marco Chiappero <marco at absence.it>
 Michael Hanselmann <public at hansmi.ch>
  - md plugin.
 
+Michael Schenck <mschenck at digitalocean.com>
+ - IO time support to disk plugin.
+
 Michael Stapelberg <michael+git at stapelberg.de>
  - OpenBSD port of the tcpconns plugin.
  - cgroups plugin.
@@ -217,7 +231,7 @@ Piotr Hosowicz <the55 at wp.pl>
  - SMF manifest for collectd.
 
 Richard W. M. Jones <rjones at redhat.com>
- - libvirt plugin.
+ - virt plugin.
  - uuid plugin.
 
 Roman Klesel <roman.klesel at noris.de>
@@ -249,7 +263,7 @@ Sven Trenkel <collectd at semidefinite.de>
  - python plugin.
 
 Tim Laszlo <tim.laszlo at gmail.com>
- - drbd plugin
+ - drbd plugin.
 
 Thomas Meson <zllak at hycik.org>
  - Graphite support for the AMQP plugin.
@@ -260,6 +274,9 @@ Tomasz Pala <gotar at pld-linux.org>
 Tommie Gannert <d00-tga at d.kth.se>
  - PID-file patch.
 
+Vincent Bernat <vincent at bernat.im>
+ - smart plugin.
+
 Vincent Stehlé <vincent.stehle at free.fr>
  - hddtemp plugin.
 
index 8112afa..28be899 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,93 @@
+2015-02-26, Version 5.4.2
+       * Build system: Numerous fixes. Thanks to Bjørn Nordbø, Jim Radford,
+         KOMEDA Shinji, Lauri Tirkkonen, Manuel Luis Sanmartin Rozada, Marc
+         Fournier, Rainer Müller, Yoga Ramalingam and Yves Mettier. #326,
+         #373, #653, #828
+       * collectd: A use-after-free has been fixed in the "parse_value()"
+         function. Thanks to Matthias Urlichs.
+       * collectd: Fix carriage return sign in types_list Thanks to Marc
+         Fournier and @NsLib.
+       * collectd: Fix programming error in src/configfile.c. Thanks to
+         Wilfried Goesgens.
+       * collectd: An off-by-one error has been fixed in the
+         "strstripnewline()" function. Patch by Florian Forster.
+       * collectd: Use the complain mechanism to report filter chain write
+         failures. Thanks to Sebastian Harl.
+       * collectd: Spelling and grammar of error messages have been fixed.
+         Thanks to Katelyn Perry and Tim Laszlo.
+       * collectdctl: Fixed buffering issues which caused trouble on AIX and
+         Solaris. Thanks to Yoga Ramalingam.
+       * Documentation: Details and example about multi-instance filterchain
+         targets have been added. Thanks to Marc Fournier.
+       * Documentation: The "CollectStatistics" option of the rrdcached has
+         been documented. Thanks to Micha Krause. #907
+       * Documentation: The write_redis has been documented. Thanks to Marc
+         Fournier.
+       * Documentation: The "GraphiteSeparateInstances" and
+         "GraphiteAlwaysAppendDS" options of the amqp have been documented.
+         Thanks to Marc Fournier.
+       * Documentation: Documentation of the "AutoLoadPlugin" option has been
+         improved. Thanks to Florian Forster. #715
+       * aggregation: "utils_vl_lookup": A race when creating user objects
+         has been fixed. Thanks to Sebastian Harl. #535
+       * cpu: Temperature code for Mac&nbsp;OS&nbsp;X has been removed.
+         Thanks to Florian Forster and Marc Fournier. #22
+       * cURL, cURL-JSON, cURL-XML and Write HTTP plugins: Call
+         "curl_global_init()" in the plugins' "init()" callback. Thanks to
+         Jeremy Katz.
+       * cURL and memcachec plugins: Fix calculation of gauge, average,
+         minimum and maximum. Previously, they were calculated from the start
+         of the daemon, which is not the documented behavior. Thanks to
+         Florian Forster. #663
+       * curl-json: A bug, which triggered when two URLs with a long common
+         prefix were configured, was fixed. Thanks to Marc Fournier. #582
+       * dbi: Compatibility with new versions of libdbi has been restored.
+         Thanks to Florian Forster. #950
+       * Exec, UnixSock plugins: Fix parsing of the "time" option of the
+         "PUTNOTIF" command. Thanks to Adrian Miron. #477
+       * ipmi: A conflict with the java over the "SIGUSR2" signal has been
+         fixed. Thanks to Vincent Bernat. #114
+       * java: Conversion from Java's time representation to collectd's
+         representation has been fixed. Thanks to Manuel Luis Sanmartín
+         Rozada.
+       * java: Make sure "cjni_thread_detach()" is called on all paths.
+         Thanks to Florian Forster.
+       * LogFile and SysLog plugins: Avoid total silence in case of a
+         misconfiguration. Thanks to Marc Fournier and Wilfried Goesgens.
+       * network: Support for recent versions of gcrypt has been added.
+         Thanks to Vincent Bernat. #632
+       * network: Robustness of the client connecting behavior has been
+         improved. Thanks to Florian Forster. #627
+       * python: Don't create empty "meta_data_t" objects. Thanks to Florian
+         Forster. #716
+       * python: Fix Py list length check in "cpy_build_meta()". Thanks to
+         Yoga Ramalingam.
+       * python: The "interval" member was fixed to export seconds as a
+         double. Thanks to Justin Burnham.
+       * RRDtool and RRDCacheD plugins: A memory leak when creating RRD files
+         has been fixed. Thanks to Yves Mettier. #661
+       * snmp: Fix a memory leak. Thanks to Marc Fournier and Pierre-Yves
+         Ritschard. #610, #804
+       * statsd: Support for samplerates in timer metrics was added. Thanks
+         to John Leach. #461
+       * swap: Fix behavior under OpenVZ by making "cached" optional. Thanks
+         to Florian Forster. #733
+       * threshold: Population of the "time" field in notifications has been
+         added. Thanks to Manuel Luis Sanmartín Rozada.
+       * libvirt: Only gather stats for running domains. Thanks to Ruben
+         Kerkhof.
+       * lvm: An issue with Volume Groups (VGs) without Logical Volumes (LVs)
+         has been fixed. Thanks to Jan Kundrát.
+       * write_graphite: Escape characters not supported by Graphite. Thanks
+         to Pierre-Yves Ritschard and Marc Fournier.
+       * write_http: Make callback names context-dependent. Thanks to Marc
+         Fournier. #821
+       * write_redis: A formatting bug, which resulted in totally unusable
+         numbers being transmitted to Redis, was fixed. Thanks to Marc
+         Fournier.
+       * write_riemann: Receive acknowledge message when using TCP. Thanks to
+         John-John Tedro.
+
 2014-01-26, Version 5.4.1
        * amqp plugin: Add support for RabbitMQ 0.4.x to avoid compiler
          warnings. Thanks to Sebastian Harl for implementing this.
        * zfs_arc plugin: Support for FreeBSD has been added. Thanks to Xin Li
          for his patch.
 
+2015-02-26, Version 5.3.2
+       * Build system: Numerous fixes. Thanks to Bjørn Nordbø, Jim Radford,
+         KOMEDA Shinji, Lauri Tirkkonen, Manuel Luis Sanmartin Rozada, Marc
+         Fournier, Rainer Müller, Yoga Ramalingam and Yves Mettier. #326,
+         #373, #653, #828
+       * collectd: A use-after-free has been fixed in the "parse_value()"
+         function. Thanks to Matthias Urlichs.
+       * collectd: Fix carriage return sign in types_list Thanks to Marc
+         Fournier and @NsLib.
+       * collectd: Fix programming error in src/configfile.c Thanks to
+         Wilfried Goesgens.
+       * collectd: An off-by-one error has been fixed in the
+         "strstripnewline()" function. Patch by Florian Forster.
+       * collectd: Use the complain mechanism to report filter chain write
+         failures. Thanks to Sebastian Harl.
+       * collectd: Spelling and grammar of error messages have been fixed.
+         Thanks to Katelyn Perry and Tim Laszlo.
+       * collectdctl: Fixed buffering issues which caused trouble on AIX and
+         Solaris. Thanks to Yoga Ramalingam.
+       * Documentation: Details and example about multi-instance filterchain
+         targets have been added. Thanks to Marc Fournier.
+       * Documentation: The "CollectStatistics" option of the rrdcached has
+         been documented. Thanks to Micha Krause. #907
+       * Documentation: The write_redis has been documented. Thanks to Marc
+         Fournier.
+       * Documentation: The synopsis of the threshold has been fixed. Thanks
+         to Fabien Wernli.
+       * Documentation: The "GraphiteSeparateInstances" and
+         "GraphiteAlwaysAppendDS" options of the amqp have been documented.
+         Thanks to Marc Fournier.
+       * aggregation: "utils_vl_lookup": A race when creating user objects
+         has been fixed. Thanks to Sebastian Harl. #535
+       * cpu: Temperature code for Mac&nbsp;OS&nbsp;X has been removed.
+         Thanks to Florian Forster and Marc Fournier. #22
+       * csv: A regression which would lead to the "DataDir" option to be
+         ignored has been fixed. Thanks to Manuel Luis Sanmartin Rozada.
+       * curl, curl-json, curl-xml and write_http plugins: Call
+         "curl_global_init()" in the plugins' "init()" callback. Thanks to
+         Jeremy Katz.
+       * curl and memcachec plugins: Fix calculation of gauge, average,
+         minimum and maximum. Previously, they were calculated from the start
+         of the daemon, which is not the documented behavior. Thanks to
+         Florian Forster. #663
+       * dbi plugin: Compatibility with new versions of libdbi has been
+         restored. Thanks to Florian Forster. #950
+       * exec, unixsock plugins: Fix parsing of the "time" option of the
+         "PUTNOTIF" command. Thanks to Adrian Miron. #477
+       * java: Conversion from Java's time representation to collectd's
+         representation has been fixed. Thanks to Manuel Luis Sanmartín
+         Rozada.
+       * ipmi: A conflict with the java over the "SIGUSR2" signal has been
+         fixed. Thanks to Vincent Bernat. #114
+       * java: Make sure "cjni_thread_detach()" is called on all paths.
+         Thanks to Florian Forster.
+       * logfile and syslog plugins: Avoid total silence in case of a
+         misconfiguration. Thanks to Marc Fournier and Wilfried Goesgens.
+       * memcached: Connecting to a UNIX socket has been fixed. Thanks to Jim
+         Radford.
+       * network: Support for recent versions of gcrypt has been added.
+         Thanks to Vincent Bernat. #632
+       * network: Robustness of the client connecting behavior has been
+         improved. Thanks to Florian Forster. #627
+       * python: Don't create empty "meta_data_t" objects. Thanks to Florian
+         Forster. #716
+       * python: Fix Py list length check in "cpy_build_meta()". Thanks to
+         Yoga Ramalingam.
+       * python: The "interval" member was fixed to export seconds as a
+         double. Thanks to Justin Burnham.
+       * replace and set targets: Fix error message. Thanks to Marc Fournier.
+         #448
+       * rrdtool and rrdcached plugins: Honor the "DataDir" config option;
+         this fixes a regression. Thanks to Florian Forster. #380
+       * rrdtool and rrdcached plugins: A memory leak when creating RRD files
+         has been fixed. Thanks to Yves Mettier. #661
+       * snmp: Fix a memory leak. Thanks to Marc Fournier and Pierre-Yves
+         Ritschard. #610, #804
+       * swap: Fix behavior under OpenVZ by making "cached" optional. Thanks
+         to Florian Forster. #733
+       * threshold: Population of the "time" field in notifications has been
+         added. Thanks to Manuel Luis Sanmartín Rozada.
+       * libvirt: Only gather stats for running domains. Thanks to Ruben
+         Kerkhof.
+       * write_graphite: Escape characters not supported by Graphite. Thanks
+         to Pierre-Yves Ritschard and Marc Fournier.
+       * write_http: Make callback names context-dependent. Thanks to Marc
+         Fournier. #821
+       * write_riemann: Receive acknowledge message when using TCP. Thanks to
+         John-John Tedro.
+
 2013-07-13, Version 5.3.1
        * Documentation: Various fixes.
        * Configuration: Fix error handling: Errors in included files were
diff --git a/README b/README
index 1956609..9fb9004 100644 (file)
--- a/README
+++ b/README
@@ -45,6 +45,9 @@ Features
       Name server and resolver statistics from the `statistics-channel'
       interface of BIND 9.5, 9,6 and later.
 
+    - ceph
+      Statistics from the Ceph distributed storage system.
+
     - cgroups
       CPU accounting information for process groups under Linux.
 
@@ -146,9 +149,6 @@ Features
       Detailed CPU statistics of the “Logical Partitions” virtualization
       technique built into IBM's POWER processors.
 
-    - libvirt
-      CPU, memory, disk and network I/O statistics from virtual machines.
-
     - lvm
       Size of “Logical Volumes” (LV) and “Volume Groups” (VG) of Linux'
       “Logical Volume Manager” (LVM).
@@ -232,6 +232,9 @@ Features
       Read onewire sensors using the owcapu library of the owfs project.
       Please read in collectd.conf(5) why this plugin is experimental.
 
+    - openldap
+      Read monitoring information from OpenLDAP's cn=Monitor subtree.
+
     - openvpn
       RX and TX of each client in openvpn-status.log (status-version 2).
       <http://openvpn.net/index.php/documentation/howto.html>
@@ -296,6 +299,10 @@ Features
       to have its measurements fed to collectd. This includes multimeters,
       sound level meters, thermometers, and much more.
 
+    - smart
+      Collect SMART statistics, notably load cycle count, temperature
+      and bad sectors.
+
     - snmp
       Read values from SNMP (Simple Network Management Protocol) enabled
       network devices such as switches, routers, thermometers, rack monitoring
@@ -347,6 +354,9 @@ Features
     - varnish
       Various statistics from Varnish, an HTTP accelerator.
 
+    - virt
+      CPU, memory, disk and network I/O statistics from virtual machines.
+
     - vmem
       Virtual memory statistics, e. g. the number of page-ins/-outs or the
       number of pagefaults.
@@ -364,6 +374,9 @@ Features
     - zfs_arc
       Statistics for ZFS' “Adaptive Replacement Cache” (ARC).
 
+    - zookeeper
+      Read data from Zookeeper's MNTR command.
+
   * Output can be written or sent to various destinations by the following
     plugins:
 
@@ -423,6 +436,9 @@ Features
     - write_kafka
       Sends data to Apache Kafka, a distributed queue.
 
+    - write_log
+      Writes data to the log
+
     - write_mongodb
       Sends data to MongoDB, a NoSQL database.
 
@@ -604,12 +620,16 @@ Prerequisites
     particular.
     <http://developer.apple.com/corefoundation/>
 
+  * libatasmart (optional)
+    Used by the `smart' plugin.
+    <http://git.0pointer.de/?p=libatasmart.git>
+
   * libclntsh (optional)
     Used by the `oracle' plugin.
 
-  * libcredis (optional)
-    Used by the `redis' plugin. Please note that you require a 0.2.2 version
-    or higher. <http://code.google.com/p/credis/>
+  * libhiredis (optional)
+    Used by the redis plugin. Please note that you require a 0.10.0 version
+    or higher. <https://github.com/redis/hiredis>
 
   * libcurl (optional)
     If you want to use the `apache', `ascent', `bind', `curl', `curl_json',
@@ -650,6 +670,10 @@ Prerequisites
     libjvm” below.
     <http://openjdk.java.net/> (and others)
 
+  * libldap (optional)
+    Used by the `openldap' plugin.
+    <http://www.openldap.org/>
+
   * liblvm2 (optional)
     Used by the `lvm' plugin.
     <ftp://sources.redhat.com/pub/lvm2/>
@@ -775,15 +799,15 @@ Prerequisites
 
   * libxml2 (optional)
     Parse XML data. This is needed for the `ascent', `bind', `curl_xml' and
-    `libvirt' plugins.
+    `virt' plugins.
     <http://xmlsoft.org/>
 
   * libxmms (optional)
     <http://www.xmms.org/>
 
   * libyajl (optional)
-    Parse JSON data. This is needed for the `curl_json' and `log_logstash'
-    plugins.
+    Parse JSON data. This is needed for the `ceph', `curl_json' and
+    `log_logstash' plugins.
     <http://github.com/lloyd/yajl>
 
   * libvarnish (optional)
@@ -858,6 +882,23 @@ Configuring with libjvm
   Adding "-ljvm" to the JAVA_LDFLAGS is done automatically, you don't have to
   do that.
 
+Generating the configure script
+-------------------------------
+
+Collectd ships with a `build.sh' script to generate the `configure'
+script shipped with releases.
+
+To generate the `configure` script, you'll need the following dependencies:
+
+- autoconf
+- automake
+- flex
+- bison
+- libtool
+- libtool-ltdl
+
+The `build.sh' script takes no arguments.
+
 Crosscompiling
 --------------
 
index f2ef2fd..68fb260 100644 (file)
@@ -1,8 +1,9 @@
 use ExtUtils::MakeMaker;
 
 WriteMakefile(
-       'NAME'          => 'Collectd',
-       'AUTHOR'        => 'Sebastian Harl <sh@tokkee.org>',
+       NAME                    => 'Collectd',
+       AUTHOR                  => 'Sebastian Harl <sh@tokkee.org>',
+       TEST_REQUIRES   => { 'YAML::Any' => 0 },
 );
 
 # vim: set sw=4 ts=4 tw=78 noexpandtab :
diff --git a/bindings/perl/lib/Collectd/MockDaemon.pm b/bindings/perl/lib/Collectd/MockDaemon.pm
new file mode 100644 (file)
index 0000000..381b2d1
--- /dev/null
@@ -0,0 +1,10745 @@
+package Collectd::MockDaemon;
+use strict;
+use warnings;
+use IO::Socket::UNIX;
+use IO::Handle;
+use File::Temp;
+use Carp;
+use YAML::Any qw/Load/;
+
+use base 'Exporter';
+our @EXPORT = qw/ mockd_start mockd_stop /;
+
+my ($pid, $childfh, $sock_path);
+my $data = Load(do{local $/; <DATA>});
+my @metrics = sort keys %$data;
+
+sub mockd_start {
+    croak "don't call me twice" if defined $pid;
+    $sock_path = File::Temp::mktemp('collectd-mocksock.XXXXXX');
+
+    my $sock = IO::Socket::UNIX->new(
+        Type => SOCK_STREAM,
+        Local => $sock_path,
+        Listen => 1
+    ) or die "Can't open Unix domain socket `$sock_path': $!";
+    $pid = open(my $kid, "-|");
+    croak "cannot fork(): $!" unless defined $pid;
+    if($pid) {
+        $childfh = $kid;
+    } else {
+        daemon($sock);
+        exit 0;
+    }
+    return $sock_path;
+}
+
+sub mockd_stop {
+    return unless defined $childfh;
+    kill 'TERM', $pid;  # kill it with fire
+    unlink $sock_path;
+    $childfh = $pid = undef;
+}
+
+sub daemon {
+    my $sock = shift;
+    while(my $csock = $sock->accept) {
+        while(<$csock>) {
+            chomp;
+            /^LISTVAL\s*$/i and $csock->print(listval()), next;
+            /^GETVAL\s+(.*)$/i and $csock->print(getval($1), "\n"), next;
+            /^PUTVAL|PUTNOTIF|FLUSH\s+(.*)$/i and $csock->print("-1 Unimplemented command `$1'\n"), next;
+            $csock->print("-1 Unknown command: $_\n"), next;
+        }
+    }
+}
+
+sub listval {
+    my $now = time;
+    return print_nvalues(scalar @metrics) .
+    join('', map { "$now $_\n" } @metrics);
+}
+
+sub getval {
+    my ($val) = @_;
+    $val =~ s/(?:^\s+|\s+$)//g;
+    $val =~ s/(?:^"|"$)//g;
+    my $id = _parse_identifier($val) or return "-1 Cannot parse identifier `$val'";
+    return "-1 No such value ($val)" unless exists $data->{$val};
+    my $result = print_nvalues(scalar keys %{$data->{$val}});
+    return $result . join("\n", map { "$_=$data->{$val}{$_}" } keys %{$data->{$val}});
+}
+
+sub _parse_identifier
+{
+       my $s = shift;
+       my ($plugin_instance, $type_instance);
+
+       my ($host, $plugin, $type) = split ('/', $s);
+    return unless length $host and length $plugin and length $type;
+
+       ($plugin, $plugin_instance) = split ('-', $plugin, 2);
+       ($type, $type_instance) = split ('-', $type, 2);
+
+       my $ident =
+       {
+               host => $host,
+               plugin => $plugin,
+               type => $type
+       };
+       $ident->{'plugin_instance'} = $plugin_instance if (defined ($plugin_instance));
+       $ident->{'type_instance'} = $type_instance if (defined ($type_instance));
+
+       return $ident;
+}
+
+sub print_nvalues {
+    my $nvals = shift;
+    return sprintf("%d Value%s found\n", $nvals, $nvals > 1 ? 's' : '');
+}
+
+1;
+
+__DATA__
+---
+a1d8f6310/cpu-0/cpu-idle:
+  value: 9.999973e+01
+a1d8f6310/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+a1d8f6310/cpu-0/cpu-nice:
+  value: 0.000000e+00
+a1d8f6310/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+a1d8f6310/cpu-0/cpu-steal:
+  value: 0.000000e+00
+a1d8f6310/cpu-0/cpu-system:
+  value: 0.000000e+00
+a1d8f6310/cpu-0/cpu-user:
+  value: 9.999996e-02
+a1d8f6310/cpu-0/cpu-wait:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-idle:
+  value: 9.989979e+01
+a1d8f6310/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-nice:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-steal:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-system:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-user:
+  value: 0.000000e+00
+a1d8f6310/cpu-1/cpu-wait:
+  value: 0.000000e+00
+a1d8f6310/df-boot/df_complex-free:
+  value: 4.368712e+08
+a1d8f6310/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+a1d8f6310/df-boot/df_complex-used:
+  value: 6.471270e+07
+a1d8f6310/df-boot/df_inodes-free:
+  value: 3.271800e+04
+a1d8f6310/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-boot/df_inodes-used:
+  value: 5.000000e+01
+a1d8f6310/df-boot/percent_bytes-free:
+  value: 8.267421e+01
+a1d8f6310/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+a1d8f6310/df-boot/percent_bytes-used:
+  value: 1.224634e+01
+a1d8f6310/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+a1d8f6310/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+a1d8f6310/df-data1/df_complex-free:
+  value: 2.636943e+10
+a1d8f6310/df-data1/df_complex-reserved:
+  value: 1.476235e+09
+a1d8f6310/df-data1/df_complex-used:
+  value: 1.215783e+09
+a1d8f6310/df-data1/df_inodes-free:
+  value: 1.797470e+06
+a1d8f6310/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-data1/df_inodes-used:
+  value: 4.770000e+03
+a1d8f6310/df-data1/percent_bytes-free:
+  value: 9.073681e+01
+a1d8f6310/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+a1d8f6310/df-data1/percent_bytes-used:
+  value: 4.183491e+00
+a1d8f6310/df-data1/percent_inodes-free:
+  value: 9.973533e+01
+a1d8f6310/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-data1/percent_inodes-used:
+  value: 2.646706e-01
+a1d8f6310/df-dev-shm/df_complex-free:
+  value: 9.842483e+08
+a1d8f6310/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+a1d8f6310/df-dev-shm/df_inodes-free:
+  value: 2.402940e+05
+a1d8f6310/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+a1d8f6310/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+a1d8f6310/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+a1d8f6310/df-dev-shm/percent_inodes-free:
+  value: 9.999958e+01
+a1d8f6310/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-dev-shm/percent_inodes-used:
+  value: 4.161551e-04
+a1d8f6310/df-root/df_complex-free:
+  value: 1.072081e+10
+a1d8f6310/df-root/df_complex-reserved:
+  value: 6.442435e+08
+a1d8f6310/df-root/df_complex-used:
+  value: 1.317655e+09
+a1d8f6310/df-root/df_inodes-free:
+  value: 7.423750e+05
+a1d8f6310/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-root/df_inodes-used:
+  value: 4.405700e+04
+a1d8f6310/df-root/percent_bytes-free:
+  value: 8.453092e+01
+a1d8f6310/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+a1d8f6310/df-root/percent_bytes-used:
+  value: 1.038938e+01
+a1d8f6310/df-root/percent_inodes-free:
+  value: 9.439786e+01
+a1d8f6310/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-root/percent_inodes-used:
+  value: 5.602138e+00
+a1d8f6310/df-var/df_complex-free:
+  value: 7.454015e+09
+a1d8f6310/df-var/df_complex-reserved:
+  value: 4.294943e+08
+a1d8f6310/df-var/df_complex-used:
+  value: 5.716091e+08
+a1d8f6310/df-var/df_inodes-free:
+  value: 5.222690e+05
+a1d8f6310/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-var/df_inodes-used:
+  value: 2.019000e+03
+a1d8f6310/df-var/percent_bytes-free:
+  value: 8.815979e+01
+a1d8f6310/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+a1d8f6310/df-var/percent_bytes-used:
+  value: 6.760509e+00
+a1d8f6310/df-var/percent_inodes-free:
+  value: 9.961491e+01
+a1d8f6310/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6310/df-var/percent_inodes-used:
+  value: 3.850937e-01
+a1d8f6310/disk-vda/disk_merged:
+  read: 0.000000e+00
+  write: 9.999910e-02
+a1d8f6310/disk-vda/disk_octets:
+  read: 0.000000e+00
+  write: 1.228789e+03
+a1d8f6310/disk-vda/disk_ops:
+  read: 0.000000e+00
+  write: 1.999982e-01
+a1d8f6310/disk-vda/disk_time:
+  read: 0.000000e+00
+  write: 4.999955e-01
+a1d8f6310/disk-vda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6310/disk-vda6/disk_merged:
+  read: 0.000000e+00
+  write: 9.999878e-02
+a1d8f6310/disk-vda6/disk_octets:
+  read: 0.000000e+00
+  write: 1.228786e+03
+a1d8f6310/disk-vda6/disk_ops:
+  read: 0.000000e+00
+  write: 1.999976e-01
+a1d8f6310/disk-vda6/disk_time:
+  read: 0.000000e+00
+  write: 4.999941e-01
+a1d8f6310/load/load:
+  longterm: 7.000000e-02
+  midterm: 6.000000e-02
+  shortterm: 0.000000e+00
+a1d8f6310/memory/memory-buffered:
+  value: 2.348646e+08
+a1d8f6310/memory/memory-cached:
+  value: 5.790310e+08
+a1d8f6310/memory/memory-free:
+  value: 2.351022e+08
+a1d8f6310/memory/memory-used:
+  value: 9.194988e+08
+a1d8f6310/network/if_octets:
+  rx: 0.000000e+00
+  tx: 6.586002e+02
+a1d8f6310/network/if_packets:
+  rx: 0.000000e+00
+  tx: 4.999991e-01
+a1d8f6310/network/queue_length:
+  value: 0.000000e+00
+a1d8f6310/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+a1d8f6310/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+a1d8f6310/network/total_values-send-accepted:
+  value: 1.480003e+01
+a1d8f6310/network/total_values-send-rejected:
+  value: 0.000000e+00
+a1d8f6310/swap/swap-cached:
+  value: 4.173824e+06
+a1d8f6310/swap/swap-free:
+  value: 2.118148e+09
+a1d8f6310/swap/swap-used:
+  value: 2.515354e+07
+a1d8f6310/swap/swap_io-in:
+  value: 0.000000e+00
+a1d8f6310/swap/swap_io-out:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 6.999952e-01
+a1d8f6310/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1d8f6310/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-active_anon:
+  value: 5.748900e+04
+a1d8f6310/vmem/vmpage_number-active_file:
+  value: 1.023940e+05
+a1d8f6310/vmem/vmpage_number-anon_pages:
+  value: 5.851400e+04
+a1d8f6310/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.920000e+02
+a1d8f6310/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-dirty:
+  value: 2.000000e+00
+a1d8f6310/vmem/vmpage_number-file_pages:
+  value: 1.997240e+05
+a1d8f6310/vmem/vmpage_number-free_pages:
+  value: 5.739800e+04
+a1d8f6310/vmem/vmpage_number-inactive_anon:
+  value: 1.004470e+05
+a1d8f6310/vmem/vmpage_number-inactive_file:
+  value: 9.618100e+04
+a1d8f6310/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-kernel_stack:
+  value: 1.280000e+02
+a1d8f6310/vmem/vmpage_number-mapped:
+  value: 4.414000e+03
+a1d8f6310/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-page_table_pages:
+  value: 2.171000e+03
+a1d8f6310/vmem/vmpage_number-shmem:
+  value: 1.290000e+02
+a1d8f6310/vmem/vmpage_number-slab_reclaimable:
+  value: 5.264400e+04
+a1d8f6310/vmem/vmpage_number-slab_unreclaimable:
+  value: 5.743000e+03
+a1d8f6310/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-vmscan_write:
+  value: 7.366000e+03
+a1d8f6310/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+a1d8f6310/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+a1d8f6410/cpu-0/cpu-idle:
+  value: 9.920010e+01
+a1d8f6410/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+a1d8f6410/cpu-0/cpu-nice:
+  value: 0.000000e+00
+a1d8f6410/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+a1d8f6410/cpu-0/cpu-steal:
+  value: 0.000000e+00
+a1d8f6410/cpu-0/cpu-system:
+  value: 1.000001e-01
+a1d8f6410/cpu-0/cpu-user:
+  value: 3.000003e-01
+a1d8f6410/cpu-0/cpu-wait:
+  value: 0.000000e+00
+a1d8f6410/cpu-1/cpu-idle:
+  value: 9.900000e+01
+a1d8f6410/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+a1d8f6410/cpu-1/cpu-nice:
+  value: 0.000000e+00
+a1d8f6410/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+a1d8f6410/cpu-1/cpu-steal:
+  value: 0.000000e+00
+a1d8f6410/cpu-1/cpu-system:
+  value: 2.000000e-01
+a1d8f6410/cpu-1/cpu-user:
+  value: 2.000002e-01
+a1d8f6410/cpu-1/cpu-wait:
+  value: 2.000000e-01
+a1d8f6410/df-boot/df_complex-free:
+  value: 4.369080e+08
+a1d8f6410/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+a1d8f6410/df-boot/df_complex-used:
+  value: 6.467584e+07
+a1d8f6410/df-boot/df_inodes-free:
+  value: 3.271800e+04
+a1d8f6410/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-boot/df_inodes-used:
+  value: 5.000000e+01
+a1d8f6410/df-boot/percent_bytes-free:
+  value: 8.268118e+01
+a1d8f6410/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+a1d8f6410/df-boot/percent_bytes-used:
+  value: 1.223936e+01
+a1d8f6410/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+a1d8f6410/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+a1d8f6410/df-data1/df_complex-free:
+  value: 2.740489e+10
+a1d8f6410/df-data1/df_complex-reserved:
+  value: 1.476235e+09
+a1d8f6410/df-data1/df_complex-used:
+  value: 1.803182e+08
+a1d8f6410/df-data1/df_inodes-free:
+  value: 1.802223e+06
+a1d8f6410/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-data1/df_inodes-used:
+  value: 1.700000e+01
+a1d8f6410/df-data1/percent_bytes-free:
+  value: 9.429982e+01
+a1d8f6410/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+a1d8f6410/df-data1/percent_bytes-used:
+  value: 6.204723e-01
+a1d8f6410/df-data1/percent_inodes-free:
+  value: 9.999906e+01
+a1d8f6410/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-data1/percent_inodes-used:
+  value: 9.432706e-04
+a1d8f6410/df-dev-shm/df_complex-free:
+  value: 2.008437e+09
+a1d8f6410/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+a1d8f6410/df-dev-shm/df_inodes-free:
+  value: 4.903400e+05
+a1d8f6410/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+a1d8f6410/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+a1d8f6410/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+a1d8f6410/df-dev-shm/percent_inodes-free:
+  value: 9.999979e+01
+a1d8f6410/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-dev-shm/percent_inodes-used:
+  value: 2.039397e-04
+a1d8f6410/df-root/df_complex-free:
+  value: 1.030750e+10
+a1d8f6410/df-root/df_complex-reserved:
+  value: 6.442435e+08
+a1d8f6410/df-root/df_complex-used:
+  value: 1.730961e+09
+a1d8f6410/df-root/df_inodes-free:
+  value: 7.294150e+05
+a1d8f6410/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-root/df_inodes-used:
+  value: 5.701700e+04
+a1d8f6410/df-root/percent_bytes-free:
+  value: 8.127210e+01
+a1d8f6410/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+a1d8f6410/df-root/percent_bytes-used:
+  value: 1.364820e+01
+a1d8f6410/df-root/percent_inodes-free:
+  value: 9.274991e+01
+a1d8f6410/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-root/percent_inodes-used:
+  value: 7.250086e+00
+a1d8f6410/df-var/df_complex-free:
+  value: 6.861853e+09
+a1d8f6410/df-var/df_complex-reserved:
+  value: 4.294943e+08
+a1d8f6410/df-var/df_complex-used:
+  value: 1.163772e+09
+a1d8f6410/df-var/df_inodes-free:
+  value: 5.104480e+05
+a1d8f6410/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-var/df_inodes-used:
+  value: 1.384000e+04
+a1d8f6410/df-var/percent_bytes-free:
+  value: 8.115620e+01
+a1d8f6410/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+a1d8f6410/df-var/percent_bytes-used:
+  value: 1.376411e+01
+a1d8f6410/df-var/percent_inodes-free:
+  value: 9.736023e+01
+a1d8f6410/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+a1d8f6410/df-var/percent_inodes-used:
+  value: 2.639771e+00
+a1d8f6410/disk-vda/disk_merged:
+  read: 0.000000e+00
+  write: 3.569994e+01
+a1d8f6410/disk-vda/disk_octets:
+  read: 0.000000e+00
+  write: 1.724413e+05
+a1d8f6410/disk-vda/disk_ops:
+  read: 0.000000e+00
+  write: 6.399989e+00
+a1d8f6410/disk-vda/disk_time:
+  read: 0.000000e+00
+  write: 3.099995e+01
+a1d8f6410/disk-vda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda2/disk_merged:
+  read: 0.000000e+00
+  write: 3.999993e-01
+a1d8f6410/disk-vda2/disk_octets:
+  read: 0.000000e+00
+  write: 7.372786e+03
+a1d8f6410/disk-vda2/disk_ops:
+  read: 0.000000e+00
+  write: 1.399997e+00
+a1d8f6410/disk-vda2/disk_time:
+  read: 0.000000e+00
+  write: 9.999982e-01
+a1d8f6410/disk-vda3/disk_merged:
+  read: 0.000000e+00
+  write: 3.529993e+01
+a1d8f6410/disk-vda3/disk_octets:
+  read: 0.000000e+00
+  write: 1.650685e+05
+a1d8f6410/disk-vda3/disk_ops:
+  read: 0.000000e+00
+  write: 4.999991e+00
+a1d8f6410/disk-vda3/disk_time:
+  read: 0.000000e+00
+  write: 3.939993e+01
+a1d8f6410/disk-vda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/disk-vda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1d8f6410/load/load:
+  longterm: 0.000000e+00
+  midterm: 3.000000e-02
+  shortterm: 5.000000e-02
+a1d8f6410/memory/memory-buffered:
+  value: 3.095921e+08
+a1d8f6410/memory/memory-cached:
+  value: 1.241870e+09
+a1d8f6410/memory/memory-free:
+  value: 2.926060e+08
+a1d8f6410/memory/memory-used:
+  value: 2.172809e+09
+a1d8f6410/network/if_octets:
+  rx: 0.000000e+00
+  tx: 6.586998e+02
+a1d8f6410/network/if_packets:
+  rx: 0.000000e+00
+  tx: 4.999999e-01
+a1d8f6410/network/queue_length:
+  value: 0.000000e+00
+a1d8f6410/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+a1d8f6410/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+a1d8f6410/network/total_values-send-accepted:
+  value: 1.479998e+01
+a1d8f6410/network/total_values-send-rejected:
+  value: 0.000000e+00
+a1d8f6410/swap/swap-cached:
+  value: 2.048000e+05
+a1d8f6410/swap/swap-free:
+  value: 2.147271e+09
+a1d8f6410/swap/swap-used:
+  value: 0.000000e+00
+a1d8f6410/swap/swap_io-in:
+  value: 0.000000e+00
+a1d8f6410/swap/swap_io-out:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 6.400115e+00
+a1d8f6410/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 1.684030e+02
+a1d8f6410/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-active_anon:
+  value: 2.143920e+05
+a1d8f6410/vmem/vmpage_number-active_file:
+  value: 1.979880e+05
+a1d8f6410/vmem/vmpage_number-anon_pages:
+  value: 2.734200e+04
+a1d8f6410/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 3.880000e+02
+a1d8f6410/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-dirty:
+  value: 2.700000e+01
+a1d8f6410/vmem/vmpage_number-file_pages:
+  value: 3.788250e+05
+a1d8f6410/vmem/vmpage_number-free_pages:
+  value: 7.143700e+04
+a1d8f6410/vmem/vmpage_number-inactive_anon:
+  value: 1.176200e+04
+a1d8f6410/vmem/vmpage_number-inactive_file:
+  value: 1.806700e+05
+a1d8f6410/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-kernel_stack:
+  value: 3.000000e+02
+a1d8f6410/vmem/vmpage_number-mapped:
+  value: 1.012100e+04
+a1d8f6410/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-page_table_pages:
+  value: 1.602000e+03
+a1d8f6410/vmem/vmpage_number-shmem:
+  value: 1.170000e+02
+a1d8f6410/vmem/vmpage_number-slab_reclaimable:
+  value: 2.856060e+05
+a1d8f6410/vmem/vmpage_number-slab_unreclaimable:
+  value: 6.201000e+03
+a1d8f6410/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-vmscan_write:
+  value: 7.900000e+01
+a1d8f6410/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+a1d8f6410/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+a1ddf6210/cpu-0/cpu-idle:
+  value: 9.020090e+01
+a1ddf6210/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-0/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-0/cpu-softirq:
+  value: 4.000034e-01
+a1ddf6210/cpu-0/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-0/cpu-system:
+  value: 3.000031e-01
+a1ddf6210/cpu-0/cpu-user:
+  value: 4.200047e+00
+a1ddf6210/cpu-0/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-1/cpu-idle:
+  value: 9.969991e+01
+a1ddf6210/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-1/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-1/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-1/cpu-system:
+  value: 0.000000e+00
+a1ddf6210/cpu-1/cpu-user:
+  value: 2.000011e-01
+a1ddf6210/cpu-1/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-10/cpu-idle:
+  value: 9.979942e+01
+a1ddf6210/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-10/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-10/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-10/cpu-system:
+  value: 0.000000e+00
+a1ddf6210/cpu-10/cpu-user:
+  value: 9.999943e-02
+a1ddf6210/cpu-10/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-11/cpu-idle:
+  value: 9.989938e+01
+a1ddf6210/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-11/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-11/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-11/cpu-system:
+  value: 9.999938e-02
+a1ddf6210/cpu-11/cpu-user:
+  value: 0.000000e+00
+a1ddf6210/cpu-11/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-2/cpu-idle:
+  value: 9.959987e+01
+a1ddf6210/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-2/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-2/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-2/cpu-system:
+  value: 1.999997e-01
+a1ddf6210/cpu-2/cpu-user:
+  value: 9.999988e-02
+a1ddf6210/cpu-2/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-idle:
+  value: 9.989985e+01
+a1ddf6210/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-system:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-user:
+  value: 0.000000e+00
+a1ddf6210/cpu-3/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-idle:
+  value: 9.989964e+01
+a1ddf6210/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-system:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-user:
+  value: 0.000000e+00
+a1ddf6210/cpu-4/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-idle:
+  value: 9.989956e+01
+a1ddf6210/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-system:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-user:
+  value: 0.000000e+00
+a1ddf6210/cpu-5/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-6/cpu-idle:
+  value: 8.899957e+01
+a1ddf6210/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-6/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-6/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-6/cpu-system:
+  value: 1.599993e+00
+a1ddf6210/cpu-6/cpu-user:
+  value: 9.499956e+00
+a1ddf6210/cpu-6/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-7/cpu-idle:
+  value: 9.969946e+01
+a1ddf6210/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-7/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-7/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-7/cpu-system:
+  value: 1.999989e-01
+a1ddf6210/cpu-7/cpu-user:
+  value: 9.999947e-02
+a1ddf6210/cpu-7/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-8/cpu-idle:
+  value: 9.079948e+01
+a1ddf6210/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-8/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-8/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-8/cpu-system:
+  value: 8.999950e-01
+a1ddf6210/cpu-8/cpu-user:
+  value: 8.099954e+00
+a1ddf6210/cpu-8/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/cpu-9/cpu-idle:
+  value: 9.989942e+01
+a1ddf6210/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6210/cpu-9/cpu-nice:
+  value: 0.000000e+00
+a1ddf6210/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6210/cpu-9/cpu-steal:
+  value: 0.000000e+00
+a1ddf6210/cpu-9/cpu-system:
+  value: 9.999942e-02
+a1ddf6210/cpu-9/cpu-user:
+  value: 0.000000e+00
+a1ddf6210/cpu-9/cpu-wait:
+  value: 0.000000e+00
+a1ddf6210/df-boot/df_complex-free:
+  value: 3.880919e+08
+a1ddf6210/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+a1ddf6210/df-boot/df_complex-used:
+  value: 1.134920e+08
+a1ddf6210/df-boot/df_inodes-free:
+  value: 3.270600e+04
+a1ddf6210/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-boot/df_inodes-used:
+  value: 6.200000e+01
+a1ddf6210/df-boot/percent_bytes-free:
+  value: 7.344315e+01
+a1ddf6210/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+a1ddf6210/df-boot/percent_bytes-used:
+  value: 2.147740e+01
+a1ddf6210/df-boot/percent_inodes-free:
+  value: 9.981079e+01
+a1ddf6210/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-boot/percent_inodes-used:
+  value: 1.892090e-01
+a1ddf6210/df-data1/df_complex-free:
+  value: 5.390209e+11
+a1ddf6210/df-data1/df_complex-reserved:
+  value: 2.933339e+10
+a1ddf6210/df-data1/df_complex-used:
+  value: 9.088414e+09
+a1ddf6210/df-data1/df_inodes-free:
+  value: 3.587710e+07
+a1ddf6210/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-data1/df_inodes-used:
+  value: 7.000000e+01
+a1ddf6210/df-data1/percent_bytes-free:
+  value: 9.334621e+01
+a1ddf6210/df-data1/percent_bytes-reserved:
+  value: 5.079879e+00
+a1ddf6210/df-data1/percent_bytes-used:
+  value: 1.573908e+00
+a1ddf6210/df-data1/percent_inodes-free:
+  value: 9.999979e+01
+a1ddf6210/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-data1/percent_inodes-used:
+  value: 1.951102e-04
+a1ddf6210/df-data2/df_complex-free:
+  value: 1.042212e+13
+a1ddf6210/df-data2/df_complex-reserved:
+  value: 1.200219e+11
+a1ddf6210/df-data2/df_complex-used:
+  value: 1.271712e+12
+a1ddf6210/df-data2/df_inodes-free:
+  value: 7.319628e+08
+a1ddf6210/df-data2/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-data2/df_inodes-used:
+  value: 5.985960e+05
+a1ddf6210/df-data2/percent_bytes-free:
+  value: 8.821947e+01
+a1ddf6210/df-data2/percent_bytes-reserved:
+  value: 1.015942e+00
+a1ddf6210/df-data2/percent_bytes-used:
+  value: 1.076458e+01
+a1ddf6210/df-data2/percent_inodes-free:
+  value: 9.991829e+01
+a1ddf6210/df-data2/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-data2/percent_inodes-used:
+  value: 8.171274e-02
+a1ddf6210/df-data3/df_complex-free:
+  value: 1.143610e+13
+a1ddf6210/df-data3/df_complex-reserved:
+  value: 1.200219e+11
+a1ddf6210/df-data3/df_complex-used:
+  value: 2.577290e+11
+a1ddf6210/df-data3/df_inodes-free:
+  value: 7.323576e+08
+a1ddf6210/df-data3/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-data3/df_inodes-used:
+  value: 2.037680e+05
+a1ddf6210/df-data3/percent_bytes-free:
+  value: 9.680247e+01
+a1ddf6210/df-data3/percent_bytes-reserved:
+  value: 1.015942e+00
+a1ddf6210/df-data3/percent_bytes-used:
+  value: 2.181582e+00
+a1ddf6210/df-data3/percent_inodes-free:
+  value: 9.997218e+01
+a1ddf6210/df-data3/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-data3/percent_inodes-used:
+  value: 2.781583e-02
+a1ddf6210/df-dev-shm/df_complex-free:
+  value: 3.375733e+10
+a1ddf6210/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+a1ddf6210/df-dev-shm/df_inodes-free:
+  value: 8.241535e+06
+a1ddf6210/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+a1ddf6210/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+a1ddf6210/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+a1ddf6210/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+a1ddf6210/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-dev-shm/percent_inodes-used:
+  value: 1.213366e-05
+a1ddf6210/df-root/df_complex-free:
+  value: 2.006712e+08
+a1ddf6210/df-root/df_complex-reserved:
+  value: 1.073725e+08
+a1ddf6210/df-root/df_complex-used:
+  value: 1.805705e+09
+a1ddf6210/df-root/df_inodes-free:
+  value: 7.542600e+04
+a1ddf6210/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-root/df_inodes-used:
+  value: 5.564600e+04
+a1ddf6210/df-root/percent_bytes-free:
+  value: 9.493617e+00
+a1ddf6210/df-root/percent_bytes-reserved:
+  value: 5.079720e+00
+a1ddf6210/df-root/percent_bytes-used:
+  value: 8.542667e+01
+a1ddf6210/df-root/percent_inodes-free:
+  value: 5.754547e+01
+a1ddf6210/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-root/percent_inodes-used:
+  value: 4.245453e+01
+a1ddf6210/df-tmp/df_complex-free:
+  value: 1.102356e+08
+a1ddf6210/df-tmp/df_complex-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-tmp/df_complex-used:
+  value: 2.398208e+07
+a1ddf6210/df-tmp/df_inodes-free:
+  value: 8.241515e+06
+a1ddf6210/df-tmp/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-tmp/df_inodes-used:
+  value: 2.100000e+01
+a1ddf6210/df-tmp/percent_bytes-free:
+  value: 8.213196e+01
+a1ddf6210/df-tmp/percent_bytes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-tmp/percent_bytes-used:
+  value: 1.786804e+01
+a1ddf6210/df-tmp/percent_inodes-free:
+  value: 9.999974e+01
+a1ddf6210/df-tmp/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-tmp/percent_inodes-used:
+  value: 2.548069e-04
+a1ddf6210/df-var/df_complex-free:
+  value: 6.870528e+09
+a1ddf6210/df-var/df_complex-reserved:
+  value: 4.294943e+08
+a1ddf6210/df-var/df_complex-used:
+  value: 1.155097e+09
+a1ddf6210/df-var/df_inodes-free:
+  value: 5.196230e+05
+a1ddf6210/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-var/df_inodes-used:
+  value: 4.665000e+03
+a1ddf6210/df-var/percent_bytes-free:
+  value: 8.125880e+01
+a1ddf6210/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+a1ddf6210/df-var/percent_bytes-used:
+  value: 1.366151e+01
+a1ddf6210/df-var/percent_inodes-free:
+  value: 9.911022e+01
+a1ddf6210/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6210/df-var/percent_inodes-used:
+  value: 8.897781e-01
+a1ddf6210/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 2.080016e+01
+a1ddf6210/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 1.212425e+05
+a1ddf6210/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 8.700063e+00
+a1ddf6210/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 1.000007e-01
+a1ddf6210/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 1.960018e+01
+a1ddf6210/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 1.138698e+05
+a1ddf6210/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 8.200073e+00
+a1ddf6210/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 1.000009e-01
+a1ddf6210/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 1.200011e+00
+a1ddf6210/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 6.144060e+03
+a1ddf6210/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 3.000029e-01
+a1ddf6210/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 1.228812e+03
+a1ddf6210/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 2.000019e-01
+a1ddf6210/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdb/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdb/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdb/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdb/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdc/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdc/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdc/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/disk-sdc/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6210/load/load:
+  longterm: 9.000000e-02
+  midterm: 1.400000e-01
+  shortterm: 1.400000e-01
+a1ddf6210/memory/memory-buffered:
+  value: 7.775150e+08
+a1ddf6210/memory/memory-cached:
+  value: 2.349433e+10
+a1ddf6210/memory/memory-free:
+  value: 2.759657e+10
+a1ddf6210/memory/memory-used:
+  value: 1.564624e+10
+a1ddf6210/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.455100e+03
+a1ddf6210/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.100000e+00
+a1ddf6210/network/queue_length:
+  value: 0.000000e+00
+a1ddf6210/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+a1ddf6210/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+a1ddf6210/network/total_values-send-accepted:
+  value: 2.720003e+01
+a1ddf6210/network/total_values-send-rejected:
+  value: 0.000000e+00
+a1ddf6210/swap/swap-cached:
+  value: 0.000000e+00
+a1ddf6210/swap/swap-free:
+  value: 2.147475e+09
+a1ddf6210/swap/swap-used:
+  value: 0.000000e+00
+a1ddf6210/swap/swap_io-in:
+  value: 0.000000e+00
+a1ddf6210/swap/swap_io-out:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 1.770240e+04
+a1ddf6210/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 1.100000e+02
+a1ddf6210/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-active_anon:
+  value: 7.455600e+05
+a1ddf6210/vmem/vmpage_number-active_file:
+  value: 3.175860e+05
+a1ddf6210/vmem/vmpage_number-anon_pages:
+  value: 5.005000e+04
+a1ddf6210/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.356000e+03
+a1ddf6210/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-dirty:
+  value: 1.550000e+02
+a1ddf6210/vmem/vmpage_number-file_pages:
+  value: 5.925744e+06
+a1ddf6210/vmem/vmpage_number-free_pages:
+  value: 6.737445e+06
+a1ddf6210/vmem/vmpage_number-inactive_anon:
+  value: 4.923000e+03
+a1ddf6210/vmem/vmpage_number-inactive_file:
+  value: 5.601994e+06
+a1ddf6210/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-kernel_stack:
+  value: 3.480000e+02
+a1ddf6210/vmem/vmpage_number-mapped:
+  value: 6.515000e+03
+a1ddf6210/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-page_table_pages:
+  value: 4.479000e+03
+a1ddf6210/vmem/vmpage_number-shmem:
+  value: 6.170000e+03
+a1ddf6210/vmem/vmpage_number-slab_reclaimable:
+  value: 2.916436e+06
+a1ddf6210/vmem/vmpage_number-slab_unreclaimable:
+  value: 4.737700e+04
+a1ddf6210/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+a1ddf6210/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+a1ddf6510/cpu-0/cpu-idle:
+  value: 9.159977e+01
+a1ddf6510/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-0/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-0/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-0/cpu-system:
+  value: 2.999997e+00
+a1ddf6510/cpu-0/cpu-user:
+  value: 5.200008e+00
+a1ddf6510/cpu-0/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-1/cpu-idle:
+  value: 9.989949e+01
+a1ddf6510/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-1/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-1/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-1/cpu-system:
+  value: 9.999952e-02
+a1ddf6510/cpu-1/cpu-user:
+  value: 0.000000e+00
+a1ddf6510/cpu-1/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-10/cpu-idle:
+  value: 9.799903e+01
+a1ddf6510/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-10/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-10/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-10/cpu-system:
+  value: 1.199988e+00
+a1ddf6510/cpu-10/cpu-user:
+  value: 5.999943e-01
+a1ddf6510/cpu-10/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-idle:
+  value: 9.999894e+01
+a1ddf6510/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-system:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-user:
+  value: 0.000000e+00
+a1ddf6510/cpu-11/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-idle:
+  value: 9.989933e+01
+a1ddf6510/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-system:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-user:
+  value: 0.000000e+00
+a1ddf6510/cpu-2/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-3/cpu-idle:
+  value: 9.989927e+01
+a1ddf6510/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-3/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-3/cpu-softirq:
+  value: 9.999927e-02
+a1ddf6510/cpu-3/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-3/cpu-system:
+  value: 0.000000e+00
+a1ddf6510/cpu-3/cpu-user:
+  value: 0.000000e+00
+a1ddf6510/cpu-3/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-4/cpu-idle:
+  value: 9.999933e+01
+a1ddf6510/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-4/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-4/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-4/cpu-system:
+  value: 0.000000e+00
+a1ddf6510/cpu-4/cpu-user:
+  value: 9.999930e-02
+a1ddf6510/cpu-4/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-idle:
+  value: 9.999932e+01
+a1ddf6510/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-system:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-user:
+  value: 0.000000e+00
+a1ddf6510/cpu-5/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-6/cpu-idle:
+  value: 9.589926e+01
+a1ddf6510/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-6/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-6/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-6/cpu-system:
+  value: 2.099986e+00
+a1ddf6510/cpu-6/cpu-user:
+  value: 1.999987e+00
+a1ddf6510/cpu-6/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-7/cpu-idle:
+  value: 9.679919e+01
+a1ddf6510/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-7/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-7/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-7/cpu-system:
+  value: 2.199982e+00
+a1ddf6510/cpu-7/cpu-user:
+  value: 1.099991e+00
+a1ddf6510/cpu-7/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-8/cpu-idle:
+  value: 9.439919e+01
+a1ddf6510/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-8/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-8/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-8/cpu-system:
+  value: 4.399963e+00
+a1ddf6510/cpu-8/cpu-user:
+  value: 1.099991e+00
+a1ddf6510/cpu-8/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/cpu-9/cpu-idle:
+  value: 9.949910e+01
+a1ddf6510/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6510/cpu-9/cpu-nice:
+  value: 0.000000e+00
+a1ddf6510/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6510/cpu-9/cpu-steal:
+  value: 0.000000e+00
+a1ddf6510/cpu-9/cpu-system:
+  value: 1.999982e-01
+a1ddf6510/cpu-9/cpu-user:
+  value: 9.999913e-02
+a1ddf6510/cpu-9/cpu-wait:
+  value: 0.000000e+00
+a1ddf6510/df-boot/df_complex-free:
+  value: 4.369039e+08
+a1ddf6510/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+a1ddf6510/df-boot/df_complex-used:
+  value: 6.467994e+07
+a1ddf6510/df-boot/df_inodes-free:
+  value: 3.271800e+04
+a1ddf6510/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-boot/df_inodes-used:
+  value: 5.000000e+01
+a1ddf6510/df-boot/percent_bytes-free:
+  value: 8.268041e+01
+a1ddf6510/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+a1ddf6510/df-boot/percent_bytes-used:
+  value: 1.224014e+01
+a1ddf6510/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+a1ddf6510/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+a1ddf6510/df-data1/df_complex-free:
+  value: 5.378703e+11
+a1ddf6510/df-data1/df_complex-reserved:
+  value: 2.879652e+10
+a1ddf6510/df-data1/df_complex-used:
+  value: 2.072412e+08
+a1ddf6510/df-data1/df_inodes-free:
+  value: 3.522052e+07
+a1ddf6510/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-data1/df_inodes-used:
+  value: 1.300000e+01
+a1ddf6510/df-data1/percent_bytes-free:
+  value: 9.488357e+01
+a1ddf6510/df-data1/percent_bytes-reserved:
+  value: 5.079879e+00
+a1ddf6510/df-data1/percent_bytes-used:
+  value: 3.655860e-02
+a1ddf6510/df-data1/percent_inodes-free:
+  value: 9.999996e+01
+a1ddf6510/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-data1/percent_inodes-used:
+  value: 3.691029e-05
+a1ddf6510/df-dev-shm/df_complex-free:
+  value: 3.375725e+10
+a1ddf6510/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+a1ddf6510/df-dev-shm/df_inodes-free:
+  value: 8.241515e+06
+a1ddf6510/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+a1ddf6510/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+a1ddf6510/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+a1ddf6510/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+a1ddf6510/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-dev-shm/percent_inodes-used:
+  value: 1.213369e-05
+a1ddf6510/df-root/df_complex-free:
+  value: 1.057486e+10
+a1ddf6510/df-root/df_complex-reserved:
+  value: 6.442435e+08
+a1ddf6510/df-root/df_complex-used:
+  value: 1.463607e+09
+a1ddf6510/df-root/df_inodes-free:
+  value: 7.435400e+05
+a1ddf6510/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-root/df_inodes-used:
+  value: 4.289200e+04
+a1ddf6510/df-root/percent_bytes-free:
+  value: 8.338012e+01
+a1ddf6510/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+a1ddf6510/df-root/percent_bytes-used:
+  value: 1.154018e+01
+a1ddf6510/df-root/percent_inodes-free:
+  value: 9.454601e+01
+a1ddf6510/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-root/percent_inodes-used:
+  value: 5.454000e+00
+a1ddf6510/df-var/df_complex-free:
+  value: 6.990479e+09
+a1ddf6510/df-var/df_complex-reserved:
+  value: 4.294943e+08
+a1ddf6510/df-var/df_complex-used:
+  value: 1.035145e+09
+a1ddf6510/df-var/df_inodes-free:
+  value: 5.169860e+05
+a1ddf6510/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-var/df_inodes-used:
+  value: 7.302000e+03
+a1ddf6510/df-var/percent_bytes-free:
+  value: 8.267748e+01
+a1ddf6510/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+a1ddf6510/df-var/percent_bytes-used:
+  value: 1.224282e+01
+a1ddf6510/df-var/percent_inodes-free:
+  value: 9.860725e+01
+a1ddf6510/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6510/df-var/percent_inodes-used:
+  value: 1.392746e+00
+a1ddf6510/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 2.457548e+03
+a1ddf6510/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 5.999873e-01
+a1ddf6510/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 9.999788e-01
+a1ddf6510/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 2.457548e+03
+a1ddf6510/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 5.999872e-01
+a1ddf6510/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 9.999786e-01
+a1ddf6510/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6510/load/load:
+  longterm: 0.000000e+00
+  midterm: 0.000000e+00
+  shortterm: 0.000000e+00
+a1ddf6510/memory/memory-buffered:
+  value: 2.371871e+08
+a1ddf6510/memory/memory-cached:
+  value: 1.447993e+09
+a1ddf6510/memory/memory-free:
+  value: 6.351406e+10
+a1ddf6510/memory/memory-used:
+  value: 2.315260e+09
+a1ddf6510/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.052800e+03
+a1ddf6510/network/if_packets:
+  rx: 0.000000e+00
+  tx: 8.000000e-01
+a1ddf6510/network/queue_length:
+  value: 0.000000e+00
+a1ddf6510/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+a1ddf6510/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+a1ddf6510/network/total_values-send-accepted:
+  value: 2.280001e+01
+a1ddf6510/network/total_values-send-rejected:
+  value: 0.000000e+00
+a1ddf6510/swap/swap-cached:
+  value: 0.000000e+00
+a1ddf6510/swap/swap-free:
+  value: 2.147475e+09
+a1ddf6510/swap/swap-used:
+  value: 0.000000e+00
+a1ddf6510/swap/swap_io-in:
+  value: 0.000000e+00
+a1ddf6510/swap/swap_io-out:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 3.700034e+00
+a1ddf6510/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1ddf6510/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-active_anon:
+  value: 8.369400e+04
+a1ddf6510/vmem/vmpage_number-active_file:
+  value: 2.449340e+05
+a1ddf6510/vmem/vmpage_number-anon_pages:
+  value: 4.576400e+04
+a1ddf6510/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 7.500000e+01
+a1ddf6510/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-dirty:
+  value: 1.000000e+00
+a1ddf6510/vmem/vmpage_number-file_pages:
+  value: 4.114210e+05
+a1ddf6510/vmem/vmpage_number-free_pages:
+  value: 1.550636e+07
+a1ddf6510/vmem/vmpage_number-inactive_anon:
+  value: 2.130000e+02
+a1ddf6510/vmem/vmpage_number-inactive_file:
+  value: 1.662360e+05
+a1ddf6510/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-kernel_stack:
+  value: 3.110000e+02
+a1ddf6510/vmem/vmpage_number-mapped:
+  value: 6.615000e+03
+a1ddf6510/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-page_table_pages:
+  value: 2.683000e+03
+a1ddf6510/vmem/vmpage_number-shmem:
+  value: 2.550000e+02
+a1ddf6510/vmem/vmpage_number-slab_reclaimable:
+  value: 3.633060e+05
+a1ddf6510/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.422200e+04
+a1ddf6510/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+a1ddf6510/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+a1ddf6610/cpu-0/cpu-idle:
+  value: 8.969821e+01
+a1ddf6610/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-0/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-0/cpu-softirq:
+  value: 1.099984e+00
+a1ddf6610/cpu-0/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-0/cpu-system:
+  value: 3.499955e+00
+a1ddf6610/cpu-0/cpu-user:
+  value: 2.199975e+00
+a1ddf6610/cpu-0/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-1/cpu-idle:
+  value: 9.719322e+01
+a1ddf6610/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-1/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-1/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-1/cpu-system:
+  value: 1.899957e+00
+a1ddf6610/cpu-1/cpu-user:
+  value: 5.999838e-01
+a1ddf6610/cpu-1/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-10/cpu-idle:
+  value: 9.979814e+01
+a1ddf6610/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-10/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-10/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-10/cpu-system:
+  value: 9.999814e-02
+a1ddf6610/cpu-10/cpu-user:
+  value: 0.000000e+00
+a1ddf6610/cpu-10/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-11/cpu-idle:
+  value: 9.979789e+01
+a1ddf6610/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-11/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-11/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-11/cpu-system:
+  value: 9.999790e-02
+a1ddf6610/cpu-11/cpu-user:
+  value: 0.000000e+00
+a1ddf6610/cpu-11/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-12/cpu-idle:
+  value: 9.709848e+01
+a1ddf6610/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-12/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-12/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-12/cpu-system:
+  value: 1.599972e+00
+a1ddf6610/cpu-12/cpu-user:
+  value: 1.199978e+00
+a1ddf6610/cpu-12/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-13/cpu-idle:
+  value: 7.879859e+01
+a1ddf6610/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-13/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-13/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-13/cpu-system:
+  value: 1.309976e+01
+a1ddf6610/cpu-13/cpu-user:
+  value: 8.099863e+00
+a1ddf6610/cpu-13/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-14/cpu-idle:
+  value: 9.309875e+01
+a1ddf6610/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-14/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-14/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-14/cpu-system:
+  value: 4.699934e+00
+a1ddf6610/cpu-14/cpu-user:
+  value: 2.099971e+00
+a1ddf6610/cpu-14/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-15/cpu-idle:
+  value: 8.789892e+01
+a1ddf6610/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-15/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-15/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-15/cpu-system:
+  value: 7.999894e+00
+a1ddf6610/cpu-15/cpu-user:
+  value: 3.599950e+00
+a1ddf6610/cpu-15/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-16/cpu-idle:
+  value: 9.959880e+01
+a1ddf6610/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-16/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-16/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-16/cpu-system:
+  value: 2.999964e-01
+a1ddf6610/cpu-16/cpu-user:
+  value: 9.999874e-02
+a1ddf6610/cpu-16/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-17/cpu-idle:
+  value: 9.959911e+01
+a1ddf6610/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-17/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-17/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-17/cpu-system:
+  value: 1.999981e-01
+a1ddf6610/cpu-17/cpu-user:
+  value: 9.999911e-02
+a1ddf6610/cpu-17/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-18/cpu-idle:
+  value: 9.519927e+01
+a1ddf6610/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-18/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-18/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-18/cpu-system:
+  value: 2.499979e+00
+a1ddf6610/cpu-18/cpu-user:
+  value: 1.899982e+00
+a1ddf6610/cpu-18/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-19/cpu-idle:
+  value: 8.319942e+01
+a1ddf6610/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-19/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-19/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-19/cpu-system:
+  value: 1.189992e+01
+a1ddf6610/cpu-19/cpu-user:
+  value: 3.999985e+00
+a1ddf6610/cpu-19/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-2/cpu-idle:
+  value: 9.899200e+01
+a1ddf6610/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-2/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-2/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-2/cpu-system:
+  value: 3.999674e-01
+a1ddf6610/cpu-2/cpu-user:
+  value: 2.999799e-01
+a1ddf6610/cpu-2/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-20/cpu-idle:
+  value: 9.389955e+01
+a1ddf6610/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-20/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-20/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-20/cpu-system:
+  value: 4.199980e+00
+a1ddf6610/cpu-20/cpu-user:
+  value: 1.399991e+00
+a1ddf6610/cpu-20/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-21/cpu-idle:
+  value: 8.779956e+01
+a1ddf6610/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-21/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-21/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-21/cpu-system:
+  value: 8.199940e+00
+a1ddf6610/cpu-21/cpu-user:
+  value: 3.599972e+00
+a1ddf6610/cpu-21/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-22/cpu-idle:
+  value: 9.959932e+01
+a1ddf6610/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-22/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-22/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-22/cpu-system:
+  value: 2.999981e-01
+a1ddf6610/cpu-22/cpu-user:
+  value: 9.999956e-02
+a1ddf6610/cpu-22/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-23/cpu-idle:
+  value: 9.929916e+01
+a1ddf6610/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-23/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-23/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-23/cpu-system:
+  value: 4.999943e-01
+a1ddf6610/cpu-23/cpu-user:
+  value: 0.000000e+00
+a1ddf6610/cpu-23/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-3/cpu-idle:
+  value: 9.949283e+01
+a1ddf6610/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-3/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-3/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-3/cpu-system:
+  value: 9.999309e-02
+a1ddf6610/cpu-3/cpu-user:
+  value: 1.999852e-01
+a1ddf6610/cpu-3/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-idle:
+  value: 9.989305e+01
+a1ddf6610/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-system:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-user:
+  value: 0.000000e+00
+a1ddf6610/cpu-4/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-5/cpu-idle:
+  value: 9.989362e+01
+a1ddf6610/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-5/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-5/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-5/cpu-system:
+  value: 9.999406e-02
+a1ddf6610/cpu-5/cpu-user:
+  value: 0.000000e+00
+a1ddf6610/cpu-5/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-6/cpu-idle:
+  value: 9.469571e+01
+a1ddf6610/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-6/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-6/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-6/cpu-system:
+  value: 3.499803e+00
+a1ddf6610/cpu-6/cpu-user:
+  value: 1.199947e+00
+a1ddf6610/cpu-6/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-7/cpu-idle:
+  value: 9.819573e+01
+a1ddf6610/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-7/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-7/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-7/cpu-system:
+  value: 1.299941e+00
+a1ddf6610/cpu-7/cpu-user:
+  value: 2.999861e-01
+a1ddf6610/cpu-7/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-8/cpu-idle:
+  value: 9.929729e+01
+a1ddf6610/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-8/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-8/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-8/cpu-system:
+  value: 1.999943e-01
+a1ddf6610/cpu-8/cpu-user:
+  value: 9.999644e-02
+a1ddf6610/cpu-8/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/cpu-9/cpu-idle:
+  value: 9.989737e+01
+a1ddf6610/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+a1ddf6610/cpu-9/cpu-nice:
+  value: 0.000000e+00
+a1ddf6610/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+a1ddf6610/cpu-9/cpu-steal:
+  value: 0.000000e+00
+a1ddf6610/cpu-9/cpu-system:
+  value: 9.999736e-02
+a1ddf6610/cpu-9/cpu-user:
+  value: 0.000000e+00
+a1ddf6610/cpu-9/cpu-wait:
+  value: 0.000000e+00
+a1ddf6610/df-boot/df_complex-free:
+  value: 4.793754e+08
+a1ddf6610/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+a1ddf6610/df-boot/df_complex-used:
+  value: 2.220851e+07
+a1ddf6610/df-boot/df_inodes-free:
+  value: 3.273000e+04
+a1ddf6610/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-boot/df_inodes-used:
+  value: 3.800000e+01
+a1ddf6610/df-boot/percent_bytes-free:
+  value: 9.071777e+01
+a1ddf6610/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+a1ddf6610/df-boot/percent_bytes-used:
+  value: 4.202775e+00
+a1ddf6610/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+a1ddf6610/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+a1ddf6610/df-data1/df_complex-free:
+  value: 2.574899e+11
+a1ddf6610/df-data1/df_complex-reserved:
+  value: 1.379019e+10
+a1ddf6610/df-data1/df_complex-used:
+  value: 1.961411e+08
+a1ddf6610/df-data1/df_inodes-free:
+  value: 1.683454e+07
+a1ddf6610/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-data1/df_inodes-used:
+  value: 1.800000e+01
+a1ddf6610/df-data1/percent_bytes-free:
+  value: 9.484805e+01
+a1ddf6610/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+a1ddf6610/df-data1/percent_bytes-used:
+  value: 7.224981e-02
+a1ddf6610/df-data1/percent_inodes-free:
+  value: 9.999989e+01
+a1ddf6610/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-data1/percent_inodes-used:
+  value: 1.069229e-04
+a1ddf6610/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+a1ddf6610/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+a1ddf6610/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+a1ddf6610/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+a1ddf6610/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+a1ddf6610/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+a1ddf6610/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+a1ddf6610/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+a1ddf6610/df-root/df_complex-free:
+  value: 1.030392e+10
+a1ddf6610/df-root/df_complex-reserved:
+  value: 6.442435e+08
+a1ddf6610/df-root/df_complex-used:
+  value: 1.734545e+09
+a1ddf6610/df-root/df_inodes-free:
+  value: 7.387960e+05
+a1ddf6610/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-root/df_inodes-used:
+  value: 4.763600e+04
+a1ddf6610/df-root/percent_bytes-free:
+  value: 8.124384e+01
+a1ddf6610/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+a1ddf6610/df-root/percent_bytes-used:
+  value: 1.367646e+01
+a1ddf6610/df-root/percent_inodes-free:
+  value: 9.394276e+01
+a1ddf6610/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-root/percent_inodes-used:
+  value: 6.057231e+00
+a1ddf6610/df-var/df_complex-free:
+  value: 5.412876e+09
+a1ddf6610/df-var/df_complex-reserved:
+  value: 4.294943e+08
+a1ddf6610/df-var/df_complex-used:
+  value: 2.612748e+09
+a1ddf6610/df-var/df_inodes-free:
+  value: 5.218510e+05
+a1ddf6610/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-var/df_inodes-used:
+  value: 2.437000e+03
+a1ddf6610/df-var/percent_bytes-free:
+  value: 6.401893e+01
+a1ddf6610/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+a1ddf6610/df-var/percent_bytes-used:
+  value: 3.090138e+01
+a1ddf6610/df-var/percent_inodes-free:
+  value: 9.953518e+01
+a1ddf6610/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+a1ddf6610/df-var/percent_inodes-used:
+  value: 4.648209e-01
+a1ddf6610/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 1.224974e+02
+a1ddf6610/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 5.377975e+05
+a1ddf6610/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 8.799739e+00
+a1ddf6610/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 1.599958e+00
+a1ddf6610/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 1.148967e+02
+a1ddf6610/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 4.829033e+05
+a1ddf6610/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 2.999895e+00
+a1ddf6610/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 3.999861e-01
+a1ddf6610/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 7.599447e+00
+a1ddf6610/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 5.488478e+04
+a1ddf6610/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 5.799747e+00
+a1ddf6610/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 2.299833e+00
+a1ddf6610/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+a1ddf6610/load/load:
+  longterm: 2.600000e-01
+  midterm: 2.400000e-01
+  shortterm: 3.000000e-02
+a1ddf6610/memory/memory-buffered:
+  value: 2.945802e+08
+a1ddf6610/memory/memory-cached:
+  value: 2.390438e+09
+a1ddf6610/memory/memory-free:
+  value: 6.154120e+10
+a1ddf6610/memory/memory-used:
+  value: 3.287953e+09
+a1ddf6610/network/if_octets:
+  rx: 2.326949e+04
+  tx: 0.000000e+00
+a1ddf6610/network/if_packets:
+  rx: 1.759976e+01
+  tx: 0.000000e+00
+a1ddf6610/network/queue_length:
+  value: 0.000000e+00
+a1ddf6610/network/total_values-dispatch-accepted:
+  value: 4.607941e+02
+a1ddf6610/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+a1ddf6610/network/total_values-send-accepted:
+  value: 0.000000e+00
+a1ddf6610/network/total_values-send-rejected:
+  value: 0.000000e+00
+a1ddf6610/swap/swap-cached:
+  value: 0.000000e+00
+a1ddf6610/swap/swap-free:
+  value: 2.147475e+09
+a1ddf6610/swap/swap-used:
+  value: 0.000000e+00
+a1ddf6610/swap/swap_io-in:
+  value: 0.000000e+00
+a1ddf6610/swap/swap_io-out:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 1.460435e+05
+a1ddf6610/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 5.252066e+02
+a1ddf6610/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-active_anon:
+  value: 7.743400e+04
+a1ddf6610/vmem/vmpage_number-active_file:
+  value: 5.886950e+05
+a1ddf6610/vmem/vmpage_number-anon_pages:
+  value: 3.168900e+04
+a1ddf6610/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 8.900000e+01
+a1ddf6610/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-dirty:
+  value: 1.217000e+03
+a1ddf6610/vmem/vmpage_number-file_pages:
+  value: 6.555230e+05
+a1ddf6610/vmem/vmpage_number-free_pages:
+  value: 1.502482e+07
+a1ddf6610/vmem/vmpage_number-inactive_anon:
+  value: 1.440000e+02
+a1ddf6610/vmem/vmpage_number-inactive_file:
+  value: 6.663400e+04
+a1ddf6610/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-kernel_stack:
+  value: 5.050000e+02
+a1ddf6610/vmem/vmpage_number-mapped:
+  value: 7.061000e+03
+a1ddf6610/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-page_table_pages:
+  value: 2.714000e+03
+a1ddf6610/vmem/vmpage_number-shmem:
+  value: 2.010000e+02
+a1ddf6610/vmem/vmpage_number-slab_reclaimable:
+  value: 5.981700e+05
+a1ddf6610/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.751300e+04
+a1ddf6610/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+a1ddf6610/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+h2gdf6120/cpu-0/cpu-idle:
+  value: 9.830055e+01
+h2gdf6120/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-0/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-0/cpu-softirq:
+  value: 1.000006e-01
+h2gdf6120/cpu-0/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-0/cpu-system:
+  value: 2.000012e-01
+h2gdf6120/cpu-0/cpu-user:
+  value: 7.000045e-01
+h2gdf6120/cpu-0/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-1/cpu-idle:
+  value: 9.630047e+01
+h2gdf6120/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-1/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-1/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-1/cpu-system:
+  value: 5.000024e-01
+h2gdf6120/cpu-1/cpu-user:
+  value: 3.300017e+00
+h2gdf6120/cpu-1/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-10/cpu-idle:
+  value: 9.990053e+01
+h2gdf6120/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-10/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-10/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-10/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-10/cpu-user:
+  value: 1.000005e-01
+h2gdf6120/cpu-10/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-idle:
+  value: 9.990010e+01
+h2gdf6120/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-11/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-12/cpu-idle:
+  value: 9.600001e+01
+h2gdf6120/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-12/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-12/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-12/cpu-system:
+  value: 7.000001e-01
+h2gdf6120/cpu-12/cpu-user:
+  value: 2.900000e+00
+h2gdf6120/cpu-12/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-13/cpu-idle:
+  value: 9.740004e+01
+h2gdf6120/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-13/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-13/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-13/cpu-system:
+  value: 2.000001e-01
+h2gdf6120/cpu-13/cpu-user:
+  value: 2.100001e+00
+h2gdf6120/cpu-13/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-14/cpu-idle:
+  value: 9.920005e+01
+h2gdf6120/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-14/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-14/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-14/cpu-system:
+  value: 1.000000e-01
+h2gdf6120/cpu-14/cpu-user:
+  value: 6.000003e-01
+h2gdf6120/cpu-14/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-15/cpu-idle:
+  value: 9.990025e+01
+h2gdf6120/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-15/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-15/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-15/cpu-system:
+  value: 1.000002e-01
+h2gdf6120/cpu-15/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-15/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-16/cpu-idle:
+  value: 9.989996e+01
+h2gdf6120/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-16/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-16/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-16/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-16/cpu-user:
+  value: 1.000000e-01
+h2gdf6120/cpu-16/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-idle:
+  value: 9.999995e+01
+h2gdf6120/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-17/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-18/cpu-idle:
+  value: 9.989994e+01
+h2gdf6120/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-18/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-18/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-18/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-18/cpu-user:
+  value: 9.999997e-02
+h2gdf6120/cpu-18/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-19/cpu-idle:
+  value: 9.930003e+01
+h2gdf6120/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-19/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-19/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-19/cpu-system:
+  value: 9.999996e-02
+h2gdf6120/cpu-19/cpu-user:
+  value: 4.999998e-01
+h2gdf6120/cpu-19/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-2/cpu-idle:
+  value: 9.800028e+01
+h2gdf6120/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-2/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-2/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-2/cpu-system:
+  value: 3.000009e-01
+h2gdf6120/cpu-2/cpu-user:
+  value: 2.000007e+00
+h2gdf6120/cpu-2/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-20/cpu-idle:
+  value: 9.980000e+01
+h2gdf6120/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-20/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-20/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-20/cpu-system:
+  value: 9.999990e-02
+h2gdf6120/cpu-20/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-20/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-idle:
+  value: 9.990021e+01
+h2gdf6120/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-21/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-22/cpu-idle:
+  value: 9.660017e+01
+h2gdf6120/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-22/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-22/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-22/cpu-system:
+  value: 1.000002e-01
+h2gdf6120/cpu-22/cpu-user:
+  value: 3.000008e+00
+h2gdf6120/cpu-22/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-idle:
+  value: 1.000001e+02
+h2gdf6120/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-23/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-3/cpu-idle:
+  value: 9.840034e+01
+h2gdf6120/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-3/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-3/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-3/cpu-system:
+  value: 3.000008e-01
+h2gdf6120/cpu-3/cpu-user:
+  value: 1.700004e+00
+h2gdf6120/cpu-3/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-4/cpu-idle:
+  value: 9.930038e+01
+h2gdf6120/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-4/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-4/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-4/cpu-system:
+  value: 1.000004e-01
+h2gdf6120/cpu-4/cpu-user:
+  value: 5.000020e-01
+h2gdf6120/cpu-4/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-idle:
+  value: 1.000003e+02
+h2gdf6120/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-5/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-6/cpu-idle:
+  value: 9.840033e+01
+h2gdf6120/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-6/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-6/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-6/cpu-system:
+  value: 3.000009e-01
+h2gdf6120/cpu-6/cpu-user:
+  value: 1.200004e+00
+h2gdf6120/cpu-6/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-7/cpu-idle:
+  value: 9.700041e+01
+h2gdf6120/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-7/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-7/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-7/cpu-system:
+  value: 2.000008e-01
+h2gdf6120/cpu-7/cpu-user:
+  value: 2.500009e+00
+h2gdf6120/cpu-7/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-idle:
+  value: 1.000004e+02
+h2gdf6120/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-8/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-idle:
+  value: 9.990057e+01
+h2gdf6120/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-nice:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-steal:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-system:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-user:
+  value: 0.000000e+00
+h2gdf6120/cpu-9/cpu-wait:
+  value: 0.000000e+00
+h2gdf6120/df-boot/df_complex-free:
+  value: 4.325089e+08
+h2gdf6120/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+h2gdf6120/df-boot/df_complex-used:
+  value: 6.907494e+07
+h2gdf6120/df-boot/df_inodes-free:
+  value: 3.271800e+04
+h2gdf6120/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-boot/df_inodes-used:
+  value: 5.000000e+01
+h2gdf6120/df-boot/percent_bytes-free:
+  value: 8.184869e+01
+h2gdf6120/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+h2gdf6120/df-boot/percent_bytes-used:
+  value: 1.307185e+01
+h2gdf6120/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+h2gdf6120/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+h2gdf6120/df-data1/df_complex-free:
+  value: 2.503070e+11
+h2gdf6120/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+h2gdf6120/df-data1/df_complex-used:
+  value: 7.372034e+09
+h2gdf6120/df-data1/df_inodes-free:
+  value: 1.683450e+07
+h2gdf6120/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-data1/df_inodes-used:
+  value: 5.900000e+01
+h2gdf6120/df-data1/percent_bytes-free:
+  value: 9.220468e+01
+h2gdf6120/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+h2gdf6120/df-data1/percent_bytes-used:
+  value: 2.715609e+00
+h2gdf6120/df-data1/percent_inodes-free:
+  value: 9.999964e+01
+h2gdf6120/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-data1/percent_inodes-used:
+  value: 3.504695e-04
+h2gdf6120/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+h2gdf6120/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+h2gdf6120/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+h2gdf6120/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+h2gdf6120/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+h2gdf6120/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+h2gdf6120/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+h2gdf6120/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+h2gdf6120/df-root/df_complex-free:
+  value: 1.058675e+10
+h2gdf6120/df-root/df_complex-reserved:
+  value: 6.442435e+08
+h2gdf6120/df-root/df_complex-used:
+  value: 1.451717e+09
+h2gdf6120/df-root/df_inodes-free:
+  value: 7.435350e+05
+h2gdf6120/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-root/df_inodes-used:
+  value: 4.289700e+04
+h2gdf6120/df-root/percent_bytes-free:
+  value: 8.347388e+01
+h2gdf6120/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+h2gdf6120/df-root/percent_bytes-used:
+  value: 1.144643e+01
+h2gdf6120/df-root/percent_inodes-free:
+  value: 9.454536e+01
+h2gdf6120/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-root/percent_inodes-used:
+  value: 5.454636e+00
+h2gdf6120/df-var/df_complex-free:
+  value: 7.503532e+09
+h2gdf6120/df-var/df_complex-reserved:
+  value: 4.294943e+08
+h2gdf6120/df-var/df_complex-used:
+  value: 5.220925e+08
+h2gdf6120/df-var/df_inodes-free:
+  value: 5.225340e+05
+h2gdf6120/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-var/df_inodes-used:
+  value: 1.754000e+03
+h2gdf6120/df-var/percent_bytes-free:
+  value: 8.874543e+01
+h2gdf6120/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+h2gdf6120/df-var/percent_bytes-used:
+  value: 6.174870e+00
+h2gdf6120/df-var/percent_inodes-free:
+  value: 9.966545e+01
+h2gdf6120/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6120/df-var/percent_inodes-used:
+  value: 3.345490e-01
+h2gdf6120/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 1.000000e-01
+h2gdf6120/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 4.915201e+03
+h2gdf6120/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 1.000000e+00
+h2gdf6120/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 1.638401e+03
+h2gdf6120/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 4.000002e-01
+h2gdf6120/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 9.999979e-02
+h2gdf6120/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 3.276793e+03
+h2gdf6120/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 5.999987e-01
+h2gdf6120/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6120/load/load:
+  longterm: 3.000000e-02
+  midterm: 3.000000e-02
+  shortterm: 0.000000e+00
+h2gdf6120/memory/memory-buffered:
+  value: 3.471032e+08
+h2gdf6120/memory/memory-cached:
+  value: 6.819758e+08
+h2gdf6120/memory/memory-free:
+  value: 5.914347e+10
+h2gdf6120/memory/memory-used:
+  value: 7.341625e+09
+h2gdf6120/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.587800e+03
+h2gdf6120/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.200000e+00
+h2gdf6120/network/queue_length:
+  value: 0.000000e+00
+h2gdf6120/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+h2gdf6120/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+h2gdf6120/network/total_values-send-accepted:
+  value: 3.189999e+01
+h2gdf6120/network/total_values-send-rejected:
+  value: 0.000000e+00
+h2gdf6120/swap/swap-cached:
+  value: 0.000000e+00
+h2gdf6120/swap/swap-free:
+  value: 2.147475e+09
+h2gdf6120/swap/swap-used:
+  value: 0.000000e+00
+h2gdf6120/swap/swap_io-in:
+  value: 0.000000e+00
+h2gdf6120/swap/swap_io-out:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 4.499975e+00
+h2gdf6120/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 8.799950e+00
+h2gdf6120/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-active_anon:
+  value: 1.425964e+06
+h2gdf6120/vmem/vmpage_number-active_file:
+  value: 1.796950e+05
+h2gdf6120/vmem/vmpage_number-anon_pages:
+  value: 1.638300e+04
+h2gdf6120/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 2.753000e+03
+h2gdf6120/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-dirty:
+  value: 8.000000e+00
+h2gdf6120/vmem/vmpage_number-file_pages:
+  value: 2.512400e+05
+h2gdf6120/vmem/vmpage_number-free_pages:
+  value: 1.443932e+07
+h2gdf6120/vmem/vmpage_number-inactive_anon:
+  value: 1.100000e+01
+h2gdf6120/vmem/vmpage_number-inactive_file:
+  value: 7.149200e+04
+h2gdf6120/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-kernel_stack:
+  value: 4.730000e+02
+h2gdf6120/vmem/vmpage_number-mapped:
+  value: 4.319000e+03
+h2gdf6120/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-page_table_pages:
+  value: 3.607000e+03
+h2gdf6120/vmem/vmpage_number-shmem:
+  value: 5.700000e+01
+h2gdf6120/vmem/vmpage_number-slab_reclaimable:
+  value: 2.365580e+05
+h2gdf6120/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.603500e+04
+h2gdf6120/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+h2gdf6120/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+h2gdf6220/cpu-0/cpu-idle:
+  value: 9.760209e+01
+h2gdf6220/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-0/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-0/cpu-softirq:
+  value: 1.000040e-01
+h2gdf6220/cpu-0/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-0/cpu-system:
+  value: 4.000084e-01
+h2gdf6220/cpu-0/cpu-user:
+  value: 9.999957e-01
+h2gdf6220/cpu-0/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-1/cpu-idle:
+  value: 9.970561e+01
+h2gdf6220/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-1/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-1/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-1/cpu-system:
+  value: 1.000053e-01
+h2gdf6220/cpu-1/cpu-user:
+  value: 1.000047e-01
+h2gdf6220/cpu-1/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-idle:
+  value: 9.990600e+01
+h2gdf6220/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-10/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-idle:
+  value: 1.000060e+02
+h2gdf6220/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-11/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-12/cpu-idle:
+  value: 9.780591e+01
+h2gdf6220/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-12/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-12/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-12/cpu-system:
+  value: 5.000302e-01
+h2gdf6220/cpu-12/cpu-user:
+  value: 8.000479e-01
+h2gdf6220/cpu-12/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-idle:
+  value: 9.980613e+01
+h2gdf6220/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-13/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-idle:
+  value: 1.000061e+02
+h2gdf6220/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-14/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-idle:
+  value: 9.990596e+01
+h2gdf6220/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-15/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-idle:
+  value: 9.990572e+01
+h2gdf6220/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-16/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-idle:
+  value: 1.000057e+02
+h2gdf6220/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-17/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-idle:
+  value: 1.000058e+02
+h2gdf6220/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-18/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-19/cpu-idle:
+  value: 9.990559e+01
+h2gdf6220/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-19/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-19/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-19/cpu-system:
+  value: 2.000113e-01
+h2gdf6220/cpu-19/cpu-user:
+  value: 1.000057e-01
+h2gdf6220/cpu-19/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-2/cpu-idle:
+  value: 9.990540e+01
+h2gdf6220/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-2/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-2/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-2/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-2/cpu-user:
+  value: 1.000054e-01
+h2gdf6220/cpu-2/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-idle:
+  value: 1.000055e+02
+h2gdf6220/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-20/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-idle:
+  value: 1.000054e+02
+h2gdf6220/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-21/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-idle:
+  value: 9.990534e+01
+h2gdf6220/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-22/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-idle:
+  value: 1.000054e+02
+h2gdf6220/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-23/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-idle:
+  value: 1.000058e+02
+h2gdf6220/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-3/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-idle:
+  value: 9.990588e+01
+h2gdf6220/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-4/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-idle:
+  value: 1.000061e+02
+h2gdf6220/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-5/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-idle:
+  value: 9.980614e+01
+h2gdf6220/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-6/cpu-wait:
+  value: 1.000062e-01
+h2gdf6220/cpu-7/cpu-idle:
+  value: 9.990617e+01
+h2gdf6220/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-7/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-7/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-7/cpu-system:
+  value: 1.000062e-01
+h2gdf6220/cpu-7/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-7/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-idle:
+  value: 1.000060e+02
+h2gdf6220/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-8/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-idle:
+  value: 9.990601e+01
+h2gdf6220/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-nice:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-steal:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-system:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-user:
+  value: 0.000000e+00
+h2gdf6220/cpu-9/cpu-wait:
+  value: 0.000000e+00
+h2gdf6220/df-boot/df_complex-free:
+  value: 4.324721e+08
+h2gdf6220/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+h2gdf6220/df-boot/df_complex-used:
+  value: 6.911181e+07
+h2gdf6220/df-boot/df_inodes-free:
+  value: 3.271800e+04
+h2gdf6220/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-boot/df_inodes-used:
+  value: 5.000000e+01
+h2gdf6220/df-boot/percent_bytes-free:
+  value: 8.184172e+01
+h2gdf6220/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+h2gdf6220/df-boot/percent_bytes-used:
+  value: 1.307883e+01
+h2gdf6220/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+h2gdf6220/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+h2gdf6220/df-data1/df_complex-free:
+  value: 2.459593e+11
+h2gdf6220/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+h2gdf6220/df-data1/df_complex-used:
+  value: 1.171974e+10
+h2gdf6220/df-data1/df_inodes-free:
+  value: 1.683450e+07
+h2gdf6220/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-data1/df_inodes-used:
+  value: 6.100000e+01
+h2gdf6220/df-data1/percent_bytes-free:
+  value: 9.060313e+01
+h2gdf6220/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+h2gdf6220/df-data1/percent_bytes-used:
+  value: 4.317159e+00
+h2gdf6220/df-data1/percent_inodes-free:
+  value: 9.999964e+01
+h2gdf6220/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-data1/percent_inodes-used:
+  value: 3.623498e-04
+h2gdf6220/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+h2gdf6220/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+h2gdf6220/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+h2gdf6220/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+h2gdf6220/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+h2gdf6220/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+h2gdf6220/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+h2gdf6220/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+h2gdf6220/df-root/df_complex-free:
+  value: 1.058283e+10
+h2gdf6220/df-root/df_complex-reserved:
+  value: 6.442435e+08
+h2gdf6220/df-root/df_complex-used:
+  value: 1.455632e+09
+h2gdf6220/df-root/df_inodes-free:
+  value: 7.435320e+05
+h2gdf6220/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-root/df_inodes-used:
+  value: 4.290000e+04
+h2gdf6220/df-root/percent_bytes-free:
+  value: 8.344300e+01
+h2gdf6220/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+h2gdf6220/df-root/percent_bytes-used:
+  value: 1.147730e+01
+h2gdf6220/df-root/percent_inodes-free:
+  value: 9.454498e+01
+h2gdf6220/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-root/percent_inodes-used:
+  value: 5.455017e+00
+h2gdf6220/df-var/df_complex-free:
+  value: 7.501562e+09
+h2gdf6220/df-var/df_complex-reserved:
+  value: 4.294943e+08
+h2gdf6220/df-var/df_complex-used:
+  value: 5.240627e+08
+h2gdf6220/df-var/df_inodes-free:
+  value: 5.225360e+05
+h2gdf6220/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-var/df_inodes-used:
+  value: 1.752000e+03
+h2gdf6220/df-var/percent_bytes-free:
+  value: 8.872214e+01
+h2gdf6220/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+h2gdf6220/df-var/percent_bytes-used:
+  value: 6.198171e+00
+h2gdf6220/df-var/percent_inodes-free:
+  value: 9.966583e+01
+h2gdf6220/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+h2gdf6220/df-var/percent_inodes-used:
+  value: 3.341675e-01
+h2gdf6220/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 5.000078e-01
+h2gdf6220/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 1.761274e+05
+h2gdf6220/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 6.599997e+00
+h2gdf6220/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 1.200000e+00
+h2gdf6220/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+h2gdf6220/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 5.000119e-01
+h2gdf6220/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 1.761322e+05
+h2gdf6220/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 6.600157e+00
+h2gdf6220/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 1.200029e+00
+h2gdf6220/load/load:
+  longterm: 3.000000e-02
+  midterm: 1.300000e-01
+  shortterm: 1.800000e-01
+h2gdf6220/memory/memory-buffered:
+  value: 3.538944e+08
+h2gdf6220/memory/memory-cached:
+  value: 6.890127e+08
+h2gdf6220/memory/memory-free:
+  value: 5.744062e+10
+h2gdf6220/memory/memory-used:
+  value: 9.030652e+09
+h2gdf6220/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.449803e+03
+h2gdf6220/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.100003e+00
+h2gdf6220/network/queue_length:
+  value: 0.000000e+00
+h2gdf6220/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+h2gdf6220/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+h2gdf6220/network/total_values-send-accepted:
+  value: 2.630008e+01
+h2gdf6220/network/total_values-send-rejected:
+  value: 0.000000e+00
+h2gdf6220/swap/swap-cached:
+  value: 0.000000e+00
+h2gdf6220/swap/swap-free:
+  value: 2.147475e+09
+h2gdf6220/swap/swap-used:
+  value: 0.000000e+00
+h2gdf6220/swap/swap_io-in:
+  value: 0.000000e+00
+h2gdf6220/swap/swap_io-out:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 7.000005e-01
+h2gdf6220/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 2.800002e+00
+h2gdf6220/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-active_anon:
+  value: 1.830919e+06
+h2gdf6220/vmem/vmpage_number-active_file:
+  value: 1.812510e+05
+h2gdf6220/vmem/vmpage_number-anon_pages:
+  value: 1.841200e+04
+h2gdf6220/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 3.540000e+03
+h2gdf6220/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-dirty:
+  value: 4.000000e+00
+h2gdf6220/vmem/vmpage_number-file_pages:
+  value: 2.546160e+05
+h2gdf6220/vmem/vmpage_number-free_pages:
+  value: 1.402359e+07
+h2gdf6220/vmem/vmpage_number-inactive_anon:
+  value: 1.600000e+01
+h2gdf6220/vmem/vmpage_number-inactive_file:
+  value: 7.330700e+04
+h2gdf6220/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-kernel_stack:
+  value: 4.900000e+02
+h2gdf6220/vmem/vmpage_number-mapped:
+  value: 4.792000e+03
+h2gdf6220/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-page_table_pages:
+  value: 4.540000e+03
+h2gdf6220/vmem/vmpage_number-shmem:
+  value: 6.200000e+01
+h2gdf6220/vmem/vmpage_number-slab_reclaimable:
+  value: 2.343820e+05
+h2gdf6220/vmem/vmpage_number-slab_unreclaimable:
+  value: 2.127200e+04
+h2gdf6220/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+h2gdf6220/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-idle:
+  value: 9.980233e+01
+m01df6100/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-0/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-idle:
+  value: 1.000105e+02
+m01df6100/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-1/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-idle:
+  value: 1.000294e+02
+m01df6100/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-10/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-idle:
+  value: 9.993001e+01
+m01df6100/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-11/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-idle:
+  value: 1.000310e+02
+m01df6100/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-12/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-idle:
+  value: 9.993154e+01
+m01df6100/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-13/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-idle:
+  value: 1.000329e+02
+m01df6100/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-14/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-idle:
+  value: 1.000341e+02
+m01df6100/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-15/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-idle:
+  value: 1.000347e+02
+m01df6100/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-16/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-idle:
+  value: 1.000354e+02
+m01df6100/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-17/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-idle:
+  value: 9.993624e+01
+m01df6100/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-18/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-idle:
+  value: 9.993717e+01
+m01df6100/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-19/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-idle:
+  value: 1.000135e+02
+m01df6100/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-2/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-idle:
+  value: 9.993831e+01
+m01df6100/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-20/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-idle:
+  value: 1.000397e+02
+m01df6100/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-21/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-idle:
+  value: 9.994092e+01
+m01df6100/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-22/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-idle:
+  value: 1.000420e+02
+m01df6100/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-23/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-idle:
+  value: 1.000161e+02
+m01df6100/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-3/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-idle:
+  value: 1.000191e+02
+m01df6100/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-4/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-idle:
+  value: 1.000243e+02
+m01df6100/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-5/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-6/cpu-idle:
+  value: 1.000268e+02
+m01df6100/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-6/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-6/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-6/cpu-system:
+  value: 1.000266e-01
+m01df6100/cpu-6/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-6/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-idle:
+  value: 1.000274e+02
+m01df6100/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-7/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-idle:
+  value: 1.000283e+02
+m01df6100/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-8/cpu-wait:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-idle:
+  value: 1.000291e+02
+m01df6100/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-nice:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-steal:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-system:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-user:
+  value: 0.000000e+00
+m01df6100/cpu-9/cpu-wait:
+  value: 0.000000e+00
+m01df6100/df-boot/df_complex-free:
+  value: 4.369408e+08
+m01df6100/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+m01df6100/df-boot/df_complex-used:
+  value: 6.464307e+07
+m01df6100/df-boot/df_inodes-free:
+  value: 3.271800e+04
+m01df6100/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-boot/df_inodes-used:
+  value: 5.000000e+01
+m01df6100/df-boot/percent_bytes-free:
+  value: 8.268739e+01
+m01df6100/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+m01df6100/df-boot/percent_bytes-used:
+  value: 1.223316e+01
+m01df6100/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+m01df6100/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+m01df6100/df-data1/df_complex-free:
+  value: 2.574032e+11
+m01df6100/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+m01df6100/df-data1/df_complex-used:
+  value: 2.758984e+08
+m01df6100/df-data1/df_inodes-free:
+  value: 1.683426e+07
+m01df6100/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-data1/df_inodes-used:
+  value: 2.960000e+02
+m01df6100/df-data1/percent_bytes-free:
+  value: 9.481866e+01
+m01df6100/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+m01df6100/df-data1/percent_bytes-used:
+  value: 1.016317e-01
+m01df6100/df-data1/percent_inodes-free:
+  value: 9.999825e+01
+m01df6100/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-data1/percent_inodes-used:
+  value: 1.758288e-03
+m01df6100/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+m01df6100/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+m01df6100/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+m01df6100/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+m01df6100/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+m01df6100/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+m01df6100/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+m01df6100/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+m01df6100/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+m01df6100/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+m01df6100/df-root/df_complex-free:
+  value: 1.072688e+10
+m01df6100/df-root/df_complex-reserved:
+  value: 6.442435e+08
+m01df6100/df-root/df_complex-used:
+  value: 1.311580e+09
+m01df6100/df-root/df_inodes-free:
+  value: 7.454950e+05
+m01df6100/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-root/df_inodes-used:
+  value: 4.093700e+04
+m01df6100/df-root/percent_bytes-free:
+  value: 8.457882e+01
+m01df6100/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+m01df6100/df-root/percent_bytes-used:
+  value: 1.034148e+01
+m01df6100/df-root/percent_inodes-free:
+  value: 9.479459e+01
+m01df6100/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-root/percent_inodes-used:
+  value: 5.205409e+00
+m01df6100/df-var/df_complex-free:
+  value: 7.566787e+09
+m01df6100/df-var/df_complex-reserved:
+  value: 4.294943e+08
+m01df6100/df-var/df_complex-used:
+  value: 4.588380e+08
+m01df6100/df-var/df_inodes-free:
+  value: 5.228090e+05
+m01df6100/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-var/df_inodes-used:
+  value: 1.479000e+03
+m01df6100/df-var/percent_bytes-free:
+  value: 8.949355e+01
+m01df6100/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+m01df6100/df-var/percent_bytes-used:
+  value: 5.426748e+00
+m01df6100/df-var/percent_inodes-free:
+  value: 9.971790e+01
+m01df6100/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6100/df-var/percent_inodes-used:
+  value: 2.820969e-01
+m01df6100/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6100/load/load:
+  longterm: 0.000000e+00
+  midterm: 2.000000e-02
+  shortterm: 3.000000e-02
+m01df6100/memory/memory-buffered:
+  value: 3.348275e+08
+m01df6100/memory/memory-cached:
+  value: 5.892219e+08
+m01df6100/memory/memory-free:
+  value: 6.425088e+10
+m01df6100/memory/memory-used:
+  value: 2.339246e+09
+m01df6100/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.057501e+03
+m01df6100/network/if_packets:
+  rx: 0.000000e+00
+  tx: 8.000004e-01
+m01df6100/network/queue_length:
+  value: 0.000000e+00
+m01df6100/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+m01df6100/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+m01df6100/network/total_values-send-accepted:
+  value: 1.929969e+01
+m01df6100/network/total_values-send-rejected:
+  value: 0.000000e+00
+m01df6100/swap/swap-cached:
+  value: 0.000000e+00
+m01df6100/swap/swap-free:
+  value: 2.147475e+09
+m01df6100/swap/swap-used:
+  value: 0.000000e+00
+m01df6100/swap/swap_io-in:
+  value: 0.000000e+00
+m01df6100/swap/swap_io-out:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 3.199662e+00
+m01df6100/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+m01df6100/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+m01df6100/vmem/vmpage_number-active_anon:
+  value: 2.152660e+05
+m01df6100/vmem/vmpage_number-active_file:
+  value: 1.507500e+05
+m01df6100/vmem/vmpage_number-anon_pages:
+  value: 1.456100e+04
+m01df6100/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 3.920000e+02
+m01df6100/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-file_pages:
+  value: 2.255980e+05
+m01df6100/vmem/vmpage_number-free_pages:
+  value: 1.568625e+07
+m01df6100/vmem/vmpage_number-inactive_anon:
+  value: 4.600000e+01
+m01df6100/vmem/vmpage_number-inactive_file:
+  value: 7.480400e+04
+m01df6100/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-kernel_stack:
+  value: 4.500000e+02
+m01df6100/vmem/vmpage_number-mapped:
+  value: 3.560000e+03
+m01df6100/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-page_table_pages:
+  value: 1.060000e+03
+m01df6100/vmem/vmpage_number-shmem:
+  value: 4.800000e+01
+m01df6100/vmem/vmpage_number-slab_reclaimable:
+  value: 2.369210e+05
+m01df6100/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.479000e+04
+m01df6100/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+m01df6100/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-idle:
+  value: 9.970372e+01
+m01df6200/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-0/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-idle:
+  value: 1.000038e+02
+m01df6200/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-1/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-idle:
+  value: 1.000043e+02
+m01df6200/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-10/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-idle:
+  value: 1.000045e+02
+m01df6200/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-11/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-idle:
+  value: 1.000044e+02
+m01df6200/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-12/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-idle:
+  value: 1.000045e+02
+m01df6200/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-13/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-idle:
+  value: 1.000044e+02
+m01df6200/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-14/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-idle:
+  value: 9.990450e+01
+m01df6200/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-15/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-idle:
+  value: 1.000046e+02
+m01df6200/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-16/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-idle:
+  value: 1.000047e+02
+m01df6200/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-17/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-idle:
+  value: 1.000047e+02
+m01df6200/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-18/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-idle:
+  value: 9.990492e+01
+m01df6200/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-19/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-idle:
+  value: 1.000038e+02
+m01df6200/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-2/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-idle:
+  value: 9.990475e+01
+m01df6200/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-20/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-idle:
+  value: 1.000048e+02
+m01df6200/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-21/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-idle:
+  value: 1.000049e+02
+m01df6200/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-22/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-idle:
+  value: 9.990458e+01
+m01df6200/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-23/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-3/cpu-idle:
+  value: 9.990383e+01
+m01df6200/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-3/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-3/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-3/cpu-system:
+  value: 1.000038e-01
+m01df6200/cpu-3/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-3/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-idle:
+  value: 1.000039e+02
+m01df6200/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-4/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-idle:
+  value: 1.000039e+02
+m01df6200/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-5/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-6/cpu-idle:
+  value: 1.000039e+02
+m01df6200/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-6/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-6/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-6/cpu-system:
+  value: 1.000039e-01
+m01df6200/cpu-6/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-6/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-7/cpu-idle:
+  value: 9.990388e+01
+m01df6200/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-7/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-7/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-7/cpu-system:
+  value: 1.000039e-01
+m01df6200/cpu-7/cpu-user:
+  value: 0.000000e+00
+m01df6200/cpu-7/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-8/cpu-idle:
+  value: 9.990408e+01
+m01df6200/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-8/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-8/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-8/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-8/cpu-user:
+  value: 1.000040e-01
+m01df6200/cpu-8/cpu-wait:
+  value: 0.000000e+00
+m01df6200/cpu-9/cpu-idle:
+  value: 1.000043e+02
+m01df6200/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+m01df6200/cpu-9/cpu-nice:
+  value: 0.000000e+00
+m01df6200/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+m01df6200/cpu-9/cpu-steal:
+  value: 0.000000e+00
+m01df6200/cpu-9/cpu-system:
+  value: 0.000000e+00
+m01df6200/cpu-9/cpu-user:
+  value: 1.000043e-01
+m01df6200/cpu-9/cpu-wait:
+  value: 0.000000e+00
+m01df6200/df-boot/df_complex-free:
+  value: 4.368957e+08
+m01df6200/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+m01df6200/df-boot/df_complex-used:
+  value: 6.468813e+07
+m01df6200/df-boot/df_inodes-free:
+  value: 3.271800e+04
+m01df6200/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-boot/df_inodes-used:
+  value: 5.000000e+01
+m01df6200/df-boot/percent_bytes-free:
+  value: 8.267886e+01
+m01df6200/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+m01df6200/df-boot/percent_bytes-used:
+  value: 1.224169e+01
+m01df6200/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+m01df6200/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+m01df6200/df-data1/df_complex-free:
+  value: 2.574203e+11
+m01df6200/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+m01df6200/df-data1/df_complex-used:
+  value: 2.587075e+08
+m01df6200/df-data1/df_inodes-free:
+  value: 1.683427e+07
+m01df6200/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-data1/df_inodes-used:
+  value: 2.940000e+02
+m01df6200/df-data1/percent_bytes-free:
+  value: 9.482500e+01
+m01df6200/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+m01df6200/df-data1/percent_bytes-used:
+  value: 9.529912e-02
+m01df6200/df-data1/percent_inodes-free:
+  value: 9.999825e+01
+m01df6200/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-data1/percent_inodes-used:
+  value: 1.746407e-03
+m01df6200/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+m01df6200/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+m01df6200/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+m01df6200/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+m01df6200/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+m01df6200/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+m01df6200/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+m01df6200/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+m01df6200/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+m01df6200/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+m01df6200/df-root/df_complex-free:
+  value: 1.073381e+10
+m01df6200/df-root/df_complex-reserved:
+  value: 6.442435e+08
+m01df6200/df-root/df_complex-used:
+  value: 1.304654e+09
+m01df6200/df-root/df_inodes-free:
+  value: 7.455060e+05
+m01df6200/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-root/df_inodes-used:
+  value: 4.092600e+04
+m01df6200/df-root/percent_bytes-free:
+  value: 8.463343e+01
+m01df6200/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+m01df6200/df-root/percent_bytes-used:
+  value: 1.028687e+01
+m01df6200/df-root/percent_inodes-free:
+  value: 9.479599e+01
+m01df6200/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-root/percent_inodes-used:
+  value: 5.204010e+00
+m01df6200/df-var/df_complex-free:
+  value: 7.567528e+09
+m01df6200/df-var/df_complex-reserved:
+  value: 4.294943e+08
+m01df6200/df-var/df_complex-used:
+  value: 4.580966e+08
+m01df6200/df-var/df_inodes-free:
+  value: 5.228110e+05
+m01df6200/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-var/df_inodes-used:
+  value: 1.477000e+03
+m01df6200/df-var/percent_bytes-free:
+  value: 8.950232e+01
+m01df6200/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+m01df6200/df-var/percent_bytes-used:
+  value: 5.417980e+00
+m01df6200/df-var/percent_inodes-free:
+  value: 9.971828e+01
+m01df6200/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+m01df6200/df-var/percent_inodes-used:
+  value: 2.817154e-01
+m01df6200/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+m01df6200/load/load:
+  longterm: 0.000000e+00
+  midterm: 0.000000e+00
+  shortterm: 0.000000e+00
+m01df6200/memory/memory-buffered:
+  value: 3.312067e+08
+m01df6200/memory/memory-cached:
+  value: 5.615206e+08
+m01df6200/memory/memory-free:
+  value: 6.428290e+10
+m01df6200/memory/memory-used:
+  value: 2.338546e+09
+m01df6200/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.583300e+03
+m01df6200/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.200000e+00
+m01df6200/network/queue_length:
+  value: 0.000000e+00
+m01df6200/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+m01df6200/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+m01df6200/network/total_values-send-accepted:
+  value: 3.150000e+01
+m01df6200/network/total_values-send-rejected:
+  value: 0.000000e+00
+m01df6200/swap/swap-cached:
+  value: 0.000000e+00
+m01df6200/swap/swap-free:
+  value: 2.147475e+09
+m01df6200/swap/swap-used:
+  value: 0.000000e+00
+m01df6200/swap/swap_io-in:
+  value: 0.000000e+00
+m01df6200/swap/swap_io-out:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 3.600012e+00
+m01df6200/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+m01df6200/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+m01df6200/vmem/vmpage_number-active_anon:
+  value: 2.124650e+05
+m01df6200/vmem/vmpage_number-active_file:
+  value: 1.424970e+05
+m01df6200/vmem/vmpage_number-anon_pages:
+  value: 1.227400e+04
+m01df6200/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 3.910000e+02
+m01df6200/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-file_pages:
+  value: 2.179510e+05
+m01df6200/vmem/vmpage_number-free_pages:
+  value: 1.569406e+07
+m01df6200/vmem/vmpage_number-inactive_anon:
+  value: 4.800000e+01
+m01df6200/vmem/vmpage_number-inactive_file:
+  value: 7.540800e+04
+m01df6200/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-kernel_stack:
+  value: 4.460000e+02
+m01df6200/vmem/vmpage_number-mapped:
+  value: 3.063000e+03
+m01df6200/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-page_table_pages:
+  value: 8.920000e+02
+m01df6200/vmem/vmpage_number-shmem:
+  value: 5.000000e+01
+m01df6200/vmem/vmpage_number-slab_reclaimable:
+  value: 2.398380e+05
+m01df6200/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.473600e+04
+m01df6200/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+m01df6200/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-idle:
+  value: 9.990008e+01
+w838f6010/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-system:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-user:
+  value: 0.000000e+00
+w838f6010/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-idle:
+  value: 9.980017e+01
+w838f6010/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-system:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-user:
+  value: 0.000000e+00
+w838f6010/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w838f6010/df-boot/df_complex-free:
+  value: 4.793754e+08
+w838f6010/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w838f6010/df-boot/df_complex-used:
+  value: 2.220851e+07
+w838f6010/df-boot/df_inodes-free:
+  value: 3.273000e+04
+w838f6010/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-boot/df_inodes-used:
+  value: 3.800000e+01
+w838f6010/df-boot/percent_bytes-free:
+  value: 9.071777e+01
+w838f6010/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w838f6010/df-boot/percent_bytes-used:
+  value: 4.202775e+00
+w838f6010/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+w838f6010/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+w838f6010/df-data1/df_complex-free:
+  value: 2.740491e+10
+w838f6010/df-data1/df_complex-reserved:
+  value: 1.476235e+09
+w838f6010/df-data1/df_complex-used:
+  value: 1.802977e+08
+w838f6010/df-data1/df_inodes-free:
+  value: 1.802227e+06
+w838f6010/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-data1/df_inodes-used:
+  value: 1.300000e+01
+w838f6010/df-data1/percent_bytes-free:
+  value: 9.429990e+01
+w838f6010/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+w838f6010/df-data1/percent_bytes-used:
+  value: 6.204019e-01
+w838f6010/df-data1/percent_inodes-free:
+  value: 9.999928e+01
+w838f6010/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-data1/percent_inodes-used:
+  value: 7.213246e-04
+w838f6010/df-dev-shm/df_complex-free:
+  value: 9.842483e+08
+w838f6010/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w838f6010/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w838f6010/df-dev-shm/df_inodes-free:
+  value: 2.402940e+05
+w838f6010/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w838f6010/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w838f6010/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w838f6010/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w838f6010/df-dev-shm/percent_inodes-free:
+  value: 9.999958e+01
+w838f6010/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-dev-shm/percent_inodes-used:
+  value: 4.161551e-04
+w838f6010/df-root/df_complex-free:
+  value: 1.099070e+10
+w838f6010/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w838f6010/df-root/df_complex-used:
+  value: 1.047761e+09
+w838f6010/df-root/df_inodes-free:
+  value: 7.509290e+05
+w838f6010/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-root/df_inodes-used:
+  value: 3.550300e+04
+w838f6010/df-root/percent_bytes-free:
+  value: 8.665897e+01
+w838f6010/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w838f6010/df-root/percent_bytes-used:
+  value: 8.261335e+00
+w838f6010/df-root/percent_inodes-free:
+  value: 9.548557e+01
+w838f6010/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-root/percent_inodes-used:
+  value: 4.514440e+00
+w838f6010/df-var/df_complex-free:
+  value: 7.638827e+09
+w838f6010/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w838f6010/df-var/df_complex-used:
+  value: 3.867976e+08
+w838f6010/df-var/df_inodes-free:
+  value: 5.230900e+05
+w838f6010/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-var/df_inodes-used:
+  value: 1.198000e+03
+w838f6010/df-var/percent_bytes-free:
+  value: 9.034559e+01
+w838f6010/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w838f6010/df-var/percent_bytes-used:
+  value: 4.574715e+00
+w838f6010/df-var/percent_inodes-free:
+  value: 9.977150e+01
+w838f6010/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6010/df-var/percent_inodes-used:
+  value: 2.285004e-01
+w838f6010/disk-vda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/disk-vda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6010/load/load:
+  longterm: 0.000000e+00
+  midterm: 2.000000e-02
+  shortterm: 2.000000e-02
+w838f6010/memory/memory-buffered:
+  value: 1.263739e+08
+w838f6010/memory/memory-cached:
+  value: 4.350566e+08
+w838f6010/memory/memory-free:
+  value: 1.024844e+09
+w838f6010/memory/memory-used:
+  value: 3.822223e+08
+w838f6010/network/if_octets:
+  rx: 0.000000e+00
+  tx: 6.632999e+02
+w838f6010/network/if_packets:
+  rx: 0.000000e+00
+  tx: 5.000010e-01
+w838f6010/network/queue_length:
+  value: 0.000000e+00
+w838f6010/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w838f6010/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w838f6010/network/total_values-send-accepted:
+  value: 1.480000e+01
+w838f6010/network/total_values-send-rejected:
+  value: 0.000000e+00
+w838f6010/swap/swap-cached:
+  value: 0.000000e+00
+w838f6010/swap/swap-free:
+  value: 2.147475e+09
+w838f6010/swap/swap-used:
+  value: 0.000000e+00
+w838f6010/swap/swap_io-in:
+  value: 0.000000e+00
+w838f6010/swap/swap_io-out:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 4.999995e+00
+w838f6010/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6010/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6010/vmem/vmpage_number-active_anon:
+  value: 1.249400e+04
+w838f6010/vmem/vmpage_number-active_file:
+  value: 7.016800e+04
+w838f6010/vmem/vmpage_number-anon_pages:
+  value: 1.095500e+04
+w838f6010/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 3.000000e+00
+w838f6010/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-file_pages:
+  value: 1.370680e+05
+w838f6010/vmem/vmpage_number-free_pages:
+  value: 2.502060e+05
+w838f6010/vmem/vmpage_number-inactive_anon:
+  value: 4.200000e+01
+w838f6010/vmem/vmpage_number-inactive_file:
+  value: 6.685900e+04
+w838f6010/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-kernel_stack:
+  value: 1.130000e+02
+w838f6010/vmem/vmpage_number-mapped:
+  value: 1.480000e+03
+w838f6010/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-page_table_pages:
+  value: 4.220000e+02
+w838f6010/vmem/vmpage_number-shmem:
+  value: 4.500000e+01
+w838f6010/vmem/vmpage_number-slab_reclaimable:
+  value: 6.896900e+04
+w838f6010/vmem/vmpage_number-slab_unreclaimable:
+  value: 5.190000e+03
+w838f6010/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w838f6010/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w838f6700/cpu-0/cpu-idle:
+  value: 9.619931e+01
+w838f6700/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w838f6700/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w838f6700/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w838f6700/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w838f6700/cpu-0/cpu-system:
+  value: 1.899992e+00
+w838f6700/cpu-0/cpu-user:
+  value: 1.600000e+00
+w838f6700/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w838f6700/cpu-1/cpu-idle:
+  value: 9.599589e+01
+w838f6700/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w838f6700/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w838f6700/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w838f6700/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w838f6700/cpu-1/cpu-system:
+  value: 1.799923e+00
+w838f6700/cpu-1/cpu-user:
+  value: 1.799919e+00
+w838f6700/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w838f6700/cpu-2/cpu-idle:
+  value: 9.539595e+01
+w838f6700/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w838f6700/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w838f6700/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w838f6700/cpu-2/cpu-steal:
+  value: 9.999593e-02
+w838f6700/cpu-2/cpu-system:
+  value: 2.299903e+00
+w838f6700/cpu-2/cpu-user:
+  value: 1.899919e+00
+w838f6700/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w838f6700/cpu-3/cpu-idle:
+  value: 9.439610e+01
+w838f6700/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w838f6700/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w838f6700/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w838f6700/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w838f6700/cpu-3/cpu-system:
+  value: 2.699890e+00
+w838f6700/cpu-3/cpu-user:
+  value: 2.599893e+00
+w838f6700/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w838f6700/df-boot/df_complex-free:
+  value: 4.793713e+08
+w838f6700/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w838f6700/df-boot/df_complex-used:
+  value: 2.221261e+07
+w838f6700/df-boot/df_inodes-free:
+  value: 3.273000e+04
+w838f6700/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-boot/df_inodes-used:
+  value: 3.800000e+01
+w838f6700/df-boot/percent_bytes-free:
+  value: 9.071700e+01
+w838f6700/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w838f6700/df-boot/percent_bytes-used:
+  value: 4.203550e+00
+w838f6700/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+w838f6700/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+w838f6700/df-data1/df_complex-free:
+  value: 2.740491e+10
+w838f6700/df-data1/df_complex-reserved:
+  value: 1.476235e+09
+w838f6700/df-data1/df_complex-used:
+  value: 1.802977e+08
+w838f6700/df-data1/df_inodes-free:
+  value: 1.802227e+06
+w838f6700/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-data1/df_inodes-used:
+  value: 1.300000e+01
+w838f6700/df-data1/percent_bytes-free:
+  value: 9.429990e+01
+w838f6700/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+w838f6700/df-data1/percent_bytes-used:
+  value: 6.204019e-01
+w838f6700/df-data1/percent_inodes-free:
+  value: 9.999928e+01
+w838f6700/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-data1/percent_inodes-used:
+  value: 7.213246e-04
+w838f6700/df-dev-shm/df_complex-free:
+  value: 4.126425e+09
+w838f6700/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w838f6700/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w838f6700/df-dev-shm/df_inodes-free:
+  value: 1.007427e+06
+w838f6700/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w838f6700/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w838f6700/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w838f6700/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w838f6700/df-dev-shm/percent_inodes-free:
+  value: 9.999990e+01
+w838f6700/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-dev-shm/percent_inodes-used:
+  value: 9.926267e-05
+w838f6700/df-root/df_complex-free:
+  value: 1.069915e+10
+w838f6700/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w838f6700/df-root/df_complex-used:
+  value: 1.339314e+09
+w838f6700/df-root/df_inodes-free:
+  value: 7.466750e+05
+w838f6700/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-root/df_inodes-used:
+  value: 3.975700e+04
+w838f6700/df-root/percent_bytes-free:
+  value: 8.436014e+01
+w838f6700/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w838f6700/df-root/percent_bytes-used:
+  value: 1.056016e+01
+w838f6700/df-root/percent_inodes-free:
+  value: 9.494464e+01
+w838f6700/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-root/percent_inodes-used:
+  value: 5.055364e+00
+w838f6700/df-var/df_complex-free:
+  value: 6.687375e+09
+w838f6700/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w838f6700/df-var/df_complex-used:
+  value: 1.338249e+09
+w838f6700/df-var/df_inodes-free:
+  value: 5.212840e+05
+w838f6700/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-var/df_inodes-used:
+  value: 3.004000e+03
+w838f6700/df-var/percent_bytes-free:
+  value: 7.909262e+01
+w838f6700/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w838f6700/df-var/percent_bytes-used:
+  value: 1.582768e+01
+w838f6700/df-var/percent_inodes-free:
+  value: 9.942703e+01
+w838f6700/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6700/df-var/percent_inodes-used:
+  value: 5.729675e-01
+w838f6700/disk-vda/disk_merged:
+  read: 0.000000e+00
+  write: 1.000002e-01
+w838f6700/disk-vda/disk_octets:
+  read: 0.000000e+00
+  write: 2.457603e+03
+w838f6700/disk-vda/disk_ops:
+  read: 0.000000e+00
+  write: 5.000007e-01
+w838f6700/disk-vda/disk_time:
+  read: 0.000000e+00
+  write: 1.200001e+00
+w838f6700/disk-vda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda3/disk_merged:
+  read: 0.000000e+00
+  write: 1.000001e-01
+w838f6700/disk-vda3/disk_octets:
+  read: 0.000000e+00
+  write: 2.457604e+03
+w838f6700/disk-vda3/disk_ops:
+  read: 0.000000e+00
+  write: 5.000007e-01
+w838f6700/disk-vda3/disk_time:
+  read: 0.000000e+00
+  write: 1.200002e+00
+w838f6700/disk-vda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/disk-vda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6700/load/load:
+  longterm: 2.000000e-02
+  midterm: 4.000000e-02
+  shortterm: 0.000000e+00
+w838f6700/memory/memory-buffered:
+  value: 1.980662e+08
+w838f6700/memory/memory-cached:
+  value: 1.702576e+09
+w838f6700/memory/memory-free:
+  value: 4.717773e+09
+w838f6700/memory/memory-used:
+  value: 1.634439e+09
+w838f6700/network/if_octets:
+  rx: 0.000000e+00
+  tx: 9.293005e+02
+w838f6700/network/if_packets:
+  rx: 0.000000e+00
+  tx: 7.000008e-01
+w838f6700/network/queue_length:
+  value: 0.000000e+00
+w838f6700/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w838f6700/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w838f6700/network/total_values-send-accepted:
+  value: 1.640000e+01
+w838f6700/network/total_values-send-rejected:
+  value: 0.000000e+00
+w838f6700/swap/swap-cached:
+  value: 0.000000e+00
+w838f6700/swap/swap-free:
+  value: 2.147475e+09
+w838f6700/swap/swap-used:
+  value: 0.000000e+00
+w838f6700/swap/swap_io-in:
+  value: 0.000000e+00
+w838f6700/swap/swap_io-out:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 2.519992e+01
+w838f6700/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 1.999993e+00
+w838f6700/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6700/vmem/vmpage_number-active_anon:
+  value: 2.680560e+05
+w838f6700/vmem/vmpage_number-active_file:
+  value: 1.344860e+05
+w838f6700/vmem/vmpage_number-anon_pages:
+  value: 1.661620e+05
+w838f6700/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.990000e+02
+w838f6700/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-dirty:
+  value: 6.000000e+00
+w838f6700/vmem/vmpage_number-file_pages:
+  value: 4.640230e+05
+w838f6700/vmem/vmpage_number-free_pages:
+  value: 1.151800e+06
+w838f6700/vmem/vmpage_number-inactive_anon:
+  value: 6.300000e+01
+w838f6700/vmem/vmpage_number-inactive_file:
+  value: 3.294730e+05
+w838f6700/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-kernel_stack:
+  value: 2.060000e+02
+w838f6700/vmem/vmpage_number-mapped:
+  value: 7.423000e+03
+w838f6700/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-page_table_pages:
+  value: 2.612000e+03
+w838f6700/vmem/vmpage_number-shmem:
+  value: 6.900000e+01
+w838f6700/vmem/vmpage_number-slab_reclaimable:
+  value: 1.048400e+05
+w838f6700/vmem/vmpage_number-slab_unreclaimable:
+  value: 6.180000e+03
+w838f6700/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w838f6700/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-idle:
+  value: 1.000001e+02
+w838f6800/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-system:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-user:
+  value: 0.000000e+00
+w838f6800/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-idle:
+  value: 9.989984e+01
+w838f6800/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-system:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-user:
+  value: 0.000000e+00
+w838f6800/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-idle:
+  value: 9.989981e+01
+w838f6800/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-system:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-user:
+  value: 0.000000e+00
+w838f6800/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-idle:
+  value: 9.989982e+01
+w838f6800/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-system:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-user:
+  value: 0.000000e+00
+w838f6800/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w838f6800/df-boot/df_complex-free:
+  value: 4.793917e+08
+w838f6800/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w838f6800/df-boot/df_complex-used:
+  value: 2.219213e+07
+w838f6800/df-boot/df_inodes-free:
+  value: 3.273000e+04
+w838f6800/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-boot/df_inodes-used:
+  value: 3.800000e+01
+w838f6800/df-boot/percent_bytes-free:
+  value: 9.072087e+01
+w838f6800/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w838f6800/df-boot/percent_bytes-used:
+  value: 4.199674e+00
+w838f6800/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+w838f6800/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+w838f6800/df-data1/df_complex-free:
+  value: 2.740491e+10
+w838f6800/df-data1/df_complex-reserved:
+  value: 1.476235e+09
+w838f6800/df-data1/df_complex-used:
+  value: 1.802977e+08
+w838f6800/df-data1/df_inodes-free:
+  value: 1.802227e+06
+w838f6800/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-data1/df_inodes-used:
+  value: 1.300000e+01
+w838f6800/df-data1/percent_bytes-free:
+  value: 9.429990e+01
+w838f6800/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+w838f6800/df-data1/percent_bytes-used:
+  value: 6.204019e-01
+w838f6800/df-data1/percent_inodes-free:
+  value: 9.999928e+01
+w838f6800/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-data1/percent_inodes-used:
+  value: 7.213246e-04
+w838f6800/df-dev-shm/df_complex-free:
+  value: 4.126425e+09
+w838f6800/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w838f6800/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w838f6800/df-dev-shm/df_inodes-free:
+  value: 1.007427e+06
+w838f6800/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w838f6800/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w838f6800/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w838f6800/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w838f6800/df-dev-shm/percent_inodes-free:
+  value: 9.999990e+01
+w838f6800/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-dev-shm/percent_inodes-used:
+  value: 9.926267e-05
+w838f6800/df-root/df_complex-free:
+  value: 1.099071e+10
+w838f6800/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w838f6800/df-root/df_complex-used:
+  value: 1.047757e+09
+w838f6800/df-root/df_inodes-free:
+  value: 7.509280e+05
+w838f6800/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-root/df_inodes-used:
+  value: 3.550400e+04
+w838f6800/df-root/percent_bytes-free:
+  value: 8.665900e+01
+w838f6800/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w838f6800/df-root/percent_bytes-used:
+  value: 8.261303e+00
+w838f6800/df-root/percent_inodes-free:
+  value: 9.548543e+01
+w838f6800/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-root/percent_inodes-used:
+  value: 4.514567e+00
+w838f6800/df-var/df_complex-free:
+  value: 7.635927e+09
+w838f6800/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w838f6800/df-var/df_complex-used:
+  value: 3.896975e+08
+w838f6800/df-var/df_inodes-free:
+  value: 5.230400e+05
+w838f6800/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-var/df_inodes-used:
+  value: 1.248000e+03
+w838f6800/df-var/percent_bytes-free:
+  value: 9.031129e+01
+w838f6800/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w838f6800/df-var/percent_bytes-used:
+  value: 4.609013e+00
+w838f6800/df-var/percent_inodes-free:
+  value: 9.976196e+01
+w838f6800/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6800/df-var/percent_inodes-used:
+  value: 2.380371e-01
+w838f6800/disk-vda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/disk-vda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6800/load/load:
+  longterm: 0.000000e+00
+  midterm: 0.000000e+00
+  shortterm: 0.000000e+00
+w838f6800/memory/memory-buffered:
+  value: 1.443430e+08
+w838f6800/memory/memory-cached:
+  value: 4.507607e+08
+w838f6800/memory/memory-free:
+  value: 7.122756e+09
+w838f6800/memory/memory-used:
+  value: 5.349949e+08
+w838f6800/network/if_octets:
+  rx: 0.000000e+00
+  tx: 7.896001e+02
+w838f6800/network/if_packets:
+  rx: 0.000000e+00
+  tx: 6.000121e-01
+w838f6800/network/queue_length:
+  value: 0.000000e+00
+w838f6800/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w838f6800/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w838f6800/network/total_values-send-accepted:
+  value: 1.530036e+01
+w838f6800/network/total_values-send-rejected:
+  value: 0.000000e+00
+w838f6800/swap/swap-cached:
+  value: 0.000000e+00
+w838f6800/swap/swap-free:
+  value: 2.147475e+09
+w838f6800/swap/swap-used:
+  value: 0.000000e+00
+w838f6800/swap/swap_io-in:
+  value: 0.000000e+00
+w838f6800/swap/swap_io-out:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 4.500056e+00
+w838f6800/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6800/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6800/vmem/vmpage_number-active_anon:
+  value: 1.298400e+04
+w838f6800/vmem/vmpage_number-active_file:
+  value: 7.437200e+04
+w838f6800/vmem/vmpage_number-anon_pages:
+  value: 1.042100e+04
+w838f6800/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 5.000000e+00
+w838f6800/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-file_pages:
+  value: 1.452890e+05
+w838f6800/vmem/vmpage_number-free_pages:
+  value: 1.738954e+06
+w838f6800/vmem/vmpage_number-inactive_anon:
+  value: 4.200000e+01
+w838f6800/vmem/vmpage_number-inactive_file:
+  value: 7.087600e+04
+w838f6800/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-kernel_stack:
+  value: 1.390000e+02
+w838f6800/vmem/vmpage_number-mapped:
+  value: 1.478000e+03
+w838f6800/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-page_table_pages:
+  value: 4.100000e+02
+w838f6800/vmem/vmpage_number-shmem:
+  value: 4.500000e+01
+w838f6800/vmem/vmpage_number-slab_reclaimable:
+  value: 9.488500e+04
+w838f6800/vmem/vmpage_number-slab_unreclaimable:
+  value: 5.513000e+03
+w838f6800/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w838f6800/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w838f6900/cpu-0/cpu-idle:
+  value: 9.700088e+01
+w838f6900/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w838f6900/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w838f6900/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w838f6900/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w838f6900/cpu-0/cpu-system:
+  value: 1.000009e-01
+w838f6900/cpu-0/cpu-user:
+  value: 2.900025e+00
+w838f6900/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-idle:
+  value: 9.960079e+01
+w838f6900/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-system:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-user:
+  value: 0.000000e+00
+w838f6900/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w838f6900/df-boot/df_complex-free:
+  value: 4.793836e+08
+w838f6900/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w838f6900/df-boot/df_complex-used:
+  value: 2.220032e+07
+w838f6900/df-boot/df_inodes-free:
+  value: 3.273000e+04
+w838f6900/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-boot/df_inodes-used:
+  value: 3.800000e+01
+w838f6900/df-boot/percent_bytes-free:
+  value: 9.071932e+01
+w838f6900/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w838f6900/df-boot/percent_bytes-used:
+  value: 4.201225e+00
+w838f6900/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+w838f6900/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+w838f6900/df-data1/df_complex-free:
+  value: 2.740491e+10
+w838f6900/df-data1/df_complex-reserved:
+  value: 1.476235e+09
+w838f6900/df-data1/df_complex-used:
+  value: 1.802977e+08
+w838f6900/df-data1/df_inodes-free:
+  value: 1.802227e+06
+w838f6900/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-data1/df_inodes-used:
+  value: 1.300000e+01
+w838f6900/df-data1/percent_bytes-free:
+  value: 9.429990e+01
+w838f6900/df-data1/percent_bytes-reserved:
+  value: 5.079704e+00
+w838f6900/df-data1/percent_bytes-used:
+  value: 6.204019e-01
+w838f6900/df-data1/percent_inodes-free:
+  value: 9.999928e+01
+w838f6900/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-data1/percent_inodes-used:
+  value: 7.213246e-04
+w838f6900/df-dev-shm/df_complex-free:
+  value: 9.842483e+08
+w838f6900/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w838f6900/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w838f6900/df-dev-shm/df_inodes-free:
+  value: 2.402940e+05
+w838f6900/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w838f6900/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w838f6900/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w838f6900/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w838f6900/df-dev-shm/percent_inodes-free:
+  value: 9.999958e+01
+w838f6900/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-dev-shm/percent_inodes-used:
+  value: 4.161551e-04
+w838f6900/df-root/df_complex-free:
+  value: 1.097382e+10
+w838f6900/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w838f6900/df-root/df_complex-used:
+  value: 1.064645e+09
+w838f6900/df-root/df_inodes-free:
+  value: 7.501330e+05
+w838f6900/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-root/df_inodes-used:
+  value: 3.629900e+04
+w838f6900/df-root/percent_bytes-free:
+  value: 8.652584e+01
+w838f6900/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w838f6900/df-root/percent_bytes-used:
+  value: 8.394459e+00
+w838f6900/df-root/percent_inodes-free:
+  value: 9.538434e+01
+w838f6900/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-root/percent_inodes-used:
+  value: 4.615657e+00
+w838f6900/df-var/df_complex-free:
+  value: 7.637877e+09
+w838f6900/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w838f6900/df-var/df_complex-used:
+  value: 3.877478e+08
+w838f6900/df-var/df_inodes-free:
+  value: 5.229840e+05
+w838f6900/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-var/df_inodes-used:
+  value: 1.304000e+03
+w838f6900/df-var/percent_bytes-free:
+  value: 9.033435e+01
+w838f6900/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w838f6900/df-var/percent_bytes-used:
+  value: 4.585954e+00
+w838f6900/df-var/percent_inodes-free:
+  value: 9.975128e+01
+w838f6900/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w838f6900/df-var/percent_inodes-used:
+  value: 2.487183e-01
+w838f6900/disk-vda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/disk-vda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w838f6900/load/load:
+  longterm: 0.000000e+00
+  midterm: 0.000000e+00
+  shortterm: 0.000000e+00
+w838f6900/memory/memory-buffered:
+  value: 1.040671e+08
+w838f6900/memory/memory-cached:
+  value: 4.379361e+08
+w838f6900/memory/memory-free:
+  value: 9.871852e+08
+w838f6900/memory/memory-used:
+  value: 4.393083e+08
+w838f6900/network/if_octets:
+  rx: 0.000000e+00
+  tx: 6.614006e+02
+w838f6900/network/if_packets:
+  rx: 0.000000e+00
+  tx: 4.999994e-01
+w838f6900/network/queue_length:
+  value: 0.000000e+00
+w838f6900/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w838f6900/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w838f6900/network/total_values-send-accepted:
+  value: 1.479996e+01
+w838f6900/network/total_values-send-rejected:
+  value: 0.000000e+00
+w838f6900/swap/swap-cached:
+  value: 0.000000e+00
+w838f6900/swap/swap-free:
+  value: 2.147475e+09
+w838f6900/swap/swap-used:
+  value: 0.000000e+00
+w838f6900/swap/swap_io-in:
+  value: 0.000000e+00
+w838f6900/swap/swap_io-out:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 4.300042e+00
+w838f6900/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6900/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w838f6900/vmem/vmpage_number-active_anon:
+  value: 3.653600e+04
+w838f6900/vmem/vmpage_number-active_file:
+  value: 7.163800e+04
+w838f6900/vmem/vmpage_number-anon_pages:
+  value: 2.014900e+04
+w838f6900/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 3.200000e+01
+w838f6900/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-file_pages:
+  value: 1.323250e+05
+w838f6900/vmem/vmpage_number-free_pages:
+  value: 2.410120e+05
+w838f6900/vmem/vmpage_number-inactive_anon:
+  value: 4.300000e+01
+w838f6900/vmem/vmpage_number-inactive_file:
+  value: 6.064500e+04
+w838f6900/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-kernel_stack:
+  value: 1.280000e+02
+w838f6900/vmem/vmpage_number-mapped:
+  value: 3.447000e+03
+w838f6900/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-page_table_pages:
+  value: 6.660000e+02
+w838f6900/vmem/vmpage_number-shmem:
+  value: 4.600000e+01
+w838f6900/vmem/vmpage_number-slab_reclaimable:
+  value: 5.838000e+04
+w838f6900/vmem/vmpage_number-slab_unreclaimable:
+  value: 5.330000e+03
+w838f6900/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w838f6900/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-idle:
+  value: 9.979989e+01
+w83df6100/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-1/cpu-idle:
+  value: 9.999984e+01
+w83df6100/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-1/cpu-system:
+  value: 9.999985e-02
+w83df6100/cpu-1/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-10/cpu-idle:
+  value: 9.989993e+01
+w83df6100/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-10/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-10/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-10/cpu-system:
+  value: 9.999993e-02
+w83df6100/cpu-10/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-10/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-idle:
+  value: 9.999994e+01
+w83df6100/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-11/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-idle:
+  value: 9.999992e+01
+w83df6100/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-12/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-13/cpu-idle:
+  value: 9.989989e+01
+w83df6100/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-13/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-13/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-13/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-13/cpu-user:
+  value: 9.999990e-02
+w83df6100/cpu-13/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-idle:
+  value: 9.999994e+01
+w83df6100/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-14/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-idle:
+  value: 9.990003e+01
+w83df6100/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-15/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-idle:
+  value: 1.000001e+02
+w83df6100/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-16/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-idle:
+  value: 9.999995e+01
+w83df6100/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-17/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-18/cpu-idle:
+  value: 9.999993e+01
+w83df6100/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-18/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-18/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-18/cpu-system:
+  value: 9.999993e-02
+w83df6100/cpu-18/cpu-user:
+  value: 9.999991e-02
+w83df6100/cpu-18/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-19/cpu-idle:
+  value: 9.989974e+01
+w83df6100/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-19/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-19/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-19/cpu-system:
+  value: 9.999975e-02
+w83df6100/cpu-19/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-19/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-idle:
+  value: 9.999995e+01
+w83df6100/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-idle:
+  value: 9.999968e+01
+w83df6100/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-20/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-idle:
+  value: 9.999958e+01
+w83df6100/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-21/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-22/cpu-idle:
+  value: 9.999951e+01
+w83df6100/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-22/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-22/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-22/cpu-system:
+  value: 9.999951e-02
+w83df6100/cpu-22/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-22/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-idle:
+  value: 9.989947e+01
+w83df6100/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-23/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-idle:
+  value: 1.000002e+02
+w83df6100/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-idle:
+  value: 1.000004e+02
+w83df6100/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-4/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-idle:
+  value: 1.000004e+02
+w83df6100/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-5/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-6/cpu-idle:
+  value: 9.990037e+01
+w83df6100/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-6/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-6/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-6/cpu-system:
+  value: 1.000004e-01
+w83df6100/cpu-6/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-6/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-idle:
+  value: 9.990034e+01
+w83df6100/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-7/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-8/cpu-idle:
+  value: 9.990024e+01
+w83df6100/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-8/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-8/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-8/cpu-system:
+  value: 3.000007e-01
+w83df6100/cpu-8/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-8/cpu-wait:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-idle:
+  value: 9.999998e+01
+w83df6100/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-nice:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-steal:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-system:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-user:
+  value: 0.000000e+00
+w83df6100/cpu-9/cpu-wait:
+  value: 0.000000e+00
+w83df6100/df-boot/df_complex-free:
+  value: 4.369900e+08
+w83df6100/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w83df6100/df-boot/df_complex-used:
+  value: 6.459392e+07
+w83df6100/df-boot/df_inodes-free:
+  value: 3.271800e+04
+w83df6100/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-boot/df_inodes-used:
+  value: 5.000000e+01
+w83df6100/df-boot/percent_bytes-free:
+  value: 8.269669e+01
+w83df6100/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w83df6100/df-boot/percent_bytes-used:
+  value: 1.222386e+01
+w83df6100/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+w83df6100/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+w83df6100/df-data1/df_complex-free:
+  value: 2.574625e+11
+w83df6100/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+w83df6100/df-data1/df_complex-used:
+  value: 2.165924e+08
+w83df6100/df-data1/df_inodes-free:
+  value: 1.683452e+07
+w83df6100/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-data1/df_inodes-used:
+  value: 4.400000e+01
+w83df6100/df-data1/percent_bytes-free:
+  value: 9.484051e+01
+w83df6100/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+w83df6100/df-data1/percent_bytes-used:
+  value: 7.978535e-02
+w83df6100/df-data1/percent_inodes-free:
+  value: 9.999974e+01
+w83df6100/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-data1/percent_inodes-used:
+  value: 2.613671e-04
+w83df6100/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+w83df6100/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w83df6100/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w83df6100/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+w83df6100/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w83df6100/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w83df6100/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w83df6100/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w83df6100/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+w83df6100/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+w83df6100/df-root/df_complex-free:
+  value: 1.076427e+10
+w83df6100/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w83df6100/df-root/df_complex-used:
+  value: 1.274192e+09
+w83df6100/df-root/df_inodes-free:
+  value: 7.458150e+05
+w83df6100/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-root/df_inodes-used:
+  value: 4.061700e+04
+w83df6100/df-root/percent_bytes-free:
+  value: 8.487361e+01
+w83df6100/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w83df6100/df-root/percent_bytes-used:
+  value: 1.004669e+01
+w83df6100/df-root/percent_inodes-free:
+  value: 9.483528e+01
+w83df6100/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-root/percent_inodes-used:
+  value: 5.164719e+00
+w83df6100/df-var/df_complex-free:
+  value: 7.566651e+09
+w83df6100/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w83df6100/df-var/df_complex-used:
+  value: 4.589732e+08
+w83df6100/df-var/df_inodes-free:
+  value: 5.227920e+05
+w83df6100/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-var/df_inodes-used:
+  value: 1.496000e+03
+w83df6100/df-var/percent_bytes-free:
+  value: 8.949196e+01
+w83df6100/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w83df6100/df-var/percent_bytes-used:
+  value: 5.428347e+00
+w83df6100/df-var/percent_inodes-free:
+  value: 9.971466e+01
+w83df6100/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6100/df-var/percent_inodes-used:
+  value: 2.853394e-01
+w83df6100/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6100/load/load:
+  longterm: 0.000000e+00
+  midterm: 0.000000e+00
+  shortterm: 0.000000e+00
+w83df6100/memory/memory-buffered:
+  value: 2.127012e+08
+w83df6100/memory/memory-cached:
+  value: 5.203763e+08
+w83df6100/memory/memory-free:
+  value: 6.526190e+10
+w83df6100/memory/memory-used:
+  value: 1.519194e+09
+w83df6100/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.580500e+03
+w83df6100/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.200000e+00
+w83df6100/network/queue_length:
+  value: 0.000000e+00
+w83df6100/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w83df6100/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w83df6100/network/total_values-send-accepted:
+  value: 3.239997e+01
+w83df6100/network/total_values-send-rejected:
+  value: 0.000000e+00
+w83df6100/swap/swap-cached:
+  value: 0.000000e+00
+w83df6100/swap/swap-free:
+  value: 2.147475e+09
+w83df6100/swap/swap-used:
+  value: 0.000000e+00
+w83df6100/swap/swap_io-in:
+  value: 0.000000e+00
+w83df6100/swap/swap_io-out:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 3.899998e+00
+w83df6100/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6100/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6100/vmem/vmpage_number-active_anon:
+  value: 1.617900e+04
+w83df6100/vmem/vmpage_number-active_file:
+  value: 1.166460e+05
+w83df6100/vmem/vmpage_number-anon_pages:
+  value: 1.208200e+04
+w83df6100/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 8.000000e+00
+w83df6100/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-file_pages:
+  value: 1.789740e+05
+w83df6100/vmem/vmpage_number-free_pages:
+  value: 1.593308e+07
+w83df6100/vmem/vmpage_number-inactive_anon:
+  value: 4.500000e+01
+w83df6100/vmem/vmpage_number-inactive_file:
+  value: 6.228400e+04
+w83df6100/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-kernel_stack:
+  value: 4.390000e+02
+w83df6100/vmem/vmpage_number-mapped:
+  value: 1.670000e+03
+w83df6100/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-page_table_pages:
+  value: 5.870000e+02
+w83df6100/vmem/vmpage_number-shmem:
+  value: 4.700000e+01
+w83df6100/vmem/vmpage_number-slab_reclaimable:
+  value: 2.364110e+05
+w83df6100/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.472600e+04
+w83df6100/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w83df6100/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-idle:
+  value: 9.970004e+01
+w83df6200/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-idle:
+  value: 1.000000e+02
+w83df6200/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-idle:
+  value: 9.990010e+01
+w83df6200/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-10/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-11/cpu-idle:
+  value: 1.000000e+02
+w83df6200/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-11/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-11/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-11/cpu-system:
+  value: 1.000001e-01
+w83df6200/cpu-11/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-11/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-idle:
+  value: 9.990011e+01
+w83df6200/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-12/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-idle:
+  value: 9.990010e+01
+w83df6200/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-13/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-idle:
+  value: 1.000000e+02
+w83df6200/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-14/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-idle:
+  value: 1.000000e+02
+w83df6200/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-15/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-idle:
+  value: 9.999999e+01
+w83df6200/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-16/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-17/cpu-idle:
+  value: 1.000000e+02
+w83df6200/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-17/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-17/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-17/cpu-system:
+  value: 1.000000e-01
+w83df6200/cpu-17/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-17/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-idle:
+  value: 9.990002e+01
+w83df6200/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-18/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-idle:
+  value: 9.989997e+01
+w83df6200/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-19/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-2/cpu-idle:
+  value: 9.980002e+01
+w83df6200/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-2/cpu-system:
+  value: 1.000000e-01
+w83df6200/cpu-2/cpu-user:
+  value: 1.000000e-01
+w83df6200/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-idle:
+  value: 9.999997e+01
+w83df6200/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-20/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-idle:
+  value: 9.989997e+01
+w83df6200/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-21/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-idle:
+  value: 9.990010e+01
+w83df6200/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-22/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-idle:
+  value: 1.000000e+02
+w83df6200/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-23/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-idle:
+  value: 9.990001e+01
+w83df6200/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-idle:
+  value: 9.989997e+01
+w83df6200/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-4/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-idle:
+  value: 9.989993e+01
+w83df6200/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-5/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-6/cpu-idle:
+  value: 9.989989e+01
+w83df6200/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-6/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-6/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-6/cpu-system:
+  value: 9.999989e-02
+w83df6200/cpu-6/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-6/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-7/cpu-idle:
+  value: 9.990003e+01
+w83df6200/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-7/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-7/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-7/cpu-system:
+  value: 2.000001e-01
+w83df6200/cpu-7/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-7/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-idle:
+  value: 9.990009e+01
+w83df6200/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-8/cpu-wait:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-idle:
+  value: 1.000001e+02
+w83df6200/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-nice:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-steal:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-system:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-user:
+  value: 0.000000e+00
+w83df6200/cpu-9/cpu-wait:
+  value: 0.000000e+00
+w83df6200/df-boot/df_complex-free:
+  value: 4.369490e+08
+w83df6200/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w83df6200/df-boot/df_complex-used:
+  value: 6.463488e+07
+w83df6200/df-boot/df_inodes-free:
+  value: 3.271800e+04
+w83df6200/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-boot/df_inodes-used:
+  value: 5.000000e+01
+w83df6200/df-boot/percent_bytes-free:
+  value: 8.268894e+01
+w83df6200/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w83df6200/df-boot/percent_bytes-used:
+  value: 1.223161e+01
+w83df6200/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+w83df6200/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+w83df6200/df-data1/df_complex-free:
+  value: 2.574625e+11
+w83df6200/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+w83df6200/df-data1/df_complex-used:
+  value: 2.165924e+08
+w83df6200/df-data1/df_inodes-free:
+  value: 1.683452e+07
+w83df6200/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-data1/df_inodes-used:
+  value: 4.400000e+01
+w83df6200/df-data1/percent_bytes-free:
+  value: 9.484051e+01
+w83df6200/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+w83df6200/df-data1/percent_bytes-used:
+  value: 7.978535e-02
+w83df6200/df-data1/percent_inodes-free:
+  value: 9.999974e+01
+w83df6200/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-data1/percent_inodes-used:
+  value: 2.613671e-04
+w83df6200/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+w83df6200/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w83df6200/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w83df6200/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+w83df6200/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w83df6200/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w83df6200/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w83df6200/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w83df6200/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+w83df6200/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+w83df6200/df-root/df_complex-free:
+  value: 1.076426e+10
+w83df6200/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w83df6200/df-root/df_complex-used:
+  value: 1.274200e+09
+w83df6200/df-root/df_inodes-free:
+  value: 7.458150e+05
+w83df6200/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-root/df_inodes-used:
+  value: 4.061700e+04
+w83df6200/df-root/percent_bytes-free:
+  value: 8.487355e+01
+w83df6200/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w83df6200/df-root/percent_bytes-used:
+  value: 1.004675e+01
+w83df6200/df-root/percent_inodes-free:
+  value: 9.483528e+01
+w83df6200/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-root/percent_inodes-used:
+  value: 5.164719e+00
+w83df6200/df-var/df_complex-free:
+  value: 7.567688e+09
+w83df6200/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w83df6200/df-var/df_complex-used:
+  value: 4.579369e+08
+w83df6200/df-var/df_inodes-free:
+  value: 5.227970e+05
+w83df6200/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-var/df_inodes-used:
+  value: 1.491000e+03
+w83df6200/df-var/percent_bytes-free:
+  value: 8.950421e+01
+w83df6200/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w83df6200/df-var/percent_bytes-used:
+  value: 5.416090e+00
+w83df6200/df-var/percent_inodes-free:
+  value: 9.971561e+01
+w83df6200/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6200/df-var/percent_inodes-used:
+  value: 2.843857e-01
+w83df6200/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6200/load/load:
+  longterm: 0.000000e+00
+  midterm: 2.000000e-02
+  shortterm: 1.000000e-02
+w83df6200/memory/memory-buffered:
+  value: 2.156175e+08
+w83df6200/memory/memory-cached:
+  value: 5.203517e+08
+w83df6200/memory/memory-free:
+  value: 6.524863e+10
+w83df6200/memory/memory-used:
+  value: 1.529577e+09
+w83df6200/network/if_octets:
+  rx: 0.000000e+00
+  tx: 2.117499e+03
+w83df6200/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.600001e+00
+w83df6200/network/queue_length:
+  value: 0.000000e+00
+w83df6200/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w83df6200/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w83df6200/network/total_values-send-accepted:
+  value: 4.570050e+01
+w83df6200/network/total_values-send-rejected:
+  value: 0.000000e+00
+w83df6200/swap/swap-cached:
+  value: 0.000000e+00
+w83df6200/swap/swap-free:
+  value: 2.147475e+09
+w83df6200/swap/swap-used:
+  value: 0.000000e+00
+w83df6200/swap/swap_io-in:
+  value: 0.000000e+00
+w83df6200/swap/swap_io-out:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 8.000883e-01
+w83df6200/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6200/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6200/vmem/vmpage_number-active_anon:
+  value: 1.666900e+04
+w83df6200/vmem/vmpage_number-active_file:
+  value: 1.167210e+05
+w83df6200/vmem/vmpage_number-anon_pages:
+  value: 1.154700e+04
+w83df6200/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.000000e+01
+w83df6200/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-dirty:
+  value: 2.000000e+00
+w83df6200/vmem/vmpage_number-file_pages:
+  value: 1.796800e+05
+w83df6200/vmem/vmpage_number-free_pages:
+  value: 1.592984e+07
+w83df6200/vmem/vmpage_number-inactive_anon:
+  value: 4.500000e+01
+w83df6200/vmem/vmpage_number-inactive_file:
+  value: 6.291600e+04
+w83df6200/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-kernel_stack:
+  value: 4.390000e+02
+w83df6200/vmem/vmpage_number-mapped:
+  value: 1.669000e+03
+w83df6200/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-page_table_pages:
+  value: 5.770000e+02
+w83df6200/vmem/vmpage_number-shmem:
+  value: 4.700000e+01
+w83df6200/vmem/vmpage_number-slab_reclaimable:
+  value: 2.386770e+05
+w83df6200/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.476200e+04
+w83df6200/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w83df6200/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-idle:
+  value: 9.980074e+01
+w83df6300/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-idle:
+  value: 9.990070e+01
+w83df6300/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-10/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-10/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-10/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-10/cpu-system:
+  value: 1.000011e-01
+w83df6300/cpu-10/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-10/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-idle:
+  value: 1.000011e+02
+w83df6300/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-11/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-idle:
+  value: 9.980111e+01
+w83df6300/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-12/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-idle:
+  value: 9.990102e+01
+w83df6300/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-13/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-14/cpu-idle:
+  value: 9.990101e+01
+w83df6300/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-14/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-14/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-14/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-14/cpu-user:
+  value: 1.000010e-01
+w83df6300/cpu-14/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-15/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-16/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-17/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-18/cpu-idle:
+  value: 1.000009e+02
+w83df6300/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-18/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-18/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-18/cpu-system:
+  value: 1.000009e-01
+w83df6300/cpu-18/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-18/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-idle:
+  value: 9.990092e+01
+w83df6300/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-19/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-idle:
+  value: 1.000009e+02
+w83df6300/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-20/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-21/cpu-idle:
+  value: 1.000011e+02
+w83df6300/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-21/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-21/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-21/cpu-system:
+  value: 1.000011e-01
+w83df6300/cpu-21/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-21/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-22/cpu-idle:
+  value: 1.000012e+02
+w83df6300/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-22/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-22/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-22/cpu-system:
+  value: 1.000012e-01
+w83df6300/cpu-22/cpu-user:
+  value: 1.000012e-01
+w83df6300/cpu-22/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-idle:
+  value: 9.990117e+01
+w83df6300/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-23/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-idle:
+  value: 1.000009e+02
+w83df6300/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-idle:
+  value: 9.990089e+01
+w83df6300/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-4/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-5/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-6/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-6/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-6/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-6/cpu-system:
+  value: 1.000010e-01
+w83df6300/cpu-6/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-6/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-idle:
+  value: 1.000011e+02
+w83df6300/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-7/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-idle:
+  value: 9.990103e+01
+w83df6300/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-8/cpu-wait:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-idle:
+  value: 1.000010e+02
+w83df6300/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-nice:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-steal:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-system:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-user:
+  value: 0.000000e+00
+w83df6300/cpu-9/cpu-wait:
+  value: 0.000000e+00
+w83df6300/df-boot/df_complex-free:
+  value: 4.369449e+08
+w83df6300/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w83df6300/df-boot/df_complex-used:
+  value: 6.463898e+07
+w83df6300/df-boot/df_inodes-free:
+  value: 3.271800e+04
+w83df6300/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-boot/df_inodes-used:
+  value: 5.000000e+01
+w83df6300/df-boot/percent_bytes-free:
+  value: 8.268816e+01
+w83df6300/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w83df6300/df-boot/percent_bytes-used:
+  value: 1.223238e+01
+w83df6300/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+w83df6300/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+w83df6300/df-data1/df_complex-free:
+  value: 2.574625e+11
+w83df6300/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+w83df6300/df-data1/df_complex-used:
+  value: 2.165924e+08
+w83df6300/df-data1/df_inodes-free:
+  value: 1.683452e+07
+w83df6300/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-data1/df_inodes-used:
+  value: 4.400000e+01
+w83df6300/df-data1/percent_bytes-free:
+  value: 9.484051e+01
+w83df6300/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+w83df6300/df-data1/percent_bytes-used:
+  value: 7.978535e-02
+w83df6300/df-data1/percent_inodes-free:
+  value: 9.999974e+01
+w83df6300/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-data1/percent_inodes-used:
+  value: 2.613671e-04
+w83df6300/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+w83df6300/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w83df6300/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w83df6300/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+w83df6300/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w83df6300/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w83df6300/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w83df6300/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w83df6300/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+w83df6300/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+w83df6300/df-root/df_complex-free:
+  value: 1.022576e+10
+w83df6300/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w83df6300/df-root/df_complex-used:
+  value: 1.812701e+09
+w83df6300/df-root/df_inodes-free:
+  value: 7.415980e+05
+w83df6300/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-root/df_inodes-used:
+  value: 4.483400e+04
+w83df6300/df-root/percent_bytes-free:
+  value: 8.062760e+01
+w83df6300/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w83df6300/df-root/percent_bytes-used:
+  value: 1.429270e+01
+w83df6300/df-root/percent_inodes-free:
+  value: 9.429906e+01
+w83df6300/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-root/percent_inodes-used:
+  value: 5.700938e+00
+w83df6300/df-var/df_complex-free:
+  value: 7.485731e+09
+w83df6300/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w83df6300/df-var/df_complex-used:
+  value: 5.398938e+08
+w83df6300/df-var/df_inodes-free:
+  value: 5.224290e+05
+w83df6300/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-var/df_inodes-used:
+  value: 1.859000e+03
+w83df6300/df-var/percent_bytes-free:
+  value: 8.853490e+01
+w83df6300/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w83df6300/df-var/percent_bytes-used:
+  value: 6.385407e+00
+w83df6300/df-var/percent_inodes-free:
+  value: 9.964542e+01
+w83df6300/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6300/df-var/percent_inodes-used:
+  value: 3.545761e-01
+w83df6300/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6300/load/load:
+  longterm: 0.000000e+00
+  midterm: 2.000000e-02
+  shortterm: 1.000000e-02
+w83df6300/memory/memory-buffered:
+  value: 2.686280e+08
+w83df6300/memory/memory-cached:
+  value: 1.142759e+09
+w83df6300/memory/memory-free:
+  value: 6.452790e+10
+w83df6300/memory/memory-used:
+  value: 1.574883e+09
+w83df6300/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.575799e+03
+w83df6300/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.199999e+00
+w83df6300/network/queue_length:
+  value: 0.000000e+00
+w83df6300/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w83df6300/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w83df6300/network/total_values-send-accepted:
+  value: 3.240001e+01
+w83df6300/network/total_values-send-rejected:
+  value: 0.000000e+00
+w83df6300/swap/swap-cached:
+  value: 0.000000e+00
+w83df6300/swap/swap-free:
+  value: 2.147475e+09
+w83df6300/swap/swap-used:
+  value: 0.000000e+00
+w83df6300/swap/swap_io-in:
+  value: 0.000000e+00
+w83df6300/swap/swap_io-out:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 3.800015e+00
+w83df6300/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6300/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6300/vmem/vmpage_number-active_anon:
+  value: 1.835300e+04
+w83df6300/vmem/vmpage_number-active_file:
+  value: 1.867190e+05
+w83df6300/vmem/vmpage_number-anon_pages:
+  value: 1.272000e+04
+w83df6300/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.100000e+01
+w83df6300/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-dirty:
+  value: 4.000000e+00
+w83df6300/vmem/vmpage_number-file_pages:
+  value: 3.445770e+05
+w83df6300/vmem/vmpage_number-free_pages:
+  value: 1.575388e+07
+w83df6300/vmem/vmpage_number-inactive_anon:
+  value: 4.900000e+01
+w83df6300/vmem/vmpage_number-inactive_file:
+  value: 1.578110e+05
+w83df6300/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-kernel_stack:
+  value: 4.460000e+02
+w83df6300/vmem/vmpage_number-mapped:
+  value: 2.404000e+03
+w83df6300/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-page_table_pages:
+  value: 8.250000e+02
+w83df6300/vmem/vmpage_number-shmem:
+  value: 5.100000e+01
+w83df6300/vmem/vmpage_number-slab_reclaimable:
+  value: 2.469330e+05
+w83df6300/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.504900e+04
+w83df6300/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w83df6300/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-idle:
+  value: 9.979917e+01
+w83df6400/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-1/cpu-idle:
+  value: 9.989810e+01
+w83df6400/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-1/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-1/cpu-user:
+  value: 9.999843e-02
+w83df6400/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-10/cpu-idle:
+  value: 9.999853e+01
+w83df6400/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-10/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-10/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-10/cpu-system:
+  value: 9.999853e-02
+w83df6400/cpu-10/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-10/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-11/cpu-idle:
+  value: 9.989854e+01
+w83df6400/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-11/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-11/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-11/cpu-system:
+  value: 9.999853e-02
+w83df6400/cpu-11/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-11/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-idle:
+  value: 9.989849e+01
+w83df6400/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-12/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-idle:
+  value: 9.989843e+01
+w83df6400/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-13/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-idle:
+  value: 9.999838e+01
+w83df6400/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-14/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-idle:
+  value: 9.989833e+01
+w83df6400/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-15/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-16/cpu-idle:
+  value: 9.999832e+01
+w83df6400/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-16/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-16/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-16/cpu-system:
+  value: 9.999834e-02
+w83df6400/cpu-16/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-16/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-idle:
+  value: 9.989833e+01
+w83df6400/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-17/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-idle:
+  value: 9.999827e+01
+w83df6400/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-18/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-idle:
+  value: 9.999815e+01
+w83df6400/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-19/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-2/cpu-idle:
+  value: 9.979807e+01
+w83df6400/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-2/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-2/cpu-user:
+  value: 9.999811e-02
+w83df6400/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-idle:
+  value: 9.999811e+01
+w83df6400/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-20/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-idle:
+  value: 9.999773e+01
+w83df6400/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-21/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-idle:
+  value: 9.999773e+01
+w83df6400/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-22/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-idle:
+  value: 9.989763e+01
+w83df6400/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-23/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-idle:
+  value: 9.999817e+01
+w83df6400/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-idle:
+  value: 9.989839e+01
+w83df6400/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-4/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-5/cpu-idle:
+  value: 9.999820e+01
+w83df6400/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-5/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-5/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-5/cpu-system:
+  value: 9.999815e-02
+w83df6400/cpu-5/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-5/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-idle:
+  value: 9.989865e+01
+w83df6400/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-system:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-6/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-7/cpu-idle:
+  value: 9.999866e+01
+w83df6400/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-7/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-7/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-7/cpu-system:
+  value: 9.999866e-02
+w83df6400/cpu-7/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-7/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-8/cpu-idle:
+  value: 9.999857e+01
+w83df6400/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-8/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-8/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-8/cpu-system:
+  value: 9.999860e-02
+w83df6400/cpu-8/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-8/cpu-wait:
+  value: 0.000000e+00
+w83df6400/cpu-9/cpu-idle:
+  value: 9.989853e+01
+w83df6400/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+w83df6400/cpu-9/cpu-nice:
+  value: 0.000000e+00
+w83df6400/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+w83df6400/cpu-9/cpu-steal:
+  value: 0.000000e+00
+w83df6400/cpu-9/cpu-system:
+  value: 9.999854e-02
+w83df6400/cpu-9/cpu-user:
+  value: 0.000000e+00
+w83df6400/cpu-9/cpu-wait:
+  value: 0.000000e+00
+w83df6400/df-boot/df_complex-free:
+  value: 4.369449e+08
+w83df6400/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w83df6400/df-boot/df_complex-used:
+  value: 6.463898e+07
+w83df6400/df-boot/df_inodes-free:
+  value: 3.271800e+04
+w83df6400/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-boot/df_inodes-used:
+  value: 5.000000e+01
+w83df6400/df-boot/percent_bytes-free:
+  value: 8.268816e+01
+w83df6400/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w83df6400/df-boot/percent_bytes-used:
+  value: 1.223238e+01
+w83df6400/df-boot/percent_inodes-free:
+  value: 9.984741e+01
+w83df6400/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-boot/percent_inodes-used:
+  value: 1.525879e-01
+w83df6400/df-data1/df_complex-free:
+  value: 2.574625e+11
+w83df6400/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+w83df6400/df-data1/df_complex-used:
+  value: 2.165924e+08
+w83df6400/df-data1/df_inodes-free:
+  value: 1.683452e+07
+w83df6400/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-data1/df_inodes-used:
+  value: 4.400000e+01
+w83df6400/df-data1/percent_bytes-free:
+  value: 9.484051e+01
+w83df6400/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+w83df6400/df-data1/percent_bytes-used:
+  value: 7.978535e-02
+w83df6400/df-data1/percent_inodes-free:
+  value: 9.999974e+01
+w83df6400/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-data1/percent_inodes-used:
+  value: 2.613671e-04
+w83df6400/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+w83df6400/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w83df6400/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w83df6400/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+w83df6400/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w83df6400/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w83df6400/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w83df6400/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w83df6400/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+w83df6400/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+w83df6400/df-root/df_complex-free:
+  value: 1.062062e+10
+w83df6400/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w83df6400/df-root/df_complex-used:
+  value: 1.417847e+09
+w83df6400/df-root/df_inodes-free:
+  value: 7.449690e+05
+w83df6400/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-root/df_inodes-used:
+  value: 4.146300e+04
+w83df6400/df-root/percent_bytes-free:
+  value: 8.374093e+01
+w83df6400/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w83df6400/df-root/percent_bytes-used:
+  value: 1.117937e+01
+w83df6400/df-root/percent_inodes-free:
+  value: 9.472771e+01
+w83df6400/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-root/percent_inodes-used:
+  value: 5.272293e+00
+w83df6400/df-var/df_complex-free:
+  value: 7.567413e+09
+w83df6400/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w83df6400/df-var/df_complex-used:
+  value: 4.582113e+08
+w83df6400/df-var/df_inodes-free:
+  value: 5.227820e+05
+w83df6400/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-var/df_inodes-used:
+  value: 1.506000e+03
+w83df6400/df-var/percent_bytes-free:
+  value: 8.950097e+01
+w83df6400/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w83df6400/df-var/percent_bytes-used:
+  value: 5.419336e+00
+w83df6400/df-var/percent_inodes-free:
+  value: 9.971275e+01
+w83df6400/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6400/df-var/percent_inodes-used:
+  value: 2.872467e-01
+w83df6400/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6400/load/load:
+  longterm: 0.000000e+00
+  midterm: 2.000000e-02
+  shortterm: 3.000000e-02
+w83df6400/memory/memory-buffered:
+  value: 2.072453e+08
+w83df6400/memory/memory-cached:
+  value: 6.651863e+08
+w83df6400/memory/memory-free:
+  value: 6.511982e+10
+w83df6400/memory/memory-used:
+  value: 1.521922e+09
+w83df6400/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.849000e+03
+w83df6400/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.400000e+00
+w83df6400/network/queue_length:
+  value: 0.000000e+00
+w83df6400/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w83df6400/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w83df6400/network/total_values-send-accepted:
+  value: 3.370000e+01
+w83df6400/network/total_values-send-rejected:
+  value: 0.000000e+00
+w83df6400/swap/swap-cached:
+  value: 0.000000e+00
+w83df6400/swap/swap-free:
+  value: 2.147475e+09
+w83df6400/swap/swap-used:
+  value: 0.000000e+00
+w83df6400/swap/swap_io-in:
+  value: 0.000000e+00
+w83df6400/swap/swap_io-out:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 4.700028e+00
+w83df6400/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6400/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6400/vmem/vmpage_number-active_anon:
+  value: 1.704400e+04
+w83df6400/vmem/vmpage_number-active_file:
+  value: 1.158240e+05
+w83df6400/vmem/vmpage_number-anon_pages:
+  value: 1.090600e+04
+w83df6400/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.200000e+01
+w83df6400/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-dirty:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-file_pages:
+  value: 2.129960e+05
+w83df6400/vmem/vmpage_number-free_pages:
+  value: 1.589839e+07
+w83df6400/vmem/vmpage_number-inactive_anon:
+  value: 4.400000e+01
+w83df6400/vmem/vmpage_number-inactive_file:
+  value: 9.713000e+04
+w83df6400/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-kernel_stack:
+  value: 4.350000e+02
+w83df6400/vmem/vmpage_number-mapped:
+  value: 1.621000e+03
+w83df6400/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-page_table_pages:
+  value: 4.680000e+02
+w83df6400/vmem/vmpage_number-shmem:
+  value: 4.600000e+01
+w83df6400/vmem/vmpage_number-slab_reclaimable:
+  value: 2.361780e+05
+w83df6400/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.468100e+04
+w83df6400/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w83df6400/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w83df6500/cpu-0/cpu-idle:
+  value: 8.689957e+01
+w83df6500/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-0/cpu-system:
+  value: 2.299989e+00
+w83df6500/cpu-0/cpu-user:
+  value: 1.059998e+01
+w83df6500/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-1/cpu-idle:
+  value: 9.869419e+01
+w83df6500/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-1/cpu-system:
+  value: 3.999803e-01
+w83df6500/cpu-1/cpu-user:
+  value: 6.999674e-01
+w83df6500/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-10/cpu-idle:
+  value: 9.999000e+01
+w83df6500/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-10/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-10/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-10/cpu-system:
+  value: 9.999001e-02
+w83df6500/cpu-10/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-10/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-11/cpu-idle:
+  value: 9.988985e+01
+w83df6500/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-11/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-11/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-11/cpu-system:
+  value: 9.998982e-02
+w83df6500/cpu-11/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-11/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-12/cpu-idle:
+  value: 9.988970e+01
+w83df6500/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-12/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-12/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-12/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-12/cpu-user:
+  value: 9.998982e-02
+w83df6500/cpu-12/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-13/cpu-idle:
+  value: 9.239045e+01
+w83df6500/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-13/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-13/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-13/cpu-system:
+  value: 2.999690e+00
+w83df6500/cpu-13/cpu-user:
+  value: 4.399545e+00
+w83df6500/cpu-13/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-14/cpu-idle:
+  value: 9.639002e+01
+w83df6500/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-14/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-14/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-14/cpu-system:
+  value: 2.999689e-01
+w83df6500/cpu-14/cpu-user:
+  value: 3.299658e+00
+w83df6500/cpu-14/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-idle:
+  value: 9.998962e+01
+w83df6500/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-15/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-idle:
+  value: 9.998964e+01
+w83df6500/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-16/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-idle:
+  value: 9.998943e+01
+w83df6500/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-17/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-18/cpu-idle:
+  value: 9.978947e+01
+w83df6500/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-18/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-18/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-18/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-18/cpu-user:
+  value: 9.998947e-02
+w83df6500/cpu-18/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-19/cpu-idle:
+  value: 9.149020e+01
+w83df6500/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-19/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-19/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-19/cpu-system:
+  value: 3.299646e+00
+w83df6500/cpu-19/cpu-user:
+  value: 5.099453e+00
+w83df6500/cpu-19/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-idle:
+  value: 9.999229e+01
+w83df6500/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-idle:
+  value: 9.988926e+01
+w83df6500/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-20/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-21/cpu-idle:
+  value: 9.888932e+01
+w83df6500/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-21/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-21/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-21/cpu-system:
+  value: 9.998920e-02
+w83df6500/cpu-21/cpu-user:
+  value: 7.999136e-01
+w83df6500/cpu-21/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-22/cpu-idle:
+  value: 9.998916e+01
+w83df6500/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-22/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-22/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-22/cpu-system:
+  value: 9.998916e-02
+w83df6500/cpu-22/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-22/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-23/cpu-idle:
+  value: 9.988925e+01
+w83df6500/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-23/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-23/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-23/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-23/cpu-user:
+  value: 9.998923e-02
+w83df6500/cpu-23/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-idle:
+  value: 9.989136e+01
+w83df6500/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-idle:
+  value: 9.989094e+01
+w83df6500/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-4/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-idle:
+  value: 9.999060e+01
+w83df6500/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-5/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-6/cpu-idle:
+  value: 9.959022e+01
+w83df6500/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-6/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-6/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-6/cpu-system:
+  value: 9.999033e-02
+w83df6500/cpu-6/cpu-user:
+  value: 2.999711e-01
+w83df6500/cpu-6/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-7/cpu-idle:
+  value: 9.809048e+01
+w83df6500/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-7/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-7/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-7/cpu-system:
+  value: 4.999515e-01
+w83df6500/cpu-7/cpu-user:
+  value: 1.299874e+00
+w83df6500/cpu-7/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-idle:
+  value: 9.999017e+01
+w83df6500/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-8/cpu-wait:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-idle:
+  value: 9.989011e+01
+w83df6500/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-nice:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-steal:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-system:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-user:
+  value: 0.000000e+00
+w83df6500/cpu-9/cpu-wait:
+  value: 0.000000e+00
+w83df6500/df-boot/df_complex-free:
+  value: 4.793876e+08
+w83df6500/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w83df6500/df-boot/df_complex-used:
+  value: 2.219622e+07
+w83df6500/df-boot/df_inodes-free:
+  value: 3.273000e+04
+w83df6500/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-boot/df_inodes-used:
+  value: 3.800000e+01
+w83df6500/df-boot/percent_bytes-free:
+  value: 9.072010e+01
+w83df6500/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w83df6500/df-boot/percent_bytes-used:
+  value: 4.200449e+00
+w83df6500/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+w83df6500/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+w83df6500/df-data1/df_complex-free:
+  value: 2.574625e+11
+w83df6500/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+w83df6500/df-data1/df_complex-used:
+  value: 2.165883e+08
+w83df6500/df-data1/df_inodes-free:
+  value: 1.683452e+07
+w83df6500/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-data1/df_inodes-used:
+  value: 4.300000e+01
+w83df6500/df-data1/percent_bytes-free:
+  value: 9.484052e+01
+w83df6500/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+w83df6500/df-data1/percent_bytes-used:
+  value: 7.978383e-02
+w83df6500/df-data1/percent_inodes-free:
+  value: 9.999974e+01
+w83df6500/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-data1/percent_inodes-used:
+  value: 2.554269e-04
+w83df6500/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+w83df6500/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w83df6500/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w83df6500/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+w83df6500/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w83df6500/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w83df6500/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w83df6500/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w83df6500/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+w83df6500/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+w83df6500/df-root/df_complex-free:
+  value: 1.055831e+10
+w83df6500/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w83df6500/df-root/df_complex-used:
+  value: 1.480151e+09
+w83df6500/df-root/df_inodes-free:
+  value: 7.465750e+05
+w83df6500/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-root/df_inodes-used:
+  value: 3.985700e+04
+w83df6500/df-root/percent_bytes-free:
+  value: 8.324968e+01
+w83df6500/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w83df6500/df-root/percent_bytes-used:
+  value: 1.167062e+01
+w83df6500/df-root/percent_inodes-free:
+  value: 9.493192e+01
+w83df6500/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-root/percent_inodes-used:
+  value: 5.068080e+00
+w83df6500/df-var/df_complex-free:
+  value: 7.641543e+09
+w83df6500/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w83df6500/df-var/df_complex-used:
+  value: 3.840819e+08
+w83df6500/df-var/df_inodes-free:
+  value: 5.228880e+05
+w83df6500/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-var/df_inodes-used:
+  value: 1.400000e+03
+w83df6500/df-var/percent_bytes-free:
+  value: 9.037771e+01
+w83df6500/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w83df6500/df-var/percent_bytes-used:
+  value: 4.542596e+00
+w83df6500/df-var/percent_inodes-free:
+  value: 9.973297e+01
+w83df6500/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6500/df-var/percent_inodes-used:
+  value: 2.670288e-01
+w83df6500/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 7.199968e+00
+w83df6500/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 3.850286e+04
+w83df6500/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 2.200014e+00
+w83df6500/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 4.000026e-01
+w83df6500/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 2.299968e+00
+w83df6500/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 1.146866e+04
+w83df6500/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 4.999937e-01
+w83df6500/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 1.999972e-01
+w83df6500/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 4.899926e+00
+w83df6500/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 2.703321e+04
+w83df6500/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 1.699975e+00
+w83df6500/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 4.999926e-01
+w83df6500/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6500/load/load:
+  longterm: 2.000000e-02
+  midterm: 9.000000e-02
+  shortterm: 1.600000e-01
+w83df6500/memory/memory-buffered:
+  value: 4.858675e+07
+w83df6500/memory/memory-cached:
+  value: 7.746028e+08
+w83df6500/memory/memory-free:
+  value: 6.579641e+10
+w83df6500/memory/memory-used:
+  value: 8.945746e+08
+w83df6500/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.591300e+03
+w83df6500/network/if_packets:
+  rx: 0.000000e+00
+  tx: 1.199999e+00
+w83df6500/network/queue_length:
+  value: 0.000000e+00
+w83df6500/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w83df6500/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w83df6500/network/total_values-send-accepted:
+  value: 3.239995e+01
+w83df6500/network/total_values-send-rejected:
+  value: 0.000000e+00
+w83df6500/swap/swap-cached:
+  value: 0.000000e+00
+w83df6500/swap/swap-free:
+  value: 2.147475e+09
+w83df6500/swap/swap-used:
+  value: 0.000000e+00
+w83df6500/swap/swap_io-in:
+  value: 0.000000e+00
+w83df6500/swap/swap_io-out:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 1.747727e+04
+w83df6500/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 3.759999e+01
+w83df6500/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6500/vmem/vmpage_number-active_anon:
+  value: 7.795900e+04
+w83df6500/vmem/vmpage_number-active_file:
+  value: 8.036800e+04
+w83df6500/vmem/vmpage_number-anon_pages:
+  value: 2.727800e+04
+w83df6500/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 1.000000e+02
+w83df6500/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-dirty:
+  value: 3.920000e+02
+w83df6500/vmem/vmpage_number-file_pages:
+  value: 2.009740e+05
+w83df6500/vmem/vmpage_number-free_pages:
+  value: 1.606358e+07
+w83df6500/vmem/vmpage_number-inactive_anon:
+  value: 4.600000e+01
+w83df6500/vmem/vmpage_number-inactive_file:
+  value: 1.205540e+05
+w83df6500/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-kernel_stack:
+  value: 5.970000e+02
+w83df6500/vmem/vmpage_number-mapped:
+  value: 6.373000e+03
+w83df6500/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-page_table_pages:
+  value: 1.091000e+03
+w83df6500/vmem/vmpage_number-shmem:
+  value: 4.800000e+01
+w83df6500/vmem/vmpage_number-slab_reclaimable:
+  value: 1.991400e+04
+w83df6500/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.512500e+04
+w83df6500/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w83df6500/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-idle:
+  value: 9.980063e+01
+w83df6600/cpu-0/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-0/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-idle:
+  value: 9.990608e+01
+w83df6600/cpu-1/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-1/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-idle:
+  value: 9.991430e+01
+w83df6600/cpu-10/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-10/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-idle:
+  value: 1.000143e+02
+w83df6600/cpu-11/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-11/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-idle:
+  value: 1.000143e+02
+w83df6600/cpu-12/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-12/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-idle:
+  value: 9.991410e+01
+w83df6600/cpu-13/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-13/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-idle:
+  value: 1.000141e+02
+w83df6600/cpu-14/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-14/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-idle:
+  value: 9.998509e+01
+w83df6600/cpu-15/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-15/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-idle:
+  value: 9.998503e+01
+w83df6600/cpu-16/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-16/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-idle:
+  value: 9.988509e+01
+w83df6600/cpu-17/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-17/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-idle:
+  value: 9.988507e+01
+w83df6600/cpu-18/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-18/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-idle:
+  value: 9.978521e+01
+w83df6600/cpu-19/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-19/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-idle:
+  value: 9.999391e+01
+w83df6600/cpu-2/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-2/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-idle:
+  value: 1.000140e+02
+w83df6600/cpu-20/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-20/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-idle:
+  value: 1.000139e+02
+w83df6600/cpu-21/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-21/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-idle:
+  value: 1.000138e+02
+w83df6600/cpu-22/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-22/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-idle:
+  value: 1.000137e+02
+w83df6600/cpu-23/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-23/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-idle:
+  value: 9.989001e+01
+w83df6600/cpu-3/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-3/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-4/cpu-idle:
+  value: 9.998791e+01
+w83df6600/cpu-4/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-4/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-4/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-4/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-4/cpu-system:
+  value: 9.998773e-02
+w83df6600/cpu-4/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-4/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-5/cpu-idle:
+  value: 9.988613e+01
+w83df6600/cpu-5/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-5/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-5/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-5/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-5/cpu-system:
+  value: 9.998665e-02
+w83df6600/cpu-5/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-5/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-idle:
+  value: 9.988577e+01
+w83df6600/cpu-6/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-6/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-7/cpu-idle:
+  value: 9.988529e+01
+w83df6600/cpu-7/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-7/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-7/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-7/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-7/cpu-system:
+  value: 3.999412e-01
+w83df6600/cpu-7/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-7/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-idle:
+  value: 9.998504e+01
+w83df6600/cpu-8/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-system:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-8/cpu-wait:
+  value: 0.000000e+00
+w83df6600/cpu-9/cpu-idle:
+  value: 9.988501e+01
+w83df6600/cpu-9/cpu-interrupt:
+  value: 0.000000e+00
+w83df6600/cpu-9/cpu-nice:
+  value: 0.000000e+00
+w83df6600/cpu-9/cpu-softirq:
+  value: 0.000000e+00
+w83df6600/cpu-9/cpu-steal:
+  value: 0.000000e+00
+w83df6600/cpu-9/cpu-system:
+  value: 9.998501e-02
+w83df6600/cpu-9/cpu-user:
+  value: 0.000000e+00
+w83df6600/cpu-9/cpu-wait:
+  value: 0.000000e+00
+w83df6600/df-boot/df_complex-free:
+  value: 4.793631e+08
+w83df6600/df-boot/df_complex-reserved:
+  value: 2.684109e+07
+w83df6600/df-boot/df_complex-used:
+  value: 2.222080e+07
+w83df6600/df-boot/df_inodes-free:
+  value: 3.273000e+04
+w83df6600/df-boot/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-boot/df_inodes-used:
+  value: 3.800000e+01
+w83df6600/df-boot/percent_bytes-free:
+  value: 9.071545e+01
+w83df6600/df-boot/percent_bytes-reserved:
+  value: 5.079451e+00
+w83df6600/df-boot/percent_bytes-used:
+  value: 4.205100e+00
+w83df6600/df-boot/percent_inodes-free:
+  value: 9.988403e+01
+w83df6600/df-boot/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-boot/percent_inodes-used:
+  value: 1.159668e-01
+w83df6600/df-data1/df_complex-free:
+  value: 2.574625e+11
+w83df6600/df-data1/df_complex-reserved:
+  value: 1.378982e+10
+w83df6600/df-data1/df_complex-used:
+  value: 2.165883e+08
+w83df6600/df-data1/df_inodes-free:
+  value: 1.683452e+07
+w83df6600/df-data1/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-data1/df_inodes-used:
+  value: 4.300000e+01
+w83df6600/df-data1/percent_bytes-free:
+  value: 9.484052e+01
+w83df6600/df-data1/percent_bytes-reserved:
+  value: 5.079707e+00
+w83df6600/df-data1/percent_bytes-used:
+  value: 7.978383e-02
+w83df6600/df-data1/percent_inodes-free:
+  value: 9.999974e+01
+w83df6600/df-data1/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-data1/percent_inodes-used:
+  value: 2.554269e-04
+w83df6600/df-dev-shm/df_complex-free:
+  value: 3.375709e+10
+w83df6600/df-dev-shm/df_complex-reserved:
+  value: 0.000000e+00
+w83df6600/df-dev-shm/df_complex-used:
+  value: 0.000000e+00
+w83df6600/df-dev-shm/df_inodes-free:
+  value: 8.241475e+06
+w83df6600/df-dev-shm/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-dev-shm/df_inodes-used:
+  value: 1.000000e+00
+w83df6600/df-dev-shm/percent_bytes-free:
+  value: 1.000000e+02
+w83df6600/df-dev-shm/percent_bytes-reserved:
+  value: 0.000000e+00
+w83df6600/df-dev-shm/percent_bytes-used:
+  value: 0.000000e+00
+w83df6600/df-dev-shm/percent_inodes-free:
+  value: 9.999998e+01
+w83df6600/df-dev-shm/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-dev-shm/percent_inodes-used:
+  value: 1.213375e-05
+w83df6600/df-root/df_complex-free:
+  value: 1.055849e+10
+w83df6600/df-root/df_complex-reserved:
+  value: 6.442435e+08
+w83df6600/df-root/df_complex-used:
+  value: 1.479975e+09
+w83df6600/df-root/df_inodes-free:
+  value: 7.466050e+05
+w83df6600/df-root/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-root/df_inodes-used:
+  value: 3.982700e+04
+w83df6600/df-root/percent_bytes-free:
+  value: 8.325107e+01
+w83df6600/df-root/percent_bytes-reserved:
+  value: 5.079700e+00
+w83df6600/df-root/percent_bytes-used:
+  value: 1.166924e+01
+w83df6600/df-root/percent_inodes-free:
+  value: 9.493573e+01
+w83df6600/df-root/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-root/percent_inodes-used:
+  value: 5.064265e+00
+w83df6600/df-var/df_complex-free:
+  value: 7.642092e+09
+w83df6600/df-var/df_complex-reserved:
+  value: 4.294943e+08
+w83df6600/df-var/df_complex-used:
+  value: 3.835331e+08
+w83df6600/df-var/df_inodes-free:
+  value: 5.229150e+05
+w83df6600/df-var/df_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-var/df_inodes-used:
+  value: 1.373000e+03
+w83df6600/df-var/percent_bytes-free:
+  value: 9.038420e+01
+w83df6600/df-var/percent_bytes-reserved:
+  value: 5.079695e+00
+w83df6600/df-var/percent_bytes-used:
+  value: 4.536105e+00
+w83df6600/df-var/percent_inodes-free:
+  value: 9.973812e+01
+w83df6600/df-var/percent_inodes-reserved:
+  value: 0.000000e+00
+w83df6600/df-var/percent_inodes-used:
+  value: 2.618790e-01
+w83df6600/disk-sda/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda1/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda1/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda1/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda1/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda2/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda2/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda2/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda2/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda3/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda3/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda3/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda3/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda4/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda4/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda4/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda4/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda5/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda5/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda5/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda5/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda6/disk_merged:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda6/disk_octets:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda6/disk_ops:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/disk-sda6/disk_time:
+  read: 0.000000e+00
+  write: 0.000000e+00
+w83df6600/load/load:
+  longterm: 0.000000e+00
+  midterm: 0.000000e+00
+  shortterm: 0.000000e+00
+w83df6600/memory/memory-buffered:
+  value: 4.378624e+07
+w83df6600/memory/memory-cached:
+  value: 7.730299e+08
+w83df6600/memory/memory-free:
+  value: 6.607691e+10
+w83df6600/memory/memory-used:
+  value: 6.204498e+08
+w83df6600/network/if_octets:
+  rx: 0.000000e+00
+  tx: 1.043100e+03
+w83df6600/network/if_packets:
+  rx: 0.000000e+00
+  tx: 7.999960e-01
+w83df6600/network/queue_length:
+  value: 0.000000e+00
+w83df6600/network/total_values-dispatch-accepted:
+  value: 0.000000e+00
+w83df6600/network/total_values-dispatch-rejected:
+  value: 0.000000e+00
+w83df6600/network/total_values-send-accepted:
+  value: 2.019973e+01
+w83df6600/network/total_values-send-rejected:
+  value: 0.000000e+00
+w83df6600/swap/swap-cached:
+  value: 0.000000e+00
+w83df6600/swap/swap-free:
+  value: 2.147475e+09
+w83df6600/swap/swap-used:
+  value: 0.000000e+00
+w83df6600/swap/swap_io-in:
+  value: 0.000000e+00
+w83df6600/swap/swap_io-out:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_faults:
+  majflt: 0.000000e+00
+  minflt: 8.999036e-01
+w83df6600/vmem/vmpage_io-memory:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6600/vmem/vmpage_io-swap:
+  in: 0.000000e+00
+  out: 0.000000e+00
+w83df6600/vmem/vmpage_number-active_anon:
+  value: 1.469200e+04
+w83df6600/vmem/vmpage_number-active_file:
+  value: 6.927600e+04
+w83df6600/vmem/vmpage_number-anon_pages:
+  value: 1.110500e+04
+w83df6600/vmem/vmpage_number-anon_transparent_hugepages:
+  value: 7.000000e+00
+w83df6600/vmem/vmpage_number-boudfe:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-dirty:
+  value: 9.000000e+00
+w83df6600/vmem/vmpage_number-file_pages:
+  value: 1.994180e+05
+w83df6600/vmem/vmpage_number-free_pages:
+  value: 1.613205e+07
+w83df6600/vmem/vmpage_number-inactive_anon:
+  value: 4.300000e+01
+w83df6600/vmem/vmpage_number-inactive_file:
+  value: 1.300980e+05
+w83df6600/vmem/vmpage_number-isolated_anon:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-isolated_file:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-kernel_stack:
+  value: 4.330000e+02
+w83df6600/vmem/vmpage_number-mapped:
+  value: 1.253000e+03
+w83df6600/vmem/vmpage_number-mlock:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-page_table_pages:
+  value: 4.520000e+02
+w83df6600/vmem/vmpage_number-shmem:
+  value: 4.600000e+01
+w83df6600/vmem/vmpage_number-slab_reclaimable:
+  value: 1.905300e+04
+w83df6600/vmem/vmpage_number-slab_unreclaimable:
+  value: 1.455200e+04
+w83df6600/vmem/vmpage_number-unevictable:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-unstable:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-vmscan_write:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-writeback:
+  value: 0.000000e+00
+w83df6600/vmem/vmpage_number-writeback_temp:
+  value: 0.000000e+00
index 2b3d8f5..5c6a5f9 100644 (file)
@@ -33,7 +33,7 @@ collectd's unixsock plugin.
 
 =head1 SYNOPSIS
 
-  use Collectd::Unixsock ();
+  use Collectd::Unixsock;
 
   my $sock = Collectd::Unixsock->new ($path);
 
@@ -56,23 +56,15 @@ programmers to interact with the daemon.
 use strict;
 use warnings;
 
-#use constant { NOTIF_FAILURE => 1, NOTIF_WARNING => 2, NOTIF_OKAY => 4 };
-
-use Carp (qw(cluck confess));
+use Carp qw(cluck confess carp croak);
 use IO::Socket::UNIX;
-use Regexp::Common (qw(number));
+use Scalar::Util qw( looks_like_number );
 
 our $Debug = 0;
 
-return (1);
-
 sub _debug
 {
-       if (!$Debug)
-       {
-               return;
-       }
-       print @_;
+       print @_ if $Debug;
 }
 
 sub _create_socket
@@ -89,88 +81,124 @@ sub _create_socket
 
 =head1 VALUE IDENTIFIERS
 
-The values in the collectd are identified using an five-tuple (host, plugin,
-plugin-instance, type, type-instance) where only plugin-instance and
-type-instance may be NULL (or undefined). Many functions expect an
-I<%identifier> hash that has at least the members B<host>, B<plugin>, and
-B<type>, possibly completed by B<plugin_instance> and B<type_instance>.
+The values in the collectd are identified using a five-tuple (host, plugin,
+plugin-instance, type, type-instance) where only plugin instance and type
+instance may be undef. Many functions expect an I<%identifier> hash that has at
+least the members B<host>, B<plugin>, and B<type>, possibly completed by
+B<plugin_instance> and B<type_instance>.
 
 Usually you can pass this hash as follows:
 
-  $obj->method (host => $host, plugin => $plugin, type => $type, %other_args);
+  $self->method (host => $host, plugin => $plugin, type => $type, %other_args);
 
 =cut
 
 sub _create_identifier
 {
        my $args = shift;
-       my $host;
-       my $plugin;
-       my $type;
+       my ($host, $plugin, $type);
 
-       if (!$args->{'host'} || !$args->{'plugin'} || !$args->{'type'})
+       if (!$args->{host} || !$args->{plugin} || !$args->{type})
        {
                cluck ("Need `host', `plugin' and `type'");
                return;
        }
 
-       $host = $args->{'host'};
-       $plugin = $args->{'plugin'};
-       $plugin .= '-' . $args->{'plugin_instance'} if (defined ($args->{'plugin_instance'}));
-       $type = $args->{'type'};
-       $type .= '-' . $args->{'type_instance'} if (defined ($args->{'type_instance'}));
+       $host = $args->{host};
+       $plugin = $args->{plugin};
+       $plugin .= '-' . $args->{plugin_instance} if defined $args->{plugin_instance};
+       $type = $args->{type};
+       $type .= '-' . $args->{type_instance} if defined $args->{type_instance};
 
-       return ("$host/$plugin/$type");
+       return "$host/$plugin/$type";
 } # _create_identifier
 
 sub _parse_identifier
 {
        my $string = shift;
-       my $host;
-       my $plugin;
-       my $plugin_instance;
-       my $type;
-       my $type_instance;
-       my $ident;
+       my ($plugin_instance, $type_instance);
 
-       ($host, $plugin, $type) = split ('/', $string);
+       my ($host, $plugin, $type) = split /\//, $string;
 
-       ($plugin, $plugin_instance) = split ('-', $plugin, 2);
-       ($type, $type_instance) = split ('-', $type, 2);
+       ($plugin, $plugin_instance) = split /-/, $plugin, 2;
+       ($type, $type_instance) = split /-/, $type, 2;
 
-       $ident =
+       my $ident =
        {
                host => $host,
                plugin => $plugin,
                type => $type
        };
-       $ident->{'plugin_instance'} = $plugin_instance if (defined ($plugin_instance));
-       $ident->{'type_instance'} = $type_instance if (defined ($type_instance));
+       $ident->{plugin_instance} = $plugin_instance if defined $plugin_instance;
+       $ident->{type_instance} = $type_instance if defined $type_instance;
 
-       return ($ident);
+       return $ident;
 } # _parse_identifier
 
 sub _escape_argument
 {
-       my $string = shift;
+       local $_ = shift;
+
+       return $_ if /^\w+$/;
+
+       s#\\#\\\\#g;
+       s#"#\\"#g;
+       return "\"$_\"";
+}
+
+# Send a command on a socket, including any required argument escaping.
+# Return a single line of result.
+sub _socket_command {
+       my ($self, $command, $args) = @_;
+
+       my $fh = $self->{sock} or confess ('object has no filehandle');
+
+    if($args) {
+        my $identifier = _create_identifier ($args) or return;
+           $command .= ' ' . _escape_argument ($identifier) . "\n";
+    } else {
+        $command .= "\n";
+    }
+       _debug "-> $command";
+       $fh->print($command);
+
+       my $response = $fh->getline;
+       chomp $response;
+       _debug "<- $response\n";
+    return $response;
+}
+
+# Read any remaining results from a socket and pass them to
+# a callback for caller-defined mangling.
+sub _socket_chat
+{
+       my ($self, $msg, $callback, $cbdata) = @_;
+       my ($nresults, $ret);
+       my $fh = $self->{sock} or confess ('object has no filehandle');
 
-       if ($string =~ m/^\w+$/)
+       ($nresults, $msg) = split / /, $msg, 2;
+       if ($nresults <= 0)
        {
-               return ("$string");
+               $self->{error} = $msg;
+               return;
        }
 
-       $string =~ s#\\#\\\\#g;
-       $string =~ s#"#\\"#g;
-       $string = "\"$string\"";
-
-       return ($string);
+       for (1 .. $nresults)
+       {
+               my $entry = $fh->getline;
+               chomp $entry;
+               _debug "<- $entry\n";
+        $callback->($entry, $cbdata);
+       }
+       return $cbdata;
 }
 
+
 =head1 PUBLIC METHODS
 
 =over 4
 
-=item I<$obj> = Collectd::Unixsock->B<new> ([I<$path>]);
+=item I<$self> = Collectd::Unixsock->B<new> ([I<$path>]);
 
 Creates a new connection to the daemon. The optional I<$path> argument gives
 the path to the UNIX socket of the C<unixsock plugin> and defaults to
@@ -181,19 +209,18 @@ false on error.
 
 sub new
 {
-       my $pkg = shift;
-       my $path = @_ ? shift : '/var/run/collectd-unixsock';
+       my $class = shift;
+       my $path = shift || '/var/run/collectd-unixsock';
        my $sock = _create_socket ($path) or return;
-       my $obj = bless (
+       return bless
                {
                        path => $path,
                        sock => $sock,
                        error => 'No error'
-               }, $pkg);
-       return ($obj);
+               }, $class;
 } # new
 
-=item I<$res> = I<$obj>-E<gt>B<getval> (I<%identifier>);
+=item I<$res> = I<$self>-E<gt>B<getval> (I<%identifier>);
 
 Requests a value-list from the daemon. On success a hash-ref is returned with
 the name of each data-source as the key and the according value as, well, the
@@ -203,53 +230,22 @@ value. On error false is returned.
 
 sub getval # {{{
 {
-       my $obj = shift;
+       my $self = shift;
        my %args = @_;
-
-       my $status;
-       my $fh = $obj->{'sock'} or confess ('object has no filehandle');
-       my $msg;
-       my $identifier;
-
        my $ret = {};
 
-       $identifier = _create_identifier (\%args) or return;
-
-       $msg = 'GETVAL ' . _escape_argument ($identifier) . "\n";
-       _debug "-> $msg";
-       print $fh $msg;
-
-       $msg = <$fh>;
-       chomp ($msg);
-       _debug "<- $msg\n";
-
-       ($status, $msg) = split (' ', $msg, 2);
-       if ($status <= 0)
-       {
-               $obj->{'error'} = $msg;
-               return;
-       }
-
-       for (my $i = 0; $i < $status; $i++)
-       {
-               my $entry = <$fh>;
-               chomp ($entry);
-               _debug "<- $entry\n";
-
-               if ($entry =~ m/^(\w+)=NaN$/)
-               {
-                       $ret->{$1} = undef;
-               }
-               elsif ($entry =~ m/^(\w+)=($RE{num}{real})$/)
-               {
-                       $ret->{$1} = 0.0 + $2;
-               }
-       }
-
-       return ($ret);
+    my $msg = $self->_socket_command('GETVAL', \%args) or return;
+    $self->_socket_chat($msg, sub {
+            local $_ = shift;
+            my $ret = shift;
+            /^(\w+)=NaN$/ and $ret->{$1} = undef, return;
+            /^(\w+)=(.*)$/ and looks_like_number($2) and $ret->{$1} = 0 + $2, return;
+        }, $ret
+    );
+       return $ret;
 } # }}} sub getval
 
-=item I<$res> = I<$obj>-E<gt>B<getthreshold> (I<%identifier>);
+=item I<$res> = I<$self>-E<gt>B<getthreshold> (I<%identifier>);
 
 Requests a threshold from the daemon. On success a hash-ref is returned with
 the threshold data. On error false is returned.
@@ -258,55 +254,24 @@ the threshold data. On error false is returned.
 
 sub getthreshold # {{{
 {
-       my $obj = shift;
+       my $self = shift;
        my %args = @_;
-
-       my $status;
-       my $fh = $obj->{'sock'} or confess ('object has no filehandle');
-       my $msg;
-       my $identifier;
-
        my $ret = {};
 
-       $identifier = _create_identifier (\%args) or return;
-
-       $msg = 'GETTHRESHOLD ' . _escape_argument ($identifier) . "\n";
-       _debug "-> $msg";
-       print $fh $msg;
-
-       $msg = <$fh>;
-       chomp ($msg);
-       _debug "<- $msg\n";
-
-       ($status, $msg) = split (' ', $msg, 2);
-       if ($status <= 0)
-       {
-               $obj->{'error'} = $msg;
-               return;
-       }
-
-       for (my $i = 0; $i < $status; $i++)
-       {
-               my $entry = <$fh>;
-               chomp ($entry);
-               _debug "<- $entry\n";
-
-               if ($entry =~ m/^([^:]+):\s*(\S.*)$/)
-               {
-                       my $key = $1;
-                       my $value = $2;
-
-                       $key =~ s/^\s+//;
-                       $key =~ s/\s+$//;
-
-                       $ret->{$key} = $value;
-               }
-       }
-
-       return ($ret);
+    my $msg = $self->_socket_command('GETTHRESHOLD', \%args) or return;
+    $self->_socket_chat($msg, sub {
+            local $_ = shift;
+            my $ret = shift;
+                   /^\s*([^:]+):\s*(.*)/ and do {
+                           $1 =~ s/\s*$//;
+                           $ret->{$1} = $2;
+                   };
+        }, $ret
+    );
+       return $ret;
 } # }}} sub getthreshold
 
-=item I<$obj>-E<gt>B<putval> (I<%identifier>, B<time> =E<gt> I<$time>, B<values> =E<gt> [...]);
+=item I<$self>-E<gt>B<putval> (I<%identifier>, B<time> =E<gt> I<$time>, B<values> =E<gt> [...]);
 
 Submits a value-list to the daemon. If the B<time> argument is omitted
 C<time()> is used. The required argument B<values> is a reference to an array
@@ -320,51 +285,44 @@ otherwise.
 
 sub putval
 {
-       my $obj = shift;
+       my $self = shift;
        my %args = @_;
 
-       my $status;
-       my $fh = $obj->{'sock'} or confess;
-       my $msg;
-       my $identifier;
-       my $values;
-       my $interval = "";
+       my ($status, $msg, $identifier, $values);
+       my $fh = $self->{sock} or confess;
 
-       if (defined $args{'interval'})
-       {
-               $interval = ' interval='
-               . _escape_argument ($args{'interval'});
-       }
+       my $interval = defined $args{interval} ?
+    ' interval=' . _escape_argument ($args{interval}) : '';
 
        $identifier = _create_identifier (\%args) or return;
-       if (!$args{'values'})
+       if (!$args{values})
        {
                cluck ("Need argument `values'");
                return;
        }
 
-       if (!ref ($args{'values'}))
-       {
-               $values = $args{'values'};
-       }
-       else
+       if (ref ($args{values}))
        {
                my $time;
 
-               if ("ARRAY" ne ref ($args{'values'}))
+               if ("ARRAY" ne ref ($args{values}))
                {
                        cluck ("Invalid `values' argument (expected an array ref)");
                        return;
                }
 
-               if (! scalar @{$args{'values'}})
+               if (! scalar @{$args{values}})
                {
                        cluck ("Empty `values' array");
                        return;
                }
 
-               $time = $args{'time'} ? $args{'time'} : time ();
-               $values = join (':', $time, map { defined ($_) ? $_ : 'U' } (@{$args{'values'}}));
+               $time = $args{time} || time;
+               $values = join (':', $time, map { defined $_ ? $_ : 'U' } @{$args{values}});
+       }
+       else
+       {
+               $values = $args{values};
        }
 
        $msg = 'PUTVAL '
@@ -372,20 +330,72 @@ sub putval
        . $interval
        . ' ' . _escape_argument ($values) . "\n";
        _debug "-> $msg";
-       print $fh $msg;
+       $fh->print($msg);
 
        $msg = <$fh>;
-       chomp ($msg);
+       chomp $msg;
        _debug "<- $msg\n";
 
-       ($status, $msg) = split (' ', $msg, 2);
-       return (1) if ($status == 0);
+       ($status, $msg) = split / /, $msg, 2;
+       return 1 if $status == 0;
 
-       $obj->{'error'} = $msg;
+       $self->{error} = $msg;
        return;
 } # putval
 
-=item I<$res> = I<$obj>-E<gt>B<listval> ()
+=item I<$res> = I<$self>-E<gt>B<listval_filter> ( C<%identifier> )
+
+Queries a list of values from the daemon while restricting the results to
+certain hosts, plugins etc. The argument may be anything that passes for an
+identifier (cf. L<VALUE IDENTIFIERS>), although all fields are optional.
+The returned data is in the same format as from C<listval>.
+
+=cut
+
+sub listval_filter
+{
+       my $self = shift;
+    my %args = @_;
+       my @ret;
+       my $nresults;
+       my $fh = $self->{sock} or confess;
+
+    my $pattern =
+    (exists $args{host}              ? "$args{host}"             : '[^/]+') .
+    (exists $args{plugin}            ? "/$args{plugin}"          : '/[^/-]+') .
+       (exists $args{plugin_instance}   ? "-$args{plugin_instance}" : '(?:-[^/]+)?') .
+       (exists $args{type}              ? "/$args{type}"            : '/[^/-]+') .
+       (exists $args{type_instance}     ? "-$args{type_instance}"   : '(?:-[^/]+)?');
+    $pattern = qr/^\d+ $pattern$/;
+
+    my $msg = $self->_socket_command('LISTVAL') or return;
+       ($nresults, $msg) = split / /, $msg, 2;
+
+    # This could use _socket_chat() but doesn't for speed reasons
+       if ($nresults < 0)
+       {
+               $self->{error} = $msg;
+               return;
+       }
+
+       for (1 .. $nresults)
+       {
+               $msg = <$fh>;
+               chomp $msg;
+               _debug "<- $msg\n";
+               next unless $msg =~ $pattern;
+               my ($time, $ident) = split / /, $msg, 2;
+
+               $ident = _parse_identifier ($ident);
+               $ident->{time} = int $time;
+
+               push (@ret, $ident);
+       } # for (i = 0 .. $status)
+
+       return @ret;
+} # listval
+
+=item I<$res> = I<$self>-E<gt>B<listval> ()
 
 Queries a list of values from the daemon. The list is returned as an array of
 hash references, where each hash reference is a valid identifier. The C<time>
@@ -395,46 +405,39 @@ member of each hash holds the epoch value of the last update of that value.
 
 sub listval
 {
-       my $obj = shift;
-       my $msg;
-       my @ret = ();
-       my $status;
-       my $fh = $obj->{'sock'} or confess;
+       my $self = shift;
+       my $nresults;
+       my @ret;
+       my $fh = $self->{sock} or confess;
 
-       _debug "LISTVAL\n";
-       print $fh "LISTVAL\n";
+    my $msg = $self->_socket_command('LISTVAL') or return;
+       ($nresults, $msg) = split / /, $msg, 2;
 
-       $msg = <$fh>;
-       chomp ($msg);
-       _debug "<- $msg\n";
-       ($status, $msg) = split (' ', $msg, 2);
-       if ($status < 0)
+    # This could use _socket_chat() but doesn't for speed reasons
+       if ($nresults < 0)
        {
-               $obj->{'error'} = $msg;
+               $self->{error} = $msg;
                return;
        }
 
-       for (my $i = 0; $i < $status; $i++)
+       for (1 .. $nresults)
        {
-               my $time;
-               my $ident;
-
                $msg = <$fh>;
-               chomp ($msg);
+               chomp $msg;
                _debug "<- $msg\n";
 
-               ($time, $ident) = split (' ', $msg, 2);
+               my ($time, $ident) = split / /, $msg, 2;
 
                $ident = _parse_identifier ($ident);
-               $ident->{'time'} = int ($time);
+               $ident->{time} = int $time;
 
                push (@ret, $ident);
        } # for (i = 0 .. $status)
 
-       return (@ret);
+       return @ret;
 } # listval
 
-=item I<$res> = I<$obj>-E<gt>B<putnotif> (B<severity> =E<gt> I<$severity>, B<message> =E<gt> I<$message>, ...);
+=item I<$res> = I<$self>-E<gt>B<putnotif> (B<severity> =E<gt> I<$severity>, B<message> =E<gt> I<$message>, ...);
 
 Submits a notification to the daemon.
 
@@ -469,57 +472,48 @@ For more details, please see L<collectd-unixsock(5)>.
 
 sub putnotif
 {
-       my $obj = shift;
+       my $self = shift;
        my %args = @_;
 
        my $status;
-       my $fh = $obj->{'sock'} or confess;
+       my $fh = $self->{sock} or confess;
 
        my $msg; # message sent to the socket
        
-       if (!$args{'message'})
-       {
-               cluck ("Need argument `message'");
-               return;
-       }
-       if (!$args{'severity'})
-       {
-               cluck ("Need argument `severity'");
-               return;
-       }
-       $args{'severity'} = lc ($args{'severity'});
-       if (($args{'severity'} ne 'failure')
-               && ($args{'severity'} ne 'warning')
-               && ($args{'severity'} ne 'okay'))
+    for my $arg (qw( message severity ))
+    {
+        cluck ("Need argument `$arg'"), return unless $args{$arg};
+    }
+       $args{severity} = lc $args{severity};
+       if (($args{severity} ne 'failure')
+               && ($args{severity} ne 'warning')
+               && ($args{severity} ne 'okay'))
        {
-               cluck ("Invalid `severity: " . $args{'severity'});
+               cluck ("Invalid `severity: " . $args{severity});
                return;
        }
 
-       if (!$args{'time'})
-       {
-               $args{'time'} = time ();
-       }
+       $args{time} ||= time;
        
        $msg = 'PUTNOTIF '
-       . join (' ', map { $_ . '=' . _escape_argument ($args{$_}) } (keys %args))
+       . join (' ', map { $_ . '=' . _escape_argument ($args{$_}) } keys %args)
        . "\n";
 
        _debug "-> $msg";
-       print $fh $msg;
+       $fh->print($msg);
 
        $msg = <$fh>;
-       chomp ($msg);
+       chomp $msg;
        _debug "<- $msg\n";
 
-       ($status, $msg) = split (' ', $msg, 2);
-       return (1) if ($status == 0);
+       ($status, $msg) = split / /, $msg, 2;
+       return 1 if $status == 0;
 
-       $obj->{'error'} = $msg;
+       $self->{error} = $msg;
        return;
 } # putnotif
 
-=item I<$obj>-E<gt>B<flush> (B<timeout> =E<gt> I<$timeout>, B<plugins> =E<gt> [...], B<identifier>  =E<gt> [...]);
+=item I<$self>-E<gt>B<flush> (B<timeout> =E<gt> I<$timeout>, B<plugins> =E<gt> [...], B<identifier>  =E<gt> [...]);
 
 Flush cached data.
 
@@ -549,48 +543,38 @@ are hash references and have the members as outlined in L<VALUE IDENTIFIERS>.
 
 sub flush
 {
-       my $obj  = shift;
+       my $self  = shift;
        my %args = @_;
 
-       my $fh = $obj->{'sock'} or confess;
+       my $fh = $self->{sock} or confess;
 
        my $status = 0;
        my $msg    = "FLUSH";
 
-       if (defined ($args{'timeout'}))
-       {
-               $msg .= " timeout=" . $args{'timeout'};
-       }
+    $msg .= " timeout=$args{timeout}" if defined $args{timeout};
 
-       if ($args{'plugins'})
+       if ($args{plugins})
        {
-               foreach my $plugin (@{$args{'plugins'}})
+               foreach my $plugin (@{$args{plugins}})
                {
                        $msg .= " plugin=" . $plugin;
                }
        }
 
-       if ($args{'identifier'})
+       if ($args{identifier})
        {
-               for (@{$args{'identifier'}})
+               for my $identifier (@{$args{identifier}})
                {
-                       my $identifier = $_;
                        my $ident_str;
 
                        if (ref ($identifier) ne 'HASH')
                        {
                                cluck ("The argument of the `identifier' "
-                                       . "option must be an array reference "
-                                       . "of hash references.");
-                               return;
-                       }
-
-                       $ident_str = _create_identifier ($identifier);
-                       if (!$ident_str)
-                       {
+                                       . "option must be an array of hashrefs.");
                                return;
                        }
 
+                       $ident_str = _create_identifier ($identifier) or return;
                        $msg .= ' identifier=' . _escape_argument ($ident_str);
                }
        }
@@ -598,30 +582,25 @@ sub flush
        $msg .= "\n";
 
        _debug "-> $msg";
-       print $fh $msg;
+       $fh->print($msg);
 
        $msg = <$fh>;
        chomp ($msg);
        _debug "<- $msg\n";
 
-       ($status, $msg) = split (' ', $msg, 2);
-       return (1) if ($status == 0);
+       ($status, $msg) = split / /, $msg, 2;
+       return 1 if $status == 0;
 
-       $obj->{'error'} = $msg;
+       $self->{error} = $msg;
        return;
 }
 
 sub error
 {
-       my $obj = shift;
-       if ($obj->{'error'})
-       {
-               return ($obj->{'error'});
-       }
-       return;
+       return shift->{error};
 }
 
-=item I<$obj>-E<gt>destroy ();
+=item I<$self>-E<gt>destroy ();
 
 Closes the socket before the object is destroyed. This function is also
 automatically called then the object goes out of scope.
@@ -632,18 +611,18 @@ automatically called then the object goes out of scope.
 
 sub destroy
 {
-       my $obj = shift;
-       if ($obj->{'sock'})
+       my $self = shift;
+       if ($self->{sock})
        {
-               close ($obj->{'sock'});
-               delete ($obj->{'sock'});
+               close $self->{sock};
+               delete $self->{sock};
        }
 }
 
 sub DESTROY
 {
-       my $obj = shift;
-       $obj->destroy ();
+       my $self = shift;
+       $self->destroy ();
 }
 
 =head1 SEE ALSO
@@ -657,5 +636,5 @@ L<collectd-unixsock(5)>
 Florian octo Forster E<lt>octo@collectd.orgE<gt>
 
 =cut
-
+1;
 # vim: set fdm=marker :
diff --git a/bindings/perl/t/00_load.t b/bindings/perl/t/00_load.t
new file mode 100644 (file)
index 0000000..b40bbdd
--- /dev/null
@@ -0,0 +1,6 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More tests => 1;
+use_ok 'Collectd::Unixsock';
diff --git a/bindings/perl/t/01_methods.t b/bindings/perl/t/01_methods.t
new file mode 100644 (file)
index 0000000..2f7818b
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Test::More tests => 14;
+use Collectd::Unixsock;
+use Collectd::MockDaemon;
+
+my $path = mockd_start();
+END { mockd_stop(); }
+
+sub filter_time { return map { delete $_->{time}; $_ } @_ }
+
+sub test_query {
+    my ($s, $attr, $results) = @_;
+    my ($nresults, $resultdata) = @$results;
+    my $r = $s->getval(%{Collectd::Unixsock::_parse_identifier($attr)});
+    is(ref $r, 'HASH', "Got a result for $attr");
+    is(scalar keys $r, $nresults, "$nresults result result for $attr");
+    is_deeply($r, $resultdata, "Data or $attr matches");
+}
+
+my $s = Collectd::Unixsock->new($path);
+isnt($s, undef, "Collectd::Unixsock object created");
+
+my %queries = (
+    'w83df6600/vmem/vmpage_number-vmscan_write' => [ 1, { value => 0 } ],
+    'a1d8f6310/load/load' => [ 3, { longterm => '0.07', shortterm => 0, midterm => '0.06' } ],
+    'w83df6600/disk-sda/disk_octets' => [ 2, { read => 0, write => 0 } ],
+);
+
+test_query($s, $_, $queries{$_}) for sort keys %queries;
+
+my @values = $s->listval;
+is(scalar @values, 4984, "Correct number of results from LISTVAL");
+delete $values[1234]{time};     # won't be constant
+is_deeply($values[1234], {
+        type_instance => 'nice',
+        plugin_instance => 21,
+        plugin => 'cpu',
+        type => 'cpu',
+        host => 'h2gdf6120'
+    }, "Correct data returned for select element");
+@values = ();
+
+is_deeply([ filter_time $s->listval_filter() ] , [ filter_time $s->listval ], "listval_filter() w/o filter equivalent to listval()");
+is_deeply(
+    [ filter_time $s->listval_filter(host => 'a1d8f6310', plugin => 'disk', plugin_instance => 'vda6') ],
+    [
+        { 'plugin_instance' => 'vda6', 'type' => 'disk_merged', 'plugin' => 'disk', 'host' => 'a1d8f6310' },
+        { 'host' => 'a1d8f6310', 'plugin' => 'disk', 'plugin_instance' => 'vda6', 'type' => 'disk_octets' },
+        { 'type' => 'disk_ops', 'plugin_instance' => 'vda6', 'plugin' => 'disk', 'host' => 'a1d8f6310' },
+        { 'plugin' => 'disk', 'host' => 'a1d8f6310', 'type' => 'disk_time', 'plugin_instance' => 'vda6' }
+    ],
+    "Correct result from listval_filter on <host>, <plugin> and <plugin_instance>"
+);
+
+# TODO more test for putval() and the like
+
index 46e8c29..200091a 100755 (executable)
--- a/clean.sh
+++ b/clean.sh
@@ -27,7 +27,6 @@ true \
 && rm -f src/*.o \
 && rm -f src/*.la \
 && rm -f src/*.lo \
-&& rm -f src/collectd \
 && rm -f src/collectd.1 \
 && rm -f src/collectd.conf \
 && rm -f src/collectdctl \
@@ -44,6 +43,14 @@ true \
 && rm -f src/*.pb-c.c \
 && rm -f src/*.pb-c.h \
 && rm -f src/Makefile.in \
+&& rm -f -r src/daemon/.deps \
+&& rm -f -r src/daemon/.libs \
+&& rm -f src/daemon/*.o \
+&& rm -f src/daemon/*.la \
+&& rm -f src/daemon/*.lo \
+&& rm -f src/daemon/collectd \
+&& rm -f src/daemon/Makefile.in \
+&& rm -f src/daemon/Makefile \
 && rm -f src/liboconfig/*.o \
 && rm -f src/liboconfig/*.la \
 && rm -f src/liboconfig/*.lo \
index 9dd30c7..c83805e 100644 (file)
@@ -527,7 +527,7 @@ AC_CHECK_HEADERS(linux/un.h, [], [],
 #endif
 ])
 
-AC_CHECK_HEADERS(pwd.h grp.h sys/un.h ctype.h limits.h xfs/xqm.h fs_info.h fshelp.h paths.h mntent.h mnttab.h sys/fstyp.h sys/fs_types.h sys/mntent.h sys/mnttab.h sys/statfs.h sys/statvfs.h sys/vfs.h sys/vfstab.h kvm.h wordexp.h locale.h)
+AC_CHECK_HEADERS(pwd.h grp.h sys/un.h ctype.h limits.h xfs/xqm.h fs_info.h fshelp.h paths.h mntent.h mnttab.h sys/fstyp.h sys/fs_types.h sys/mntent.h sys/mnttab.h sys/statfs.h sys/statvfs.h sys/vfs.h sys/vfstab.h sys/vmmeter.h kvm.h wordexp.h locale.h)
 
 # For the dns plugin
 AC_CHECK_HEADERS(arpa/nameser.h)
@@ -809,7 +809,9 @@ if test "x$have_swapctl" = "xyes"; then
 #  undef _LARGEFILE64_SOURCE
 #endif
 #include <sys/stat.h>
+#include <sys/param.h>
 #include <sys/swap.h>
+#include <unistd.h>
 ]]],
 [[[
 int num = swapctl(0, NULL);
@@ -829,7 +831,9 @@ int num = swapctl(0, NULL);
 #  undef _LARGEFILE64_SOURCE
 #endif
 #include <sys/stat.h>
+#include <sys/param.h>
 #include <sys/swap.h>
+#include <unistd.h>
 ]]],
 [[[
 int num = swapctl(0, NULL, 0);
@@ -1311,7 +1315,7 @@ AC_CHECK_MEMBERS([struct kinfo_proc.ki_pid, struct kinfo_proc.ki_rssize, struct
 #include <sys/user.h>
        ])
 
-AC_CHECK_MEMBERS([struct kinfo_proc.kp_proc, struct kinfo_proc.kp_eproc],
+AC_CHECK_MEMBERS([struct kinfo_proc.p_pid, struct kinfo_proc.p_vm_rssize],
        [
                AC_DEFINE(HAVE_STRUCT_KINFO_PROC_OPENBSD, 1,
                        [Define if struct kinfo_proc exists in the OpenBSD variant.])
@@ -1328,6 +1332,7 @@ AC_CHECK_MEMBERS([struct kinfo_proc.kp_proc, struct kinfo_proc.kp_eproc],
 
 AC_CHECK_MEMBERS([struct udphdr.uh_dport, struct udphdr.uh_sport], [], [],
 [#define _BSD_SOURCE
+#define _DEFAULT_SOURCE
 #if HAVE_STDINT_H
 # include <stdint.h>
 #endif
@@ -1349,6 +1354,7 @@ AC_CHECK_MEMBERS([struct udphdr.uh_dport, struct udphdr.uh_sport], [], [],
 ])
 AC_CHECK_MEMBERS([struct udphdr.dest, struct udphdr.source], [], [],
 [#define _BSD_SOURCE
+#define _DEFAULT_SOURCE
 #if HAVE_STDINT_H
 # include <stdint.h>
 #endif
@@ -1573,62 +1579,63 @@ fi
 AM_CONDITIONAL(BUILD_WITH_LIBAQUAERO5, test "x$with_libaquaero5" = "xyes")
 # }}}
 
-# --with-libcredis {{{
-AC_ARG_WITH(libcredis, [AS_HELP_STRING([--with-libcredis@<:@=PREFIX@:>@], [Path to libcredis.])],
+# --with-libhiredis {{{
+AC_ARG_WITH(libhiredis, [AS_HELP_STRING([--with-libhiredis@<:@=PREFIX@:>@],
+      [Path to libhiredis.])],
 [
  if test "x$withval" = "xyes"
  then
-        with_libcredis="yes"
+        with_libhiredis="yes"
  else if test "x$withval" = "xno"
  then
-        with_libcredis="no"
+        with_libhiredis="no"
  else
-        with_libcredis="yes"
-        LIBCREDIS_CPPFLAGS="$LIBCREDIS_CPPFLAGS -I$withval/include"
-        LIBCREDIS_LDFLAGS="$LIBCREDIS_LDFLAGS -L$withval/lib"
+        with_libhiredis="yes"
+        LIBHIREDIS_CPPFLAGS="$LIBHIREDIS_CPPFLAGS -I$withval/include"
+        LIBHIREDIS_LDFLAGS="$LIBHIREDIS_LDFLAGS -L$withval/lib"
  fi; fi
 ],
-[with_libcredis="yes"])
+[with_libhiredis="yes"])
 
 SAVE_CPPFLAGS="$CPPFLAGS"
 SAVE_LDFLAGS="$LDFLAGS"
 
-CPPFLAGS="$CPPFLAGS $LIBCREDIS_CPPFLAGS"
-LDFLAGS="$LDFLAGS $LIBCREDIS_LDFLAGS"
+CPPFLAGS="$CPPFLAGS $LIBHIREDIS_CPPFLAGS"
+LDFLAGS="$LDFLAGS $LIBHIREDIS_LDFLAGS"
 
-if test "x$with_libcredis" = "xyes"
+if test "x$with_libhiredis" = "xyes"
 then
-       if test "x$LIBCREDIS_CPPFLAGS" != "x"
+       if test "x$LIBHIREDIS_CPPFLAGS" != "x"
        then
-               AC_MSG_NOTICE([libcredis CPPFLAGS: $LIBCREDIS_CPPFLAGS])
+               AC_MSG_NOTICE([libhiredis CPPFLAGS: $LIBHIREDIS_CPPFLAGS])
        fi
-       AC_CHECK_HEADERS(credis.h,
-       [with_libcredis="yes"],
-       [with_libcredis="no (credis.h not found)"])
+       AC_CHECK_HEADERS(hiredis/hiredis.h,
+       [with_libhiredis="yes"],
+       [with_libhiredis="no (hiredis.h not found)"])
 fi
-if test "x$with_libcredis" = "xyes"
+if test "x$with_libhiredis" = "xyes"
 then
-       if test "x$LIBCREDIS_LDFLAGS" != "x"
+       if test "x$LIBHIREDIS_LDFLAGS" != "x"
        then
-               AC_MSG_NOTICE([libcredis LDFLAGS: $LIBCREDIS_LDFLAGS])
+               AC_MSG_NOTICE([libhiredis LDFLAGS: $LIBHIREDIS_LDFLAGS])
        fi
-       AC_CHECK_LIB(credis, credis_info,
-       [with_libcredis="yes"],
-       [with_libcredis="no (symbol 'credis_info' not found)"])
+       AC_CHECK_LIB(hiredis, redisCommand,
+       [with_libhiredis="yes"],
+       [with_libhiredis="no (symbol 'redisCommand' not found)"])
 
 fi
 
 CPPFLAGS="$SAVE_CPPFLAGS"
 LDFLAGS="$SAVE_LDFLAGS"
 
-if test "x$with_libcredis" = "xyes"
+if test "x$with_libhiredis" = "xyes"
 then
-       BUILD_WITH_LIBCREDIS_CPPFLAGS="$LIBCREDIS_CPPFLAGS"
-       BUILD_WITH_LIBCREDIS_LDFLAGS="$LIBCREDIS_LDFLAGS"
-       AC_SUBST(BUILD_WITH_LIBCREDIS_CPPFLAGS)
-       AC_SUBST(BUILD_WITH_LIBCREDIS_LDFLAGS)
+       BUILD_WITH_LIBHIREDIS_CPPFLAGS="$LIBHIREDIS_CPPFLAGS"
+       BUILD_WITH_LIBHIREDIS_LDFLAGS="$LIBHIREDIS_LDFLAGS"
+       AC_SUBST(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
+       AC_SUBST(BUILD_WITH_LIBHIREDIS_LDFLAGS)
 fi
-AM_CONDITIONAL(BUILD_WITH_LIBCREDIS, test "x$with_libcredis" = "xyes")
+AM_CONDITIONAL(BUILD_WITH_LIBHIREDIS, test "x$with_libhiredis" = "xyes")
 # }}}
 
 # --with-libcurl {{{
@@ -1744,7 +1751,6 @@ then
        LDFLAGS="$LDFLAGS $with_libdbi_ldflags"
 
        AC_CHECK_LIB(dbi, dbi_initialize, [with_libdbi="yes"], [with_libdbi="no (Symbol 'dbi_initialize' not found)"])
-       AC_CHECK_LIB(dbi, dbi_driver_open_r, [with_libdbi_r="yes"], [with_libdbi_r="no"])
 
        CPPFLAGS="$SAVE_CPPFLAGS"
        LDFLAGS="$SAVE_LDFLAGS"
@@ -1757,11 +1763,6 @@ then
        AC_SUBST(BUILD_WITH_LIBDBI_CPPFLAGS)
        AC_SUBST(BUILD_WITH_LIBDBI_LDFLAGS)
        AC_SUBST(BUILD_WITH_LIBDBI_LIBS)
-
-  if test "x$with_libdbi_r" = "xyes"
-  then
-               AC_DEFINE(HAVE_LIBDBI_R, 1, [Define if reentrant dbi facility is present and usable.])
-  fi
 fi
 AM_CONDITIONAL(BUILD_WITH_LIBDBI, test "x$with_libdbi" = "xyes")
 # }}}
@@ -1957,7 +1958,7 @@ then
                [with_libgcrypt="no (symbol gcry_md_hash_buffer not found)"])
 
        if test "$with_libgcrypt" != "no"; then
-               AM_PATH_LIBGCRYPT(1:1.2.0,,with_libgcrypt="no (version 1.2.0+ required)")
+               m4_ifdef([AM_PATH_LIBGCRYPT],[AM_PATH_LIBGCRYPT(1:1.2.0,,with_libgcrypt="no (version 1.2.0+ required)")])
                GCRYPT_CPPFLAGS="$LIBGCRYPT_CPPFLAGS $LIBGCRYPT_CFLAGS"
                GCRYPT_LIBS="$LIBGCRYPT_LIBS"
        fi
@@ -2241,6 +2242,64 @@ AC_SUBST(JAVA_LIBS)
 AM_CONDITIONAL(BUILD_WITH_JAVA, test "x$with_java" = "xyes")
 # }}}
 
+# --with-libldap {{{
+AC_ARG_WITH(libldap, [AS_HELP_STRING([--with-libldap@<:@=PREFIX@:>@], [Path to libldap.])],
+[
+ if test "x$withval" = "xyes"
+ then
+        with_libldap="yes"
+ else if test "x$withval" = "xno"
+ then
+        with_libldap="no"
+ else
+        with_libldap="yes"
+        LIBLDAP_CPPFLAGS="$LIBLDAP_CPPFLAGS -I$withval/include"
+        LIBLDAP_LDFLAGS="$LIBLDAP_LDFLAGS -L$withval/lib"
+ fi; fi
+],
+[with_libldap="yes"])
+
+SAVE_CPPFLAGS="$CPPFLAGS"
+SAVE_LDFLAGS="$LDFLAGS"
+
+CPPFLAGS="$CPPFLAGS $LIBLDAP_CPPFLAGS"
+LDFLAGS="$LDFLAGS $LIBLDAP_LDFLAGS"
+
+if test "x$with_libldap" = "xyes"
+then
+       if test "x$LIBLDAP_CPPFLAGS" != "x"
+       then
+               AC_MSG_NOTICE([libldap CPPFLAGS: $LIBLDAP_CPPFLAGS])
+       fi
+       AC_CHECK_HEADERS(ldap.h,
+       [with_libldap="yes"],
+       [with_libldap="no ('ldap.h' not found)"])
+fi
+if test "x$with_libldap" = "xyes"
+then
+       if test "x$LIBLDAP_LDFLAGS" != "x"
+       then
+               AC_MSG_NOTICE([libldap LDFLAGS: $LIBLDAP_LDFLAGS])
+       fi
+       AC_CHECK_LIB(ldap, ldap_initialize,
+       [with_libldap="yes"],
+       [with_libldap="no (symbol 'ldap_initialize' not found)"])
+
+fi
+
+CPPFLAGS="$SAVE_CPPFLAGS"
+LDFLAGS="$SAVE_LDFLAGS"
+
+if test "x$with_libldap" = "xyes"
+then
+       BUILD_WITH_LIBLDAP_CPPFLAGS="$LIBLDAP_CPPFLAGS"
+       BUILD_WITH_LIBLDAP_LDFLAGS="$LIBLDAP_LDFLAGS"
+       AC_SUBST(BUILD_WITH_LIBLDAP_CPPFLAGS)
+       AC_SUBST(BUILD_WITH_LIBLDAP_LDFLAGS)
+fi
+AM_CONDITIONAL(BUILD_WITH_LIBLDAP, test "x$with_libldap" = "xyes")
+# }}}
+
 # --with-liblvm2app {{{
 with_liblvm2app_cppflags=""
 with_liblvm2app_ldflags=""
@@ -3154,12 +3213,12 @@ if test "x$with_libperl" = "xyes" \
        && test -n "$perl_interpreter"
 then
   SAVE_CFLAGS="$CFLAGS"
-  SAVE_LDFLAGS="$LDFLAGS"
+  SAVE_LIBS="$LIBS"
 dnl ARCHFLAGS="" -> disable multi -arch on OSX (see Config_heavy.pl:fetch_string)
   PERL_CFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ccopts`
-  PERL_LDFLAGS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ldopts`
+  PERL_LIBS=`ARCHFLAGS="" $perl_interpreter -MExtUtils::Embed -e ldopts`
   CFLAGS="$CFLAGS $PERL_CFLAGS"
-  LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
+  LIBS="$LIBS $PERL_LIBS"
 
   AC_CACHE_CHECK([for libperl],
     [c_cv_have_libperl],
@@ -3186,13 +3245,13 @@ dnl ARCHFLAGS="" -> disable multi -arch on OSX (see Config_heavy.pl:fetch_string
   then
          AC_DEFINE(HAVE_LIBPERL, 1, [Define if libperl is present and usable.])
          AC_SUBST(PERL_CFLAGS)
-         AC_SUBST(PERL_LDFLAGS)
+         AC_SUBST(PERL_LIBS)
   else
          with_libperl="no"
   fi
 
   CFLAGS="$SAVE_CFLAGS"
-  LDFLAGS="$SAVE_LDFLAGS"
+  LIBS="$SAVE_LIBS"
 else if test -z "$perl_interpreter"; then
   with_libperl="no (no perl interpreter found)"
   c_cv_have_libperl="no"
@@ -3202,9 +3261,9 @@ AM_CONDITIONAL(BUILD_WITH_LIBPERL, test "x$with_libperl" = "xyes")
 if test "x$with_libperl" = "xyes"
 then
        SAVE_CFLAGS="$CFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
+       SAVE_LIBS="$LIBS"
        CFLAGS="$CFLAGS $PERL_CFLAGS"
-       LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
+       LIBS="$LIBS $PERL_LIBS"
 
        AC_CACHE_CHECK([if perl supports ithreads],
                [c_cv_have_perl_ithreads],
@@ -3231,17 +3290,17 @@ then
        fi
 
        CFLAGS="$SAVE_CFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+       LIBS="$SAVE_LIBS"
 fi
 
 if test "x$with_libperl" = "xyes"
 then
        SAVE_CFLAGS="$CFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
+       SAVE_LIBS="$LIBS"
        # trigger an error if Perl_load_module*() uses __attribute__nonnull__(3)
        # (see issues #41 and #42)
        CFLAGS="$CFLAGS $PERL_CFLAGS -Wall -Werror"
-       LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
+       LIBS="$LIBS $PERL_LIBS"
 
        AC_CACHE_CHECK([for broken Perl_load_module()],
                [c_cv_have_broken_perl_load_module],
@@ -3265,7 +3324,7 @@ then
        )
 
        CFLAGS="$SAVE_CFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+       LIBS="$SAVE_LIBS"
 fi
 AM_CONDITIONAL(HAVE_BROKEN_PERL_LOAD_MODULE,
                test "x$c_cv_have_broken_perl_load_module" = "xyes")
@@ -3273,9 +3332,9 @@ AM_CONDITIONAL(HAVE_BROKEN_PERL_LOAD_MODULE,
 if test "x$with_libperl" = "xyes"
 then
        SAVE_CFLAGS="$CFLAGS"
-       SAVE_LDFLAGS="$LDFLAGS"
+       SAVE_LIBS="$LIBS"
        CFLAGS="$CFLAGS $PERL_CFLAGS"
-       LDFLAGS="$LDFLAGS $PERL_LDFLAGS"
+       LIBS="$LIBS $PERL_LIBS"
 
        AC_CHECK_MEMBER(
                [struct mgvtbl.svt_local],
@@ -3294,7 +3353,7 @@ then
        fi
 
        CFLAGS="$SAVE_CFLAGS"
-       LDFLAGS="$SAVE_LDFLAGS"
+       LIBS="$SAVE_LIBS"
 fi
 # }}}
 
@@ -4071,6 +4130,36 @@ then
   LDFLAGS="$SAVE_LDFLAGS"
 fi
 
+if test "x$with_libstatgrab" = "xyes"
+then
+  SAVE_CFLAGS="$CFLAGS"
+  SAVE_LIBS="$LIBS"
+
+  CFLAGS="$CFLAGS $with_libstatgrab_cflags"
+  LDFLAGS="$LDFLAGS $with_libstatgrab_ldflags"
+  LIBS="-lstatgrab $LIBS"
+
+  AC_CACHE_CHECK([if libstatgrab >= 0.90],
+          [c_cv_have_libstatgrab_0_90],
+          AC_LINK_IFELSE([AC_LANG_PROGRAM(
+[[[
+#include <stdio.h>
+#include <statgrab.h>
+]]],
+[[[
+      if (sg_init()) return 0;
+]]]
+    )],
+    [c_cv_have_libstatgrab_0_90="no"],
+    [c_cv_have_libstatgrab_0_90="yes"]
+          )
+  )
+
+  CFLAGS="$SAVE_CFLAGS"
+  LDFLAGS="$SAVE_LDFLAGS"
+  LIBS="$SAVE_LIBS"
+fi
+
 AM_CONDITIONAL(BUILD_WITH_LIBSTATGRAB, test "x$with_libstatgrab" = "xyes")
 if test "x$with_libstatgrab" = "xyes"
 then
@@ -4079,6 +4168,10 @@ then
   BUILD_WITH_LIBSTATGRAB_LDFLAGS="$with_libstatgrab_ldflags"
   AC_SUBST(BUILD_WITH_LIBSTATGRAB_CFLAGS)
   AC_SUBST(BUILD_WITH_LIBSTATGRAB_LDFLAGS)
+  if test "x$c_cv_have_libstatgrab_0_90" = "xyes"
+  then
+        AC_DEFINE(HAVE_LIBSTATGRAB_0_90, 1, [Define to 1 if libstatgrab version >= 0.90])
+  fi
 fi
 # }}}
 
@@ -4590,25 +4683,18 @@ fi
 if test "x$with_libvarnish" = "xyes"
 then
        SAVE_CPPFLAGS="$CPPFLAGS"
-       CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
-       AC_CHECK_HEADERS(varnish/varnishapi.h, [], [with_libvarnish="no (varnish/varnishapi.h not found)"])
-
-       CPPFLAGS="$SAVE_CPPFLAGS"
-fi
-if test "x$with_libvarnish" = "xyes"
-then
-       SAVE_CPPFLAGS="$CPPFLAGS"
-       #SAVE_LDFLAGS="$LDFLAGS"
 
        CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
-       #LDFLAGS="$LDFLAGS $with_libvarnish_libs"
 
-    AC_CHECK_HEADERS(varnish/vsc.h,
-        [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
-        [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])])
+       AC_CHECK_HEADERS(varnish/vapi/vsc.h,
+               [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
+               [AC_CHECK_HEADERS(varnish/vsc.h,
+                       [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support])],
+                       [AC_CHECK_HEADERS(varnish/varnishapi.h,
+                               [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
+                               [with_libvarnish="no (found none of the varnish header files)"])])])
 
        CPPFLAGS="$SAVE_CPPFLAGS"
-       #LDFLAGS="$SAVE_LDFLAGS"
 fi
 if test "x$with_libvarnish" = "xyes"
 then
@@ -4817,6 +4903,62 @@ then
 fi
 # }}}
 
+# --with-libatasmart {{{
+with_libatasmart_cppflags=""
+with_libatasmart_ldflags=""
+AC_ARG_WITH(libatasmart, [AS_HELP_STRING([--with-libatasmart@<:@=PREFIX@:>@], [Path to libatasmart.])],
+[
+       if test "x$withval" != "xno" && test "x$withval" != "xyes"
+       then
+               with_libatasmart_cppflags="-I$withval/include"
+               with_libatasmart_ldflags="-L$withval/lib"
+               with_libatasmart="yes"
+       else
+               with_libatasmart="$withval"
+       fi
+],
+[
+       if test "x$ac_system" = "xLinux"
+       then
+               with_libatasmart="yes"
+       else
+               with_libatasmart="no (Linux only library)"
+       fi
+])
+if test "x$with_libatasmart" = "xyes"
+then
+       SAVE_CPPFLAGS="$CPPFLAGS"
+       CPPFLAGS="$CPPFLAGS $with_libatasmart_cppflags"
+
+       AC_CHECK_HEADERS(atasmart.h, [with_libatasmart="yes"], [with_libatasmart="no (atasmart.h not found)"])
+
+       CPPFLAGS="$SAVE_CPPFLAGS"
+fi
+if test "x$with_libatasmart" = "xyes"
+then
+       SAVE_CPPFLAGS="$CPPFLAGS"
+       SAVE_LDFLAGS="$LDFLAGS"
+       CPPFLAGS="$CPPFLAGS $with_libatasmart_cppflags"
+       LDFLAGS="$LDFLAGS $with_libatasmart_ldflags"
+
+       AC_CHECK_LIB(atasmart, sk_disk_open, [with_libatasmart="yes"], [with_libatasmart="no (Symbol 'sk_disk_open' not found)"])
+
+       CPPFLAGS="$SAVE_CPPFLAGS"
+       LDFLAGS="$SAVE_LDFLAGS"
+fi
+if test "x$with_libatasmart" = "xyes"
+then
+       BUILD_WITH_LIBATASMART_CPPFLAGS="$with_libatasmart_cppflags"
+       BUILD_WITH_LIBATASMART_LDFLAGS="$with_libatasmart_ldflags"
+       BUILD_WITH_LIBATASMART_LIBS="-latasmart"
+       AC_SUBST(BUILD_WITH_LIBATASMART_CPPFLAGS)
+       AC_SUBST(BUILD_WITH_LIBATASMART_LDFLAGS)
+       AC_SUBST(BUILD_WITH_LIBATASMART_LIBS)
+       AC_DEFINE(HAVE_LIBATASMART, 1, [Define if libatasmart is present and usable.])
+fi
+AM_CONDITIONAL(BUILD_WITH_LIBATASMART, test "x$with_libatasmart" = "xyes")
+# }}}
+
 PKG_CHECK_MODULES([LIBNOTIFY], [libnotify],
                [with_libnotify="yes"],
                [if test "x$LIBNOTIFY_PKG_ERRORS" = "x"; then
@@ -4955,6 +5097,7 @@ plugin_ascent="no"
 plugin_barometer="no"
 plugin_battery="no"
 plugin_bind="no"
+plugin_ceph="no"
 plugin_cgroups="no"
 plugin_conntrack="no"
 plugin_contextswitch="no"
@@ -4994,6 +5137,7 @@ plugin_vmem="no"
 plugin_vserver="no"
 plugin_wireless="no"
 plugin_zfs_arc="no"
+plugin_zookeeper="no"
 
 # Linux
 if test "x$ac_system" = "xLinux"
@@ -5147,6 +5291,11 @@ then
        plugin_curl_xml="yes"
 fi
 
+if test "x$with_libyajl" = "xyes"
+then
+       plugin_ceph="yes"
+fi
+
 if test "x$have_processor_info" = "xyes"
 then
        plugin_cpu="yes"
@@ -5254,6 +5403,11 @@ then
        plugin_processes="yes"
 fi
 
+if test "x$with_kvm_getprocs" = "xyes" && test "x$have_struct_kinfo_proc_openbsd" = "xyes"
+then
+       plugin_processes="yes"
+fi
+
 if test "x$with_kvm_getswapinfo" = "xyes"
 then
        plugin_swap="yes"
@@ -5314,6 +5468,7 @@ AC_PLUGIN([ascent],      [$plugin_ascent],     [AscentEmu player statistics])
 AC_PLUGIN([barometer],   [$plugin_barometer],  [Barometer sensor on I2C])
 AC_PLUGIN([battery],     [$plugin_battery],    [Battery statistics])
 AC_PLUGIN([bind],        [$plugin_bind],       [ISC Bind nameserver statistics])
+AC_PLUGIN([ceph],        [$plugin_ceph],       [Ceph daemon statistics])
 AC_PLUGIN([conntrack],   [$plugin_conntrack],  [nf_conntrack statistics])
 AC_PLUGIN([contextswitch], [$plugin_contextswitch], [context switch statistics])
 AC_PLUGIN([cpufreq],     [$plugin_cpufreq],    [CPU frequency statistics])
@@ -5374,6 +5529,7 @@ AC_PLUGIN([numa],        [$plugin_numa],       [NUMA virtual memory statistics])
 AC_PLUGIN([nut],         [$with_libupsclient], [Network UPS tools statistics])
 AC_PLUGIN([olsrd],       [yes],                [olsrd statistics])
 AC_PLUGIN([onewire],     [$with_libowcapi],    [OneWire sensor statistics])
+AC_PLUGIN([openldap],    [$with_libldap],      [OpenLDAP statistics])
 AC_PLUGIN([openvpn],     [yes],                [OpenVPN client statistics])
 AC_PLUGIN([oracle],      [$with_oracle],       [Oracle plugin])
 AC_PLUGIN([perl],        [$plugin_perl],       [Embed a Perl interpreter])
@@ -5386,13 +5542,14 @@ AC_PLUGIN([powerdns],    [yes],                [PowerDNS statistics])
 AC_PLUGIN([processes],   [$plugin_processes],  [Process statistics])
 AC_PLUGIN([protocols],   [$plugin_protocols],  [Protocol (IP, TCP, ...) statistics])
 AC_PLUGIN([python],      [$with_python],       [Embed a Python interpreter])
-AC_PLUGIN([redis],       [$with_libcredis],    [Redis plugin])
+AC_PLUGIN([redis],       [$with_libhiredis],    [Redis plugin])
 AC_PLUGIN([routeros],    [$with_librouteros],  [RouterOS plugin])
 AC_PLUGIN([rrdcached],   [$librrd_rrdc_update], [RRDTool output plugin])
 AC_PLUGIN([rrdtool],     [$with_librrd],       [RRDTool output plugin])
 AC_PLUGIN([sensors],     [$with_libsensors],   [lm_sensors statistics])
 AC_PLUGIN([serial],      [$plugin_serial],     [serial port traffic])
 AC_PLUGIN([sigrok],      [$with_libsigrok],    [sigrok acquisition sources])
+AC_PLUGIN([smart],       [$with_libatasmart],  [SMART statistics])
 AC_PLUGIN([snmp],        [$with_libnetsnmp],   [SNMP querying plugin])
 AC_PLUGIN([statsd],      [yes],                [StatsD plugin])
 AC_PLUGIN([swap],        [$plugin_swap],       [Swap usage statistics])
@@ -5424,12 +5581,14 @@ AC_PLUGIN([wireless],    [$plugin_wireless],   [Wireless statistics])
 AC_PLUGIN([write_graphite], [yes],             [Graphite / Carbon output plugin])
 AC_PLUGIN([write_http],  [$with_libcurl],      [HTTP output plugin])
 AC_PLUGIN([write_kafka],  [$with_librdkafka],  [Kafka output plugin])
+AC_PLUGIN([write_log], [yes],                  [Log output plugin])
 AC_PLUGIN([write_mongodb], [$with_libmongoc],  [MongoDB output plugin])
-AC_PLUGIN([write_redis], [$with_libcredis],    [Redis output plugin])
+AC_PLUGIN([write_redis], [$with_libhiredis],    [Redis output plugin])
 AC_PLUGIN([write_riemann], [$have_protoc_c],   [Riemann output plugin])
 AC_PLUGIN([write_tsdb],  [yes],                [TSDB output plugin])
 AC_PLUGIN([xmms],        [$with_libxmms],      [XMMS statistics])
 AC_PLUGIN([zfs_arc],     [$plugin_zfs_arc],    [ZFS ARC statistics])
+AC_PLUGIN([zookeeper],   [yes],               [Zookeeper statistics])
 
 dnl Default configuration file
 # Load either syslog or logfile
@@ -5613,22 +5772,26 @@ Configuration:
   Libraries:
     intel mic . . . . . . $with_mic
     libaquaero5 . . . . . $with_libaquaero5
+    libatasmart . . . . . $with_libatasmart
     libcurl . . . . . . . $with_libcurl
     libdbi  . . . . . . . $with_libdbi
-    libcredis . . . . . . $with_libcredis
     libesmtp  . . . . . . $with_libesmtp
     libganglia  . . . . . $with_libganglia
     libgcrypt . . . . . . $with_libgcrypt
+    libhal  . . . . . . . $with_libhal
+    libhiredis  . . . . . $with_libhiredis
     libi2c-dev  . . . . . $with_libi2c
     libiokit  . . . . . . $with_libiokit
     libiptc . . . . . . . $with_libiptc
     libjvm  . . . . . . . $with_java
     libkstat  . . . . . . $with_kstat
     libkvm  . . . . . . . $with_libkvm
+    libldap . . . . . . . $with_libldap
     liblvm2app  . . . . . $with_liblvm2app
     libmemcached  . . . . $with_libmemcached
     libmnl  . . . . . . . $with_libmnl
     libmodbus . . . . . . $with_libmodbus
+    libmongoc . . . . . . $with_libmongoc
     libmysql  . . . . . . $with_libmysql
     libnetapp . . . . . . $with_libnetapp
     libnetsnmp  . . . . . $with_libnetsnmp
@@ -5636,6 +5799,7 @@ Configuration:
     liboconfig  . . . . . $with_liboconfig
     libopenipmi . . . . . $with_libopenipmipthread
     liboping  . . . . . . $with_liboping
+    libowcapi . . . . . . $with_libowcapi
     libpcap . . . . . . . $with_libpcap
     libperfstat . . . . . $with_perfstat
     libperl . . . . . . . $with_libperl
@@ -5656,9 +5820,8 @@ Configuration:
     libxml2 . . . . . . . $with_libxml2
     libxmms . . . . . . . $with_libxmms
     libyajl . . . . . . . $with_libyajl
-    libevent  . . . . . . $with_libevent
-    protobuf-c  . . . . . $have_protoc_c
     oracle  . . . . . . . $with_oracle
+    protobuf-c  . . . . . $have_protoc_c
     python  . . . . . . . $with_python
 
   Features:
@@ -5673,15 +5836,16 @@ Configuration:
     amqp    . . . . . . . $enable_amqp
     apache  . . . . . . . $enable_apache
     apcups  . . . . . . . $enable_apcups
-    aquaero . . . . . . . $enable_aquaero
     apple_sensors . . . . $enable_apple_sensors
+    aquaero . . . . . . . $enable_aquaero
     ascent  . . . . . . . $enable_ascent
     barometer . . . . . . $enable_barometer
     battery . . . . . . . $enable_battery
     bind  . . . . . . . . $enable_bind
+    ceph  . . . . . . . . $enable_ceph
+    cgroups . . . . . . . $enable_cgroups
     conntrack . . . . . . $enable_conntrack
     contextswitch . . . . $enable_contextswitch
-    cgroups . . . . . . . $enable_cgroups
     cpu . . . . . . . . . $enable_cpu
     cpufreq . . . . . . . $enable_cpufreq
     csv . . . . . . . . . $enable_csv
@@ -5709,8 +5873,8 @@ Configuration:
     java  . . . . . . . . $enable_java
     load  . . . . . . . . $enable_load
     logfile . . . . . . . $enable_logfile
-    lpar  . . . . . . . . $enable_lpar
     log_logstash  . . . . $enable_log_logstash
+    lpar  . . . . . . . . $enable_lpar
     lvm . . . . . . . . . $enable_lvm
     madwifi . . . . . . . $enable_madwifi
     match_empty_counter . $enable_match_empty_counter
@@ -5739,6 +5903,7 @@ Configuration:
     nut . . . . . . . . . $enable_nut
     olsrd . . . . . . . . $enable_olsrd
     onewire . . . . . . . $enable_onewire
+    openldap  . . . . . . $enable_openldap
     openvpn . . . . . . . $enable_openvpn
     oracle  . . . . . . . $enable_oracle
     perl  . . . . . . . . $enable_perl
@@ -5757,13 +5922,14 @@ Configuration:
     sensors . . . . . . . $enable_sensors
     serial  . . . . . . . $enable_serial
     sigrok  . . . . . . . $enable_sigrok
+    smart . . . . . . . . $enable_smart
     snmp  . . . . . . . . $enable_snmp
     statsd  . . . . . . . $enable_statsd
     swap  . . . . . . . . $enable_swap
     syslog  . . . . . . . $enable_syslog
     table . . . . . . . . $enable_table
-    tail  . . . . . . . . $enable_tail
     tail_csv  . . . . . . $enable_tail_csv
+    tail  . . . . . . . . $enable_tail
     tape  . . . . . . . . $enable_tape
     target_notification . $enable_target_notification
     target_replace  . . . $enable_target_replace
@@ -5788,12 +5954,14 @@ Configuration:
     write_graphite  . . . $enable_write_graphite
     write_http  . . . . . $enable_write_http
     write_kafka . . . . . $enable_write_kafka
+    write_log . . . . . . $enable_write_log
     write_mongodb . . . . $enable_write_mongodb
     write_redis . . . . . $enable_write_redis
     write_riemann . . . . $enable_write_riemann
     write_tsdb  . . . . . $enable_write_tsdb
     xmms  . . . . . . . . $enable_xmms
     zfs_arc . . . . . . . $enable_zfs_arc
+    zookeeper . . . . . . $enable_zookeeper
 
 EOF
 
index c7f18c5..ec13b0a 100755 (executable)
@@ -442,7 +442,7 @@ sub execute_script
 
   close ($fh);
   # Save the exit status of the check in $state
-  $state = $?;
+  $state = $? >> 8;
 
   if ($state == 0)
   {
index 9d63e3a..0e5cd86 100644 (file)
 # - enable the EPEL repository (http://dl.fedoraproject.org/pub/epel/) in the
 #   configuration files for your target systems (/etc/mock/*.cfg).
 #
-# - copy this file in your ~/rpmbuild/SPECS/ directory
-#
 # - fetch the desired collectd release file from https://collectd.org/files/
-#   and save it in your ~/rpmbuild/SOURCES/ directory
+#   and save it in your ~/rpmbuild/SOURCES/ directory (or build your own out of
+#   the git repository: ./build.sh && ./configure && make-dist-bz2)
+#
+# - copy this file in your ~/rpmbuild/SPECS/ directory. Make sure the
+#   "Version:" tag matches the version from the tarball.
 #
 # - build the SRPM first:
 #   mock -r centos-6-x86_64 --buildsrpm --spec ~/rpmbuild/SPECS/collectd.spec \
@@ -34,6 +36,7 @@
 #
 
 %global _hardened_build 1
+%{?perl_default_filter}
 
 # plugins only buildable on RHEL6
 # (NB: %{elN} macro is not available on RHEL < 6)
@@ -47,6 +50,8 @@
 %{?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}
@@ -59,6 +64,8 @@
 %{?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}
@@ -68,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}
 %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_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_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_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_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}
 
@@ -208,12 +218,19 @@ Source:           http://collectd.org/files/%{name}-%{version}.tar.bz2
 License:       GPLv2
 Group:         System Environment/Daemons
 BuildRoot:     %{_tmppath}/%{name}-%{version}-root
-BuildRequires: libgcrypt-devel, kernel-headers
+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
@@ -285,6 +302,16 @@ The BIND plugin retrieves this information that's encoded in XML and provided
 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
@@ -417,16 +444,6 @@ This plugin for collectd allows plugins to be written in Java and executed
 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.
-%endif
-
 %if %{with_log_logstash}
 %package log_logstash
 Summary:       log_logstash plugin for collectd
@@ -543,17 +560,27 @@ BuildRequires:    nut-devel
 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.
@@ -597,11 +624,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.
@@ -612,10 +639,10 @@ 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}
@@ -660,6 +687,17 @@ measurements fed to collectd. This includes multimeters, sound level meters,
 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
@@ -680,6 +718,16 @@ BuildRequires:     varnish-libs-devel
 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
@@ -706,7 +754,7 @@ The write_kafka plugin sends values to kafka, a distributed messaging system.
 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
@@ -763,6 +811,13 @@ Requires:  libcollectdclient%{?_isa} = %{version}-%{release}
 %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
@@ -864,6 +919,12 @@ Development files for libcollectdclient
 %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
@@ -996,10 +1057,10 @@ Development files for libcollectdclient
 %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}
@@ -1164,6 +1225,12 @@ Development files for libcollectdclient
 %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
@@ -1225,11 +1292,11 @@ Development files for libcollectdclient
 %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
@@ -1276,6 +1343,12 @@ Development files for libcollectdclient
 %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
@@ -1426,6 +1499,12 @@ Development files for libcollectdclient
 %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
@@ -1435,7 +1514,7 @@ Development files for libcollectdclient
 %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}
@@ -1462,6 +1541,12 @@ Development files for libcollectdclient
 %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 \
@@ -1486,6 +1571,7 @@ Development files for libcollectdclient
        %{?_with_barometer} \
        %{?_with_battery} \
        %{?_with_bind} \
+       %{?_with_ceph} \
        %{?_with_cgroups} \
        %{?_with_conntrack} \
        %{?_with_contextswitch} \
@@ -1513,7 +1599,7 @@ Development files for libcollectdclient
        %{?_with_iptables} \
        %{?_with_ipvs} \
        %{?_with_java} \
-       %{?_with_libvirt} \
+       %{?_with_virt} \
        %{?_with_log_logstash} \
        %{?_with_lpar} \
        %{?_with_lvm} \
@@ -1529,6 +1615,7 @@ Development files for libcollectdclient
        %{?_with_notify_email} \
        %{?_with_nut} \
        %{?_with_onewire} \
+       %{?_with_openldap} \
        %{?_with_oracle} \
        %{?_with_perl} \
        %{?_with_pf} \
@@ -1542,6 +1629,7 @@ Development files for libcollectdclient
        %{?_with_rrdtool} \
        %{?_with_sensors} \
        %{?_with_sigrok} \
+       %{?_with_smart} \
        %{?_with_snmp} \
        %{?_with_tape} \
        %{?_with_tokyotyrant} \
@@ -1552,6 +1640,7 @@ Development files for libcollectdclient
        %{?_with_write_redis} \
        %{?_with_xmms} \
        %{?_with_zfs_arc} \
+       %{?_with_zookeeper} \
        %{?_with_irq} \
        %{?_with_load} \
        %{?_with_logfile} \
@@ -1590,6 +1679,7 @@ Development files for libcollectdclient
        %{?_with_wireless}\
        %{?_with_write_graphite} \
        %{?_with_write_http} \
+       %{?_with_write_log} \
        %{?_with_write_riemann} \
        %{?_with_write_tsdb}
 
@@ -1600,7 +1690,11 @@ Development files for libcollectdclient
 %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/
@@ -1608,37 +1702,38 @@ rm -rf %{buildroot}
 %{__mkdir} -p %{buildroot}%{_localstatedir}/www
 %{__mkdir} -p %{buildroot}/%{_sysconfdir}/httpd/conf.d
 
-%{__cp} -a contrib/collection3 %{buildroot}%{_localstatedir}/www
-%{__cp} -a contrib/redhat/collection3.conf %{buildroot}/%{_sysconfdir}/httpd/conf.d/
+%{__mv} contrib/collection3 %{buildroot}%{_localstatedir}/www
+%{__mv} contrib/redhat/collection3.conf %{buildroot}/%{_sysconfdir}/httpd/conf.d/
 
-%{__cp} -a contrib/php-collection %{buildroot}%{_localstatedir}/www
-%{__cp} -a contrib/redhat/php-collection.conf %{buildroot}/%{_sysconfdir}/httpd/conf.d/
+%{__mv} contrib/php-collection %{buildroot}%{_localstatedir}/www
+%{__mv} contrib/redhat/php-collection.conf %{buildroot}/%{_sysconfdir}/httpd/conf.d/
 
 ### Clean up docs
 find contrib/ -type f -exec %{__chmod} a-x {} \;
 # *.la files shouldn't be distributed.
 rm -f %{buildroot}/%{_libdir}/{collectd/,}*.la
 
-# Move the Perl examples to a separate directory.
-mkdir perl-examples
-find contrib -name '*.p[lm]' -exec mv {} perl-examples/ \;
-
 # Remove Perl hidden .packlist files.
 find %{buildroot} -type f -name .packlist -delete
 # Remove Perl temporary file perllocal.pod
 find %{buildroot} -type f -name perllocal.pod -delete
 
 %if ! %{with_java}
+rm -f %{buildroot}%{_datadir}/collectd/java/collectd-api.jar
+rm -f %{buildroot}%{_datadir}/collectd/java/generic-jmx.jar
 rm -f %{buildroot}%{_mandir}/man5/collectd-java.5*
 %endif
 
 %if ! %{with_perl}
 rm -f %{buildroot}%{_mandir}/man5/collectd-perl.5*
 rm -f %{buildroot}%{_mandir}/man3/Collectd::Unixsock.3pm*
-rm -fr perl-examples/
 rm -fr %{buildroot}/usr/lib/perl5/
 %endif
 
+%if ! %{with_postgresql}
+rm -f %{buildroot}%{_datadir}/collectd/postgresql_default.conf
+%endif
+
 %if ! %{with_python}
 rm -f %{buildroot}%{_mandir}/man5/collectd-python.5*
 %endif
@@ -1651,19 +1746,44 @@ rm -f %{buildroot}%{_mandir}/man5/collectd-snmp.5*
 %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
@@ -1672,19 +1792,17 @@ fi
 %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/
+%{_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*
@@ -1872,12 +1990,18 @@ fi
 %if %{with_write_graphite}
 %{_libdir}/%{name}/write_graphite.so
 %endif
+%if %{with_write_log}
+%{_libdir}/%{name}/write_log.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
@@ -1890,6 +2014,14 @@ fi
 %{_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
@@ -1920,6 +2052,11 @@ fi
 %{_libdir}/%{name}/bind.so
 %endif
 
+%if %{with_ceph}
+%files ceph
+%{_libdir}/%{name}/ceph.so
+%endif
+
 %if %{with_curl}
 %files curl
 %{_libdir}/%{name}/curl.so
@@ -1977,15 +2114,15 @@ fi
 
 %if %{with_java}
 %files java
-%{_prefix}/share/collectd/java/collectd-api.jar
-%{_prefix}/share/collectd/java/generic-jmx.jar
+%{_datadir}/collectd/java/collectd-api.jar
+%{_datadir}/collectd/java/generic-jmx.jar
 %{_libdir}/%{name}/java.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}
@@ -2043,9 +2180,13 @@ fi
 %{_libdir}/%{name}/nut.so
 %endif
 
+%if %{with_openldap}
+%files openldap
+%{_libdir}/%{name}/openldap.so
+%endif
+
 %if %{with_perl}
 %files perl
-%doc perl-examples/*
 %{perl_vendorlib}/Collectd.pm
 %{perl_vendorlib}/Collectd/
 %{_mandir}/man3/Collectd::Unixsock.3pm*
@@ -2065,7 +2206,7 @@ fi
 
 %if %{with_postgresql}
 %files postgresql
-%{_prefix}/share/collectd/postgresql_default.conf
+%{_datadir}/collectd/postgresql_default.conf
 %{_libdir}/%{name}/postgresql.so
 %endif
 
@@ -2100,6 +2241,11 @@ fi
 %{_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*
@@ -2145,10 +2291,12 @@ fi
 %changelog
 # * TODO 5.5.0-1
 # - New upstream version
-# - New plugins enabled by default: drbd, log_logstash, write_tsdb
+# - New plugins enabled by default: ceph, drbd, log_logstash, write_tsdb, smart, openldap, redis, write_redis, zookeeper, write_log
 # - New plugins disabled by default: barometer, write_kafka
 # - Enable zfs_arc, now supported on Linux
-# - Install disk plugin in an dedicated package, as it depends on libudev
+# - 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
@@ -2169,6 +2317,10 @@ fi
 - Enabled netlink plugin on RHEL6 and RHEL7
 - Allow perl plugin to build on RHEL5
 - Add support for RHEL7
+- Misc perl-related improvements:
+  * prevent rpmbuild from extracting dependencies from files in /usr/share/doc
+  * don't package collection3 and php-collection twice
+  * keep perl scripts from contrib/ in collectd-contrib
 
 * Wed Apr 10 2013 Marc Fournier <marc.fournier@camptocamp.com> 5.3.0-1
 - New upstream version
index abdb168..829eda5 100644 (file)
@@ -21,6 +21,8 @@ COLLECTD=/usr/sbin/collectd
 COLLECTDMONPIDDIR="/var/run"
 COLLECTDMONPID="$COLLECTDMONPIDDIR/collectdmon.pid"
 
+MAXWAIT=30
+
 if [ -r /etc/sysconfig/$service ]; then
        . /etc/sysconfig/$service
 fi
@@ -40,7 +42,6 @@ check_config() {
         return 0
 }
 
-
 start () {
        echo -n $"Starting collectd: "
        check_config
@@ -56,13 +57,28 @@ start () {
                [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$service
        fi
 }
+
 stop () {
        echo -n $"Stopping collectd: "
-       killproc -p $COLLECTDMONPID $prog
+       killproc -p $COLLECTDMONPID -d $MAXWAIT $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$service
 }
+
+restart () {
+       check_config
+       rc="$?"
+       if test "$rc" -ne 0; then
+               RETVAL=6
+               echo $"not restarting due to configuration error"
+               failure $"not restarting $service due to configuration error"
+       else
+               stop
+               start
+       fi
+}
+
 # See how we were called.
 case "$1" in
   start)
@@ -75,16 +91,7 @@ case "$1" in
        status -p $COLLECTDMONPID $prog
        ;;
   restart|reload)
-       check_config
-       rc="$?"
-       if test "$rc" -ne 0; then
-               RETVAL=6
-               echo $"not restarting due to configuration error"
-               failure $"not restarting $service due to configuration error"
-       else
-               stop
-               start
-       fi
+       restart
        ;;
   condrestart)
        [ -f /var/lock/subsys/$service ] && restart || :
diff --git a/contrib/systemd.collectd.service b/contrib/systemd.collectd.service
new file mode 100644 (file)
index 0000000..b046192
--- /dev/null
@@ -0,0 +1,23 @@
+[Unit]
+Description=Collectd
+After=local-fs.target network.target
+Requires=local-fs.target network.target
+
+[Service]
+ExecStart=/usr/sbin/collectd
+
+# Tell systemd it will receive a notification from collectd over it's control
+# socket once the daemon is ready. See systemd.service(5) for more details.
+Type=notify
+NotifyAccess=main
+
+# Restart the collectd daemon after a 10 seconds delay, in case it crashes.
+Restart=always
+RestartSec=10
+
+# Send all console messages to syslog.
+StandardOutput=syslog
+StandardError=syslog
+
+[Install]
+WantedBy=multi-user.target
index 1c7fd9c..f833edf 100644 (file)
@@ -20,6 +20,7 @@ stop on runlevel [!2345]
 # these cannot be started at boot time by the system without
 # arcane trickery. Also a root user will not see these tasks/jobs
 # by default. set*id is a reasonable and secure compromise.
+# These options are not supported on early upstart versions.
 #setuid nobody
 #setgid nobody
 
@@ -31,17 +32,20 @@ stop on runlevel [!2345]
 # shell commands via `sh -e`.
 env DAEMON=/usr/sbin/collectd
 
-# Tell upstart to watch for forking when tracking the pid for us.
-expect fork
+# Tell upstart to wait for collectd to SIGSTOP itself, signaling it is ready
+# to run. Warning: this only works with collectd 5.5 and newer. You'll have to
+# use "expect fork" instead, if using collectd 5.4 and older.
+expect stop
 
 # prevent thrashing - 10 restarts in 5 seconds
 respawn
 respawn limit 10 5
 
-# Make a log available in /var/log/upstart/collectd.log
-console log
+# Uncomment to make a log available in /var/log/upstart/collectd.log
+# (not supported on early upstart versions).
+#console log
 
 # The daemon will not start if the configuration is invalid.
 pre-start exec $DAEMON -t
-# Let's Fork!
+# Let's start!
 exec $DAEMON
index 5c6adfe..14708c0 100644 (file)
@@ -30,7 +30,7 @@ collectdmon_SOURCES = collectdmon.c
 collectdmon_CPPFLAGS = $(AM_CPPFLAGS)
 
 collectd_nagios_SOURCES = collectd-nagios.c
-collectd_nagios_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_builddir)/src/libcollectdclient/collectd
+collectd_nagios_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/libcollectdclient/collectd -I$(top_builddir)/src/libcollectdclient/collectd
 collectd_nagios_LDADD =
 if BUILD_WITH_LIBSOCKET
 collectd_nagios_LDADD += -lsocket
@@ -44,7 +44,7 @@ collectd_nagios_DEPENDENCIES = libcollectdclient/libcollectdclient.la
 
 
 collectdctl_SOURCES = collectdctl.c
-collectdctl_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_builddir)/src/libcollectdclient/collectd
+collectdctl_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/libcollectdclient/collectd -I$(top_builddir)/src/libcollectdclient/collectd
 collectdctl_LDADD =
 if BUILD_WITH_LIBSOCKET
 collectdctl_LDADD += -lsocket
@@ -57,7 +57,7 @@ collectdctl_DEPENDENCIES = libcollectdclient/libcollectdclient.la
 
 collectd_tg_SOURCES = collectd-tg.c \
                      daemon/utils_heap.c daemon/utils_heap.h
-collectd_tg_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_builddir)/src/libcollectdclient/collectd
+collectd_tg_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src/libcollectdclient/collectd -I$(top_builddir)/src/libcollectdclient/collectd
 collectd_tg_LDADD =
 if BUILD_WITH_LIBSOCKET
 collectd_tg_LDADD += -lsocket
@@ -68,6 +68,9 @@ endif
 if BUILD_AIX
 collectd_tg_LDADD += -lm
 endif
+if BUILD_WITH_LIBPTHREAD
+collectd_tg_LDADD += -lpthread
+endif
 collectd_tg_LDADD += libcollectdclient/libcollectdclient.la
 collectd_tg_DEPENDENCIES = libcollectdclient/libcollectdclient.la
 
@@ -82,7 +85,7 @@ pkglib_LTLIBRARIES += aggregation.la
 aggregation_la_SOURCES = aggregation.c \
                          utils_vl_lookup.c utils_vl_lookup.h
 aggregation_la_LDFLAGS = $(PLUGIN_LDFLAGS)
-aggregation_la_LIBADD =
+aggregation_la_LIBADD = -lm
 endif
 
 if BUILD_PLUGIN_AMQP
@@ -168,6 +171,15 @@ bind_la_CFLAGS = $(AM_CFLAGS) \
 bind_la_LIBADD = $(BUILD_WITH_LIBCURL_LIBS) $(BUILD_WITH_LIBXML2_LIBS)
 endif
 
+if BUILD_PLUGIN_CEPH
+pkglib_LTLIBRARIES += ceph.la
+ceph_la_SOURCES = ceph.c
+ceph_la_CFLAGS = $(AM_CFLAGS)
+ceph_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBYAJL_LDFLAGS)
+ceph_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBYAJL_CPPFLAGS)
+ceph_la_LIBADD = $(BUILD_WITH_LIBYAJL_LIBS)
+endif
+
 if BUILD_PLUGIN_CGROUPS
 pkglib_LTLIBRARIES += cgroups.la
 cgroups_la_SOURCES = cgroups.c \
@@ -725,6 +737,14 @@ onewire_la_LIBADD = $(BUILD_WITH_LIBOWCAPI_LIBS)
 onewire_la_LDFLAGS = $(PLUGIN_LDFLAGS)
 endif
 
+if BUILD_PLUGIN_OPENLDAP
+pkglib_LTLIBRARIES += openldap.la
+openldap_la_SOURCES = openldap.c
+openldap_la_LDFLAGS = -module -avoid-version $(BUILD_WITH_LIBLDAP_LDFLAGS)
+openldap_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBLDAP_CPPFLAGS)
+openldap_la_LIBADD = -lldap
+endif
+
 if BUILD_PLUGIN_OPENVPN
 pkglib_LTLIBRARIES += openvpn.la
 openvpn_la_SOURCES = openvpn.c
@@ -758,6 +778,7 @@ perl_la_CFLAGS += -Wno-nonnull
 endif
 perl_la_LDFLAGS = $(PLUGIN_LDFLAGS) \
                $(PERL_LDFLAGS)
+perl_la_LIBADD = $(PERL_LIBS)
 endif
 
 if BUILD_PLUGIN_PF
@@ -830,9 +851,9 @@ endif
 if BUILD_PLUGIN_REDIS
 pkglib_LTLIBRARIES += redis.la
 redis_la_SOURCES = redis.c
-redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBCREDIS_LDFLAGS)
-redis_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCREDIS_CPPFLAGS)
-redis_la_LIBADD = -lcredis
+redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBHIREDIS_LDFLAGS)
+redis_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
+redis_la_LIBADD = -lhiredis
 endif
 
 if BUILD_PLUGIN_ROUTEROS
@@ -882,6 +903,17 @@ sigrok_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBSIGROK_LDFLAGS)
 sigrok_la_LIBADD = -lsigrok
 endif
 
+if BUILD_PLUGIN_SMART
+if BUILD_WITH_LIBUDEV
+pkglib_LTLIBRARIES += smart.la
+smart_la_SOURCES = smart.c \
+                  utils_ignorelist.c utils_ignorelist.h
+smart_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBATASMART_CPPFLAGS)
+smart_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBATASMART_LDFLAGS)
+smart_la_LIBADD = $(BUILD_WITH_LIBATASMART_LIBS) -ludev
+endif
+endif
+
 if BUILD_PLUGIN_SNMP
 pkglib_LTLIBRARIES += snmp.la
 snmp_la_SOURCES = snmp.c
@@ -1153,6 +1185,13 @@ write_kafka_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBRDKAFKA_LDFLAGS)
 write_kafka_la_LIBADD = $(BUILD_WITH_LIBRDKAFKA_LIBS)
 endif
 
+if BUILD_PLUGIN_WRITE_LOG
+pkglib_LTLIBRARIES += write_log.la
+write_log_la_SOURCES = write_log.c \
+                        utils_format_graphite.c utils_format_graphite.h
+write_log_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
 if BUILD_PLUGIN_WRITE_MONGODB
 pkglib_LTLIBRARIES += write_mongodb.la
 write_mongodb_la_SOURCES = write_mongodb.c
@@ -1164,9 +1203,9 @@ endif
 if BUILD_PLUGIN_WRITE_REDIS
 pkglib_LTLIBRARIES += write_redis.la
 write_redis_la_SOURCES = write_redis.c
-write_redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBCREDIS_LDFLAGS)
-write_redis_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBCREDIS_CPPFLAGS)
-write_redis_la_LIBADD = -lcredis
+write_redis_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBHIREDIS_LDFLAGS)
+write_redis_la_CFLAGS = $(AM_CFLAGS) $(BUILD_WITH_LIBHIREDIS_CPPFLAGS)
+write_redis_la_LIBADD = -lhiredis
 endif
 
 if BUILD_PLUGIN_WRITE_RIEMANN
@@ -1208,6 +1247,12 @@ endif
 endif
 endif
 
+if BUILD_PLUGIN_ZOOKEEPER
+pkglib_LTLIBRARIES += zookeeper.la
+zookeeper_la_SOURCES = zookeeper.c
+zookeeper_la_LDFLAGS = $(PLUGIN_LDFLAGS)
+endif
+
 BUILT_SOURCES += $(dist_man_MANS)
 
 dist_man_MANS = collectd.1 \
@@ -1305,7 +1350,7 @@ uninstall-hook:
 check_PROGRAMS = test_common test_utils_avltree test_utils_heap test_utils_mount test_utils_vl_lookup
 
 test_common_SOURCES = tests/test_common.c \
-                      common.h common.c \
+                      daemon/common.h daemon/common.c \
                       tests/mock/plugin.c \
                       tests/mock/utils_cache.c \
                       tests/mock/utils_time.c
@@ -1314,20 +1359,20 @@ test_common_LDFLAGS = -export-dynamic
 test_common_LDADD =
 
 test_utils_avltree_SOURCES = tests/test_utils_avltree.c \
-                             utils_avltree.c utils_avltree.h
+                             daemon/utils_avltree.c daemon/utils_avltree.h
 test_utils_avltree_CPPFLAGS = $(AM_CPPFLAGS) $(LTDLINCL)
 test_utils_avltree_LDFLAGS = -export-dynamic
 test_utils_avltree_LDADD =
 
 test_utils_heap_SOURCES = tests/test_utils_heap.c \
-                          utils_heap.c utils_heap.h
+                          daemon/utils_heap.c daemon/utils_heap.h
 test_utils_heap_CPPFLAGS = $(AM_CPPFLAGS) $(LTDLINCL)
 test_utils_heap_LDFLAGS = -export-dynamic
 test_utils_heap_LDADD =
 
 test_utils_mount_SOURCES = tests/test_utils_mount.c \
                            utils_mount.c utils_mount.h \
-                           common.c common.h \
+                           daemon/common.c daemon/common.h \
                            tests/mock/plugin.c \
                            tests/mock/utils_cache.c \
                            tests/mock/utils_time.c
@@ -1337,8 +1382,8 @@ test_utils_mount_LDADD =
 
 test_utils_vl_lookup_SOURCES = tests/test_utils_vl_lookup.c \
                                utils_vl_lookup.h utils_vl_lookup.c \
-                               utils_avltree.c utils_avltree.h \
-                               common.c common.h \
+                               daemon/utils_avltree.c daemon/utils_avltree.h \
+                               daemon/common.c daemon/common.h \
                                tests/mock/plugin.c \
                                tests/mock/utils_cache.c \
                                tests/mock/utils_time.c
index 1764129..cf2a448 100644 (file)
@@ -80,6 +80,9 @@ struct camqp_config_s
     char   *exchange;
     char   *routing_key;
 
+    /* Number of seconds to wait before connection is retried */
+    int     connection_retry_delay;
+
     /* publish only */
     uint8_t delivery_mode;
     _Bool   store_rates;
@@ -405,6 +408,8 @@ static int camqp_setup_queue (camqp_config_t *conf) /* {{{ */
 
 static int camqp_connect (camqp_config_t *conf) /* {{{ */
 {
+    static time_t last_connect_time = 0;
+
     amqp_rpc_reply_t reply;
     int status;
 #ifdef HAVE_AMQP_TCP_SOCKET
@@ -416,6 +421,19 @@ static int camqp_connect (camqp_config_t *conf) /* {{{ */
     if (conf->connection != NULL)
         return (0);
 
+    time_t now = time(NULL);
+    if (now < (last_connect_time + conf->connection_retry_delay))
+    {
+        DEBUG("amqp plugin: skipping connection retry, "
+            "ConnectionRetryDelay: %d", conf->connection_retry_delay);
+        return(1);
+    }
+    else
+    {
+        DEBUG ("amqp plugin: retrying connection");
+        last_connect_time = now;
+    }
+
     conf->connection = amqp_new_connection ();
     if (conf->connection == NULL)
     {
@@ -922,6 +940,8 @@ static int camqp_config_connection (oconfig_item_t *ci, /* {{{ */
     conf->password = NULL;
     conf->exchange = NULL;
     conf->routing_key = NULL;
+    conf->connection_retry_delay = 0;
+
     /* publish only */
     conf->delivery_mode = CAMQP_DM_VOLATILE;
     conf->store_rates = 0;
@@ -1017,6 +1037,8 @@ static int camqp_config_connection (oconfig_item_t *ci, /* {{{ */
             conf->escape_char = tmp_buff[0];
             sfree (tmp_buff);
         }
+        else if (strcasecmp ("ConnectionRetryDelay", child->key) == 0)
+            status = cf_util_get_int (child, &conf->connection_retry_delay);
         else
             WARNING ("amqp plugin: Ignoring unknown "
                     "configuration option \"%s\".", child->key);
index 75ef3e1..1099248 100644 (file)
@@ -283,8 +283,6 @@ static int config (oconfig_item_t *ci)
 /* initialize curl for each host */
 static int init_host (apache_t *st) /* {{{ */
 {
-       static char credentials[1024];
-
        assert (st->url != NULL);
        /* (Assured by `config_add') */
 
@@ -334,6 +332,12 @@ static int init_host (apache_t *st) /* {{{ */
 
        if (st->user != NULL)
        {
+#ifdef HAVE_CURLOPT_USERNAME
+               curl_easy_setopt (st->curl, CURLOPT_USERNAME, st->user);
+               curl_easy_setopt (st->curl, CURLOPT_PASSWORD,
+                               (st->pass == NULL) ? "" : st->pass);
+#else
+               static char credentials[1024];
                int status;
 
                status = ssnprintf (credentials, sizeof (credentials), "%s:%s",
@@ -349,6 +353,7 @@ static int init_host (apache_t *st) /* {{{ */
                }
 
                curl_easy_setopt (st->curl, CURLOPT_USERPWD, credentials);
+#endif
        }
 
        curl_easy_setopt (st->curl, CURLOPT_URL, st->url);
index ca0fac7..e9d25bd 100644 (file)
@@ -524,8 +524,6 @@ static int ascent_config (const char *key, const char *value) /* {{{ */
 
 static int ascent_init (void) /* {{{ */
 {
-  static char credentials[1024];
-
   if (url == NULL)
   {
     WARNING ("ascent plugin: ascent_init: No URL configured, "
@@ -551,6 +549,11 @@ static int ascent_init (void) /* {{{ */
 
   if (user != NULL)
   {
+#ifdef HAVE_CURLOPT_USERNAME
+    curl_easy_setopt (curl, CURLOPT_USERNAME, user);
+    curl_easy_setopt (curl, CURLOPT_PASSWORD, (pass == NULL) ? "" : pass);
+#else
+    static char credentials[1024];
     int status;
 
     status = ssnprintf (credentials, sizeof (credentials), "%s:%s",
@@ -563,6 +566,7 @@ static int ascent_init (void) /* {{{ */
     }
 
     curl_easy_setopt (curl, CURLOPT_USERPWD, credentials);
+#endif
   }
 
   curl_easy_setopt (curl, CURLOPT_URL, url);
index 62c2964..185442c 100644 (file)
@@ -376,6 +376,8 @@ static int battery_read (void) /* {{{ */
                battery_submit ("0", "current", current);
        if (!isnan (voltage))
                battery_submit ("0", "voltage", voltage);
+
+       return (0);
 } /* }}} int battery_read */
 /* #endif HAVE_IOKIT_IOKITLIB_H || HAVE_IOKIT_PS_IOPOWERSOURCES_H */
 
index d7b8c08..59eb249 100644 (file)
@@ -745,7 +745,7 @@ static int bind_xml_stats_handle_zone (int version, xmlDoc *doc, /* {{{ */
   xmlFree (zone_name);
   zone_name = NULL;
 
-  if (j >= views_num)
+  if (j >= views->zones_num)
   {
     xmlXPathFreeObject (path_obj);
     return (0);
diff --git a/src/ceph.c b/src/ceph.c
new file mode 100644 (file)
index 0000000..56e349c
--- /dev/null
@@ -0,0 +1,1580 @@
+/**
+ * collectd - src/ceph.c
+ * Copyright (C) 2011  New Dream Network
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; only version 2 of the License is applicable.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Colin McCabe <cmccabe@alumni.cmu.edu>
+ *   Dennis Zou <yunzou@cisco.com>
+ *   Dan Ryder <daryder@cisco.com>
+ **/
+
+#define _DEFAULT_SOURCE
+#define _BSD_SOURCE
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+
+#include <arpa/inet.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <yajl/yajl_parse.h>
+#if HAVE_YAJL_YAJL_VERSION_H
+#include <yajl/yajl_version.h>
+#endif
+
+#include <limits.h>
+#include <poll.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/un.h>
+#include <unistd.h>
+#include <math.h>
+#include <inttypes.h>
+
+#define RETRY_AVGCOUNT -1
+
+#if defined(YAJL_MAJOR) && (YAJL_MAJOR > 1)
+# define HAVE_YAJL_V2 1
+#endif
+
+#define RETRY_ON_EINTR(ret, expr) \
+    while(1) { \
+        ret = expr; \
+        if(ret >= 0) \
+            break; \
+        ret = -errno; \
+        if(ret != -EINTR) \
+            break; \
+    }
+
+/** Timeout interval in seconds */
+#define CEPH_TIMEOUT_INTERVAL 1
+
+/** Maximum path length for a UNIX domain socket on this system */
+#define UNIX_DOMAIN_SOCK_PATH_MAX (sizeof(((struct sockaddr_un*)0)->sun_path))
+
+/** Yajl callback returns */
+#define CEPH_CB_CONTINUE 1
+#define CEPH_CB_ABORT 0
+
+#if HAVE_YAJL_V2
+typedef size_t yajl_len_t;
+#else
+typedef unsigned int yajl_len_t;
+#endif
+
+/** Number of types for ceph defined in types.db */
+#define CEPH_DSET_TYPES_NUM 3
+/** ceph types enum */
+enum ceph_dset_type_d
+{
+    DSET_LATENCY = 0,
+    DSET_BYTES = 1,
+    DSET_RATE = 2,
+    DSET_TYPE_UNFOUND = 1000
+};
+
+/** Valid types for ceph defined in types.db */
+const char * ceph_dset_types [CEPH_DSET_TYPES_NUM] =
+                                   {"ceph_latency", "ceph_bytes", "ceph_rate"};
+
+/******* ceph_daemon *******/
+struct ceph_daemon
+{
+    /** Version of the admin_socket interface */
+    uint32_t version;
+    /** daemon name **/
+    char name[DATA_MAX_NAME_LEN];
+
+    /** Path to the socket that we use to talk to the ceph daemon */
+    char asok_path[UNIX_DOMAIN_SOCK_PATH_MAX];
+
+    /** Number of counters */
+    int ds_num;
+    /** Track ds types */
+    uint32_t *ds_types;
+    /** Track ds names to match with types */
+    char **ds_names;
+
+    /**
+     * Keep track of last data for latency values so we can calculate rate
+     * since last poll.
+     */
+    struct last_data **last_poll_data;
+    /** index of last poll data */
+    int last_idx;
+};
+
+/******* JSON parsing *******/
+typedef int (*node_handler_t)(void *, const char*, const char*);
+
+/** Track state and handler while parsing JSON */
+struct yajl_struct
+{
+    node_handler_t handler;
+    void * handler_arg;
+    struct {
+      char key[DATA_MAX_NAME_LEN];
+      int key_len;
+    } state[YAJL_MAX_DEPTH];
+    int depth;
+};
+typedef struct yajl_struct yajl_struct;
+
+enum perfcounter_type_d
+{
+    PERFCOUNTER_LATENCY = 0x4, PERFCOUNTER_DERIVE = 0x8,
+};
+
+/** Give user option to use default (long run = since daemon started) avg */
+static int long_run_latency_avg = 0;
+
+/**
+ * Give user option to use default type for special cases -
+ * filestore.journal_wr_bytes is currently only metric here. Ceph reports the
+ * type as a sum/count pair and will calculate it the same as a latency value.
+ * All other "bytes" metrics (excluding the used/capacity bytes for the OSD)
+ * use the DERIVE type. Unless user specifies to use given type, convert this
+ * metric to use DERIVE.
+ */
+static int convert_special_metrics = 1;
+
+/** Array of daemons to monitor */
+static struct ceph_daemon **g_daemons = NULL;
+
+/** Number of elements in g_daemons */
+static int g_num_daemons = 0;
+
+/**
+ * A set of data that we build up in memory while parsing the JSON.
+ */
+struct values_tmp
+{
+    /** ceph daemon we are processing data for*/
+    struct ceph_daemon *d;
+    /** track avgcount across counters for avgcount/sum latency pairs */
+    uint64_t avgcount;
+    /** current index of counters - used to get type of counter */
+    int index;
+    /** do we already have an avgcount for latency pair */
+    int avgcount_exists;
+    /**
+     * similar to index, but current index of latency type counters -
+     * used to get last poll data of counter
+     */
+    int latency_index;
+    /**
+     * values list - maintain across counters since
+     * host/plugin/plugin instance are always the same
+     */
+    value_list_t vlist;
+};
+
+/**
+ * A set of count/sum pairs to keep track of latency types and get difference
+ * between this poll data and last poll data.
+ */
+struct last_data
+{
+    char ds_name[DATA_MAX_NAME_LEN];
+    double last_sum;
+    uint64_t last_count;
+};
+
+/******* network I/O *******/
+enum cstate_t
+{
+    CSTATE_UNCONNECTED = 0,
+    CSTATE_WRITE_REQUEST,
+    CSTATE_READ_VERSION,
+    CSTATE_READ_AMT,
+    CSTATE_READ_JSON,
+};
+
+enum request_type_t
+{
+    ASOK_REQ_VERSION = 0,
+    ASOK_REQ_DATA = 1,
+    ASOK_REQ_SCHEMA = 2,
+    ASOK_REQ_NONE = 1000,
+};
+
+struct cconn
+{
+    /** The Ceph daemon that we're talking to */
+    struct ceph_daemon *d;
+
+    /** Request type */
+    uint32_t request_type;
+
+    /** The connection state */
+    enum cstate_t state;
+
+    /** The socket we use to talk to this daemon */
+    int asok;
+
+    /** The amount of data remaining to read / write. */
+    uint32_t amt;
+
+    /** Length of the JSON to read */
+    uint32_t json_len;
+
+    /** Buffer containing JSON data */
+    unsigned char *json;
+
+    /** Keep data important to yajl processing */
+    struct yajl_struct yajl;
+};
+
+static int ceph_cb_null(void *ctx)
+{
+    return CEPH_CB_CONTINUE;
+}
+
+static int ceph_cb_boolean(void *ctx, int bool_val)
+{
+    return CEPH_CB_CONTINUE;
+}
+
+static int
+ceph_cb_number(void *ctx, const char *number_val, yajl_len_t number_len)
+{
+    yajl_struct *yajl = (yajl_struct*)ctx;
+    char buffer[number_len+1];
+    int i, latency_type = 0, result;
+    char key[128];
+
+    memcpy(buffer, number_val, number_len);
+    buffer[sizeof(buffer) - 1] = 0;
+
+    ssnprintf(key, yajl->state[0].key_len, "%s", yajl->state[0].key);
+    for(i = 1; i < yajl->depth; i++)
+    {
+        if((i == yajl->depth-1) && ((strcmp(yajl->state[i].key,"avgcount") == 0)
+                || (strcmp(yajl->state[i].key,"sum") == 0)))
+        {
+            if(convert_special_metrics)
+            {
+                /**
+                 * Special case for filestore:JournalWrBytes. For some reason,
+                 * Ceph schema encodes this as a count/sum pair while all
+                 * other "Bytes" data (excluding used/capacity bytes for OSD
+                 * space) uses a single "Derive" type. To spare further
+                 * confusion, keep this KPI as the same type of other "Bytes".
+                 * Instead of keeping an "average" or "rate", use the "sum" in
+                 * the pair and assign that to the derive value.
+                 */
+                if((strcmp(yajl->state[i-1].key, "journal_wr_bytes") == 0) &&
+                        (strcmp(yajl->state[i-2].key,"filestore") == 0) &&
+                        (strcmp(yajl->state[i].key,"avgcount") == 0))
+                {
+                    DEBUG("ceph plugin: Skipping avgcount for filestore.JournalWrBytes");
+                    yajl->depth = (yajl->depth - 1);
+                    return CEPH_CB_CONTINUE;
+                }
+            }
+            //probably a avgcount/sum pair. if not - we'll try full key later
+            latency_type = 1;
+            break;
+        }
+        strncat(key, ".", 1);
+        strncat(key, yajl->state[i].key, yajl->state[i].key_len+1);
+    }
+
+    result = yajl->handler(yajl->handler_arg, buffer, key);
+
+    if((result == RETRY_AVGCOUNT) && latency_type)
+    {
+        strncat(key, ".", 1);
+        strncat(key, yajl->state[yajl->depth-1].key,
+                yajl->state[yajl->depth-1].key_len+1);
+        result = yajl->handler(yajl->handler_arg, buffer, key);
+    }
+
+    if(result == -ENOMEM)
+    {
+        ERROR("ceph plugin: memory allocation failed");
+        return CEPH_CB_ABORT;
+    }
+
+    yajl->depth = (yajl->depth - 1);
+    return CEPH_CB_CONTINUE;
+}
+
+static int ceph_cb_string(void *ctx, const unsigned char *string_val,
+        yajl_len_t string_len)
+{
+    return CEPH_CB_CONTINUE;
+}
+
+static int ceph_cb_start_map(void *ctx)
+{
+    return CEPH_CB_CONTINUE;
+}
+
+static int
+ceph_cb_map_key(void *ctx, const unsigned char *key, yajl_len_t string_len)
+{
+    yajl_struct *yajl = (yajl_struct*)ctx;
+
+    if((yajl->depth+1)  >= YAJL_MAX_DEPTH)
+    {
+        ERROR("ceph plugin: depth exceeds max, aborting.");
+        return CEPH_CB_ABORT;
+    }
+
+    char buffer[string_len+1];
+
+    memcpy(buffer, key, string_len);
+    buffer[sizeof(buffer) - 1] = 0;
+
+    snprintf(yajl->state[yajl->depth].key, sizeof(buffer), "%s", buffer);
+    yajl->state[yajl->depth].key_len = sizeof(buffer);
+    yajl->depth = (yajl->depth + 1);
+
+    return CEPH_CB_CONTINUE;
+}
+
+static int ceph_cb_end_map(void *ctx)
+{
+    yajl_struct *yajl = (yajl_struct*)ctx;
+
+    yajl->depth = (yajl->depth - 1);
+    return CEPH_CB_CONTINUE;
+}
+
+static int ceph_cb_start_array(void *ctx)
+{
+    return CEPH_CB_CONTINUE;
+}
+
+static int ceph_cb_end_array(void *ctx)
+{
+    return CEPH_CB_CONTINUE;
+}
+
+static yajl_callbacks callbacks = {
+        ceph_cb_null,
+        ceph_cb_boolean,
+        NULL,
+        NULL,
+        ceph_cb_number,
+        ceph_cb_string,
+        ceph_cb_start_map,
+        ceph_cb_map_key,
+        ceph_cb_end_map,
+        ceph_cb_start_array,
+        ceph_cb_end_array
+};
+
+static void ceph_daemon_print(const struct ceph_daemon *d)
+{
+    DEBUG("ceph plugin: name=%s, asok_path=%s", d->name, d->asok_path);
+}
+
+static void ceph_daemons_print(void)
+{
+    int i;
+    for(i = 0; i < g_num_daemons; ++i)
+    {
+        ceph_daemon_print(g_daemons[i]);
+    }
+}
+
+static void ceph_daemon_free(struct ceph_daemon *d)
+{
+    int i = 0;
+    for(; i < d->last_idx; i++)
+    {
+        sfree(d->last_poll_data[i]);
+    }
+    sfree(d->last_poll_data);
+    d->last_poll_data = NULL;
+    d->last_idx = 0;
+    for(i = 0; i < d->ds_num; i++)
+    {
+        sfree(d->ds_names[i]);
+    }
+    sfree(d->ds_types);
+    sfree(d->ds_names);
+    sfree(d);
+}
+
+/**
+ * Compact ds name by removing special characters and trimming length to
+ * DATA_MAX_NAME_LEN if necessary
+ */
+static void compact_ds_name(char *source, char *dest)
+{
+    int keys_num = 0, i;
+    char *save_ptr = NULL, *tmp_ptr = source;
+    char *keys[16];
+    char len_str[3];
+    char tmp[DATA_MAX_NAME_LEN];
+    size_t key_chars_remaining = (DATA_MAX_NAME_LEN-1);
+    int reserved = 0;
+    int offset = 0;
+    memset(tmp, 0, sizeof(tmp));
+    if(source == NULL || dest == NULL || source[0] == '\0' || dest[0] != '\0')
+    {
+        return;
+    }
+    size_t src_len = strlen(source);
+    snprintf(len_str, sizeof(len_str), "%zu", src_len);
+    unsigned char append_status = 0x0;
+    append_status |= (source[src_len - 1] == '-') ? 0x1 : 0x0;
+    append_status |= (source[src_len - 1] == '+') ? 0x2 : 0x0;
+    while ((keys[keys_num] = strtok_r(tmp_ptr, ":_-+", &save_ptr)) != NULL)
+    {
+        tmp_ptr = NULL;
+        /** capitalize 1st char **/
+        keys[keys_num][0] = toupper(keys[keys_num][0]);
+        keys_num++;
+        if(keys_num >= 16)
+        {
+            break;
+        }
+    }
+    /** concatenate each part of source string **/
+    for(i = 0; i < keys_num; i++)
+    {
+        strncat(tmp, keys[i], key_chars_remaining);
+        key_chars_remaining -= strlen(keys[i]);
+    }
+    tmp[DATA_MAX_NAME_LEN - 1] = '\0';
+    /** to coordinate limitation of length of type_instance
+     *  we will truncate ds_name
+     *  when the its length is more than
+     *  DATA_MAX_NAME_LEN
+     */
+    if(strlen(tmp) > DATA_MAX_NAME_LEN - 1)
+    {
+        append_status |= 0x4;
+        /** we should reserve space for
+         * len_str
+         */
+        reserved += 2;
+    }
+    if(append_status & 0x1)
+    {
+        /** we should reserve space for
+         * "Minus"
+         */
+        reserved += 5;
+    }
+    if(append_status & 0x2)
+    {
+        /** we should reserve space for
+         * "Plus"
+         */
+        reserved += 4;
+    }
+    snprintf(dest, DATA_MAX_NAME_LEN - reserved, "%s", tmp);
+    offset = strlen(dest);
+    switch (append_status)
+    {
+        case 0x1:
+            memcpy(dest + offset, "Minus", 5);
+            break;
+        case 0x2:
+            memcpy(dest + offset, "Plus", 5);
+            break;
+        case 0x4:
+            memcpy(dest + offset, len_str, 2);
+            break;
+        case 0x5:
+            memcpy(dest + offset, "Minus", 5);
+            memcpy(dest + offset + 5, len_str, 2);
+            break;
+        case 0x6:
+            memcpy(dest + offset, "Plus", 4);
+            memcpy(dest + offset + 4, len_str, 2);
+            break;
+        default:
+            break;
+    }
+}
+
+/**
+ * Parse key to remove "type" if this is for schema and initiate compaction
+ */
+static int parse_keys(const char *key_str, char *ds_name)
+{
+    char *ptr, *rptr;
+    size_t ds_name_len = 0;
+    /**
+     * allow up to 100 characters before compaction - compact_ds_name will not
+     * allow more than DATA_MAX_NAME_LEN chars
+     */
+    int max_str_len = 100;
+    char tmp_ds_name[max_str_len];
+    memset(tmp_ds_name, 0, sizeof(tmp_ds_name));
+    if(ds_name == NULL || key_str == NULL ||  key_str[0] == '\0' ||
+                                                            ds_name[0] != '\0')
+    {
+        return -1;
+    }
+    if((ptr = strchr(key_str, '.')) == NULL
+            || (rptr = strrchr(key_str, '.')) == NULL)
+    {
+        memcpy(tmp_ds_name, key_str, max_str_len - 1);
+        goto compact;
+    }
+
+    ds_name_len = (rptr - ptr) > max_str_len ? max_str_len : (rptr - ptr);
+    if((ds_name_len == 0) || strncmp(rptr + 1, "type", 4))
+    { /** copy whole key **/
+        memcpy(tmp_ds_name, key_str, max_str_len - 1);
+    }
+    else
+    {/** more than two keys **/
+        memcpy(tmp_ds_name, key_str, ((rptr - key_str) > (max_str_len - 1) ?
+                (max_str_len - 1) : (rptr - key_str)));
+    }
+
+    compact: compact_ds_name(tmp_ds_name, ds_name);
+    return 0;
+}
+
+/**
+ * while parsing ceph admin socket schema, save counter name and type for later
+ * data processing
+ */
+static int ceph_daemon_add_ds_entry(struct ceph_daemon *d, const char *name,
+        int pc_type)
+{
+    uint32_t type;
+    char ds_name[DATA_MAX_NAME_LEN];
+    memset(ds_name, 0, sizeof(ds_name));
+
+    if(convert_special_metrics)
+    {
+        /**
+         * Special case for filestore:JournalWrBytes. For some reason, Ceph
+         * schema encodes this as a count/sum pair while all other "Bytes" data
+         * (excluding used/capacity bytes for OSD space) uses a single "Derive"
+         * type. To spare further confusion, keep this KPI as the same type of
+         * other "Bytes". Instead of keeping an "average" or "rate", use the
+         * "sum" in the pair and assign that to the derive value.
+         */
+        if((strcmp(name,"filestore.journal_wr_bytes.type") == 0))
+        {
+            pc_type = 10;
+        }
+    }
+
+    d->ds_names = realloc(d->ds_names, sizeof(char *) * (d->ds_num + 1));
+    if(!d->ds_names)
+    {
+        return -ENOMEM;
+    }
+
+    d->ds_types = realloc(d->ds_types, sizeof(uint32_t) * (d->ds_num + 1));
+    if(!d->ds_types)
+    {
+        return -ENOMEM;
+    }
+
+    d->ds_names[d->ds_num] = malloc(sizeof(char) * DATA_MAX_NAME_LEN);
+    if(!d->ds_names[d->ds_num])
+    {
+        return -ENOMEM;
+    }
+
+    type = (pc_type & PERFCOUNTER_DERIVE) ? DSET_RATE :
+            ((pc_type & PERFCOUNTER_LATENCY) ? DSET_LATENCY : DSET_BYTES);
+    d->ds_types[d->ds_num] = type;
+
+    if(parse_keys(name, ds_name))
+    {
+        return 1;
+    }
+
+    sstrncpy(d->ds_names[d->ds_num], ds_name, DATA_MAX_NAME_LEN -1);
+    d->ds_num = (d->ds_num + 1);
+
+    return 0;
+}
+
+/******* ceph_config *******/
+static int cc_handle_str(struct oconfig_item_s *item, char *dest, int dest_len)
+{
+    const char *val;
+    if(item->values_num != 1)
+    {
+        return -ENOTSUP;
+    }
+    if(item->values[0].type != OCONFIG_TYPE_STRING)
+    {
+        return -ENOTSUP;
+    }
+    val = item->values[0].value.string;
+    if(snprintf(dest, dest_len, "%s", val) > (dest_len - 1))
+    {
+        ERROR("ceph plugin: configuration parameter '%s' is too long.\n",
+                item->key);
+        return -ENAMETOOLONG;
+    }
+    return 0;
+}
+
+static int cc_handle_bool(struct oconfig_item_s *item, int *dest)
+{
+    if(item->values_num != 1)
+    {
+        return -ENOTSUP;
+    }
+
+    if(item->values[0].type != OCONFIG_TYPE_BOOLEAN)
+    {
+        return -ENOTSUP;
+    }
+
+    *dest = (item->values[0].value.boolean) ? 1 : 0;
+    return 0;
+}
+
+static int cc_add_daemon_config(oconfig_item_t *ci)
+{
+    int ret, i;
+    struct ceph_daemon *array, *nd, cd;
+    memset(&cd, 0, sizeof(struct ceph_daemon));
+
+    if((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING))
+    {
+        WARNING("ceph plugin: `Daemon' blocks need exactly one string "
+                "argument.");
+        return (-1);
+    }
+
+    ret = cc_handle_str(ci, cd.name, DATA_MAX_NAME_LEN);
+    if(ret)
+    {
+        return ret;
+    }
+
+    for(i=0; i < ci->children_num; i++)
+    {
+        oconfig_item_t *child = ci->children + i;
+
+        if(strcasecmp("SocketPath", child->key) == 0)
+        {
+            ret = cc_handle_str(child, cd.asok_path, sizeof(cd.asok_path));
+            if(ret)
+            {
+                return ret;
+            }
+        }
+        else
+        {
+            WARNING("ceph plugin: ignoring unknown option %s", child->key);
+        }
+    }
+    if(cd.name[0] == '\0')
+    {
+        ERROR("ceph plugin: you must configure a daemon name.\n");
+        return -EINVAL;
+    }
+    else if(cd.asok_path[0] == '\0')
+    {
+        ERROR("ceph plugin(name=%s): you must configure an administrative "
+        "socket path.\n", cd.name);
+        return -EINVAL;
+    }
+    else if(!((cd.asok_path[0] == '/') ||
+            (cd.asok_path[0] == '.' && cd.asok_path[1] == '/')))
+    {
+        ERROR("ceph plugin(name=%s): administrative socket paths must begin "
+                "with '/' or './' Can't parse: '%s'\n", cd.name, cd.asok_path);
+        return -EINVAL;
+    }
+
+    array = realloc(g_daemons,
+                    sizeof(struct ceph_daemon *) * (g_num_daemons + 1));
+    if(array == NULL)
+    {
+        /* The positive return value here indicates that this is a
+         * runtime error, not a configuration error.  */
+        return ENOMEM;
+    }
+    g_daemons = (struct ceph_daemon**) array;
+    nd = malloc(sizeof(struct ceph_daemon));
+    if(!nd)
+    {
+        return ENOMEM;
+    }
+    memcpy(nd, &cd, sizeof(struct ceph_daemon));
+    g_daemons[g_num_daemons++] = nd;
+    return 0;
+}
+
+static int ceph_config(oconfig_item_t *ci)
+{
+    int ret, i;
+
+    for(i = 0; i < ci->children_num; ++i)
+    {
+        oconfig_item_t *child = ci->children + i;
+        if(strcasecmp("Daemon", child->key) == 0)
+        {
+            ret = cc_add_daemon_config(child);
+            if(ret == ENOMEM)
+            {
+                ERROR("ceph plugin: Couldn't allocate memory");
+                return ret;
+            }
+            else if(ret)
+            {
+                //process other daemons and ignore this one
+                continue;
+            }
+        }
+        else if(strcasecmp("LongRunAvgLatency", child->key) == 0)
+        {
+            ret = cc_handle_bool(child, &long_run_latency_avg);
+            if(ret)
+            {
+                return ret;
+            }
+        }
+        else if(strcasecmp("ConvertSpecialMetricTypes", child->key) == 0)
+        {
+            ret = cc_handle_bool(child, &convert_special_metrics);
+            if(ret)
+            {
+                return ret;
+            }
+        }
+        else
+        {
+            WARNING("ceph plugin: ignoring unknown option %s", child->key);
+        }
+    }
+    return 0;
+}
+
+/**
+ * Parse JSON and get error message if present
+ */
+static int
+traverse_json(const unsigned char *json, uint32_t json_len, yajl_handle hand)
+{
+    yajl_status status = yajl_parse(hand, json, json_len);
+    unsigned char *msg;
+
+    switch(status)
+    {
+        case yajl_status_error:
+            msg = yajl_get_error(hand, /* verbose = */ 1,
+                                       /* jsonText = */ (unsigned char *) json,
+                                                      (unsigned int) json_len);
+            ERROR ("ceph plugin: yajl_parse failed: %s", msg);
+            yajl_free_error(hand, msg);
+            return 1;
+        case yajl_status_client_canceled:
+            return 1;
+        default:
+            return 0;
+    }
+}
+
+/**
+ * Add entry for each counter while parsing schema
+ */
+static int
+node_handler_define_schema(void *arg, const char *val, const char *key)
+{
+    struct ceph_daemon *d = (struct ceph_daemon *) arg;
+    int pc_type;
+    pc_type = atoi(val);
+    return ceph_daemon_add_ds_entry(d, key, pc_type);
+}
+
+/**
+ * Latency counter does not yet have an entry in last poll data - add it.
+ */
+static int add_last(struct ceph_daemon *d, const char *ds_n, double cur_sum,
+        uint64_t cur_count)
+{
+    d->last_poll_data[d->last_idx] = malloc(1 * sizeof(struct last_data));
+    if(!d->last_poll_data[d->last_idx])
+    {
+        return -ENOMEM;
+    }
+    sstrncpy(d->last_poll_data[d->last_idx]->ds_name,ds_n,
+            sizeof(d->last_poll_data[d->last_idx]->ds_name));
+    d->last_poll_data[d->last_idx]->last_sum = cur_sum;
+    d->last_poll_data[d->last_idx]->last_count = cur_count;
+    d->last_idx = (d->last_idx + 1);
+    return 0;
+}
+
+/**
+ * Update latency counter or add new entry if it doesn't exist
+ */
+static int update_last(struct ceph_daemon *d, const char *ds_n, int index,
+        double cur_sum, uint64_t cur_count)
+{
+    if((d->last_idx > index) && (strcmp(d->last_poll_data[index]->ds_name, ds_n) == 0))
+    {
+        d->last_poll_data[index]->last_sum = cur_sum;
+        d->last_poll_data[index]->last_count = cur_count;
+        return 0;
+    }
+
+    if(!d->last_poll_data)
+    {
+        d->last_poll_data = malloc(1 * sizeof(struct last_data *));
+        if(!d->last_poll_data)
+        {
+            return -ENOMEM;
+        }
+    }
+    else
+    {
+        struct last_data **tmp_last = realloc(d->last_poll_data,
+                ((d->last_idx+1) * sizeof(struct last_data *)));
+        if(!tmp_last)
+        {
+            return -ENOMEM;
+        }
+        d->last_poll_data = tmp_last;
+    }
+    return add_last(d, ds_n, cur_sum, cur_count);
+}
+
+/**
+ * If using index guess failed (shouldn't happen, but possible if counters
+ * get rearranged), resort to searching for counter name
+ */
+static int backup_search_for_last_avg(struct ceph_daemon *d, const char *ds_n)
+{
+    int i = 0;
+    for(; i < d->last_idx; i++)
+    {
+        if(strcmp(d->last_poll_data[i]->ds_name, ds_n) == 0)
+        {
+            return i;
+        }
+    }
+    return -1;
+}
+
+/**
+ * Calculate average b/t current data and last poll data
+ * if last poll data exists
+ */
+static double get_last_avg(struct ceph_daemon *d, const char *ds_n, int index,
+        double cur_sum, uint64_t cur_count)
+{
+    double result = -1.1, sum_delt = 0.0;
+    uint64_t count_delt = 0;
+    int tmp_index = 0;
+    if(d->last_idx > index)
+    {
+        if(strcmp(d->last_poll_data[index]->ds_name, ds_n) == 0)
+        {
+            tmp_index = index;
+        }
+        //test previous index
+        else if((index > 0) && (strcmp(d->last_poll_data[index-1]->ds_name, ds_n) == 0))
+        {
+            tmp_index = (index - 1);
+        }
+        else
+        {
+            tmp_index = backup_search_for_last_avg(d, ds_n);
+        }
+
+        if((tmp_index > -1) && (cur_count > d->last_poll_data[tmp_index]->last_count))
+        {
+            sum_delt = (cur_sum - d->last_poll_data[tmp_index]->last_sum);
+            count_delt = (cur_count - d->last_poll_data[tmp_index]->last_count);
+            result = (sum_delt / count_delt);
+        }
+    }
+
+    if(result == -1.1)
+    {
+        result = NAN;
+    }
+    if(update_last(d, ds_n, tmp_index, cur_sum, cur_count) == -ENOMEM)
+    {
+        return -ENOMEM;
+    }
+    return result;
+}
+
+/**
+ * If using index guess failed, resort to searching for counter name
+ */
+static uint32_t backup_search_for_type(struct ceph_daemon *d, char *ds_name)
+{
+    int idx = 0;
+    for(; idx < d->ds_num; idx++)
+    {
+        if(strcmp(d->ds_names[idx], ds_name) == 0)
+        {
+            return d->ds_types[idx];
+        }
+    }
+    return DSET_TYPE_UNFOUND;
+}
+
+/**
+ * Process counter data and dispatch values
+ */
+static int node_handler_fetch_data(void *arg, const char *val, const char *key)
+{
+    value_t uv;
+    double tmp_d;
+    uint64_t tmp_u;
+    struct values_tmp *vtmp = (struct values_tmp*) arg;
+    uint32_t type = DSET_TYPE_UNFOUND;
+    int index = vtmp->index;
+
+    char ds_name[DATA_MAX_NAME_LEN];
+    memset(ds_name, 0, sizeof(ds_name));
+
+    if(parse_keys(key, ds_name))
+    {
+        return 1;
+    }
+
+    if(index >= vtmp->d->ds_num)
+    {
+        //don't overflow bounds of array
+        index = (vtmp->d->ds_num - 1);
+    }
+
+    /**
+     * counters should remain in same order we parsed schema... we maintain the
+     * index variable to keep track of current point in list of counters. first
+     * use index to guess point in array for retrieving type. if that doesn't
+     * work, use the old way to get the counter type
+     */
+    if(strcmp(ds_name, vtmp->d->ds_names[index]) == 0)
+    {
+        //found match
+        type = vtmp->d->ds_types[index];
+    }
+    else if((index > 0) && (strcmp(ds_name, vtmp->d->ds_names[index-1]) == 0))
+    {
+        //try previous key
+        type = vtmp->d->ds_types[index-1];
+    }
+
+    if(type == DSET_TYPE_UNFOUND)
+    {
+        //couldn't find right type by guessing, check the old way
+        type = backup_search_for_type(vtmp->d, ds_name);
+    }
+
+    switch(type)
+    {
+        case DSET_LATENCY:
+            if(vtmp->avgcount_exists == -1)
+            {
+                sscanf(val, "%" PRIu64, &vtmp->avgcount);
+                vtmp->avgcount_exists = 0;
+                //return after saving avgcount - don't dispatch value
+                //until latency calculation
+                return 0;
+            }
+            else
+            {
+                double sum, result;
+                sscanf(val, "%lf", &sum);
+
+                if(vtmp->avgcount == 0)
+                {
+                    vtmp->avgcount = 1;
+                }
+
+                /** User wants latency values as long run avg */
+                if(long_run_latency_avg)
+                {
+                    result = (sum / vtmp->avgcount);
+                }
+                else
+                {
+                    result = get_last_avg(vtmp->d, ds_name, vtmp->latency_index, sum, vtmp->avgcount);
+                    if(result == -ENOMEM)
+                    {
+                        return -ENOMEM;
+                    }
+                }
+
+                uv.gauge = result;
+                vtmp->avgcount_exists = -1;
+                vtmp->latency_index = (vtmp->latency_index + 1);
+            }
+            break;
+        case DSET_BYTES:
+            sscanf(val, "%lf", &tmp_d);
+            uv.gauge = tmp_d;
+            break;
+        case DSET_RATE:
+            sscanf(val, "%" PRIu64, &tmp_u);
+            uv.derive = tmp_u;
+            break;
+        case DSET_TYPE_UNFOUND:
+        default:
+            ERROR("ceph plugin: ds %s was not properly initialized.", ds_name);
+            return -1;
+    }
+
+    sstrncpy(vtmp->vlist.type, ceph_dset_types[type], sizeof(vtmp->vlist.type));
+    sstrncpy(vtmp->vlist.type_instance, ds_name, sizeof(vtmp->vlist.type_instance));
+    vtmp->vlist.values = &uv;
+    vtmp->vlist.values_len = 1;
+
+    vtmp->index = (vtmp->index + 1);
+    plugin_dispatch_values(&vtmp->vlist);
+
+    return 0;
+}
+
+static int cconn_connect(struct cconn *io)
+{
+    struct sockaddr_un address;
+    int flags, fd, err;
+    if(io->state != CSTATE_UNCONNECTED)
+    {
+        ERROR("ceph plugin: cconn_connect: io->state != CSTATE_UNCONNECTED");
+        return -EDOM;
+    }
+    fd = socket(PF_UNIX, SOCK_STREAM, 0);
+    if(fd < 0)
+    {
+        int err = -errno;
+        ERROR("ceph plugin: cconn_connect: socket(PF_UNIX, SOCK_STREAM, 0) "
+            "failed: error %d", err);
+        return err;
+    }
+    memset(&address, 0, sizeof(struct sockaddr_un));
+    address.sun_family = AF_UNIX;
+    snprintf(address.sun_path, sizeof(address.sun_path), "%s",
+            io->d->asok_path);
+    RETRY_ON_EINTR(err,
+        connect(fd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)));
+    if(err < 0)
+    {
+        ERROR("ceph plugin: cconn_connect: connect(%d) failed: error %d",
+            fd, err);
+        return err;
+    }
+
+    flags = fcntl(fd, F_GETFL, 0);
+    if(fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0)
+    {
+        err = -errno;
+        ERROR("ceph plugin: cconn_connect: fcntl(%d, O_NONBLOCK) error %d",
+            fd, err);
+        return err;
+    }
+    io->asok = fd;
+    io->state = CSTATE_WRITE_REQUEST;
+    io->amt = 0;
+    io->json_len = 0;
+    io->json = NULL;
+    return 0;
+}
+
+static void cconn_close(struct cconn *io)
+{
+    io->state = CSTATE_UNCONNECTED;
+    if(io->asok != -1)
+    {
+        int res;
+        RETRY_ON_EINTR(res, close(io->asok));
+    }
+    io->asok = -1;
+    io->amt = 0;
+    io->json_len = 0;
+    sfree(io->json);
+    io->json = NULL;
+}
+
+/* Process incoming JSON counter data */
+static int
+cconn_process_data(struct cconn *io, yajl_struct *yajl, yajl_handle hand)
+{
+    int ret;
+    struct values_tmp *vtmp = calloc(1, sizeof(struct values_tmp) * 1);
+    if(!vtmp)
+    {
+        return -ENOMEM;
+    }
+
+    vtmp->vlist = (value_list_t)VALUE_LIST_INIT;
+    sstrncpy(vtmp->vlist.host, hostname_g, sizeof(vtmp->vlist.host));
+    sstrncpy(vtmp->vlist.plugin, "ceph", sizeof(vtmp->vlist.plugin));
+    sstrncpy(vtmp->vlist.plugin_instance, io->d->name, sizeof(vtmp->vlist.plugin_instance));
+
+    vtmp->d = io->d;
+    vtmp->avgcount_exists = -1;
+    vtmp->latency_index = 0;
+    vtmp->index = 0;
+    yajl->handler_arg = vtmp;
+    ret = traverse_json(io->json, io->json_len, hand);
+    sfree(vtmp);
+    return ret;
+}
+
+/**
+ * Initiate JSON parsing and print error if one occurs
+ */
+static int cconn_process_json(struct cconn *io)
+{
+    if((io->request_type != ASOK_REQ_DATA) &&
+            (io->request_type != ASOK_REQ_SCHEMA))
+    {
+        return -EDOM;
+    }
+
+    int result = 1;
+    yajl_handle hand;
+    yajl_status status;
+
+    hand = yajl_alloc(&callbacks,
+#if HAVE_YAJL_V2
+      /* alloc funcs = */ NULL,
+#else
+      /* alloc funcs = */ NULL, NULL,
+#endif
+      /* context = */ (void *)(&io->yajl));
+
+    if(!hand)
+    {
+        ERROR ("ceph plugin: yajl_alloc failed.");
+        return ENOMEM;
+    }
+
+    io->yajl.depth = 0;
+
+    switch(io->request_type)
+    {
+        case ASOK_REQ_DATA:
+            io->yajl.handler = node_handler_fetch_data;
+            result = cconn_process_data(io, &io->yajl, hand);
+            break;
+        case ASOK_REQ_SCHEMA:
+            //init daemon specific variables
+            io->d->ds_num = 0;
+            io->d->last_idx = 0;
+            io->d->last_poll_data = NULL;
+            io->yajl.handler = node_handler_define_schema;
+            io->yajl.handler_arg = io->d;
+            result = traverse_json(io->json, io->json_len, hand);
+            break;
+    }
+
+    if(result)
+    {
+        goto done;
+    }
+
+#if HAVE_YAJL_V2
+    status = yajl_complete_parse(hand);
+#else
+    status = yajl_parse_complete(hand);
+#endif
+
+    if (status != yajl_status_ok)
+    {
+      unsigned char *errmsg = yajl_get_error (hand, /* verbose = */ 0,
+          /* jsonText = */ NULL, /* jsonTextLen = */ 0);
+      ERROR ("ceph plugin: yajl_parse_complete failed: %s",
+          (char *) errmsg);
+      yajl_free_error (hand, errmsg);
+      yajl_free (hand);
+      return 1;
+    }
+
+    done:
+    yajl_free (hand);
+    return result;
+}
+
+static int cconn_validate_revents(struct cconn *io, int revents)
+{
+    if(revents & POLLERR)
+    {
+        ERROR("ceph plugin: cconn_validate_revents(name=%s): got POLLERR",
+            io->d->name);
+        return -EIO;
+    }
+    switch (io->state)
+    {
+        case CSTATE_WRITE_REQUEST:
+            return (revents & POLLOUT) ? 0 : -EINVAL;
+        case CSTATE_READ_VERSION:
+        case CSTATE_READ_AMT:
+        case CSTATE_READ_JSON:
+            return (revents & POLLIN) ? 0 : -EINVAL;
+        default:
+            ERROR("ceph plugin: cconn_validate_revents(name=%s) got to "
+                "illegal state on line %d", io->d->name, __LINE__);
+            return -EDOM;
+    }
+}
+
+/** Handle a network event for a connection */
+static int cconn_handle_event(struct cconn *io)
+{
+    int ret;
+    switch (io->state)
+    {
+        case CSTATE_UNCONNECTED:
+            ERROR("ceph plugin: cconn_handle_event(name=%s) got to illegal "
+                "state on line %d", io->d->name, __LINE__);
+
+            return -EDOM;
+        case CSTATE_WRITE_REQUEST:
+        {
+            char cmd[32];
+            snprintf(cmd, sizeof(cmd), "%s%d%s", "{ \"prefix\": \"",
+                    io->request_type, "\" }\n");
+            size_t cmd_len = strlen(cmd);
+            RETRY_ON_EINTR(ret,
+                  write(io->asok, ((char*)&cmd) + io->amt, cmd_len - io->amt));
+            DEBUG("ceph plugin: cconn_handle_event(name=%s,state=%d,amt=%d,ret=%d)",
+                    io->d->name, io->state, io->amt, ret);
+            if(ret < 0)
+            {
+                return ret;
+            }
+            io->amt += ret;
+            if(io->amt >= cmd_len)
+            {
+                io->amt = 0;
+                switch (io->request_type)
+                {
+                    case ASOK_REQ_VERSION:
+                        io->state = CSTATE_READ_VERSION;
+                        break;
+                    default:
+                        io->state = CSTATE_READ_AMT;
+                        break;
+                }
+            }
+            return 0;
+        }
+        case CSTATE_READ_VERSION:
+        {
+            RETRY_ON_EINTR(ret,
+                    read(io->asok, ((char*)(&io->d->version)) + io->amt,
+                            sizeof(io->d->version) - io->amt));
+            DEBUG("ceph plugin: cconn_handle_event(name=%s,state=%d,ret=%d)",
+                    io->d->name, io->state, ret);
+            if(ret < 0)
+            {
+                return ret;
+            }
+            io->amt += ret;
+            if(io->amt >= sizeof(io->d->version))
+            {
+                io->d->version = ntohl(io->d->version);
+                if(io->d->version != 1)
+                {
+                    ERROR("ceph plugin: cconn_handle_event(name=%s) not "
+                        "expecting version %d!", io->d->name, io->d->version);
+                    return -ENOTSUP;
+                }
+                DEBUG("ceph plugin: cconn_handle_event(name=%s): identified as "
+                        "version %d", io->d->name, io->d->version);
+                io->amt = 0;
+                cconn_close(io);
+                io->request_type = ASOK_REQ_SCHEMA;
+            }
+            return 0;
+        }
+        case CSTATE_READ_AMT:
+        {
+            RETRY_ON_EINTR(ret,
+                    read(io->asok, ((char*)(&io->json_len)) + io->amt,
+                            sizeof(io->json_len) - io->amt));
+            DEBUG("ceph plugin: cconn_handle_event(name=%s,state=%d,ret=%d)",
+                    io->d->name, io->state, ret);
+            if(ret < 0)
+            {
+                return ret;
+            }
+            io->amt += ret;
+            if(io->amt >= sizeof(io->json_len))
+            {
+                io->json_len = ntohl(io->json_len);
+                io->amt = 0;
+                io->state = CSTATE_READ_JSON;
+                io->json = calloc(1, io->json_len + 1);
+                if(!io->json)
+                {
+                    ERROR("ceph plugin: error callocing io->json");
+                    return -ENOMEM;
+                }
+            }
+            return 0;
+        }
+        case CSTATE_READ_JSON:
+        {
+            RETRY_ON_EINTR(ret,
+                   read(io->asok, io->json + io->amt, io->json_len - io->amt));
+            DEBUG("ceph plugin: cconn_handle_event(name=%s,state=%d,ret=%d)",
+                    io->d->name, io->state, ret);
+            if(ret < 0)
+            {
+                return ret;
+            }
+            io->amt += ret;
+            if(io->amt >= io->json_len)
+            {
+                ret = cconn_process_json(io);
+                if(ret)
+                {
+                    return ret;
+                }
+                cconn_close(io);
+                io->request_type = ASOK_REQ_NONE;
+            }
+            return 0;
+        }
+        default:
+            ERROR("ceph plugin: cconn_handle_event(name=%s) got to illegal "
+                "state on line %d", io->d->name, __LINE__);
+            return -EDOM;
+    }
+}
+
+static int cconn_prepare(struct cconn *io, struct pollfd* fds)
+{
+    int ret;
+    if(io->request_type == ASOK_REQ_NONE)
+    {
+        /* The request has already been serviced. */
+        return 0;
+    }
+    else if((io->request_type == ASOK_REQ_DATA) && (io->d->ds_num == 0))
+    {
+        /* If there are no counters to report on, don't bother
+         * connecting */
+        return 0;
+    }
+
+    switch (io->state)
+    {
+        case CSTATE_UNCONNECTED:
+            ret = cconn_connect(io);
+            if(ret > 0)
+            {
+                return -ret;
+            }
+            else if(ret < 0)
+            {
+                return ret;
+            }
+            fds->fd = io->asok;
+            fds->events = POLLOUT;
+            return 1;
+        case CSTATE_WRITE_REQUEST:
+            fds->fd = io->asok;
+            fds->events = POLLOUT;
+            return 1;
+        case CSTATE_READ_VERSION:
+        case CSTATE_READ_AMT:
+        case CSTATE_READ_JSON:
+            fds->fd = io->asok;
+            fds->events = POLLIN;
+            return 1;
+        default:
+            ERROR("ceph plugin: cconn_prepare(name=%s) got to illegal state "
+                "on line %d", io->d->name, __LINE__);
+            return -EDOM;
+    }
+}
+
+/** Returns the difference between two struct timevals in milliseconds.
+ * On overflow, we return max/min int.
+ */
+static int milli_diff(const struct timeval *t1, const struct timeval *t2)
+{
+    int64_t ret;
+    int sec_diff = t1->tv_sec - t2->tv_sec;
+    int usec_diff = t1->tv_usec - t2->tv_usec;
+    ret = usec_diff / 1000;
+    ret += (sec_diff * 1000);
+    return (ret > INT_MAX) ? INT_MAX : ((ret < INT_MIN) ? INT_MIN : (int)ret);
+}
+
+/** This handles the actual network I/O to talk to the Ceph daemons.
+ */
+static int cconn_main_loop(uint32_t request_type)
+{
+    int i, ret, some_unreachable = 0;
+    struct timeval end_tv;
+    struct cconn io_array[g_num_daemons];
+
+    DEBUG("ceph plugin: entering cconn_main_loop(request_type = %d)", request_type);
+
+    /* create cconn array */
+    memset(io_array, 0, sizeof(io_array));
+    for(i = 0; i < g_num_daemons; ++i)
+    {
+        io_array[i].d = g_daemons[i];
+        io_array[i].request_type = request_type;
+        io_array[i].state = CSTATE_UNCONNECTED;
+    }
+
+    /** Calculate the time at which we should give up */
+    gettimeofday(&end_tv, NULL);
+    end_tv.tv_sec += CEPH_TIMEOUT_INTERVAL;
+
+    while (1)
+    {
+        int nfds, diff;
+        struct timeval tv;
+        struct cconn *polled_io_array[g_num_daemons];
+        struct pollfd fds[g_num_daemons];
+        memset(fds, 0, sizeof(fds));
+        nfds = 0;
+        for(i = 0; i < g_num_daemons; ++i)
+        {
+            struct cconn *io = io_array + i;
+            ret = cconn_prepare(io, fds + nfds);
+            if(ret < 0)
+            {
+                WARNING("ceph plugin: cconn_prepare(name=%s,i=%d,st=%d)=%d",
+                        io->d->name, i, io->state, ret);
+                cconn_close(io);
+                io->request_type = ASOK_REQ_NONE;
+                some_unreachable = 1;
+            }
+            else if(ret == 1)
+            {
+                polled_io_array[nfds++] = io_array + i;
+            }
+        }
+        if(nfds == 0)
+        {
+            /* finished */
+            ret = 0;
+            goto done;
+        }
+        gettimeofday(&tv, NULL);
+        diff = milli_diff(&end_tv, &tv);
+        if(diff <= 0)
+        {
+            /* Timed out */
+            ret = -ETIMEDOUT;
+            WARNING("ceph plugin: cconn_main_loop: timed out.");
+            goto done;
+        }
+        RETRY_ON_EINTR(ret, poll(fds, nfds, diff));
+        if(ret < 0)
+        {
+            ERROR("ceph plugin: poll(2) error: %d", ret);
+            goto done;
+        }
+        for(i = 0; i < nfds; ++i)
+        {
+            struct cconn *io = polled_io_array[i];
+            int revents = fds[i].revents;
+            if(revents == 0)
+            {
+                /* do nothing */
+            }
+            else if(cconn_validate_revents(io, revents))
+            {
+                WARNING("ceph plugin: cconn(name=%s,i=%d,st=%d): "
+                "revents validation error: "
+                "revents=0x%08x", io->d->name, i, io->state, revents);
+                cconn_close(io);
+                io->request_type = ASOK_REQ_NONE;
+                some_unreachable = 1;
+            }
+            else
+            {
+                int ret = cconn_handle_event(io);
+                if(ret)
+                {
+                    WARNING("ceph plugin: cconn_handle_event(name=%s,"
+                    "i=%d,st=%d): error %d", io->d->name, i, io->state, ret);
+                    cconn_close(io);
+                    io->request_type = ASOK_REQ_NONE;
+                    some_unreachable = 1;
+                }
+            }
+        }
+    }
+    done: for(i = 0; i < g_num_daemons; ++i)
+    {
+        cconn_close(io_array + i);
+    }
+    if(some_unreachable)
+    {
+        DEBUG("ceph plugin: cconn_main_loop: some Ceph daemons were unreachable.");
+    }
+    else
+    {
+        DEBUG("ceph plugin: cconn_main_loop: reached all Ceph daemons :)");
+    }
+    return ret;
+}
+
+static int ceph_read(void)
+{
+    return cconn_main_loop(ASOK_REQ_DATA);
+}
+
+/******* lifecycle *******/
+static int ceph_init(void)
+{
+    int ret;
+    ceph_daemons_print();
+
+    ret = cconn_main_loop(ASOK_REQ_VERSION);
+
+    return (ret) ? ret : 0;
+}
+
+static int ceph_shutdown(void)
+{
+    int i;
+    for(i = 0; i < g_num_daemons; ++i)
+    {
+        ceph_daemon_free(g_daemons[i]);
+    }
+    sfree(g_daemons);
+    g_daemons = NULL;
+    g_num_daemons = 0;
+    DEBUG("ceph plugin: finished ceph_shutdown");
+    return 0;
+}
+
+void module_register(void)
+{
+    plugin_register_complex_config("ceph", ceph_config);
+    plugin_register_init("ceph", ceph_init);
+    plugin_register_read("ceph", ceph_read);
+    plugin_register_shutdown("ceph", ceph_shutdown);
+}
index 5f2c687..10f9f61 100644 (file)
@@ -201,13 +201,13 @@ The data is passed to the executables over C<STDIN> in a format very similar to
 HTTP: At first there is a "header" with one line per field. Every line consists
 of a field name, ended by a colon, and the associated value until end-of-line.
 The "header" is ended by two newlines immediately following another,
-i.E<nbsp>e. an empty line. The rest, basically the "body", is the message of
-the notification.
+i.e. an empty line. The rest, basically the "body", is the message of the
+notification.
 
 The following is an example notification passed to a program:
 
   Severity: FAILURE
-  Time: 1200928930
+  Time: 1200928930.515
   Host: myhost.mydomain.org
   \n
   This is a test notification to demonstrate the format
@@ -223,7 +223,9 @@ Severity of the notification. May either be B<FAILURE>, B<WARNING>, or B<OKAY>.
 
 =item B<Time>
 
-The time in epoch, i.E<nbsp>e. as seconds since 1970-01-01 00:00:00 UTC.
+The time in epoch, i.e. as seconds since 1970-01-01 00:00:00 UTC. The value
+currently has millisecond precision (i.e. three decimal places), but scripts
+should accept arbitrary numbers of decimal places, including no decimal places.
 
 =item B<Host>
 
index 38d790e..f1426de 100644 (file)
@@ -6,9 +6,7 @@ collectd-perl - Documentation of collectd's C<perl plugin>
 
 =head1 SYNOPSIS
 
-  <LoadPlugin perl>
-    Globals true
-  </LoadPlugin>
+  LoadPlugin perl
   # ...
   <Plugin perl>
     IncludeDir "/path/to/perl/plugins"
index 6645614..0da891f 100644 (file)
@@ -16,9 +16,7 @@ collectd-python - Documentation of collectd's C<python plugin>
 
 =head1 SYNOPSIS
 
-  <LoadPlugin python>
-    Globals true
-  </LoadPlugin>
+  LoadPlugin python
   # ...
   <Plugin python>
     ModulePath "/path/to/your/python/modules"
@@ -47,23 +45,20 @@ The minimum required Python version is I<2.3>.
 
 =item B<LoadPlugin> I<Plugin>
 
-Loads the Python plugin I<Plugin>. Unlike most other LoadPlugin lines, this one
-should be a block containing the line "Globals true". This will cause collectd
-to export the name of all objects in the Python interpreter for all plugins to
-see. If you don't do this or your platform does not support it, the embedded
-interpreter will start anyway but you won't be able to load certain Python
-modules, e.g. "time".
+Loads the Python plugin I<Plugin>.
 
 =item B<Encoding> I<Name>
 
 The default encoding for Unicode objects you pass to collectd. If you omit this
-option it will default to B<ascii> on I<Python 2> and B<utf-8> on I<Python 3>.
-This is hardcoded in Python and will ignore everything else, including your
-locale.
+option it will default to B<ascii> on I<Python 2>. On I<Python 3> it will
+always be B<utf-8>, as this function was removed, so this will be silently
+ignored.
+These defaults are hardcoded in Python and will ignore everything else,
+including your locale.
 
 =item B<ModulePath> I<Name>
 
-Appends I<Name> to B<sys.path>. You won't be able to import any scripts you
+Prepends I<Name> to B<sys.path>. You won't be able to import any scripts you
 wrote unless they are located in one of the directories in this list. Please
 note that it only has effect on plugins loaded after this option. You can
 use multiple B<ModulePath> lines to add more than one directory.
@@ -562,7 +557,7 @@ receive blocks where your callback identifier matches B<python.>I<blockname>.
 
 The callback will be called without arguments.
 
-=item register_read(callback[, interval][, data][, name]) -> identifier
+=item register_read(callback[, interval][, data][, name]) -> I<identifier>
 
 This function takes an additional parameter: I<interval>. It specifies the
 time between calls to the callback function.
@@ -616,7 +611,33 @@ I<identifier> is either the string that was returned by the register function
 or a callback function. The identifier will be constructed in the same way as
 for the register functions.
 
-=item B<flush>(I<plugin[, I<timeout>][, I<identifier>]) -> None
+=item B<get_dataset>(I<name>) -> I<definition>
+
+Returns the definition of a dataset specified by I<name>. I<definition> is a list
+of tuples, each representing one data source. Each tuple has 4 values:
+
+=over 4
+
+=item name
+
+A string, the name of the data source.
+
+=item type
+
+A string that is equal to either of the variables B<DS_TYPE_COUNTER>,
+B<DS_TYPE_GAUGE>, B<DS_TYPE_DERIVE> or B<DS_TYPE_ABSOLUTE>.
+
+=item min
+
+A float or None, the minimum value.
+
+=item max
+
+A float or None, the maximum value.
+
+=back
+
+=item B<flush>(I<plugin>[, I<timeout>][, I<identifier>]) -> None
 
 Flush one or all plugins. I<timeout> and the specified I<identifiers> are
 passed on to the registered flush-callbacks. If omitted, the timeout defaults
index 80e1d5c..8d7622a 100644 (file)
@@ -98,6 +98,7 @@
 #@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_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_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_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_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                                                       #
 #    RoutingKey "collectd"
 #    Persistent false
 #    StoreRates false
+#    ConnectionRetryDelay 0
 #  </Publish>
 #</Plugin>
 
 #  </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 curl_json>
+#  <URL "http://localhost:80/test.json">
+#    Instance "test_http_json"
+#    <Key "testArray/0">
+#      Type "gauge"
+#      # Expect: 1
+#    </Key>
+#    <Key "testArray/1">
+#      Type "gauge"
+#      # Expect: 2
+#    </Key>
+#    <Key "testArrayInbetween/0/blarg">
+#      Type "gauge"
+#      # Expect: 3
+#    </Key>
+#    <Key "testArrayInbetween/1/blub">
+#      Type "gauge"
+#      # Expect: 4
+#    </Key>
+#    <Key "testDirectHit">
+#      Type "gauge"
+#      # Expect: 5
+#    </Key>
+#    <Key "testSubLevelHit/oneMoreLevel">
+#      Type "gauge"
+#      # Expect: 6
+#    </Key>
+#  </URL>
+# put this as test.json on your webserver, the above config demonstraces
+# how to match them.
+# {
+#  "testArray":[1,2],
+#  "testArrayInbetween":[{"blarg":3},{"blub":4}],
+#  "testDirectHit":5,
+#  "testSubLevelHit":{"oneMoreLevel":6}
+# }
 ## See: http://wiki.apache.org/couchdb/Runtime_Statistics
 #  <URL "http://localhost:5984/_stats">
 #    Instance "httpd"
 #<Plugin modbus>
 #      <Data "data_name">
 #              RegisterBase 1234
+#              RegisterCmd ReadHolding
 #              RegisterType float
 #              Type gauge
 #              Instance "..."
 #              Interface "eth0"
 #              ResolveInterval 14400
 @LOAD_PLUGIN_NETWORK@  </Server>
-#      TimeToLive "128"
+#      TimeToLive 128
 #
 #      # server setup:
 #      Listen "ff18::efc0:4a42" "25826"
 #      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"
 #  DeleteGauges   false
 #  DeleteSets     false
 #  TimerPercentile 90.0
+#  TimerPercentile 95.0
+#  TimerPercentile 99.0
+#  TimerLower     false
+#  TimerUpper     false
+#  TimerSum       false
+#  TimerCount     false
 #</Plugin>
 
 #<Plugin swap>
 
 #<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>
 
 #<Plugin write_http>
-#      <URL "http://example.com/collectd-post">
+#      <Node "example">
+#              URL "http://example.com/collectd-post"
 #              User "collectd"
 #              Password "weCh3ik0"
 #              VerifyPeer true
 #              Format "Command"
 #              StoreRates false
 #              BufferSize 4096
-#      </URL>
+#      </Node>
 #</Plugin>
 
 #<Plugin write_kafka>
 #      <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"
+#      Attribute "foo" "bar"
 #</Plugin>
 
 #<Plugin write_tsdb>
 #      </Node>
 #</Plugin>
 
+#<Plugin zookeeper>
+#    Host "localhost"
+#    Port "2181"
+#</Plugin>
+
 ##############################################################################
 # Filter configuration                                                       #
 #----------------------------------------------------------------------------#
index 1a89be3..a0d6f89 100644 (file)
@@ -9,17 +9,17 @@ collectd.conf - Configuration for the system statistics collection daemon B<coll
   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"
@@ -519,6 +519,7 @@ possibly filtering or messages.
  #   ExchangeType "fanout"
  #   RoutingKey "collectd"
  #   Persistent false
+ #   ConnectionRetryDelay 0
  #   Format "command"
  #   StoreRates false
  #   GraphitePrefix "collectd."
@@ -540,6 +541,7 @@ possibly filtering or messages.
  #   QueueDurable false
  #   QueueAutoDelete true
  #   RoutingKey "collectd.#"
+ #   ConnectionRetryDelay 0
    </Subscribe>
  </Plugin>
 
@@ -630,6 +632,13 @@ mode will be used, i.e. delivery is guaranteed. If set to B<false> (the
 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
@@ -1169,6 +1178,74 @@ By default no detailed zone information is collected.
 
 =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
@@ -2880,8 +2957,8 @@ which the sizes of physical memory vary.
 
 =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).
 
@@ -2890,6 +2967,7 @@ B<Synopsis:>
  <Data "voltage-input-1">
    RegisterBase 0
    RegisterType float
+   RegisterCmd ReadHolding
    Type voltage
    Instance "input-1"
  </Data>
@@ -2897,10 +2975,19 @@ B<Synopsis:>
  <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"
@@ -2913,6 +3000,17 @@ B<Synopsis:>
    </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
@@ -2936,6 +3034,11 @@ Specifies what kind of data is returned by the device. If the type is B<Int32>,
 B<Uint32> or B<Float>, two 16E<nbsp>bit registers will be read and the data is
 combined into one value. Defaults to B<Uint16>.
 
+=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
@@ -2961,15 +3064,25 @@ Within E<lt>HostE<nbsp>/E<gt> blocks, the following options are allowed:
 
 =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>
 
@@ -2978,7 +3091,7 @@ host. By default the global B<Interval> setting will be used.
 
 =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.
 
@@ -3109,12 +3222,12 @@ Disabled by default.
 
 Enable the collection of master / slave statistics in a replication setup. In
 order to be able to get access to these statistics, the user needs special
-privileges. See the B<User> documentation above.
+privileges. See the B<User> documentation above. Defaults to B<false>.
 
 =item B<SlaveNotifications> I<true|false>
 
 If enabled, the plugin sends a notification if the replication slave I/O and /
-or SQL threads are not running.
+or SQL threads are not running. Defaults to B<false>.
 
 =item B<ConnectTimeout> I<Seconds>
 
@@ -4245,6 +4358,70 @@ short: If it works for you: Great! But keep in mind that the config I<might>
 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
@@ -4898,6 +5075,10 @@ Specify the username to be used when connecting to the server.
 
 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
@@ -5269,6 +5450,10 @@ which configures the connection parameters for this node.
         Host "localhost"
         Port "6379"
         Timeout 2000
+        <Query "LLEN myqueue">
+          Type "queue_length"
+          Instance "myqueue"
+        <Query>
     </Node>
   </Plugin>
 
@@ -5306,6 +5491,22 @@ 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>
@@ -5410,6 +5611,14 @@ Set the "XFiles Factor". The default is 0.1. If unsure, don't set this option.
 I<Factor> must be in the range C<[0.0-1.0)>, i.e. between zero (inclusive) and
 one (exclusive).
 
+=item B<CollectStatistics> B<false>|B<true>
+
+When set to B<true>, various statistics about the I<rrdcached> daemon will be
+collected, with "rrdcached" as the I<plugin name>. Defaults to B<false>.
+
+Statistics are read via I<rrdcached>s socket using the STATS command.
+See L<rrdcached(1)> for details.
+
 =back
 
 =head2 Plugin C<rrdtool>
@@ -5639,6 +5848,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
@@ -5690,7 +5933,20 @@ that I<Percent> of all reported timers are smaller than or equal to the
 computed latency. This is useful for cutting off the long tail latency, as it's
 often done in I<Service Level Agreements> (SLAs).
 
-If not specified, no percentile is calculated / dispatched.
+Different percentiles can be calculated by setting this option several times.
+If none are specified, no percentiles are calculated / dispatched.
+
+=item B<TimerLower> B<false>|B<true>
+
+=item B<TimerUpper> B<false>|B<true>
+
+=item B<TimerSum> B<false>|B<true>
+
+=item B<TimerCount> B<false>|B<true>
+
+Calculate and dispatch various values out of I<Timer> metrics received during
+an interval. If set to B<False>, the default, these values aren't calculated /
+dispatched.
 
 =back
 
@@ -5949,6 +6205,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>
@@ -5957,6 +6215,8 @@ Add the matched value to the internal counter. In case of B<DeriveAdd>, the
 matched number may be negative, which will effectively subtract from the
 internal counter.
 
+=item B<GaugeInc>
+
 =item B<CounterInc>
 
 =item B<DeriveInc>
@@ -6176,6 +6436,11 @@ connections a mail server or news server has to other mail or news servers, or
 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>
@@ -6305,22 +6570,35 @@ Take the UUID from the given file (default I</etc/uuid>).
 =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>
@@ -6334,29 +6612,24 @@ Inside each E<lt>B<Instance>E<gt> blocks, the following options are recognized:
 
 =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>
 
@@ -6390,7 +6663,14 @@ number of objects tested against purge operations. Only available with Varnish
 =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>
 
@@ -6421,12 +6701,17 @@ the number of requests and bytes transferred. False by default.
 
 =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.
@@ -6494,7 +6779,7 @@ will be collected.
 
 =item B<HostnameFormat> B<name|uuid|hostname|...>
 
-When the libvirt plugin logs data, it sets the hostname of the collected data
+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>.
 
@@ -6510,7 +6795,7 @@ 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
+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>.
@@ -6520,7 +6805,7 @@ interface path might change between reboots of a guest or across migrations.
 
 =item B<PluginInstanceFormat> B<name|uuid>
 
-When the libvirt plugin logs data, it sets the plugin_instance of the collected
+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>.
 
@@ -6754,25 +7039,29 @@ want to use authentication all three fields must be set.
 
 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)>. 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.
+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"
      Format JSON
-   </URL>
+   </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.
@@ -6851,13 +7140,13 @@ Defaults to C<4096>.
 
 =item B<LowSpeedLimit> B<true|false>
 
-If set to B<true>, average transfer speed in bytes per second will be checked. 
-In case it is below B<LowLimitBytesPerSec> connection will be considered slow 
+If set to B<true>, average transfer speed in bytes per second will be checked.
+In case it is below B<LowLimitBytesPerSec> connection will be considered slow
 and aborted.
 
 =item B<LowLimitBytesPerSec> I<Bytes>
 
-Sets bytes per second value for B<LowSpeedLimit> to make a decission if 
+Sets bytes per second value for B<LowSpeedLimit> to make a decission if
 connection is too slow. Default value is C<100>.
 
 =item B<PostTimeoutSec> I<Seconds>
@@ -6974,6 +7263,61 @@ want to set B<metadata.broker.list> to your Kafka broker list.
 
 =back
 
+=head2 Plugin C<write_redis>
+
+The I<write_redis plugin> submits values to I<Redis>, a data structure server.
+
+Synopsis:
+
+  <Plugin "write_redis">
+    <Node "example">
+        Host "localhost"
+        Port "6379"
+        Timeout 1000
+    </Node>
+  </Plugin>
+
+Values are submitted to I<Sorted Sets>, using the metric name as the key, and
+the timestamp as the score. Retrieving a date range can then be done using the
+C<ZRANGEBYSCORE> I<Redis> command. Additionnally, all the identifiers of these
+I<Sorted Sets> are kept in a I<Set> called C<collectd/values> and can be
+retrieved using the C<SMEMBERS> I<Redis> command. See
+L<http://redis.io/commands#sorted_set> and L<http://redis.io/commands#set> for
+details.
+
+The information shown in the synopsis above is the I<default configuration>
+which is used by the plugin if no configuration is present.
+
+The plugin can send values to multiple instances of I<Redis> by specifying
+one B<Node> block for each instance. Within the B<Node> blocks, the following
+options are available:
+
+=over 4
+
+=item B<Node> I<Nodename>
+
+The B<Node> block identifies a new I<Redis> node, that is a new I<Redis>
+instance running in an specified host and port. The name for node is a
+canonical identifier which is used as I<plugin instance>. It is limited to
+64E<nbsp>characters in length.
+
+=item B<Host> I<Hostname>
+
+The B<Host> option is the hostname or IP-address where the I<Redis> instance is
+running on.
+
+=item B<Port> I<Port>
+
+The B<Port> option is the TCP port on which the Redis instance accepts
+connections. Either a service name of a port number may be given. Please note
+that numerical port numbers must be given as a string, too.
+
+=item B<Timeout> I<Timeout in miliseconds>
+
+The B<Timeout> option sets the socket connection timeout, in milliseconds.
+
+=back
+
 =head2 Plugin C<write_riemann>
 
 The I<write_riemann plugin> will send values to I<Riemann>, a powerful stream
@@ -7019,7 +7363,26 @@ Service name or port number to connect to. Defaults to C<5555>.
 =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>
 
@@ -7077,6 +7440,31 @@ attribute for each metric being sent out to I<Riemann>.
 
 =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
 
 Starting with version C<4.3.0> collectd has support for B<monitoring>. By that
index 8fccdb3..fb0403b 100644 (file)
@@ -49,7 +49,11 @@ config-option.
 
 Don't fork to the background. I<collectd> will also B<not> close standard file
 descriptors, detach from the session nor write a pid file. This is mainly
-thought for 'supervising' init replacements such as I<runit>.
+thought for 'supervising' init replacements such as I<runit>. If using
+I<upstart> or I<systemd> though, starting with version 5.5.0 I<collectd> is
+able to notify these two init replacements, and B<does> require forking to the
+background for process supervision. The F<contrib/> directory has sample
+I<upstart> and I<systemd> configuration files.
 
 =item B<-h>
 
index fae7ab9..57af2dd 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
 # define CAN_USE_SYSCTL 0
 #endif
 
-#define CPU_STATE_USER 0
-#define CPU_STATE_SYSTEM 1
-#define CPU_STATE_WAIT 2
-#define CPU_STATE_NICE 3
-#define CPU_STATE_SWAP 4
-#define CPU_STATE_INTERRUPT 5
-#define CPU_STATE_SOFTIRQ 6
-#define CPU_STATE_STEAL 7
-#define CPU_STATE_IDLE 8
-#define CPU_STATE_ACTIVE 9 /* sum of (!idle) */
-#define CPU_STATE_MAX 10 /* #states */
+#define COLLECTD_CPU_STATE_USER 0
+#define COLLECTD_CPU_STATE_SYSTEM 1
+#define COLLECTD_CPU_STATE_WAIT 2
+#define COLLECTD_CPU_STATE_NICE 3
+#define COLLECTD_CPU_STATE_SWAP 4
+#define COLLECTD_CPU_STATE_INTERRUPT 5
+#define COLLECTD_CPU_STATE_SOFTIRQ 6
+#define COLLECTD_CPU_STATE_STEAL 7
+#define COLLECTD_CPU_STATE_IDLE 8
+#define COLLECTD_CPU_STATE_ACTIVE 9 /* sum of (!idle) */
+#define COLLECTD_CPU_STATE_MAX 10 /* #states */
 
 #if HAVE_STATGRAB_H
 # include <statgrab.h>
@@ -131,12 +131,6 @@ static const char *cpu_state_names[] = {
 static mach_port_t port_host;
 static processor_port_array_t cpu_list;
 static mach_msg_type_number_t cpu_list_len;
-
-#if PROCESSOR_TEMPERATURE
-static int cpu_temp_retry_counter = 0;
-static int cpu_temp_retry_step    = 1;
-static int cpu_temp_retry_max     = 1;
-#endif /* PROCESSOR_TEMPERATURE */
 /* #endif PROCESSOR_CPU_LOAD_INFO */
 
 #elif defined(KERNEL_LINUX)
@@ -222,7 +216,7 @@ static int cpu_config (char const *key, char const *value) /* {{{ */
 
 static int init (void)
 {
-#if PROCESSOR_CPU_LOAD_INFO || PROCESSOR_TEMPERATURE
+#if PROCESSOR_CPU_LOAD_INFO
        kern_return_t status;
 
        port_host = mach_host_self ();
@@ -237,8 +231,6 @@ static int init (void)
 
        DEBUG ("host_processors returned %i %s", (int) cpu_list_len, cpu_list_len == 1 ? "processor" : "processors");
        INFO ("cpu plugin: Found %i processor%s.", (int) cpu_list_len, cpu_list_len == 1 ? "" : "s");
-
-       cpu_temp_retry_max = 86400 / CDTIME_T_TO_TIME_T (plugin_get_interval ());
 /* #endif PROCESSOR_CPU_LOAD_INFO */
 
 #elif defined(HAVE_LIBKSTAT)
@@ -368,7 +360,7 @@ static int cpu_states_alloc (size_t cpu_num) /* {{{ */
        cpu_state_t *tmp;
        size_t sz;
 
-       sz = (((size_t) cpu_num) + 1) * CPU_STATE_MAX;
+       sz = (((size_t) cpu_num) + 1) * COLLECTD_CPU_STATE_MAX;
        assert (sz > 0);
 
        /* We already have enough space. */
@@ -391,7 +383,7 @@ static int cpu_states_alloc (size_t cpu_num) /* {{{ */
 
 static cpu_state_t *get_cpu_state (size_t cpu_num, size_t state) /* {{{ */
 {
-       size_t index = ((cpu_num * CPU_STATE_MAX) + state);
+       size_t index = ((cpu_num * COLLECTD_CPU_STATE_MAX) + state);
 
        if (index >= cpu_states_num)
                return (NULL);
@@ -399,58 +391,61 @@ static cpu_state_t *get_cpu_state (size_t cpu_num, size_t state) /* {{{ */
        return (&cpu_states[index]);
 } /* }}} cpu_state_t *get_cpu_state */
 
-/* Populates the per-CPU CPU_STATE_ACTIVE rate and the global rate_by_state
+/* Populates the per-CPU COLLECTD_CPU_STATE_ACTIVE rate and the global rate_by_state
  * array. */
 static void aggregate (gauge_t *sum_by_state) /* {{{ */
 {
        size_t cpu_num;
        size_t state;
 
-       for (state = 0; state < CPU_STATE_MAX; state++)
+       for (state = 0; state < COLLECTD_CPU_STATE_MAX; state++)
                sum_by_state[state] = NAN;
 
        for (cpu_num = 0; cpu_num < global_cpu_num; cpu_num++)
        {
                cpu_state_t *this_cpu_states = get_cpu_state (cpu_num, 0);
 
-               this_cpu_states[CPU_STATE_ACTIVE].rate = NAN;
+               this_cpu_states[COLLECTD_CPU_STATE_ACTIVE].rate = NAN;
 
-               for (state = 0; state < CPU_STATE_ACTIVE; state++)
+               for (state = 0; state < COLLECTD_CPU_STATE_ACTIVE; state++)
                {
                        if (!this_cpu_states[state].has_value)
                                continue;
 
                        RATE_ADD (sum_by_state[state], this_cpu_states[state].rate);
-                       if (state != CPU_STATE_IDLE)
-                               RATE_ADD (this_cpu_states[CPU_STATE_ACTIVE].rate, this_cpu_states[state].rate);
+                       if (state != COLLECTD_CPU_STATE_IDLE)
+                               RATE_ADD (this_cpu_states[COLLECTD_CPU_STATE_ACTIVE].rate, this_cpu_states[state].rate);
                }
 
-               RATE_ADD (sum_by_state[CPU_STATE_ACTIVE], this_cpu_states[CPU_STATE_ACTIVE].rate);
+               if (!isnan (this_cpu_states[COLLECTD_CPU_STATE_ACTIVE].rate))
+                       this_cpu_states[COLLECTD_CPU_STATE_ACTIVE].has_value = 1;
+
+               RATE_ADD (sum_by_state[COLLECTD_CPU_STATE_ACTIVE], this_cpu_states[COLLECTD_CPU_STATE_ACTIVE].rate);
        }
 } /* }}} void aggregate */
 
 /* Commits (dispatches) the values for one CPU or the global aggregation.
  * cpu_num is the index of the CPU to be committed or -1 in case of the global
- * aggregation. rates is a pointer to CPU_STATE_MAX gauge_t values holding the
+ * aggregation. rates is a pointer to COLLECTD_CPU_STATE_MAX gauge_t values holding the
  * current rate; each rate may be NAN. Calculates the percentage of each state
  * and dispatches the metric. */
 static void cpu_commit_one (int cpu_num, /* {{{ */
-               gauge_t rates[static CPU_STATE_MAX])
+               gauge_t rates[static COLLECTD_CPU_STATE_MAX])
 {
        size_t state;
        gauge_t sum;
 
-       sum = rates[CPU_STATE_ACTIVE];
-       RATE_ADD (sum, rates[CPU_STATE_IDLE]);
+       sum = rates[COLLECTD_CPU_STATE_ACTIVE];
+       RATE_ADD (sum, rates[COLLECTD_CPU_STATE_IDLE]);
 
        if (!report_by_state)
        {
-               gauge_t percent = 100.0 * rates[CPU_STATE_ACTIVE] / sum;
-               submit_percent (cpu_num, CPU_STATE_ACTIVE, percent);
+               gauge_t percent = 100.0 * rates[COLLECTD_CPU_STATE_ACTIVE] / sum;
+               submit_percent (cpu_num, COLLECTD_CPU_STATE_ACTIVE, percent);
                return;
        }
 
-       for (state = 0; state < CPU_STATE_ACTIVE; state++)
+       for (state = 0; state < COLLECTD_CPU_STATE_ACTIVE; state++)
        {
                gauge_t percent = 100.0 * rates[state] / sum;
                submit_percent (cpu_num, state, percent);
@@ -472,13 +467,13 @@ static void cpu_reset (void) /* {{{ */
 /* Legacy behavior: Dispatches the raw derive values without any aggregation. */
 static void cpu_commit_without_aggregation (void) /* {{{ */
 {
-       size_t cpu_num;
+       int state;
 
-       for (cpu_num = 0; cpu_num < global_cpu_num; cpu_num++)
+       for (state = 0; state < COLLECTD_CPU_STATE_ACTIVE; state++)
        {
-               int state;
+               size_t cpu_num;
 
-               for (state = 0; state < CPU_STATE_ACTIVE; state++)
+               for (cpu_num = 0; cpu_num < global_cpu_num; cpu_num++)
                {
                        cpu_state_t *s = get_cpu_state (cpu_num, state);
 
@@ -493,12 +488,12 @@ static void cpu_commit_without_aggregation (void) /* {{{ */
 /* Aggregates the internal state and dispatches the metrics. */
 static void cpu_commit (void) /* {{{ */
 {
-       gauge_t global_rates[CPU_STATE_MAX] = {
-               NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN
+       gauge_t global_rates[COLLECTD_CPU_STATE_MAX] = {
+               NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN /* Batman! */
        };
        size_t cpu_num;
 
-       if (report_by_cpu && report_by_state && !report_percent)
+       if (report_by_state && report_by_cpu && !report_percent)
        {
                cpu_commit_without_aggregation ();
                return;
@@ -515,12 +510,12 @@ static void cpu_commit (void) /* {{{ */
        for (cpu_num = 0; cpu_num < global_cpu_num; cpu_num++)
        {
                cpu_state_t *this_cpu_states = get_cpu_state (cpu_num, 0);
-               gauge_t local_rates[CPU_STATE_MAX] = {
+               gauge_t local_rates[COLLECTD_CPU_STATE_MAX] = {
                        NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN
                };
                size_t state;
 
-               for (state = 0; state < CPU_STATE_ACTIVE; state++)
+               for (state = 0; state < COLLECTD_CPU_STATE_MAX; state++)
                        if (this_cpu_states[state].has_value)
                                local_rates[state] = this_cpu_states[state].rate;
 
@@ -537,7 +532,7 @@ static int cpu_stage (size_t cpu_num, size_t state, derive_t value, cdtime_t now
        cpu_state_t *s;
        value_t v;
 
-       if (state >= CPU_STATE_ACTIVE)
+       if (state >= COLLECTD_CPU_STATE_ACTIVE)
                return (EINVAL);
 
        status = cpu_states_alloc (cpu_num);
@@ -563,90 +558,40 @@ static int cpu_read (void)
 {
        cdtime_t now = cdtime ();
 
-#if PROCESSOR_CPU_LOAD_INFO || PROCESSOR_TEMPERATURE /* {{{ */
+#if PROCESSOR_CPU_LOAD_INFO /* {{{ */
        int cpu;
 
        kern_return_t status;
 
-#if PROCESSOR_CPU_LOAD_INFO
        processor_cpu_load_info_data_t cpu_info;
        mach_msg_type_number_t         cpu_info_len;
-#endif
-#if PROCESSOR_TEMPERATURE
-       processor_info_data_t          cpu_temp;
-       mach_msg_type_number_t         cpu_temp_len;
-#endif
 
        host_t cpu_host;
 
        for (cpu = 0; cpu < cpu_list_len; cpu++)
        {
-#if PROCESSOR_CPU_LOAD_INFO
                cpu_host = 0;
                cpu_info_len = PROCESSOR_BASIC_INFO_COUNT;
 
-               if ((status = processor_info (cpu_list[cpu],
-                                               PROCESSOR_CPU_LOAD_INFO, &cpu_host,
-                                               (processor_info_t) &cpu_info, &cpu_info_len)) != KERN_SUCCESS)
-               {
-                       ERROR ("cpu plugin: processor_info failed with status %i", (int) status);
-                       continue;
-               }
-
-               if (cpu_info_len < CPU_STATE_MAX)
-               {
-                       ERROR ("cpu plugin: processor_info returned only %i elements..", cpu_info_len);
-                       continue;
-               }
-
-               cpu_stage (cpu, CPU_STATE_USER,   (derive_t) cpu_info.cpu_ticks[CPU_STATE_USER],   now);
-               cpu_stage (cpu, CPU_STATE_NICE,   (derive_t) cpu_info.cpu_ticks[CPU_STATE_NICE],   now);
-               cpu_stage (cpu, CPU_STATE_SYSTEM, (derive_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM], now);
-               cpu_stage (cpu, CPU_STATE_IDLE,   (derive_t) cpu_info.cpu_ticks[CPU_STATE_IDLE],   now);
-#endif /* PROCESSOR_CPU_LOAD_INFO */
-
-#if PROCESSOR_TEMPERATURE
-               /*
-                * Not all Apple computers do have this ability. To minimize
-                * the messages sent to the syslog we do an exponential
-                * stepback if `processor_info' fails. We still try ~once a day
-                * though..
-                */
-               if (cpu_temp_retry_counter > 0)
-               {
-                       cpu_temp_retry_counter--;
-                       continue;
-               }
-
-               cpu_temp_len = PROCESSOR_INFO_MAX;
-
-               status = processor_info (cpu_list[cpu],
-                               PROCESSOR_TEMPERATURE,
-                               &cpu_host,
-                               cpu_temp, &cpu_temp_len);
+               status = processor_info (cpu_list[cpu], PROCESSOR_CPU_LOAD_INFO, &cpu_host,
+                               (processor_info_t) &cpu_info, &cpu_info_len);
                if (status != KERN_SUCCESS)
                {
-                       ERROR ("cpu plugin: processor_info failed: %s",
+                       ERROR ("cpu plugin: processor_info (PROCESSOR_CPU_LOAD_INFO) failed: %s",
                                        mach_error_string (status));
-
-                       cpu_temp_retry_counter = cpu_temp_retry_step;
-                       cpu_temp_retry_step *= 2;
-                       if (cpu_temp_retry_step > cpu_temp_retry_max)
-                               cpu_temp_retry_step = cpu_temp_retry_max;
-
                        continue;
                }
 
-               if (cpu_temp_len != 1)
+               if (cpu_info_len < COLLECTD_CPU_STATE_MAX)
                {
-                       DEBUG ("processor_info (PROCESSOR_TEMPERATURE) returned %i elements..?",
-                                       (int) cpu_temp_len);
+                       ERROR ("cpu plugin: processor_info returned only %i elements..", cpu_info_len);
                        continue;
                }
 
-               cpu_temp_retry_counter = 0;
-               cpu_temp_retry_step    = 1;
-#endif /* PROCESSOR_TEMPERATURE */
+               cpu_stage (cpu, COLLECTD_CPU_STATE_USER,   (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_USER],   now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_NICE,   (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_NICE],   now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_SYSTEM, (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_SYSTEM], now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_IDLE,   (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_IDLE],   now);
        }
 /* }}} #endif PROCESSOR_CPU_LOAD_INFO */
 
@@ -679,19 +624,19 @@ static int cpu_read (void)
 
                cpu = atoi (fields[0] + 3);
 
-               cpu_stage (cpu, CPU_STATE_USER,   (derive_t) atoll(fields[1]), now);
-               cpu_stage (cpu, CPU_STATE_NICE,   (derive_t) atoll(fields[2]), now);
-               cpu_stage (cpu, CPU_STATE_SYSTEM, (derive_t) atoll(fields[3]), now);
-               cpu_stage (cpu, CPU_STATE_IDLE,   (derive_t) atoll(fields[4]), now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_USER,   (derive_t) atoll(fields[1]), now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_NICE,   (derive_t) atoll(fields[2]), now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_SYSTEM, (derive_t) atoll(fields[3]), now);
+               cpu_stage (cpu, COLLECTD_CPU_STATE_IDLE,   (derive_t) atoll(fields[4]), now);
 
                if (numfields >= 8)
                {
-                       cpu_stage (cpu, CPU_STATE_WAIT,      (derive_t) atoll(fields[5]), now);
-                       cpu_stage (cpu, CPU_STATE_INTERRUPT, (derive_t) atoll(fields[6]), now);
-                       cpu_stage (cpu, CPU_STATE_SOFTIRQ,   (derive_t) atoll(fields[7]), now);
+                       cpu_stage (cpu, COLLECTD_CPU_STATE_WAIT,      (derive_t) atoll(fields[5]), now);
+                       cpu_stage (cpu, COLLECTD_CPU_STATE_INTERRUPT, (derive_t) atoll(fields[6]), now);
+                       cpu_stage (cpu, COLLECTD_CPU_STATE_SOFTIRQ,   (derive_t) atoll(fields[7]), now);
 
                        if (numfields >= 9)
-                               cpu_stage (cpu, CPU_STATE_STEAL, (derive_t) atoll(fields[8]), now);
+                               cpu_stage (cpu, COLLECTD_CPU_STATE_STEAL, (derive_t) atoll(fields[8]), now);
                }
        }
        fclose (fh);
@@ -709,10 +654,10 @@ static int cpu_read (void)
                if (kstat_read (kc, ksp[cpu], &cs) == -1)
                        continue; /* error message? */
 
-               cpu_stage (ksp[cpu]->ks_instance, CPU_STATE_IDLE,   (derive_t) cs.cpu_sysinfo.cpu[CPU_IDLE],   now);
-               cpu_stage (ksp[cpu]->ks_instance, CPU_STATE_USER,   (derive_t) cs.cpu_sysinfo.cpu[CPU_USER],   now);
-               cpu_stage (ksp[cpu]->ks_instance, CPU_STATE_SYSTEM, (derive_t) cs.cpu_sysinfo.cpu[CPU_KERNEL], now);
-               cpu_stage (ksp[cpu]->ks_instance, CPU_STATE_WAIT,   (derive_t) cs.cpu_sysinfo.cpu[CPU_WAIT],   now);
+               cpu_stage (ksp[cpu]->ks_instance, COLLECTD_CPU_STATE_IDLE,   (derive_t) cs.cpu_sysinfo.cpu[CPU_IDLE],   now);
+               cpu_stage (ksp[cpu]->ks_instance, COLLECTD_CPU_STATE_USER,   (derive_t) cs.cpu_sysinfo.cpu[CPU_USER],   now);
+               cpu_stage (ksp[cpu]->ks_instance, COLLECTD_CPU_STATE_SYSTEM, (derive_t) cs.cpu_sysinfo.cpu[CPU_KERNEL], now);
+               cpu_stage (ksp[cpu]->ks_instance, COLLECTD_CPU_STATE_WAIT,   (derive_t) cs.cpu_sysinfo.cpu[CPU_WAIT],   now);
        }
 /* }}} #endif defined(HAVE_LIBKSTAT) */
 
@@ -772,11 +717,11 @@ static int cpu_read (void)
        }
 
        for (i = 0; i < numcpu; i++) {
-               cpu_state (i, CPU_STATE_USER,      (derive_t) cpuinfo[i][CP_USER]);
-               cpu_state (i, CPU_STATE_NICE,      (derive_t) cpuinfo[i][CP_NICE]);
-               cpu_state (i, CPU_STATE_SYSTEM,    (derive_t) cpuinfo[i][CP_SYS]);
-               cpu_state (i, CPU_STATE_IDLE,      (derive_t) cpuinfo[i][CP_IDLE]);
-               cpu_state (i, CPU_STATE_INTERRUPT, (derive_t) cpuinfo[i][CP_INTR]);
+               cpu_stage (i, COLLECTD_CPU_STATE_USER,      (derive_t) cpuinfo[i][CP_USER], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_NICE,      (derive_t) cpuinfo[i][CP_NICE], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_SYSTEM,    (derive_t) cpuinfo[i][CP_SYS], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_IDLE,      (derive_t) cpuinfo[i][CP_IDLE], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_INTERRUPT, (derive_t) cpuinfo[i][CP_INTR], now);
        }
 /* }}} #endif CAN_USE_SYSCTL */
 
@@ -797,11 +742,11 @@ static int cpu_read (void)
        }
 
        for (i = 0; i < numcpu; i++) {
-               cpu_state (i, CPU_STATE_USER,      (derive_t) cpuinfo[i][CP_USER]);
-               cpu_state (i, CPU_STATE_NICE,      (derive_t) cpuinfo[i][CP_NICE]);
-               cpu_state (i, CPU_STATE_SYSTEM,    (derive_t) cpuinfo[i][CP_SYS]);
-               cpu_state (i, CPU_STATE_IDLE,      (derive_t) cpuinfo[i][CP_IDLE]);
-               cpu_state (i, CPU_STATE_INTERRUPT, (derive_t) cpuinfo[i][CP_INTR]);
+               cpu_stage (i, COLLECTD_CPU_STATE_USER,      (derive_t) cpuinfo[i][CP_USER], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_NICE,      (derive_t) cpuinfo[i][CP_NICE], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_SYSTEM,    (derive_t) cpuinfo[i][CP_SYS], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_IDLE,      (derive_t) cpuinfo[i][CP_IDLE], now);
+               cpu_stage (i, COLLECTD_CPU_STATE_INTERRUPT, (derive_t) cpuinfo[i][CP_INTR], now);
        }
 /* }}} #endif HAVE_SYSCTL_KERN_CP_TIMES */
 
@@ -819,11 +764,11 @@ static int cpu_read (void)
                return (-1);
        }
 
-       cpu_state (0, CPU_STATE_USER,      (derive_t) cpuinfo[CP_USER]);
-       cpu_state (0, CPU_STATE_NICE,      (derive_t) cpuinfo[CP_NICE]);
-       cpu_state (0, CPU_STATE_SYSTEM,    (derive_t) cpuinfo[CP_SYS]);
-       cpu_state (0, CPU_STATE_IDLE,      (derive_t) cpuinfo[CP_IDLE]);
-       cpu_state (0, CPU_STATE_INTERRUPT, (derive_t) cpuinfo[CP_INTR]);
+       cpu_stage (0, COLLECTD_CPU_STATE_USER,      (derive_t) cpuinfo[CP_USER], now);
+       cpu_stage (0, COLLECTD_CPU_STATE_NICE,      (derive_t) cpuinfo[CP_NICE], now);
+       cpu_stage (0, COLLECTD_CPU_STATE_SYSTEM,    (derive_t) cpuinfo[CP_SYS], now);
+       cpu_stage (0, COLLECTD_CPU_STATE_IDLE,      (derive_t) cpuinfo[CP_IDLE], now);
+       cpu_stage (0, COLLECTD_CPU_STATE_INTERRUPT, (derive_t) cpuinfo[CP_INTR], now);
 /* }}} #endif HAVE_SYSCTLBYNAME */
 
 #elif defined(HAVE_LIBSTATGRAB) /* {{{ */
@@ -836,12 +781,12 @@ static int cpu_read (void)
                return (-1);
        }
 
-       cpu_state (0, CPU_STATE_IDLE,   (derive_t) cs->idle);
-       cpu_state (0, CPU_STATE_NICE,   (derive_t) cs->nice);
-       cpu_state (0, CPU_STATE_SWAP,   (derive_t) cs->swap);
-       cpu_state (0, CPU_STATE_SYSTEM, (derive_t) cs->kernel);
-       cpu_state (0, CPU_STATE_USER,   (derive_t) cs->user);
-       cpu_state (0, CPU_STATE_WAIT,   (derive_t) cs->iowait);
+       cpu_state (0, COLLECTD_CPU_STATE_IDLE,   (derive_t) cs->idle);
+       cpu_state (0, COLLECTD_CPU_STATE_NICE,   (derive_t) cs->nice);
+       cpu_state (0, COLLECTD_CPU_STATE_SWAP,   (derive_t) cs->swap);
+       cpu_state (0, COLLECTD_CPU_STATE_SYSTEM, (derive_t) cs->kernel);
+       cpu_state (0, COLLECTD_CPU_STATE_USER,   (derive_t) cs->user);
+       cpu_state (0, COLLECTD_CPU_STATE_WAIT,   (derive_t) cs->iowait);
 /* }}} #endif HAVE_LIBSTATGRAB */
 
 #elif defined(HAVE_PERFSTAT) /* {{{ */
@@ -876,10 +821,10 @@ static int cpu_read (void)
 
        for (i = 0; i < cpus; i++)
        {
-               cpu_stage (i, CPU_STATE_IDLE,   (derive_t) perfcpu[i].idle, now);
-               cpu_stage (i, CPU_STATE_SYSTEM, (derive_t) perfcpu[i].sys,  now);
-               cpu_stage (i, CPU_STATE_USER,   (derive_t) perfcpu[i].user, now);
-               cpu_stage (i, CPU_STATE_WAIT,   (derive_t) perfcpu[i].wait, now);
+               cpu_stage (i, COLLECTD_CPU_STATE_IDLE,   (derive_t) perfcpu[i].idle, now);
+               cpu_stage (i, COLLECTD_CPU_STATE_SYSTEM, (derive_t) perfcpu[i].sys,  now);
+               cpu_stage (i, COLLECTD_CPU_STATE_USER,   (derive_t) perfcpu[i].user, now);
+               cpu_stage (i, COLLECTD_CPU_STATE_WAIT,   (derive_t) perfcpu[i].wait, now);
        }
 #endif /* }}} HAVE_PERFSTAT */
 
index 8a084fe..09db786 100644 (file)
@@ -231,12 +231,17 @@ static int cj_cb_number (void *ctx,
   buffer[sizeof (buffer) - 1] = 0;
 
   if ((key == NULL) || !CJ_IS_KEY (key)) {
-    if (key != NULL)
+    if (key != NULL && !db->state[db->depth].in_array/*can be inhomogeneous*/)
       NOTICE ("curl_json plugin: Found \"%s\", but the configuration expects"
               " a map.", buffer);
-    cj_cb_inc_array_index (ctx, /* update_key = */ 0);
-    return (CJ_CB_CONTINUE);
-  } else {
+    cj_cb_inc_array_index (ctx, /* update_key = */ 1);
+    key = db->state[db->depth].key;
+    if (key == NULL) {
+      return (CJ_CB_CONTINUE);
+    }
+  }
+  else
+  {
     cj_cb_inc_array_index (ctx, /* update_key = */ 1);
   }
 
@@ -276,10 +281,21 @@ static int cj_cb_map_key (void *ctx,
     memcpy (name, in_name, name_len);
     name[name_len] = 0;
 
-    if (c_avl_get (tree, name, (void *) &value) == 0)
-      db->state[db->depth].key = value;
+    if (c_avl_get (tree, name, (void *) &value) == 0) {
+      if (CJ_IS_KEY((cj_key_t*)value)) {
+        db->state[db->depth].key = value;
+      }
+      else {
+        db->state[db->depth].tree = (c_avl_tree_t*) value;
+      }
+    }
     else if (c_avl_get (tree, CJ_ANY, (void *) &value) == 0)
-      db->state[db->depth].key = value;
+      if (CJ_IS_KEY((cj_key_t*)value)) {
+        db->state[db->depth].key = value;
+      }
+      else {
+        db->state[db->depth].tree = (c_avl_tree_t*) value;
+      }
     else
       db->state[db->depth].key = NULL;
   }
@@ -592,6 +608,8 @@ static int cj_init_curl (cj_t *db) /* {{{ */
   curl_easy_setopt (db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
   curl_easy_setopt (db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf);
   curl_easy_setopt (db->curl, CURLOPT_URL, db->url);
+  curl_easy_setopt (db->curl, CURLOPT_FOLLOWLOCATION, 1L);
+  curl_easy_setopt (db->curl, CURLOPT_MAXREDIRS, 50L);
 
   if (db->user != NULL)
   {
index c0ab6fd..c9f0651 100644 (file)
@@ -842,6 +842,8 @@ static int cx_init_curl (cx_t *db) /* {{{ */
   curl_easy_setopt (db->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
   curl_easy_setopt (db->curl, CURLOPT_ERRORBUFFER, db->curl_errbuf);
   curl_easy_setopt (db->curl, CURLOPT_URL, db->url);
+  curl_easy_setopt (db->curl, CURLOPT_FOLLOWLOCATION, 1L);
+  curl_easy_setopt (db->curl, CURLOPT_MAXREDIRS, 50L);
 
   if (db->user != NULL)
   {
index d6067d7..fc81554 100644 (file)
@@ -2,7 +2,8 @@ if COMPILER_IS_GCC
 AM_CFLAGS = -Wall -Werror
 endif
 
-AM_CPPFLAGS = -DPREFIX='"${prefix}"'
+AM_CPPFLAGS = -I$(top_srcdir)/src
+AM_CPPFLAGS += -DPREFIX='"${prefix}"'
 AM_CPPFLAGS += -DCONFIGFILE='"${sysconfdir}/${PACKAGE_NAME}.conf"'
 AM_CPPFLAGS += -DLOCALSTATEDIR='"${localstatedir}"'
 AM_CPPFLAGS += -DPKGLOCALSTATEDIR='"${localstatedir}/lib/${PACKAGE_NAME}"'
index 2e2d821..1b9c374 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/un.h>
 #include <netdb.h>
 
 #include <pthread.h>
@@ -191,7 +192,7 @@ static int change_basedir (const char *orig_dir)
                                sstrerror (errno, errbuf, sizeof (errbuf)));
                return (-1);
        }
-       
+
        dirlen = strlen (dir);
        while ((dirlen > 0) && (dir[dirlen - 1] == '/'))
                dir[--dirlen] = '\0';
@@ -270,7 +271,7 @@ static void update_kstat (void)
 static void exit_usage (int status)
 {
        printf ("Usage: "PACKAGE" [OPTIONS]\n\n"
-                       
+
                        "Available options:\n"
                        "  General:\n"
                        "    -C <file>       Configuration file.\n"
@@ -307,7 +308,11 @@ static int do_init (void)
 #endif
 
 #if HAVE_LIBSTATGRAB
-       if (sg_init ())
+       if (sg_init (
+# if HAVE_LIBSTATGRAB_0_90
+                   0
+# endif
+                   ))
        {
                ERROR ("sg_init: %s", sg_str_error (sg_get_error ()));
                return (-1);
@@ -409,6 +414,74 @@ static int pidfile_remove (void)
 } /* static int pidfile_remove (const char *file) */
 #endif /* COLLECT_DAEMON */
 
+#ifdef KERNEL_LINUX
+int notify_upstart (void)
+{
+    const char  *upstart_job = getenv("UPSTART_JOB");
+
+    if (upstart_job == NULL)
+        return 0;
+
+    if (strcmp(upstart_job, "collectd") != 0)
+        return 0;
+
+    WARNING ("supervised by upstart, will stop to signal readyness");
+    raise(SIGSTOP);
+    unsetenv("UPSTART_JOB");
+
+    return 1;
+}
+
+int notify_systemd (void)
+{
+    int                  fd = -1;
+    const char          *notifysocket = getenv("NOTIFY_SOCKET");
+    struct sockaddr_un   su;
+    struct iovec         iov;
+    struct msghdr        hdr;
+
+    if (notifysocket == NULL)
+        return 0;
+
+    if ((strchr("@/", notifysocket[0])) == NULL ||
+        strlen(notifysocket) < 2)
+        return 0;
+
+    WARNING ("supervised by systemd, will signal readyness");
+    if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
+        WARNING ("cannot contact systemd socket %s", notifysocket);
+        return 0;
+    }
+
+    bzero(&su, sizeof(su));
+    su.sun_family = AF_UNIX;
+    sstrncpy (su.sun_path, notifysocket, sizeof(su.sun_path));
+
+    if (notifysocket[0] == '@')
+        su.sun_path[0] = 0;
+
+    bzero(&iov, sizeof(iov));
+    iov.iov_base = "READY=1";
+    iov.iov_len = strlen("READY=1");
+
+    bzero(&hdr, sizeof(hdr));
+    hdr.msg_name = &su;
+    hdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) +
+        strlen(notifysocket);
+    hdr.msg_iov = &iov;
+    hdr.msg_iovlen = 1;
+
+    unsetenv("NOTIFY_SOCKET");
+    if (sendmsg(fd, &hdr, MSG_NOSIGNAL) < 0) {
+        WARNING ("cannot send notification to systemd");
+        close(fd);
+        return 0;
+    }
+    close(fd);
+    return 1;
+}
+#endif /* KERNEL_LINUX */
+
 int main (int argc, char **argv)
 {
        struct sigaction sig_int_action;
@@ -525,7 +598,15 @@ int main (int argc, char **argv)
        sig_chld_action.sa_handler = SIG_IGN;
        sigaction (SIGCHLD, &sig_chld_action, NULL);
 
-       if (daemonize)
+    /*
+     * Only daemonize if we're not being supervised
+     * by upstart or systemd (when using Linux).
+     */
+       if (daemonize
+#ifdef KERNEL_LINUX
+           && notify_upstart() == 0 && notify_systemd() == 0
+#endif
+       )
        {
                if ((pid = fork ()) == -1)
                {
index 535dfad..e2b618f 100644 (file)
@@ -475,8 +475,8 @@ size_t strstripnewline (char *buffer)
                if ((buffer[buffer_len - 1] != '\n')
                                && (buffer[buffer_len - 1] != '\r'))
                        break;
-               buffer[buffer_len] = 0;
                buffer_len--;
+               buffer[buffer_len] = 0;
        }
 
        return (buffer_len);
index c87b877..b93435f 100644 (file)
@@ -78,6 +78,15 @@ struct fc_chain_s /* {{{ */
   fc_chain_t  *next;
 }; /* }}} */
 
+/* Writer configuration. */
+struct fc_writer_s;
+typedef struct fc_writer_s fc_writer_t; /* {{{ */
+struct fc_writer_s
+{
+  char *plugin;
+  c_complain_t complaint;
+}; /* }}} */
+
 /*
  * Global variables
  */
@@ -627,16 +636,13 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */
 {
   int i;
 
-  char **plugin_list;
-  size_t plugin_list_len;
-
-  plugin_list = NULL;
-  plugin_list_len = 0;
+  fc_writer_t *plugin_list = NULL;
+  size_t plugin_list_len = 0;
 
   for (i = 0; i < ci->children_num; i++)
   {
     oconfig_item_t *child = ci->children + i;
-    char **temp;
+    fc_writer_t *temp;
     int j;
 
     if (strcasecmp ("Plugin", child->key) != 0)
@@ -649,14 +655,17 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */
 
     for (j = 0; j < child->values_num; j++)
     {
+      char *plugin;
+
       if (child->values[j].type != OCONFIG_TYPE_STRING)
       {
         ERROR ("Filter subsystem: Built-in target `write': "
             "The `Plugin' option accepts only string arguments.");
         continue;
       }
+      plugin = child->values[j].value.string;
 
-      temp = (char **) realloc (plugin_list, (plugin_list_len + 2)
+      temp = (fc_writer_t *) realloc (plugin_list, (plugin_list_len + 2)
           * (sizeof (*plugin_list)));
       if (temp == NULL)
       {
@@ -665,14 +674,15 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */
       }
       plugin_list = temp;
 
-      plugin_list[plugin_list_len] = fc_strdup (child->values[j].value.string);
-      if (plugin_list[plugin_list_len] == NULL)
+      plugin_list[plugin_list_len].plugin = fc_strdup (plugin);
+      if (plugin_list[plugin_list_len].plugin == NULL)
       {
         ERROR ("fc_bit_write_create: fc_strdup failed.");
         continue;
       }
+      C_COMPLAIN_INIT (&plugin_list[plugin_list_len].complaint);
       plugin_list_len++;
-      plugin_list[plugin_list_len] = NULL;
+      plugin_list[plugin_list_len].plugin = NULL;
     } /* for (j = 0; j < child->values_num; j++) */
   } /* for (i = 0; i < ci->children_num; i++) */
 
@@ -683,7 +693,7 @@ static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */
 
 static int fc_bit_write_destroy (void **user_data) /* {{{ */
 {
-  char **plugin_list;
+  fc_writer_t *plugin_list;
   size_t i;
 
   if ((user_data == NULL) || (*user_data == NULL))
@@ -691,8 +701,8 @@ static int fc_bit_write_destroy (void **user_data) /* {{{ */
 
   plugin_list = *user_data;
 
-  for (i = 0; plugin_list[i] != NULL; i++)
-    free (plugin_list[i]);
+  for (i = 0; plugin_list[i].plugin != NULL; i++)
+    free (plugin_list[i].plugin);
   free (plugin_list);
 
   return (0);
@@ -702,23 +712,23 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */
     value_list_t *vl, notification_meta_t __attribute__((unused)) **meta,
     void **user_data)
 {
-  char **plugin_list;
+  fc_writer_t *plugin_list;
   int status;
 
   plugin_list = NULL;
   if (user_data != NULL)
     plugin_list = *user_data;
 
-  if ((plugin_list == NULL) || (plugin_list[0] == NULL))
+  if ((plugin_list == NULL) || (plugin_list[0].plugin == NULL))
   {
-    static c_complain_t enoent_complaint = C_COMPLAIN_INIT_STATIC;
+    static c_complain_t write_complaint = C_COMPLAIN_INIT_STATIC;
 
     status = plugin_write (/* plugin = */ NULL, ds, vl);
     if (status == ENOENT)
     {
       /* in most cases this is a permanent error, so use the complain
        * mechanism rather than spamming the logs */
-      c_complain (LOG_INFO, &enoent_complaint,
+      c_complain (LOG_INFO, &write_complaint,
           "Filter subsystem: Built-in target `write': Dispatching value to "
           "all write plugins failed with status %i (ENOENT). "
           "Most likely this means you didn't load any write plugins.",
@@ -726,13 +736,16 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */
     }
     else if (status != 0)
     {
-      INFO ("Filter subsystem: Built-in target `write': Dispatching value to "
+      /* often, this is a permanent error (e.g. target system unavailable),
+       * so use the complain mechanism rather than spamming the logs */
+      c_complain (LOG_INFO, &write_complaint,
+          "Filter subsystem: Built-in target `write': Dispatching value to "
           "all write plugins failed with status %i.", status);
     }
     else
     {
       assert (status == 0);
-      c_release (LOG_INFO, &enoent_complaint, "Filter subsystem: "
+      c_release (LOG_INFO, &write_complaint, "Filter subsystem: "
           "Built-in target `write': Some write plugin is back to normal "
           "operation. `write' succeeded.");
     }
@@ -741,13 +754,21 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */
   {
     size_t i;
 
-    for (i = 0; plugin_list[i] != NULL; i++)
+    for (i = 0; plugin_list[i].plugin != NULL; i++)
     {
-      status = plugin_write (plugin_list[i], ds, vl);
+      status = plugin_write (plugin_list[i].plugin, ds, vl);
       if (status != 0)
       {
-        INFO ("Filter subsystem: Built-in target `write': Dispatching value to "
-            "the `%s' plugin failed with status %i.", plugin_list[i], status);
+        c_complain (LOG_INFO, &plugin_list[i].complaint,
+            "Filter subsystem: Built-in target `write': Dispatching value to "
+            "the `%s' plugin failed with status %i.",
+            plugin_list[i].plugin, status);
+      }
+      else
+      {
+        c_release (LOG_INFO, &plugin_list[i].complaint,
+            "Filter subsystem: Built-in target `write': Plugin `%s' is back "
+            "to normal operation. `write' succeeded.", plugin_list[i].plugin);
       }
     } /* for (i = 0; plugin_list[i] != NULL; i++) */
   }
index cd99204..25bd37b 100644 (file)
 #include "utils_time.h"
 #include "utils_random.h"
 
-#if HAVE_PTHREAD_H
-# include <pthread.h>
-#endif
-
 #include <ltdl.h>
 
 /*
@@ -397,7 +393,7 @@ static int plugin_load_file (char *file, uint32_t flags)
 
                ssnprintf (errbuf, sizeof (errbuf),
                                "lt_dlopen (\"%s\") failed: %s. "
-                               "The most common cause for this problem are "
+                               "The most common cause for this problem is "
                                "missing dependencies. Use ldd(1) to check "
                                "the dependencies of the plugin "
                                "/ shared object.",
@@ -953,7 +949,6 @@ int plugin_load (char const *plugin_name, uint32_t flags)
        const char *dir;
        char  filename[BUFSIZE] = "";
        char  typename[BUFSIZE];
-       int   typename_len;
        int   ret;
        struct stat    statbuf;
        struct dirent *de;
@@ -993,7 +988,6 @@ int plugin_load (char const *plugin_name, uint32_t flags)
                WARNING ("plugin_load: Filename too long: \"%s.so\"", plugin_name);
                return (-1);
        }
-       typename_len = strlen (typename);
 
        if ((dh = opendir (dir)) == NULL)
        {
@@ -1005,7 +999,7 @@ int plugin_load (char const *plugin_name, uint32_t flags)
 
        while ((de = readdir (dh)) != NULL)
        {
-               if (strncasecmp (de->d_name, typename, typename_len))
+               if (strcasecmp (de->d_name, typename))
                        continue;
 
                status = ssnprintf (filename, sizeof (filename),
@@ -2166,7 +2160,7 @@ int plugin_dispatch_values (value_list_t const *vl)
 
 __attribute__((sentinel))
 int plugin_dispatch_multivalue (value_list_t const *template, /* {{{ */
-               _Bool store_percentage, ...)
+               _Bool store_percentage, int store_type, ...)
 {
        value_list_t *vl;
        int failed = 0;
@@ -2175,28 +2169,32 @@ int plugin_dispatch_multivalue (value_list_t const *template, /* {{{ */
 
        assert (template->values_len == 1);
 
-       va_start (ap, store_percentage);
-       while (42)
-       {
-               char const *name;
-               gauge_t value;
+  /* Calculate sum for Gauge to calculate percent if needed */
+       if (DS_TYPE_GAUGE == store_type)        {
+               va_start (ap, store_type);
+               while (42)
+               {
+                       char const *name;
+                       gauge_t value;
 
-               name = va_arg (ap, char const *);
-               if (name == NULL)
-                       break;
+                       name = va_arg (ap, char const *);
+                       if (name == NULL)
+                               break;
 
-               value = va_arg (ap, gauge_t);
-               if (!isnan (value))
-                       sum += value;
+                       value = va_arg (ap, gauge_t);
+                       if (!isnan (value))
+                               sum += value;
+               }
+               va_end (ap);
        }
-       va_end (ap);
+
 
        vl = plugin_value_list_clone (template);
        /* plugin_value_list_clone makes sure vl->time is set to non-zero. */
        if (store_percentage)
                sstrncpy (vl->type, "percent", sizeof (vl->type));
 
-       va_start (ap, store_percentage);
+       va_start (ap, store_type);
        while (42)
        {
                char const *name;
@@ -2209,9 +2207,27 @@ int plugin_dispatch_multivalue (value_list_t const *template, /* {{{ */
                sstrncpy (vl->type_instance, name, sizeof (vl->type_instance));
 
                /* Set the value. */
-               vl->values[0].gauge = va_arg (ap, gauge_t);
-               if (store_percentage)
-                       vl->values[0].gauge *= 100.0 / sum;
+               switch (store_type)
+               {
+               case DS_TYPE_GAUGE:
+                       vl->values[0].gauge = va_arg (ap, gauge_t);
+                       if (store_percentage)
+                               vl->values[0].gauge *= 100.0 / sum;
+                       break;
+               case DS_TYPE_ABSOLUTE:
+                       vl->values[0].absolute = va_arg (ap, absolute_t);
+                       break;
+               case DS_TYPE_COUNTER:
+                       vl->values[0].counter  = va_arg (ap, counter_t);
+                       break;
+               case DS_TYPE_DERIVE:
+                       vl->values[0].derive   = va_arg (ap, derive_t);
+                       break;
+               default:
+                       ERROR ("plugin_dispatch_multivalue: given store_type is incorrect.");
+                       failed++;
+               }
+
 
                status = plugin_write_enqueue (vl);
                if (status != 0)
index dfc608e..86a2d66 100644 (file)
 #include "meta_data.h"
 #include "utils_time.h"
 
+#if HAVE_PTHREAD_H
+# include <pthread.h>
+#endif
+
 #define PLUGIN_FLAGS_GLOBAL 0x0001
 
 #define DATA_MAX_NAME_LEN 64
@@ -340,7 +344,7 @@ int plugin_dispatch_values (value_list_t const *vl);
  *  plugin_dispatch_multivalue
  *
  * SYNOPSIS
- *  plugin_dispatch_multivalue (vl, 1,
+ *  plugin_dispatch_multivalue (vl, 1, DS_TYPE_GAUGE,
  *                              "free", 42.0,
  *                              "used", 58.0,
  *                              NULL);
@@ -352,8 +356,16 @@ int plugin_dispatch_values (value_list_t const *vl);
  *  calculated and dispatched, rather than the absolute values. Values that are
  *  NaN are dispatched as NaN and will not influence the total.
  *
- *  The variadic arguments is a list of type_instance / gauge pairs, that are
- *  interpreted as type "char const *" and "gauge_t". The last argument must be
+ *  The variadic arguments is a list of type_instance / type pairs, that are
+ *  interpreted as type "char const *" and type, encoded by their corresponding
+ *  "store_type":
+ *
+ *     - "gauge_t"    when "DS_TYPE_GAUGE"
+ *     - "absolute_t" when "DS_TYPE_ABSOLUTE"
+ *     - "derive_t"   when "DS_TYPE_DERIVE"
+ *     - "counter_t"  when "DS_TYPE_COUNTER"
+ *
+ *  The last argument must be
  *  a NULL pointer to signal end-of-list.
  *
  * RETURNS
@@ -361,7 +373,7 @@ int plugin_dispatch_values (value_list_t const *vl);
  */
 __attribute__((sentinel))
 int plugin_dispatch_multivalue (value_list_t const *vl,
-               _Bool store_percentage, ...);
+               _Bool store_percentage, int store_type, ...);
 
 int plugin_dispatch_missing (const value_list_t *vl);
 
index b3cb8cf..c0e61c5 100644 (file)
@@ -164,7 +164,7 @@ static void parse_file (FILE *fh)
       continue;
 
     while ((buf_len > 0) && ((buf[buf_len - 1] == '\n')
-         || (buf[buf_len - 1] == '\n')))
+         || (buf[buf_len - 1] == '\r')))
       buf[--buf_len] = '\0';
 
     if (buf_len == 0)
index 223e159..a7963ea 100644 (file)
--- a/src/dbi.c
+++ b/src/dbi.c
@@ -1,6 +1,6 @@
 /**
  * collectd - src/dbi.c
- * Copyright (C) 2008-2013  Florian octo Forster
+ * Copyright (C) 2008-2015  Florian octo Forster
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 
 #include <dbi/dbi.h>
 
-#ifdef HAVE_LIBDBI_R
-  dbi_inst inst = NULL;
+/* libdbi 0.9.0 introduced a new thread-safe interface and marked the old
+ * functions "deprecated". These macros convert the new functions to their old
+ * counterparts for backwards compatibility. */
+#if !defined(LIBDBI_VERSION) || (LIBDBI_VERSION < 900)
+# define HAVE_LEGACY_LIBDBI 1
+# define dbi_initialize_r(a,inst) dbi_initialize(a)
+# define dbi_shutdown_r(inst) dbi_shutdown()
+# define dbi_set_verbosity_r(a,inst) dbi_set_verbosity(a)
+# define dbi_driver_list_r(a,inst) dbi_driver_list(a)
+# define dbi_driver_open_r(a,inst) dbi_driver_open(a)
 #endif
+
 /*
  * Data types
  */
@@ -71,6 +80,9 @@ typedef struct cdbi_database_s cdbi_database_t; /* }}} */
 /*
  * Global variables
  */
+#if !defined(HAVE_LEGACY_LIBDBI) || !HAVE_LEGACY_LIBDBI
+static dbi_inst          dbi_instance  = 0;
+#endif
 static udb_query_t     **queries       = NULL;
 static size_t            queries_num   = 0;
 static cdbi_database_t **databases     = NULL;
@@ -134,7 +146,7 @@ static int cdbi_result_get_field (dbi_result res, /* {{{ */
   else if (src_type == DBI_TYPE_STRING)
   {
     const char *value;
-
+    
     value = dbi_result_get_string_idx (res, index);
     if (value == NULL)
       sstrncpy (buffer, "", buffer_size);
@@ -200,7 +212,7 @@ static void cdbi_database_free (cdbi_database_t *db) /* {{{ */
  *     </Result>
  *     ...
  *   </Query>
- *
+ *     
  *   <Database "plugin_instance1">
  *     Driver "mysql"
  *     DriverOption "hostname" "localhost"
@@ -454,24 +466,20 @@ static int cdbi_init (void) /* {{{ */
     return (-1);
   }
 
-#ifdef HAVE_LIBDBI_R
-  status = dbi_initialize_r (NULL, &inst);
-#else
-  status = dbi_initialize (NULL);
-#endif
+  status = dbi_initialize_r (/* driverdir = */ NULL, &dbi_instance);
   if (status < 0)
   {
-    ERROR ("dbi plugin: cdbi_init: dbi_initialize failed with status %i.",
+    ERROR ("dbi plugin: cdbi_init: dbi_initialize_r failed with status %i.",
         status);
     return (-1);
   }
   else if (status == 0)
   {
-    ERROR ("dbi plugin: `dbi_initialize' could not load any drivers. Please "
+    ERROR ("dbi plugin: `dbi_initialize_r' could not load any drivers. Please "
         "install at least one `DBD' or check your installation.");
     return (-1);
   }
-  DEBUG ("dbi plugin: cdbi_init: dbi_initialize reports %i driver%s.",
+  DEBUG ("dbi plugin: cdbi_init: dbi_initialize_r reports %i driver%s.",
       status, (status == 1) ? "" : "s");
 
   return (0);
@@ -679,26 +687,16 @@ static int cdbi_connect_database (cdbi_database_t *db) /* {{{ */
     db->connection = NULL;
   }
 
-#ifdef HAVE_LIBDBI_R
-  driver = dbi_driver_open_r (db->driver, inst);
-#else
-  driver = dbi_driver_open (db->driver);
-#endif
+  driver = dbi_driver_open_r (db->driver, dbi_instance);
   if (driver == NULL)
   {
-    ERROR ("dbi plugin: cdbi_connect_database: dbi_driver_open (%s) failed.",
+    ERROR ("dbi plugin: cdbi_connect_database: dbi_driver_open_r (%s) failed.",
         db->driver);
     INFO ("dbi plugin: Maybe the driver isn't installed? "
         "Known drivers are:");
-#ifdef HAVE_LIBDBI_R
-    for (driver = dbi_driver_list_r (NULL, inst);
+    for (driver = dbi_driver_list_r (NULL, dbi_instance);
         driver != NULL;
-        driver = dbi_driver_list_r (driver, inst))
-#else
-    for (driver = dbi_driver_list (NULL);
-        driver != NULL;
-        driver = dbi_driver_list (driver))
-#endif
+        driver = dbi_driver_list_r (driver, dbi_instance))
     {
       INFO ("dbi plugin: * %s", dbi_driver_get_name (driver));
     }
index e84e835..8830403 100644 (file)
@@ -292,6 +292,28 @@ static void submit_in_progress (char const *disk_name, gauge_t in_progress)
        plugin_dispatch_values (&vl);
 }
 
+static void submit_io_time (char const *plugin_instance, derive_t io_time, derive_t weighted_time)
+{
+       value_t values[2];
+       value_list_t vl = VALUE_LIST_INIT;
+
+       if (ignorelist_match (ignorelist, plugin_instance) != 0)
+         return;
+
+       values[0].derive = io_time;
+       values[1].derive = weighted_time;
+
+       vl.values = values;
+       vl.values_len = 2;
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "disk", sizeof (vl.plugin));
+       sstrncpy (vl.plugin_instance, plugin_instance, sizeof (vl.plugin_instance));
+       sstrncpy (vl.type, "disk_io_time", sizeof (vl.type));
+
+       plugin_dispatch_values (&vl);
+}
+
+
 static counter_t disk_calc_time_incr (counter_t delta_time, counter_t delta_ops)
 {
        double interval = CDTIME_T_TO_DOUBLE (plugin_get_interval ());
@@ -560,6 +582,8 @@ static int disk_read (void)
        derive_t write_merged  = 0;
        derive_t write_time    = 0;
        gauge_t in_progress    = NAN;
+       derive_t io_time       = 0;
+       derive_t weighted_time = 0;
        int is_disk = 0;
 
        diskstats_t *ds, *pre_ds;
@@ -643,6 +667,9 @@ static int disk_read (void)
                                write_time   = atoll (fields[10+ fieldshift]);
 
                                in_progress = atof (fields[11 + fieldshift]);
+
+                               io_time       = atof (fields[12 + fieldshift]);
+                               weighted_time = atof (fields[13 + fieldshift]);
                        }
                }
                else
@@ -767,6 +794,7 @@ static int disk_read (void)
                        disk_submit (output_name, "disk_merged",
                                        read_merged, write_merged);
                        submit_in_progress (output_name, in_progress);
+                       submit_io_time (output_name, io_time, weighted_time);
                } /* if (is_disk) */
 
                /* release udev-based alternate name, if allocated */
@@ -831,7 +859,12 @@ static int disk_read (void)
 
 #elif defined(HAVE_LIBSTATGRAB)
        sg_disk_io_stats *ds;
-       int disks, counter;
+# if HAVE_LIBSTATGRAB_0_90
+       size_t disks;
+# else
+       int disks;
+#endif
+       int counter;
        char name[DATA_MAX_NAME_LEN];
        
        if ((ds = sg_get_disk_io_stats(&disks)) == NULL)
index 00fcff1..fd75dc9 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -21,6 +21,7 @@
  *   Mirko Buffoni <briareos at eswat.org>
  **/
 
+#define _DEFAULT_SOURCE
 #define _BSD_SOURCE
 
 #include "collectd.h"
index cb6844b..3f68e8b 100644 (file)
@@ -23,6 +23,7 @@
  *   Peter Holik <peter at holik.at>
  **/
 
+#define _DEFAULT_SOURCE
 #define _BSD_SOURCE /* For setgroups */
 
 #include "collectd.h"
@@ -744,8 +745,8 @@ static void *exec_notification_one (void *arg) /* {{{ */
 
   fprintf (fh,
       "Severity: %s\n"
-      "Time: %u\n",
-      severity, (unsigned int)CDTIME_T_TO_TIME_T(n->time));
+      "Time: %.3f\n",
+      severity, CDTIME_T_TO_DOUBLE (n->time));
 
   /* Print the optional fields */
   if (strlen (n->host) > 0)
index 47ceaca..51d33dc 100644 (file)
@@ -557,7 +557,7 @@ static int thread_init (os_handler_t **ret_os_handler)
   ipmi_domain_id_t domain_id;
   int status;
 
-  os_handler = ipmi_posix_thread_setup_os_handler (SIGUSR2);
+  os_handler = ipmi_posix_thread_setup_os_handler (SIGIO);
   if (os_handler == NULL)
   {
     ERROR ("ipmi plugin: ipmi_posix_thread_setup_os_handler failed.");
index 2fc3152..5abee2f 100644 (file)
@@ -11,7 +11,10 @@ nodist_pkgconfig_DATA = libcollectdclient.pc
 BUILT_SOURCES = collectd/lcc_features.h
 
 libcollectdclient_la_SOURCES = client.c network.c network_buffer.c
-libcollectdclient_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_builddir)/src/libcollectdclient/collectd -I$(top_srcdir)/src/daemon
+libcollectdclient_la_CPPFLAGS = $(AM_CPPFLAGS) \
+                               -I$(top_srcdir)/src/libcollectdclient/collectd \
+                               -I$(top_builddir)/src/libcollectdclient/collectd \
+                               -I$(top_srcdir)/src/daemon
 libcollectdclient_la_LDFLAGS = -version-info 1:0:0
 libcollectdclient_la_LIBADD = 
 if BUILD_WITH_LIBGCRYPT
index 20015be..9ad61f6 100644 (file)
@@ -258,6 +258,7 @@ static int lcc_send (lcc_connection_t *c, const char *command) /* {{{ */
     lcc_set_errno (c, errno);
     return (-1);
   }
+  fflush(c->fh);
 
   return (0);
 } /* }}} int lcc_send */
index 7b06620..61c7c22 100644 (file)
@@ -54,7 +54,9 @@
 /* Re enable deprecation warnings */
 #  pragma GCC diagnostic warning "-Wdeprecated-declarations"
 # endif
+# if GCRYPT_VERSION_NUMBER < 0x010600
 GCRY_THREAD_OPTION_PTHREAD_IMPL;
+# endif
 #endif
 
 #include "collectd/network_buffer.h"
@@ -131,7 +133,9 @@ static _Bool have_gcrypt (void) /* {{{ */
   need_init = 0;
 
 #if HAVE_LIBGCRYPT
+# if GCRYPT_VERSION_NUMBER < 0x010600
   gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+# endif
 
   if (!gcry_check_version (GCRYPT_VERSION))
     return (0);
index b6d757e..cb3754d 100644 (file)
@@ -65,9 +65,20 @@ BOOL_TRUE (true|yes|on)
 BOOL_FALSE (false|no|off)
 COMMENT #.*
 PORT (6(5(5(3[0-5]|[0-2][0-9])|[0-4][0-9][0-9])|[0-4][0-9][0-9][0-9])|[1-5][0-9][0-9][0-9][0-9]|[1-9][0-9]?[0-9]?[0-9]?)
+
 IP_BYTE (2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])
 IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})?
 
+/* IPv6 address according to http://www.ietf.org/rfc/rfc2373.txt
+ * This supports embedded IPv4 addresses as well but does not strictly check
+ * for the right prefix (::0:<v4> or ::FFFF:<v4>) because there are too many
+ * ways to correctly represent the zero bytes. It's up to the user to check
+ * for valid addresses. */
+HEX16 ([0-9A-Fa-f]{1,4})
+V6_PART ({HEX16}:{HEX16}|{IPV4_ADDR})
+IPV6_BASE ({HEX16}:){6}{V6_PART}|::({HEX16}:){5}{V6_PART}|({HEX16})?::({HEX16}:){4}{V6_PART}|(({HEX16}:){0,1}{HEX16})?::({HEX16}:){3}{V6_PART}|(({HEX16}:){0,2}{HEX16})?::({HEX16}:){2}{V6_PART}|(({HEX16}:){0,3}{HEX16})?::{HEX16}:{V6_PART}|(({HEX16}:){0,4}{HEX16})?::{V6_PART}|(({HEX16}:){0,5}{HEX16})?::{HEX16}|(({HEX16}:){0,6}{HEX16})?::
+IPV6_ADDR ({IPV6_BASE})|(\[{IPV6_BASE}\](:{PORT})?)
+
 %%
 {WHITE_SPACE}          |
 {COMMENT}              {/* ignore */}
@@ -82,6 +93,7 @@ IPV4_ADDR {IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}\.{IP_BYTE}(:{PORT})?
 {BOOL_FALSE}           {yylval.boolean = 0; return (BFALSE);}
 
 {IPV4_ADDR}            {yylval.string = yytext; return (UNQUOTED_STRING);}
+{IPV6_ADDR}            {yylval.string = yytext; return (UNQUOTED_STRING);}
 
 {NUMBER}               {yylval.number = strtod (yytext, NULL); return (NUMBER);}
 
index f631476..18b5f8e 100644 (file)
@@ -23,6 +23,7 @@
  *   Vedran Bartonicek <vbartoni at gmail.com>
  **/
 
+#define _DEFAULT_SOURCE
 #define _BSD_SOURCE
 
 #include "collectd.h"
index 15b3580..61e7f48 100644 (file)
@@ -97,7 +97,7 @@ static void log_logstash_print (yajl_gen g, int severity,
        unsigned int len;
 #endif
 
-       if (yajl_gen_string(g, (u_char *)"@level", strlen("@level")) !=
+       if (yajl_gen_string(g, (u_char *)"level", strlen("level")) !=
            yajl_gen_status_ok)
                goto err;
 
@@ -229,7 +229,7 @@ static void log_logstash_log (int severity, const char *msg,
 
        if (yajl_gen_map_open(g) != yajl_gen_status_ok)
                goto err;
-       if (yajl_gen_string(g, (u_char *)"@message", strlen("@message")) !=
+       if (yajl_gen_string(g, (u_char *)"message", strlen("message")) !=
            yajl_gen_status_ok)
                goto err;
        if (yajl_gen_string(g, (u_char *)msg, strlen(msg)) !=
@@ -265,7 +265,7 @@ static int log_logstash_notification (const notification_t *n,
 
        if (yajl_gen_map_open(g) != yajl_gen_status_ok)
                goto err;
-       if (yajl_gen_string(g, (u_char *)"@message", strlen("@message")) !=
+       if (yajl_gen_string(g, (u_char *)"message", strlen("message")) !=
            yajl_gen_status_ok)
                goto err;
        if (strlen(n->message) > 0) {
@@ -280,14 +280,6 @@ static int log_logstash_notification (const notification_t *n,
                        goto err;
        }
 
-
-       if (yajl_gen_string(g, (u_char *)"@fields", strlen("@fields")) !=
-           yajl_gen_status_ok)
-               goto err;
-       if (yajl_gen_map_open(g) !=
-           yajl_gen_status_ok)
-               goto err;
-
        if (strlen(n->host) > 0) {
                if (yajl_gen_string(g, (u_char *)"host", strlen("host")) !=
                    yajl_gen_status_ok)
@@ -365,8 +357,6 @@ static int log_logstash_notification (const notification_t *n,
                        goto err;
                break;
        }
-       if (yajl_gen_map_close(g) != yajl_gen_status_ok)
-               goto err;
 
        log_logstash_print (g, LOG_INFO, (n->time != 0) ? n->time : cdtime ());
        return (0);
index 82d7f6f..9e24542 100644 (file)
--- a/src/lvm.c
+++ b/src/lvm.c
@@ -125,10 +125,6 @@ static void vg_read(vg_t vg, char const *vg_name)
     }
 
     dm_list_iterate_items(lvl, lvs) {
-         lvm_submit(vg_name, lvm_lv_get_name(lvl->lv), lvm_lv_get_size(lvl->lv));
-    }
-
-    dm_list_iterate_items(lvl, lvs) {
         name = lvm_lv_get_name(lvl->lv);
         attrs = get_lv_property_string(lvl->lv, "lv_attr");
         size = lvm_lv_get_size(lvl->lv);
index 0f5e1a0..fb2f3d3 100644 (file)
@@ -30,6 +30,9 @@
 #ifdef HAVE_SYS_SYSCTL_H
 # include <sys/sysctl.h>
 #endif
+#ifdef HAVE_SYS_VMMETER_H
+# include <sys/vmmeter.h>
+#endif
 
 #ifdef HAVE_MACH_KERN_RETURN_H
 # include <mach/kern_return.h>
@@ -157,9 +160,9 @@ static int memory_init (void)
 
 #define MEMORY_SUBMIT(...) do { \
        if (values_absolute) \
-               plugin_dispatch_multivalue (vl, 0, __VA_ARGS__, NULL); \
+               plugin_dispatch_multivalue (vl, 0, DS_TYPE_GAUGE, __VA_ARGS__, NULL); \
        if (values_percentage) \
-               plugin_dispatch_multivalue (vl, 1, __VA_ARGS__, NULL); \
+               plugin_dispatch_multivalue (vl, 1, DS_TYPE_GAUGE, __VA_ARGS__, NULL); \
 } while (0)
 
 static int memory_read_internal (value_list_t *vl)
index 887c63c..e24f2ec 100644 (file)
@@ -47,6 +47,7 @@
 /*
  * <Data "data_name">
  *   RegisterBase 1234
+ *   RegisterCmd ReadHolding
  *   RegisterType float
  *   Type gauge
  *   Instance "..."
  * <Host "name">
  *   Address "addr"
  *   Port "1234"
+ *   # Or:
+ *   # Device "/dev/ttyUSB0"
+ *   # Baudrate 38400
+ *   # (Assumes 8N1)
  *   Interval 60
  *
  *   <Slave 1>
@@ -75,7 +80,21 @@ enum mb_register_type_e /* {{{ */
   REG_TYPE_UINT32,
   REG_TYPE_FLOAT
 }; /* }}} */
+enum mb_mreg_type_e /* {{{ */ 
+{
+  MREG_HOLDING,
+  MREG_INPUT
+}; /* }}} */
 typedef enum mb_register_type_e mb_register_type_t;
+typedef enum mb_mreg_type_e mb_mreg_type_t;
+
+/* TCP or RTU depending on what is specified in host config block */
+enum mb_conntype_e /* {{{ */
+{
+  MBCONN_TCP,
+  MBCONN_RTU
+}; /* }}} */
+typedef enum mb_conntype_e mb_conntype_t;
 
 struct mb_data_s;
 typedef struct mb_data_s mb_data_t;
@@ -84,6 +103,7 @@ struct mb_data_s /* {{{ */
   char *name;
   int register_base;
   mb_register_type_t register_type;
+  mb_mreg_type_t modbus_register_type;
   char type[DATA_MAX_NAME_LEN];
   char instance[DATA_MAX_NAME_LEN];
 
@@ -101,9 +121,11 @@ typedef struct mb_slave_s mb_slave_t;
 struct mb_host_s /* {{{ */
 {
   char host[DATA_MAX_NAME_LEN];
-  char node[NI_MAXHOST];
+  char node[NI_MAXHOST];       /* TCP hostname or RTU serial device */
   /* char service[NI_MAXSERV]; */
-  int port;
+  int port;                    /* for Modbus/TCP */
+  int baudrate;                        /* for Modbus/RTU */
+  mb_conntype_t conntype;
   cdtime_t interval;
 
   mb_slave_t *slaves;
@@ -293,21 +315,33 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */
   /* We'll do the error handling ourselves. */
   modbus_set_error_handling (&host->connection, NOP_ON_ERROR);
 
-  if ((host->port < 1) || (host->port > 65535))
-    host->port = MODBUS_TCP_DEFAULT_PORT;
+  if (host->conntype == MBCONN_TCP)
+  {
+    if ((host->port < 1) || (host->port > 65535))
+      host->port = MODBUS_TCP_DEFAULT_PORT;
+
+    DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
+        host->node, host->port);
 
-  DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
-      host->node, host->port);
+    modbus_init_tcp (&host->connection,
+        /* host = */ host->node,
+        /* port = */ host->port);
+  }
+  else /* MBCONN_RTU */
+  {
+    DEBUG ("Modbus plugin: Trying to connect to \"%s\".", host->node);
 
-  modbus_init_tcp (&host->connection,
-      /* host = */ host->node,
-      /* port = */ host->port);
+    modbus_init_rtu (&host->connection,
+       /* device = */ host->node,
+     /* baudrate = */ host->baudrate,
+                      'N', 8, 1, 0);
+  }
 
   status = modbus_connect (&host->connection);
   if (status != 0)
   {
     ERROR ("Modbus plugin: modbus_connect (%s, %i) failed with status %i.",
-        host->node, host->port, status);
+        host->node, host->port ? host->port : host->baudrate, status);
     return (status);
   }
 
@@ -328,17 +362,32 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */
   if (host->connection != NULL)
     return (0);
 
-  if ((host->port < 1) || (host->port > 65535))
-    host->port = MODBUS_TCP_DEFAULT_PORT;
+  if (host->conntype == MBCONN_TCP)
+  {
+    if ((host->port < 1) || (host->port > 65535))
+      host->port = MODBUS_TCP_DEFAULT_PORT;
 
-  DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
-      host->node, host->port);
+    DEBUG ("Modbus plugin: Trying to connect to \"%s\", port %i.",
+        host->node, host->port);
 
-  host->connection = modbus_new_tcp (host->node, host->port);
-  if (host->connection == NULL)
+    host->connection = modbus_new_tcp (host->node, host->port);
+    if (host->connection == NULL)
+    {
+      ERROR ("Modbus plugin: Creating new Modbus/TCP object failed.");
+      return (-1);
+    }
+  }
+  else
   {
-    ERROR ("Modbus plugin: Creating new Modbus/TCP object failed.");
-    return (-1);
+    DEBUG ("Modbus plugin: Trying to connect to \"%s\", baudrate %i.",
+        host->node, host->baudrate);
+
+    host->connection = modbus_new_rtu (host->node, host->baudrate, 'N', 8, 1);
+    if (host->connection == NULL)
+    {
+      ERROR ("Modbus plugin: Creating new Modbus/RTU object failed.");
+      return (-1);
+    }
   }
 
   modbus_set_debug (host->connection, 1);
@@ -350,7 +399,7 @@ static int mb_init_connection (mb_host_t *host) /* {{{ */
   if (status != 0)
   {
     ERROR ("Modbus plugin: modbus_connect (%s, %i) failed with status %i.",
-        host->node, host->port, status);
+        host->node, host->port ? host->port : host->baudrate, status);
     modbus_free (host->connection);
     host->connection = NULL;
     return (status);
@@ -419,7 +468,7 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */
   {
     status = EBADF;
   }
-  else
+  else if (host->conntype == MBCONN_TCP)
   {
     struct sockaddr sockaddr;
     socklen_t saddrlen = sizeof (sockaddr);
@@ -467,14 +516,21 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */
     return (-1);
   }
 #endif
-
-  status = modbus_read_registers (host->connection,
+  if (data->modbus_register_type == MREG_INPUT){
+    status = modbus_read_input_registers (host->connection,
         /* start_addr = */ data->register_base,
         /* num_registers = */ values_num, /* buffer = */ values);
+  }
+  else{
+    status = modbus_read_registers (host->connection,
+        /* start_addr = */ data->register_base,
+        /* num_registers = */ values_num, /* buffer = */ values);
+  }
   if (status != values_num)
   {
-    ERROR ("Modbus plugin: modbus_read_registers (%s/%s) failed. status = %i, values_num = %i "
-        "Giving up.", host->host, host->node, status, values_num);
+    ERROR ("Modbus plugin: modbus read function (%s/%s) failed. "
+           " status = %i, values_num = %i. Giving up.",
+           host->host, host->node, status, values_num);
 #if LEGACY_LIBMODBUS
     modbus_close (&host->connection);
 #else
@@ -709,6 +765,28 @@ static int mb_config_add_data (oconfig_item_t *ci) /* {{{ */
         status = -1;
       }
     }
+    else if (strcasecmp ("RegisterCmd", child->key) == 0)
+    {
+#if LEGACY_LIBMODBUS
+      ERROR("Modbus plugin: RegisterCmd parameter can not be used "
+            "with your libmodbus version");
+#else
+      char tmp[16];
+      status = cf_util_get_string_buffer (child, tmp, sizeof (tmp));
+      if (status != 0)
+        /* do nothing */;
+      else if (strcasecmp ("ReadHolding", tmp) == 0)
+        data.modbus_register_type = MREG_HOLDING;
+      else if (strcasecmp ("ReadInput", tmp) == 0)
+        data.modbus_register_type = MREG_INPUT;
+      else
+      {
+        ERROR ("Modbus plugin: The modbus_register_type \"%s\" is unknown.",
+               tmp);
+        status = -1;
+      }
+#endif
+    }
     else
     {
       ERROR ("Modbus plugin: Unknown configuration option: %s", child->key);
@@ -882,6 +960,8 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
       status = cf_util_get_string_buffer (child, buffer, sizeof (buffer));
       if (status == 0)
         status = mb_config_set_host_address (host, buffer);
+      if (status == 0)
+        host->conntype = MBCONN_TCP;
     }
     else if (strcasecmp ("Port", child->key) == 0)
     {
@@ -889,6 +969,14 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
       if (host->port <= 0)
         status = -1;
     }
+    else if (strcasecmp ("Device", child->key) == 0)
+    {
+      status = cf_util_get_string_buffer (child, host->node, sizeof (host->node));
+      if (status == 0)
+        host->conntype = MBCONN_RTU;
+    }
+    else if (strcasecmp ("Baudrate", child->key) == 0)
+      status = cf_util_get_int(child, &host->baudrate);
     else if (strcasecmp ("Interval", child->key) == 0)
       status = cf_util_get_cdtime (child, &host->interval);
     else if (strcasecmp ("Slave", child->key) == 0)
@@ -905,9 +993,22 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
   } /* for (i = 0; i < ci->children_num; i++) */
 
   assert (host->host[0] != 0);
-  if (host->host[0] == 0)
+  if (host->node[0] == 0)
   {
-    ERROR ("Modbus plugin: Data block \"%s\": No type has been specified.",
+    ERROR ("Modbus plugin: Data block \"%s\": No address or device has been specified.",
+        host->host);
+    status = -1;
+  }
+  if (host->conntype == MBCONN_RTU && !host->baudrate)
+  {
+    ERROR ("Modbus plugin: Data block \"%s\": No serial baudrate has been specified.",
+        host->host);
+    status = -1;
+  }
+  if ((host->conntype == MBCONN_TCP && host->baudrate) ||
+      (host->conntype == MBCONN_RTU && host->port))
+  {
+    ERROR ("Modbus plugin: Data block \"%s\": You've mixed up RTU and TCP options.",
         host->host);
     status = -1;
   }
index 7d5eddd..00cba09 100644 (file)
@@ -567,6 +567,130 @@ static int mysql_read_slave_stats (mysql_database_t *db, MYSQL *con)
        return (0);
 } /* mysql_read_slave_stats */
 
+static int mysql_read_innodb_stats (mysql_database_t *db, MYSQL *con)
+{
+       MYSQL_RES *res;
+       MYSQL_ROW  row;
+
+       char *query;
+    struct {
+        char *key;
+        char *type;
+        int ds_type;
+    } metrics[] = {
+        { "metadata_mem_pool_size",         "bytes",        DS_TYPE_GAUGE },
+        { "lock_deadlocks",                 "mysql_locks",  DS_TYPE_DERIVE },
+        { "lock_timeouts",                  "mysql_locks",  DS_TYPE_DERIVE },
+        { "lock_row_lock_current_waits",    "mysql_locks",  DS_TYPE_DERIVE },
+        { "buffer_pool_size",               "bytes",        DS_TYPE_GAUGE },
+
+        { "buffer_pool_reads",              "operations",   DS_TYPE_DERIVE },
+        { "buffer_pool_read_requests",      "operations",   DS_TYPE_DERIVE },
+        { "buffer_pool_write_requests",     "operations",   DS_TYPE_DERIVE },
+        { "buffer_pool_wait_free",          "operations",   DS_TYPE_DERIVE },
+        { "buffer_pool_read_ahead",         "operations",   DS_TYPE_DERIVE },
+        { "buffer_pool_read_ahead_evicted", "operations",   DS_TYPE_DERIVE },
+
+        { "buffer_pool_pages_total",        "gauge",        DS_TYPE_GAUGE },
+        { "buffer_pool_pages_misc",         "gauge",        DS_TYPE_GAUGE },
+        { "buffer_pool_pages_data",         "gauge",        DS_TYPE_GAUGE },
+        { "buffer_pool_bytes_data",         "gauge",        DS_TYPE_GAUGE },
+        { "buffer_pool_pages_dirty",        "gauge",        DS_TYPE_GAUGE },
+        { "buffer_pool_bytes_dirty",        "gauge",        DS_TYPE_GAUGE },
+        { "buffer_pool_pages_free",         "gauge",        DS_TYPE_GAUGE },
+
+        { "buffer_pages_created",           "operations",   DS_TYPE_DERIVE },
+        { "buffer_pages_written",           "operations",   DS_TYPE_DERIVE },
+        { "buffer_pages_read",              "operations",   DS_TYPE_DERIVE },
+        { "buffer_data_reads",              "operations",   DS_TYPE_DERIVE },
+        { "buffer_data_written",            "operations",   DS_TYPE_DERIVE },
+
+        { "os_data_reads",                  "operations",   DS_TYPE_DERIVE },
+        { "os_data_writes",                 "operations",   DS_TYPE_DERIVE },
+        { "os_data_fsyncs",                 "operations",   DS_TYPE_DERIVE },
+        { "os_log_bytes_written",           "operations",   DS_TYPE_DERIVE },
+        { "os_log_fsyncs",                  "operations",   DS_TYPE_DERIVE },
+        { "os_log_pending_fsyncs",          "operations",   DS_TYPE_DERIVE },
+        { "os_log_pending_writes",          "operations",   DS_TYPE_DERIVE },
+
+        { "trx_rseg_history_len",           "gauge",        DS_TYPE_GAUGE },
+
+        { "log_waits",                      "operations",   DS_TYPE_DERIVE },
+        { "log_write_requests",             "operations",   DS_TYPE_DERIVE },
+        { "log_writes",                     "operations",   DS_TYPE_DERIVE },
+        { "adaptive_hash_searches",         "operations",   DS_TYPE_DERIVE },
+
+        { "file_num_open_files",            "gauge",        DS_TYPE_GAUGE },
+
+        { "ibuf_merges_insert",             "operations",   DS_TYPE_DERIVE },
+        { "ibuf_merges_delete_mark",        "operations",   DS_TYPE_DERIVE },
+        { "ibuf_merges_delete",             "operations",   DS_TYPE_DERIVE },
+        { "ibuf_merges_discard_insert",     "operations",   DS_TYPE_DERIVE },
+        { "ibuf_merges_discard_delete_mark","operations",   DS_TYPE_DERIVE },
+        { "ibuf_merges_discard_delete",     "operations",   DS_TYPE_DERIVE },
+        { "ibuf_merges_discard_merges",     "operations",   DS_TYPE_DERIVE },
+        { "ibuf_size",                      "bytes",        DS_TYPE_GAUGE },
+
+        { "innodb_activity_count",          "gauge",        DS_TYPE_GAUGE },
+        { "innodb_dblwr_writes",            "operations",   DS_TYPE_DERIVE },
+        { "innodb_dblwr_pages_written",     "operations",   DS_TYPE_DERIVE },
+        { "innodb_dblwr_page_size",         "gauge",        DS_TYPE_GAUGE },
+
+        { "innodb_rwlock_s_spin_waits",     "operations",   DS_TYPE_DERIVE },
+        { "innodb_rwlock_x_spin_waits",     "operations",   DS_TYPE_DERIVE },
+        { "innodb_rwlock_s_spin_rounds",    "operations",   DS_TYPE_DERIVE },
+        { "innodb_rwlock_x_spin_rounds",    "operations",   DS_TYPE_DERIVE },
+        { "innodb_rwlock_s_os_waits",       "operations",   DS_TYPE_DERIVE },
+        { "innodb_rwlock_x_os_waits",       "operations",   DS_TYPE_DERIVE },
+
+        { "dml_reads",                      "operations",   DS_TYPE_DERIVE },
+        { "dml_inserts",                    "operations",   DS_TYPE_DERIVE },
+        { "dml_deletes",                    "operations",   DS_TYPE_DERIVE },
+        { "dml_updates",                    "operations",   DS_TYPE_DERIVE },
+
+        { NULL,                     NULL,           0}
+    };
+
+       query = "SELECT name, count, type FROM information_schema.innodb_metrics WHERE status = 'enabled'";
+
+       res = exec_query (con, query);
+       if (res == NULL)
+               return (-1);
+
+       while ((row = mysql_fetch_row (res)))
+       {
+        int i;
+               char *key;
+               unsigned long long val;
+
+               key = row[0];
+               val = atoll (row[1]);
+
+        for (i = 0;
+             metrics[i].key != NULL && strcmp(metrics[i].key, key) != 0;
+             i++)
+            ;
+
+        if (metrics[i].key == NULL)
+            continue;
+
+        switch (metrics[i].ds_type) {
+        case DS_TYPE_COUNTER:
+            counter_submit(metrics[i].type, key, (counter_t)val, db);
+            break;
+        case DS_TYPE_GAUGE:
+            gauge_submit(metrics[i].type, key, (gauge_t)val, db);
+            break;
+        case DS_TYPE_DERIVE:
+            derive_submit(metrics[i].type, key, (derive_t)val, db);
+            break;
+        }
+    }
+
+    mysql_free_result(res);
+    return (0);
+}
+
 static int mysql_read (user_data_t *ud)
 {
        mysql_database_t *db;
@@ -588,6 +712,7 @@ static int mysql_read (user_data_t *ud)
 
        unsigned long long traffic_incoming = 0ULL;
        unsigned long long traffic_outgoing = 0ULL;
+    unsigned long mysql_version = 0ULL;
 
        if ((ud == NULL) || (ud->data == NULL))
        {
@@ -601,8 +726,10 @@ static int mysql_read (user_data_t *ud)
        if ((con = getconnection (db)) == NULL)
                return (-1);
 
+  mysql_version = mysql_get_server_version(con);
+
        query = "SHOW STATUS";
-       if (mysql_get_server_version (con) >= 50002)
+       if (mysql_version >= 50002)
                query = "SHOW GLOBAL STATUS";
 
        res = exec_query (con, query);
@@ -688,7 +815,7 @@ static int mysql_read (user_data_t *ud)
                        else if (strcmp (key, "Innodb_buffer_pool_pages_dirty") == 0)
                                gauge_submit ("mysql_bpool_pages", "dirty", val, db);
                        else if (strcmp (key, "Innodb_buffer_pool_pages_flushed") == 0)
-                               counter_submit ("mysql_bpool_counters", "flushed", val, db);
+                               counter_submit ("mysql_bpool_pages", "flushed", val, db);
                        else if (strcmp (key, "Innodb_buffer_pool_pages_free") == 0)
                                gauge_submit ("mysql_bpool_pages", "free", val, db);
                        else if (strcmp (key, "Innodb_buffer_pool_pages_misc") == 0)
@@ -707,6 +834,10 @@ static int mysql_read (user_data_t *ud)
                                counter_submit ("mysql_bpool_counters", "reads", val, db);
                        else if (strcmp (key, "Innodb_buffer_pool_write_requests") == 0)
                                counter_submit ("mysql_bpool_counters", "write_requests", val, db);
+                       else if (strcmp (key, "Innodb_buffer_pool_bytes_data") == 0)
+                               gauge_submit ("mysql_bpool_bytes", "data", val, db);
+                       else if (strcmp (key, "Innodb_buffer_pool_bytes_dirty") == 0)
+                               gauge_submit ("mysql_bpool_bytes", "dirty", val, db);
 
                        /* data */
                        if (strcmp (key, "Innodb_data_fsyncs") == 0)
@@ -716,7 +847,7 @@ static int mysql_read (user_data_t *ud)
                        else if (strcmp (key, "Innodb_data_reads") == 0)
                                counter_submit ("mysql_innodb_data", "reads", val, db);
                        else if (strcmp (key, "Innodb_data_writes") == 0)
-                               counter_submit ("mysql_bpool_counters", "writes", val, db);
+                               counter_submit ("mysql_innodb_data", "writes", val, db);
                        else if (strcmp (key, "Innodb_data_written") == 0)
                                counter_submit ("mysql_innodb_data", "written", val, db);
 
@@ -726,6 +857,32 @@ static int mysql_read (user_data_t *ud)
                        else if (strcmp (key, "Innodb_dblwr_pages_written") == 0)
                                counter_submit ("mysql_innodb_dblwr", "written", val, db);
 
+                       /* log */
+                       else if (strcmp (key, "Innodb_log_waits") == 0)
+                               counter_submit ("mysql_innodb_log", "waits", val, db);
+                       else if (strcmp (key, "Innodb_log_write_requests") == 0)
+                               counter_submit ("mysql_innodb_log", "write_requests", val, db);
+                       else if (strcmp (key, "Innodb_log_writes") == 0)
+                               counter_submit ("mysql_innodb_log", "writes", val, db);
+                       else if (strcmp (key, "Innodb_os_log_fsyncs") == 0)
+                               counter_submit ("mysql_innodb_log", "fsyncs", val, db);
+                       else if (strcmp (key, "Innodb_os_log_written") == 0)
+                               counter_submit ("mysql_innodb_log", "written", val, db);
+
+                       /* pages */
+                       else if (strcmp (key, "Innodb_pages_created") == 0)
+                               counter_submit ("mysql_innodb_pages", "created", val, db);
+                       else if (strcmp (key, "Innodb_pages_read") == 0)
+                               counter_submit ("mysql_innodb_pages", "read", val, db);
+                       else if (strcmp (key, "Innodb_pages_written") == 0)
+                               counter_submit ("mysql_innodb_pages", "written", val, db);
+
+                       /* row lock */
+                       else if (strcmp (key, "Innodb_row_lock_time") == 0)
+                               counter_submit ("mysql_innodb_row_lock", "time", val, db);
+                       else if (strcmp (key, "Innodb_row_lock_waits") == 0)
+                               counter_submit ("mysql_innodb_row_lock", "waits", val, db);
+
                        /* rows */
                        else if (strcmp (key, "Innodb_rows_deleted") == 0)
                                counter_submit ("mysql_innodb_rows", "deleted", val, db);
@@ -782,6 +939,9 @@ static int mysql_read (user_data_t *ud)
 
        traffic_submit  (traffic_incoming, traffic_outgoing, db);
 
+       if (mysql_version >= 50600 && db->innodb_stats)
+        mysql_read_innodb_stats (db, con);
+
        if (db->master_stats)
                mysql_read_master_stats (db, con);
 
index de2de9b..aa9760f 100644 (file)
@@ -780,7 +780,7 @@ static int ir_read (void)
         continue;
       }
 
-      DEBUG ("netlink plugin: ir_read: querying %s from %s (%lu).",
+      DEBUG ("netlink plugin: ir_read: querying %s from %s (%zu).",
           type_name[type_index], iflist[ifindex], ifindex);
 
       nlh = mnl_nlmsg_put_header (buf);
index bf0b2bc..551bd5c 100644 (file)
@@ -22,6 +22,7 @@
  *   Aman Gupta <aman at tmm1.net>
  **/
 
+#define _DEFAULT_SOURCE
 #define _BSD_SOURCE /* For struct ip_mreq */
 
 #include "collectd.h"
@@ -76,7 +77,9 @@
 /* Re enable deprecation warnings */
 #  pragma GCC diagnostic warning "-Wdeprecated-declarations"
 # endif
+# if GCRYPT_VERSION_NUMBER < 0x010600
 GCRY_THREAD_OPTION_PTHREAD_IMPL;
+# endif
 #endif
 
 #ifndef IPV6_ADD_MEMBERSHIP
@@ -510,7 +513,9 @@ static void network_init_gcrypt (void) /* {{{ */
   * above doesn't count, as it doesn't implicitly initalize Libgcrypt.
   *
   * tl;dr: keep all these gry_* statements in this exact order please. */
+# if GCRYPT_VERSION_NUMBER < 0x010600
   gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread);
+# endif
   gcry_check_version (NULL);
   gcry_control (GCRYCTL_INIT_SECMEM, 32768);
   gcry_control (GCRYCTL_INITIALIZATION_FINISHED);
@@ -3002,7 +3007,7 @@ static int network_config_set_ttl (const oconfig_item_t *ci) /* {{{ */
     network_config_ttl = tmp;
   else {
     WARNING ("network plugin: The `TimeToLive' must be between 1 and 255.");
-    return (-1);    
+    return (-1);
   }
 
   return (0);
index f5b579e..4285d76 100644 (file)
--- a/src/nfs.c
+++ b/src/nfs.c
@@ -171,6 +171,160 @@ static const char *nfs4_procedures_names[] =
 static size_t nfs4_procedures_names_num = STATIC_ARRAY_SIZE (nfs4_procedures_names);
 #endif
 
+#if KERNEL_LINUX
+static const char *nfs4_server40_procedures_names[] =
+{
+       "null",
+       "compound",
+       "reserved",
+       "access",
+       "close",
+       "commit",
+       "create",
+       "delegpurge",
+       "delegreturn",
+       "getattr",
+       "getfh",
+       "link",
+       "lock",
+       "lockt",
+       "locku",
+       "lookup",
+       "lookupp",
+       "nverify",
+       "open",
+       "openattr",
+       "open_confirm",
+       "open_downgrade",
+       "putfh",
+       "putpubfh",
+       "putrootfh",
+       "read",
+       "readdir",
+       "readlink",
+       "remove",
+       "rename",
+       "renew",
+       "restorefh",
+       "savefh",
+       "secinfo",
+       "setattr",
+       "setclientid",
+       "setcltid_confirm",
+       "verify",
+       "write",
+       "release_lockowner"
+};
+
+static size_t nfs4_server40_procedures_names_num = STATIC_ARRAY_SIZE (nfs4_server40_procedures_names);
+
+static const char *nfs4_server41_procedures_names[] =
+{
+       "backchannel_ctl",
+       "bind_conn_to_session", 
+       "exchange_id",
+       "create_session",
+       "destroy_session",
+       "free_stateid",
+       "get_dir_delegation",
+       "getdeviceinfo",
+       "getdevicelist",
+       "layoutcommit",
+       "layoutget",
+       "layoutreturn",
+       "secinfo_no_name",
+       "sequence",
+       "set_ssv",
+       "test_stateid",
+       "want_delegation",
+       "destroy_clientid",
+       "reclaim_complete",
+};
+
+static size_t nfs4_server41_procedures_names_num = STATIC_ARRAY_SIZE (nfs4_server41_procedures_names);
+
+#define NFS4_SERVER40_NUM_PROC ( \
+       STATIC_ARRAY_SIZE (nfs4_server40_procedures_names) )
+
+#define NFS4_SERVER41_NUM_PROC ( \
+       STATIC_ARRAY_SIZE (nfs4_server40_procedures_names) + \
+       STATIC_ARRAY_SIZE (nfs4_server41_procedures_names) )
+
+#define NFS4_SERVER_MAX_PROC (NFS4_SERVER41_NUM_PROC)
+
+static const char *nfs4_client40_procedures_names[] =
+{
+       "null",
+       "read",
+       "write",
+       "commit",
+       "open",
+       "open_confirm",
+       "open_noattr",
+       "open_downgrade",
+       "close",
+       "setattr",
+       "fsinfo",
+       "renew",
+       "setclientid",
+       "setclientid_confirm",
+       "lock",
+       "lockt",
+       "locku",
+       "access",
+       "getattr",
+       "lookup",
+       "lookupp",
+       "remove",
+       "rename",
+       "link",
+       "symlink",
+       "create",
+       "pathconf",
+       "statfs",
+       "readlink",
+       "readdir",
+       "server_caps",
+       "delegreturn",
+       "getacl",
+       "setacl",
+       "fs_locations",         /* |35| 2.6.18 */
+       "release_lockowner",    /* |42| 2.6.36 */
+       "secinfo",              /* |46| 2.6.39 */
+       "fsid_present"          /* |54| 3.13 */
+};
+
+static const char *nfs4_client41_procedures_names[] =
+{
+       "exchange_id",          /* |40| 2.6.30 */
+       "create_session",       /* |40| 2.6.30 */
+       "destroy_session",      /* |40| 2.6.30 */
+       "sequence",             /* |40| 2.6.30 */
+       "get_lease_time",       /* |40| 2.6.30 */
+       "reclaim_complete",     /* |41| 2.6.33 */
+       "layoutget",            /* |44| 2.6.37 */
+       "getdeviceinfo",        /* |44| 2.6.37 */
+       "layoutcommit",         /* |46| 2.6.39 */
+       "layoutreturn",         /* |47| 3.0 */
+       "secinfo_no_name",      /* |51| 3.1 */
+       "test_stateid",         /* |51| 3.1 */
+       "free_stateid",         /* |51| 3.1 */
+       "getdevicelist",        /* |51| 3.1 */
+       "bind_conn_to_session", /* |53| 3.5 */
+       "destroy_clientid"      /* |53| 3.5 */
+};
+
+#define NFS4_CLIENT40_NUM_PROC ( \
+       STATIC_ARRAY_SIZE (nfs4_client40_procedures_names) )
+
+#define NFS4_CLIENT41_NUM_PROC ( \
+       STATIC_ARRAY_SIZE (nfs4_client40_procedures_names) + \
+       STATIC_ARRAY_SIZE (nfs4_client41_procedures_names) )
+
+#define NFS4_CLIENT_MAX_PROC (NFS4_CLIENT41_NUM_PROC)
+
+#endif
+
 #if HAVE_LIBKSTAT
 extern kstat_ctl_t *kc;
 static kstat_t *nfs2_ksp_client;
@@ -181,8 +335,6 @@ static kstat_t *nfs4_ksp_client;
 static kstat_t *nfs4_ksp_server;
 #endif
 
-/* Possibly TODO: NFSv4 statistics */
-
 #if KERNEL_LINUX
 static int nfs_init (void)
 {
@@ -252,14 +404,27 @@ static void nfs_procedures_submit (const char *plugin_instance,
 } /* void nfs_procedures_submit */
 
 #if KERNEL_LINUX
-static int nfs_submit_fields (int nfs_version, const char *instance,
-               char **fields, size_t fields_num,
-               const char **proc_names, size_t proc_names_num)
+static void nfs_submit_fields (int nfs_version, const char *instance, 
+               char **fields, size_t fields_num, const char **proc_names)
 {
        char plugin_instance[DATA_MAX_NAME_LEN];
        value_t values[fields_num];
        size_t i;
 
+       ssnprintf (plugin_instance, sizeof (plugin_instance), "v%i%s",
+                       nfs_version, instance);
+
+       for (i = 0; i < fields_num; i++)
+               (void) parse_value (fields[i], &values[i], DS_TYPE_DERIVE);
+
+       nfs_procedures_submit (plugin_instance, proc_names, values,
+                       fields_num);
+}
+
+static int nfs_submit_fields_safe (int nfs_version, const char *instance,
+               char **fields, size_t fields_num,
+               const char **proc_names, size_t proc_names_num)
+{
        if (fields_num != proc_names_num)
        {
                WARNING ("nfs plugin: Wrong number of fields for "
@@ -269,14 +434,121 @@ static int nfs_submit_fields (int nfs_version, const char *instance,
                return (EINVAL);
        }
 
-       ssnprintf (plugin_instance, sizeof (plugin_instance), "v%i%s",
-                       nfs_version, instance);
+       nfs_submit_fields (nfs_version, instance, fields, fields_num, 
+                       proc_names);
 
-       for (i = 0; i < proc_names_num; i++)
-               (void) parse_value (fields[i], &values[i], DS_TYPE_DERIVE);
+       return (0);
+}
 
-       nfs_procedures_submit (plugin_instance, proc_names, values,
-                       proc_names_num);
+static int nfs_submit_nfs4_server (const char *instance, char **fields, 
+               size_t fields_num)
+{
+       static int suppress_warning = 0;
+
+       if (fields_num != NFS4_SERVER40_NUM_PROC &&
+               fields_num != NFS4_SERVER41_NUM_PROC) 
+       {
+               if (!suppress_warning)
+               {
+                       WARNING ("nfs plugin: Unexpected number of fields for "
+                                       "NFSv4 %s statistics: %zu. ",
+                                       instance, fields_num);
+               }
+
+               if (fields_num > NFS4_SERVER_MAX_PROC)
+               {
+                       fields_num = NFS4_SERVER_MAX_PROC;
+                       suppress_warning = 1;
+               }
+               else
+               {
+                       return (EINVAL);
+               }
+       }
+
+        nfs_submit_fields (4, instance, fields, 
+                       nfs4_server40_procedures_names_num,
+                       nfs4_server40_procedures_names);
+
+       if (fields_num >= NFS4_SERVER41_NUM_PROC)
+       {
+               fields += nfs4_server40_procedures_names_num;
+
+               nfs_submit_fields (4, instance, fields, 
+                               nfs4_server41_procedures_names_num, 
+                               nfs4_server41_procedures_names);
+       }
+
+       return (0);
+}
+
+static int nfs_submit_nfs4_client (const char *instance, char **fields, 
+               size_t fields_num)
+{
+       size_t proc40_names_num, proc41_names_num;
+
+       static int suppress_warning = 0;
+
+       switch (fields_num)
+       {
+               case 34:
+               case 35:
+               case 36:
+               case 37:
+               case 38:
+                       /* 4.0-only configuration */
+                       proc40_names_num = fields_num;
+                       break;
+               case 40:
+               case 41:
+                       proc40_names_num = 35;
+                       break;
+               case 42:
+               case 44:
+                       proc40_names_num = 36;
+               case 46:
+               case 47:
+               case 51:
+               case 53:
+                       proc40_names_num = 37;
+                       break;
+               case 54:
+                       proc40_names_num = 38;
+                       break;
+               default:
+                       if (!suppress_warning)
+                       {
+                               WARNING ("nfs plugin: Unexpected number of "
+                                               "fields for NFSv4 %s "
+                                               "statistics: %zu. ",
+                                               instance, fields_num);
+                       }
+
+                       if (fields_num > 34)
+                       {
+                               /* safe fallback to basic nfs40 procedures */
+                               fields_num = 34;
+                               proc40_names_num = 34;
+
+                               suppress_warning = 1;
+                       }
+                       else
+                       {
+                               return (EINVAL);
+                       }
+       }
+
+       nfs_submit_fields (4, instance, fields, proc40_names_num,
+                       nfs4_client40_procedures_names);
+
+       if (fields_num > proc40_names_num)
+       {
+               proc41_names_num = fields_num - proc40_names_num;
+               fields += proc40_names_num;
+
+               nfs_submit_fields (4, instance, fields,proc41_names_num,
+                                nfs4_client41_procedures_names);
+       }
 
        return (0);
 }
@@ -285,7 +557,7 @@ static void nfs_read_linux (FILE *fh, char *inst)
 {
        char buffer[1024];
 
-       char *fields[48];
+       char *fields[64];
        int fields_num = 0;
 
        if (fh == NULL)
@@ -301,18 +573,30 @@ static void nfs_read_linux (FILE *fh, char *inst)
 
                if (strcmp (fields[0], "proc2") == 0)
                {
-                       nfs_submit_fields (/* version = */ 2, inst,
+                       nfs_submit_fields_safe (/* version = */ 2, inst,
                                        fields + 2, (size_t) (fields_num - 2),
                                        nfs2_procedures_names,
                                        nfs2_procedures_names_num);
                }
                else if (strncmp (fields[0], "proc3", 5) == 0)
                {
-                       nfs_submit_fields (/* version = */ 3, inst,
+                       nfs_submit_fields_safe (/* version = */ 3, inst,
                                        fields + 2, (size_t) (fields_num - 2),
                                        nfs3_procedures_names,
                                        nfs3_procedures_names_num);
                }
+               else if (strcmp (fields[0], "proc4ops") == 0)
+               {
+                       if (inst[0] == 's')
+                               nfs_submit_nfs4_server (inst, fields + 2, 
+                                               (size_t) (fields_num - 2));
+               }
+               else if (strcmp (fields[0], "proc4") == 0)
+               {
+                       if (inst[0] == 'c')
+                               nfs_submit_nfs4_client (inst, fields + 2,
+                                               (size_t) (fields_num - 2));                     
+               }
        } /* while (fgets) */
 } /* void nfs_read_linux */
 #endif /* KERNEL_LINUX */
index e8282f2..b0daa05 100644 (file)
@@ -113,8 +113,6 @@ static int config (const char *key, const char *value)
 
 static int init (void)
 {
-  static char credentials[1024];
-
   if (curl != NULL)
     curl_easy_cleanup (curl);
 
@@ -131,6 +129,11 @@ static int init (void)
 
   if (user != NULL)
   {
+#ifdef HAVE_CURLOPT_USERNAME
+    curl_easy_setopt (curl, CURLOPT_USERNAME, user);
+    curl_easy_setopt (curl, CURLOPT_PASSWORD, (pass == NULL) ? "" : pass);
+#else
+    static char credentials[1024];
     int status = ssnprintf (credentials, sizeof (credentials),
        "%s:%s", user, pass == NULL ? "" : pass);
     if ((status < 0) || ((size_t) status >= sizeof (credentials)))
@@ -140,6 +143,7 @@ static int init (void)
     }
 
     curl_easy_setopt (curl, CURLOPT_USERPWD, credentials);
+#endif
   }
 
   if (url != NULL)
index 6bed82c..15b12f9 100644 (file)
@@ -24,6 +24,7 @@
  *   Florian octo Forster <octo at collectd.org>
  **/
 
+#define _DEFAULT_SOURCE
 #define _BSD_SOURCE /* For NI_MAXHOST */
 
 #include "collectd.h"
@@ -486,7 +487,7 @@ static int ntpd_receive_response (int *res_items, int *res_size,
                poll_s.fd      = sd;
                poll_s.events  = POLLIN | POLLPRI;
                poll_s.revents = 0;
-               
+
                DEBUG ("Polling for %ims", timeout);
                status = poll (&poll_s, 1, timeout);
 
@@ -526,7 +527,7 @@ static int ntpd_receive_response (int *res_items, int *res_size,
 
                DEBUG ("recv'd %i bytes", status);
 
-               /* 
+               /*
                 * Do some sanity checks first
                 */
                if (status < RESP_HEADER_SIZE)
@@ -736,7 +737,7 @@ static int ntpd_send_request (int req_code, int req_items, int req_size, char *r
 
        req.err_nitems   = ERR_NITEMS (0, req_items);
        req.mbz_itemsize = MBZ_ITEMSIZE (req_size);
-       
+
        if (req_data != NULL)
                memcpy ((void *) req.data, (const void *) req_data, req_data_len);
 
diff --git a/src/openldap.c b/src/openldap.c
new file mode 100644 (file)
index 0000000..bca686e
--- /dev/null
@@ -0,0 +1,682 @@
+/**
+ * collectd - src/openldap.c
+ * Copyright (C) 2011       Kimo Rosenbaum
+ * Copyright (C) 2014       Marc Fournier
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Kimo Rosenbaum <kimor79 at yahoo.com>
+ *   Marc Fournier <marc.fournier at camptocamp.com>
+ **/
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+#include "configfile.h"
+
+#include <lber.h>
+#include <ldap.h>
+
+struct cldap_s /* {{{ */
+{
+       char *name;
+
+       char *cacert;
+       char *host;
+       int   state;
+       _Bool starttls;
+       int   timeout;
+       char *url;
+       _Bool verifyhost;
+       int   version;
+
+       LDAP *ld;
+};
+typedef struct cldap_s cldap_t; /* }}} */
+
+static void cldap_free (cldap_t *st) /* {{{ */
+{
+       if (st == NULL)
+               return;
+
+       sfree (st->cacert);
+       sfree (st->host);
+       sfree (st->name);
+       sfree (st->url);
+       if (st->ld)
+               ldap_memfree (st->ld);
+       sfree (st);
+} /* }}} void cldap_free */
+
+/* initialize ldap for each host */
+static int cldap_init_host (cldap_t *st) /* {{{ */
+{
+       LDAP *ld;
+       int rc;
+       rc = ldap_initialize (&ld, st->url);
+       if (rc != LDAP_SUCCESS)
+       {
+               ERROR ("openldap plugin: ldap_initialize failed: %s",
+                       ldap_err2string (rc));
+               st->state = 0;
+               ldap_unbind_ext_s (ld, NULL, NULL);
+               return (-1);
+       }
+
+       st->ld = ld;
+
+       ldap_set_option (st->ld, LDAP_OPT_PROTOCOL_VERSION, &st->version);
+
+       ldap_set_option (st->ld, LDAP_OPT_TIMEOUT,
+               &(const struct timeval){st->timeout, 0});
+
+       if (st->cacert != NULL)
+               ldap_set_option (st->ld, LDAP_OPT_X_TLS_CACERTFILE, st->cacert);
+
+       if (st->verifyhost == 0)
+       {
+               int never = LDAP_OPT_X_TLS_NEVER;
+               ldap_set_option (st->ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &never);
+       }
+
+       if (st->starttls != 0)
+       {
+               rc = ldap_start_tls_s (ld, NULL, NULL);
+               if (rc != LDAP_SUCCESS)
+               {
+                       ERROR ("openldap plugin: Failed to start tls on %s: %s",
+                                       st->url, ldap_err2string (rc));
+                       st->state = 0;
+                       ldap_unbind_ext_s (st->ld, NULL, NULL);
+                       return (-1);
+               }
+       }
+
+       struct berval cred;
+       cred.bv_val = "";
+       cred.bv_len = 0;
+
+       rc = ldap_sasl_bind_s (st->ld, NULL, NULL, &cred, NULL, NULL, NULL);
+       if (rc != LDAP_SUCCESS)
+       {
+               ERROR ("openldap plugin: Failed to bind to %s: %s",
+                               st->url, ldap_err2string (rc));
+               st->state = 0;
+               ldap_unbind_ext_s (st->ld, NULL, NULL);
+               return (-1);
+       }
+       else
+       {
+               DEBUG ("openldap plugin: Successfully connected to %s",
+                               st->url);
+               st->state = 1;
+               return (0);
+       }
+} /* }}} static cldap_init_host */
+
+static void cldap_submit_value (const char *type, const char *type_instance, /* {{{ */
+               value_t value, cldap_t *st)
+{
+       value_list_t vl = VALUE_LIST_INIT;
+
+       vl.values     = &value;
+       vl.values_len = 1;
+
+       if ((st->host == NULL)
+                       || (strcmp ("", st->host) == 0)
+                       || (strcmp ("localhost", st->host) == 0))
+       {
+               sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       }
+       else
+       {
+               sstrncpy (vl.host, st->host, sizeof (vl.host));
+       }
+
+       sstrncpy (vl.plugin, "openldap", sizeof (vl.plugin));
+       if (st->name != NULL)
+               sstrncpy (vl.plugin_instance, st->name,
+                               sizeof (vl.plugin_instance));
+
+       sstrncpy (vl.type, type, sizeof (vl.type));
+       if (type_instance != NULL)
+               sstrncpy (vl.type_instance, type_instance,
+                               sizeof (vl.type_instance));
+
+       plugin_dispatch_values (&vl);
+} /* }}} void cldap_submit_value */
+
+static void cldap_submit_derive (const char *type, const char *type_instance, /* {{{ */
+               derive_t d, cldap_t *st)
+{
+       value_t v;
+       v.derive = d;
+       cldap_submit_value (type, type_instance, v, st);
+} /* }}} void cldap_submit_derive */
+
+static void cldap_submit_gauge (const char *type, const char *type_instance, /* {{{ */
+               gauge_t g, cldap_t *st)
+{
+       value_t v;
+       v.gauge = g;
+       cldap_submit_value (type, type_instance, v, st);
+} /* }}} void cldap_submit_gauge */
+
+static int cldap_read_host (user_data_t *ud) /* {{{ */
+{
+       cldap_t *st;
+       LDAPMessage *e, *result;
+       char *dn;
+       int rc;
+       int status;
+
+       char *attrs[9] = { "monitorCounter",
+                               "monitorOpCompleted",
+                               "monitorOpInitiated",
+                               "monitoredInfo",
+                               "olmBDBEntryCache",
+                               "olmBDBDNCache",
+                               "olmBDBIDLCache",
+                               "namingContexts",
+                               NULL };
+
+       if ((ud == NULL) || (ud->data == NULL))
+       {
+               ERROR ("openldap plugin: cldap_read_host: Invalid user data.");
+               return (-1);
+       }
+
+       st = (cldap_t *) ud->data;
+
+       status = cldap_init_host (st);
+       if (status != 0)
+               return (-1);
+
+       rc = ldap_search_ext_s (st->ld, "cn=Monitor", LDAP_SCOPE_SUBTREE,
+               "(|(!(cn=* *))(cn=Database*))", attrs, 0,
+               NULL, NULL, NULL, 0, &result);
+
+       if (rc != LDAP_SUCCESS)
+       {
+               ERROR ("openldap plugin: Failed to execute search: %s",
+                               ldap_err2string (rc));
+               ldap_msgfree (result);
+               ldap_unbind_ext_s (st->ld, NULL, NULL);
+               return (-1);
+       }
+
+       for (e = ldap_first_entry (st->ld, result); e != NULL;
+               e = ldap_next_entry (st->ld, e))
+       {
+               if ((dn = ldap_get_dn (st->ld, e)) != NULL)
+               {
+                       unsigned long long counter = 0;
+                       unsigned long long opc = 0;
+                       unsigned long long opi = 0;
+                       unsigned long long info = 0;
+
+                       struct berval counter_data;
+                       struct berval opc_data;
+                       struct berval opi_data;
+                       struct berval info_data;
+                       struct berval olmbdb_data;
+                       struct berval nc_data;
+
+                       struct berval **counter_list;
+                       struct berval **opc_list;
+                       struct berval **opi_list;
+                       struct berval **info_list;
+                       struct berval **olmbdb_list;
+                       struct berval **nc_list;
+
+                       if ((counter_list = ldap_get_values_len (st->ld, e,
+                               "monitorCounter")) != NULL)
+                       {
+                               counter_data = *counter_list[0];
+                               counter = atoll (counter_data.bv_val);
+                       }
+
+                       if ((opc_list = ldap_get_values_len (st->ld, e,
+                               "monitorOpCompleted")) != NULL)
+                       {
+                               opc_data = *opc_list[0];
+                               opc = atoll (opc_data.bv_val);
+                       }
+
+                       if ((opi_list = ldap_get_values_len (st->ld, e,
+                               "monitorOpInitiated")) != NULL)
+                       {
+                               opi_data = *opi_list[0];
+                               opi = atoll (opi_data.bv_val);
+                       }
+
+                       if ((info_list = ldap_get_values_len (st->ld, e,
+                               "monitoredInfo")) != NULL)
+                       {
+                               info_data = *info_list[0];
+                               info = atoll (info_data.bv_val);
+                       }
+
+                       if (strcmp (dn, "cn=Total,cn=Connections,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("total_connections", NULL,
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Current,cn=Connections,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_gauge ("current_connections", NULL,
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Operations,cn=Monitor") == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Bind,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "bind-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "bind-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=UnBind,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "unbind-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "unbind-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Search,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "search-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "search-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Compare,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "compare-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "compare-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Modify,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "modify-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "modify-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Modrdn,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "modrdn-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "modrdn-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Add,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "add-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "add-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Delete,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "delete-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "delete-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Abandon,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "abandon-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "abandon-initiated", opi, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Extended,cn=Operations,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("operations",
+                                       "extended-completed", opc, st);
+                               cldap_submit_derive ("operations",
+                                       "extended-initiated", opi, st);
+                       }
+                       else if ((strncmp (dn, "cn=Database", 11) == 0)
+                               && ((nc_list = ldap_get_values_len
+                                               (st->ld, e, "namingContexts")) != NULL))
+                       {
+                               nc_data = *nc_list[0];
+                               char typeinst[DATA_MAX_NAME_LEN];
+
+                               if ((olmbdb_list = ldap_get_values_len (st->ld, e,
+                                       "olmBDBEntryCache")) != NULL)
+                               {
+                                       olmbdb_data = *olmbdb_list[0];
+                                       ssnprintf (typeinst, sizeof (typeinst),
+                                               "bdbentrycache-%s", nc_data.bv_val);
+                                       cldap_submit_gauge ("cache_size", typeinst,
+                                               atoll (olmbdb_data.bv_val), st);
+                                       ldap_value_free_len (olmbdb_list);
+                               }
+
+                               if ((olmbdb_list = ldap_get_values_len (st->ld, e,
+                                       "olmBDBDNCache")) != NULL)
+                               {
+                                       olmbdb_data = *olmbdb_list[0];
+                                       ssnprintf (typeinst, sizeof (typeinst),
+                                               "bdbdncache-%s", nc_data.bv_val);
+                                       cldap_submit_gauge ("cache_size", typeinst,
+                                               atoll (olmbdb_data.bv_val), st);
+                                       ldap_value_free_len (olmbdb_list);
+                               }
+
+                               if ((olmbdb_list = ldap_get_values_len (st->ld, e,
+                                       "olmBDBIDLCache")) != NULL)
+                               {
+                                       olmbdb_data = *olmbdb_list[0];
+                                       ssnprintf (typeinst, sizeof (typeinst),
+                                               "bdbidlcache-%s", nc_data.bv_val);
+                                       cldap_submit_gauge ("cache_size", typeinst,
+                                               atoll (olmbdb_data.bv_val), st);
+                                       ldap_value_free_len (olmbdb_list);
+                               }
+
+                               ldap_value_free_len (nc_list);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Bytes,cn=Statistics,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("derive", "statistics-bytes",
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=PDU,cn=Statistics,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("derive", "statistics-pdu",
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Entries,cn=Statistics,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("derive", "statistics-entries",
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Referrals,cn=Statistics,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("derive", "statistics-referrals",
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Open,cn=Threads,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_gauge ("threads", "threads-open",
+                                       info, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Starting,cn=Threads,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_gauge ("threads", "threads-starting",
+                                       info, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Active,cn=Threads,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_gauge ("threads", "threads-active",
+                                       info, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Pending,cn=Threads,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_gauge ("threads", "threads-pending",
+                                       info, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Backload,cn=Threads,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_gauge ("threads", "threads-backload",
+                                       info, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Read,cn=Waiters,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("derive", "waiters-read",
+                                       counter, st);
+                       }
+                       else if (strcmp (dn,
+                                       "cn=Write,cn=Waiters,cn=Monitor")
+                                       == 0)
+                       {
+                               cldap_submit_derive ("derive", "waiters-write",
+                                       counter, st);
+                       }
+
+                       ldap_value_free_len (counter_list);
+                       ldap_value_free_len (opc_list);
+                       ldap_value_free_len (opi_list);
+                       ldap_value_free_len (info_list);
+               }
+
+               ldap_memfree (dn);
+       }
+
+       ldap_msgfree (result);
+       ldap_unbind_ext_s (st->ld, NULL, NULL);
+       return (0);
+} /* }}} int cldap_read_host */
+
+/* Configuration handling functions {{{
+ *
+ * <Plugin ldap>
+ *   <Instance "plugin_instance1">
+ *     URL "ldap://localhost"
+ *     ...
+ *   </Instance>
+ * </Plugin>
+ */
+
+static int cldap_config_add (oconfig_item_t *ci) /* {{{ */
+{
+       cldap_t *st;
+       int i;
+       int status;
+
+       st = malloc (sizeof (*st));
+       if (st == NULL)
+       {
+               ERROR ("openldap plugin: malloc failed.");
+               return (-1);
+       }
+       memset (st, 0, sizeof (*st));
+
+       status = cf_util_get_string (ci, &st->name);
+       if (status != 0)
+       {
+               sfree (st);
+               return (status);
+       }
+
+       st->starttls = 0;
+       st->timeout = -1;
+       st->verifyhost = 1;
+       st->version = LDAP_VERSION3;
+
+       for (i = 0; i < ci->children_num; i++)
+       {
+               oconfig_item_t *child = ci->children + i;
+
+               if (strcasecmp ("CACert", child->key) == 0)
+                       status = cf_util_get_string (child, &st->cacert);
+               else if (strcasecmp ("StartTLS", child->key) == 0)
+                       status = cf_util_get_boolean (child, &st->starttls);
+               else if (strcasecmp ("Timeout", child->key) == 0)
+                       status = cf_util_get_int (child, &st->timeout);
+               else if (strcasecmp ("URL", child->key) == 0)
+                       status = cf_util_get_string (child, &st->url);
+               else if (strcasecmp ("VerifyHost", child->key) == 0)
+                       status = cf_util_get_boolean (child, &st->verifyhost);
+               else if (strcasecmp ("Version", child->key) == 0)
+                       status = cf_util_get_int (child, &st->version);
+               else
+               {
+                       WARNING ("openldap plugin: Option `%s' not allowed here.",
+                                       child->key);
+                       status = -1;
+               }
+
+               if (status != 0)
+                       break;
+       }
+
+       /* Check if struct is complete.. */
+       if ((status == 0) && (st->url == NULL))
+       {
+               ERROR ("openldap plugin: Instance `%s': "
+                               "No URL has been configured.",
+                               st->name);
+               status = -1;
+       }
+
+       /* Check if URL is valid */
+       if ((status == 0) && (st->url != NULL))
+       {
+               LDAPURLDesc *ludpp;
+               int rc;
+
+               if ((rc = ldap_url_parse (st->url, &ludpp)) != 0)
+               {
+                       ERROR ("openldap plugin: Instance `%s': "
+                               "Invalid URL: `%s'",
+                               st->name, st->url);
+                       status = -1;
+               }
+               else
+               {
+                       st->host = strdup (ludpp->lud_host);
+               }
+
+               ldap_free_urldesc (ludpp);
+       }
+
+       if (status == 0)
+       {
+               user_data_t ud;
+               char callback_name[3*DATA_MAX_NAME_LEN];
+
+               memset (&ud, 0, sizeof (ud));
+               ud.data = st;
+
+               memset (callback_name, 0, sizeof (callback_name));
+               ssnprintf (callback_name, sizeof (callback_name),
+                               "openldap/%s/%s",
+                               (st->host != NULL) ? st->host : hostname_g,
+                               (st->name != NULL) ? st->name : "default"),
+
+               status = plugin_register_complex_read (/* group = */ NULL,
+                               /* name      = */ callback_name,
+                               /* callback  = */ cldap_read_host,
+                               /* interval  = */ NULL,
+                               /* user_data = */ &ud);
+       }
+
+       if (status != 0)
+       {
+               cldap_free (st);
+               return (-1);
+       }
+
+       return (0);
+} /* }}} int cldap_config_add */
+
+static int cldap_config (oconfig_item_t *ci) /* {{{ */
+{
+       int i;
+       int status = 0;
+
+       for (i = 0; i < ci->children_num; i++)
+       {
+               oconfig_item_t *child = ci->children + i;
+
+               if (strcasecmp ("Instance", child->key) == 0)
+                       cldap_config_add (child);
+               else
+                       WARNING ("openldap plugin: The configuration option "
+                                       "\"%s\" is not allowed here. Did you "
+                                       "forget to add an <Instance /> block "
+                                       "around the configuration?",
+                                       child->key);
+       } /* for (ci->children) */
+
+       return (status);
+} /* }}} int cldap_config */
+
+/* }}} End of configuration handling functions */
+
+static int cldap_init (void) /* {{{ */
+{
+       /* Initialize LDAP library while still single-threaded as recommended in
+        * ldap_initialize(3) */
+       int debug_level;
+       ldap_get_option (NULL, LDAP_OPT_DEBUG_LEVEL, &debug_level);
+       return (0);
+} /* }}} int cldap_init */
+
+void module_register (void) /* {{{ */
+{
+       plugin_register_complex_config ("openldap", cldap_config);
+       plugin_register_init ("openldap", cldap_init);
+} /* }}} void module_register */
index 5b9a483..cc8faeb 100644 (file)
@@ -46,6 +46,7 @@
 #include <perl.h>
 
 #if defined(COLLECT_DEBUG) && COLLECT_DEBUG && defined(__GNUC__) && __GNUC__
+# undef sprintf
 # pragma GCC poison sprintf
 #endif
 
index 635abfc..47c9c5c 100644 (file)
@@ -135,6 +135,7 @@ typedef struct {
        /* writer "caching" settings */
        cdtime_t commit_interval;
        cdtime_t next_commit;
+       cdtime_t expire_delay;
 
        char *host;
        char *port;
@@ -257,6 +258,7 @@ static c_psql_database_t *c_psql_database_new (const char *name)
 
        db->commit_interval = 0;
        db->next_commit     = 0;
+       db->expire_delay    = 0;
 
        db->database   = sstrdup (name);
        db->host       = NULL;
@@ -867,6 +869,12 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl,
 
 #undef VALUE_OR_NULL
 
+       if( db->expire_delay > 0 && vl->time < (cdtime() - vl->interval - db->expire_delay) ) {
+               log_info ("c_psql_write: Skipped expired value @ %s - %s/%s-%s/%s-%s/%s", 
+                       params[0], params[1], params[2], params[3], params[4], params[5], params[6] );
+               return 0;
+        }
+
        pthread_mutex_lock (&db->db_lock);
 
        if (0 != c_psql_check_connection (db)) {
@@ -1236,6 +1244,8 @@ static int c_psql_config_database (oconfig_item_t *ci)
                        cf_util_get_cdtime (c, &db->interval);
                else if (strcasecmp ("CommitInterval", c->key) == 0)
                        cf_util_get_cdtime (c, &db->commit_interval);
+               else if (strcasecmp ("ExpireDelay", c->key) == 0)
+                       cf_util_get_cdtime (c, &db->expire_delay);
                else
                        log_warn ("Ignoring unknown config key \"%s\".", c->key);
        }
index ece9f75..151e09c 100644 (file)
@@ -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"},
@@ -175,6 +187,9 @@ statname_lookup_t lookup_table[] = /* {{{ */
   {"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 *
@@ -224,8 +239,8 @@ statname_lookup_t lookup_table[] = /* {{{ */
   {"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);
 
@@ -259,9 +274,6 @@ static void submit (const char *plugin_instance, /* {{{ */
     if (strcmp (lookup_table[i].name, pdns_type) == 0)
       break;
 
-  if (lookup_table[i].type == NULL)
-    return;
-
   if (i >= lookup_table_length)
   {
     INFO ("powerdns plugin: submit: Not found in lookup table: %s = %s;",
@@ -269,6 +281,9 @@ static void submit (const char *plugin_instance, /* {{{ */
     return;
   }
 
+  if (lookup_table[i].type == NULL)
+    return;
+
   type = lookup_table[i].type;
   type_instance = lookup_table[i].type_instance;
 
index aa47f33..68f30a5 100644 (file)
 #  endif
 /* #endif KERNEL_LINUX */
 
-#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD
+#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD)
 #  include <kvm.h>
 #  include <sys/param.h>
 #  include <sys/sysctl.h>
 #  include <sys/user.h>
 #  include <sys/proc.h>
-/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) */
 
 #elif HAVE_PROCINFO_H
 #  include <procinfo.h>
@@ -214,9 +214,9 @@ static mach_msg_type_number_t     pset_list_len;
 static long pagesize_g;
 /* #endif KERNEL_LINUX */
 
-#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD
+#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD)
 static int pagesize;
-/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) */
 
 #elif HAVE_PROCINFO_H
 static  struct procentry64 procentry[MAXPROCENTRY];
@@ -623,9 +623,9 @@ static int ps_init (void)
                        pagesize_g, CONFIG_HZ);
 /* #endif KERNEL_LINUX */
 
-#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD
+#elif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD)
        pagesize = getpagesize();
-/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
+/* #endif HAVE_LIBKVM_GETPROCS && (HAVE_STRUCT_KINFO_PROC_FREEBSD || HAVE_STRUCT_KINFO_PROC_OPENBSD) */
 
 #elif HAVE_PROCINFO_H
        pagesize = getpagesize();
@@ -1925,6 +1925,138 @@ static int ps_read (void)
                ps_submit_proc_list (ps_ptr);
 /* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_FREEBSD */
 
+#elif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_OPENBSD
+       int running  = 0;
+       int sleeping = 0;
+       int zombies  = 0;
+       int stopped  = 0;
+       int onproc   = 0;
+       int idle     = 0;
+       int dead     = 0;
+
+       kvm_t *kd;
+       char errbuf[1024];
+       struct kinfo_proc *procs;          /* array of processes */
+       struct kinfo_proc *proc_ptr = NULL;
+       int count;                         /* returns number of processes */
+       int i;
+
+       procstat_t *ps_ptr;
+       procstat_entry_t pse;
+
+       ps_list_reset ();
+
+       /* Open the kvm interface, get a descriptor */
+       kd = kvm_open (NULL, NULL, NULL, 0, errbuf);
+       if (kd == NULL)
+       {
+               ERROR ("processes plugin: Cannot open kvm interface: %s",
+                               errbuf);
+               return (0);
+       }
+
+       /* Get the list of processes. */
+       procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof(struct kinfo_proc), &count);
+       if (procs == NULL)
+       {
+               ERROR ("processes plugin: Cannot get kvm processes list: %s",
+                               kvm_geterr(kd));
+               kvm_close (kd);
+               return (0);
+       }
+
+       /* Iterate through the processes in kinfo_proc */
+       for (i = 0; i < count; i++)
+       {
+               /* Create only one process list entry per _process_, i.e.
+                * filter out threads (duplicate PID entries). */
+               if ((proc_ptr == NULL) || (proc_ptr->p_pid != procs[i].p_pid))
+               {
+                       char cmdline[CMDLINE_BUFFER_SIZE] = "";
+                       _Bool have_cmdline = 0;
+
+                       proc_ptr = &(procs[i]);
+                       /* Don't probe zombie processes  */
+                       if (!P_ZOMBIE(proc_ptr))
+                       {
+                               char **argv;
+                               int argc;
+                               int status;
+
+                               /* retrieve the arguments */
+                               argv = kvm_getargv (kd, proc_ptr, /* nchr = */ 0);
+                               argc = 0;
+                               if ((argv != NULL) && (argv[0] != NULL))
+                               {
+                                       while (argv[argc] != NULL)
+                                               argc++;
+
+                                       status = strjoin (cmdline, sizeof (cmdline), argv, argc, " ");
+                                       if (status < 0)
+                                               WARNING ("processes plugin: Command line did not fit into buffer.");
+                                       else
+                                               have_cmdline = 1;
+                               }
+                       } /* if (process has argument list) */
+
+                       pse.id       = procs[i].p_pid;
+                       pse.age      = 0;
+
+                       pse.num_proc = 1;
+                       pse.num_lwp  = 1; /* XXX: accumulate p_tid values for a single p_pid ? */
+
+                       pse.vmem_rss = procs[i].p_vm_rssize * pagesize;
+                       pse.vmem_data = procs[i].p_vm_dsize * pagesize;
+                       pse.vmem_code = procs[i].p_vm_tsize * pagesize;
+                       pse.stack_size = procs[i].p_vm_ssize * pagesize;
+                       pse.vmem_size = pse.stack_size + pse.vmem_code + pse.vmem_data;
+                       pse.vmem_minflt = 0;
+                       pse.vmem_minflt_counter = procs[i].p_uru_minflt;
+                       pse.vmem_majflt = 0;
+                       pse.vmem_majflt_counter = procs[i].p_uru_majflt;
+
+                       pse.cpu_user = 0;
+                       pse.cpu_system = 0;
+                       pse.cpu_user_counter = procs[i].p_uutime_usec +
+                                               (1000000lu * procs[i].p_uutime_sec);
+                       pse.cpu_system_counter = procs[i].p_ustime_usec +
+                                               (1000000lu * procs[i].p_ustime_sec);
+
+                       /* no I/O data */
+                       pse.io_rchar = -1;
+                       pse.io_wchar = -1;
+                       pse.io_syscr = -1;
+                       pse.io_syscw = -1;
+
+                       ps_list_add (procs[i].p_comm, have_cmdline ? cmdline : NULL, &pse);
+               } /* if ((proc_ptr == NULL) || (proc_ptr->p_pid != procs[i].p_pid)) */
+
+               switch (procs[i].p_stat)
+               {
+                       case SSTOP:     stopped++;      break;
+                       case SSLEEP:    sleeping++;     break;
+                       case SRUN:      running++;      break;
+                       case SIDL:      idle++;         break;
+                       case SONPROC:   onproc++;       break;
+                       case SDEAD:     dead++;         break;
+                       case SZOMB:     zombies++;      break;
+               }
+       }
+
+       kvm_close(kd);
+
+       ps_submit_state ("running",  running);
+       ps_submit_state ("sleeping", sleeping);
+       ps_submit_state ("zombies",  zombies);
+       ps_submit_state ("stopped",  stopped);
+       ps_submit_state ("onproc",   onproc);
+       ps_submit_state ("idle",     idle);
+       ps_submit_state ("dead",     dead);
+
+       for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next)
+               ps_submit_proc_list (ps_ptr);
+/* #endif HAVE_LIBKVM_GETPROCS && HAVE_STRUCT_KINFO_PROC_OPENBSD */
+
 #elif HAVE_PROCINFO_H
        /* AIX */
        int running  = 0;
index 10ac8f0..8b378a2 100644 (file)
@@ -46,6 +46,19 @@ typedef struct cpy_callback_s {
 
 static char log_doc[] = "This function sends a string to all logging plugins.";
 
+static char get_ds_doc[] = "get_dataset(name) -> definition\n"
+               "\n"
+               "Returns the definition of a dataset specified by name.\n"
+               "\n"
+               "'name' is a string specifying the dataset to query.\n"
+               "'definition' is a list of 4-tuples. Every tuple represents a \n"
+               "    data source within the data set and its 4 values are the \n"
+               "    name, type, min and max value.\n"
+               "    'name' is a string.\n"
+               "    'type' is a string that is equal to either DS_TYPE_COUNTER,\n"
+               "        DS_TYPE_GAUGE, DS_TYPE_DERIVE or DS_TYPE_ABSOLUTE.\n"
+               "    'min' and 'max' are either a float or None.";
+
 static char flush_doc[] = "flush([plugin][, timeout][, identifier]) -> None\n"
                "\n"
                "Flushes the cache of another plugin.";
@@ -548,7 +561,39 @@ static PyObject *cpy_register_generic(cpy_callback_t **list_head, PyObject *args
        return cpy_string_to_unicode_or_bytes(buf);
 }
 
-static PyObject *cpy_flush(cpy_callback_t **list_head, PyObject *args, PyObject *kwds) {
+static PyObject *float_or_none(float number) {
+       if (isnan(number)) {
+               Py_RETURN_NONE;
+       }
+       return PyFloat_FromDouble(number);
+}
+
+static PyObject *cpy_get_dataset(PyObject *self, PyObject *args) {
+       int i;
+       char *name;
+       const data_set_t *ds;
+       PyObject *list, *tuple;
+
+       if (PyArg_ParseTuple(args, "et", NULL, &name) == 0) return NULL;
+       ds = plugin_get_ds(name);
+       PyMem_Free(name);
+       if (ds == NULL) {
+               PyErr_Format(PyExc_TypeError, "Dataset %s not found", name);
+               return NULL;
+       }
+       list = PyList_New(ds->ds_num); /* New reference. */
+       for (i = 0; i < ds->ds_num; ++i) {
+               tuple = PyTuple_New(4);
+               PyTuple_SET_ITEM(tuple, 0, cpy_string_to_unicode_or_bytes(ds->ds[i].name));
+               PyTuple_SET_ITEM(tuple, 1, cpy_string_to_unicode_or_bytes(DS_TYPE_TO_STRING(ds->ds[i].type)));
+               PyTuple_SET_ITEM(tuple, 2, float_or_none(ds->ds[i].min));
+               PyTuple_SET_ITEM(tuple, 3, float_or_none(ds->ds[i].max));
+               PyList_SET_ITEM(list, i, tuple);
+       }
+       return list;
+}
+
+static PyObject *cpy_flush(PyObject *self, PyObject *args, PyObject *kwds) {
        int timeout = -1;
        char *plugin = NULL, *identifier = NULL;
        static char *kwlist[] = {"plugin", "timeout", "identifier", NULL};
@@ -817,6 +862,7 @@ static PyMethodDef cpy_methods[] = {
        {"notice", cpy_notice, METH_VARARGS, log_doc},
        {"warning", cpy_warning, METH_VARARGS, log_doc},
        {"error", cpy_error, METH_VARARGS, log_doc},
+       {"get_dataset", (PyCFunction) cpy_get_dataset, METH_VARARGS, get_ds_doc},
        {"flush", (PyCFunction) cpy_flush, METH_VARARGS | METH_KEYWORDS, flush_doc},
        {"register_log", (PyCFunction) cpy_register_log, METH_VARARGS | METH_KEYWORDS, reg_log_doc},
        {"register_init", (PyCFunction) cpy_register_init, METH_VARARGS | METH_KEYWORDS, reg_init_doc},
@@ -988,13 +1034,15 @@ PyMODINIT_FUNC PyInit_collectd(void) {
 #endif
 
 static int cpy_init_python() {
-       char *argv = "";
        PyObject *sys;
        PyObject *module;
 
 #ifdef IS_PY3K
+       wchar_t *argv = L"";
        /* Add a builtin module, before Py_Initialize */
        PyImport_AppendInittab("collectd", PyInit_collectd);
+#else
+       char *argv = "";
 #endif
        
        Py_Initialize();
@@ -1041,6 +1089,10 @@ static int cpy_init_python() {
        PyModule_AddIntConstant(module, "NOTIF_FAILURE", NOTIF_FAILURE);
        PyModule_AddIntConstant(module, "NOTIF_WARNING", NOTIF_WARNING);
        PyModule_AddIntConstant(module, "NOTIF_OKAY", NOTIF_OKAY);
+       PyModule_AddStringConstant(module, "DS_TYPE_COUNTER", DS_TYPE_TO_STRING(DS_TYPE_COUNTER));
+       PyModule_AddStringConstant(module, "DS_TYPE_GAUGE", DS_TYPE_TO_STRING(DS_TYPE_GAUGE));
+       PyModule_AddStringConstant(module, "DS_TYPE_DERIVE", DS_TYPE_TO_STRING(DS_TYPE_DERIVE));
+       PyModule_AddStringConstant(module, "DS_TYPE_ABSOLUTE", DS_TYPE_TO_STRING(DS_TYPE_ABSOLUTE));
        return 0;
 }
 
@@ -1067,9 +1119,13 @@ static int cpy_config(oconfig_item_t *ci) {
                } else if (strcasecmp(item->key, "Encoding") == 0) {
                        if (item->values_num != 1 || item->values[0].type != OCONFIG_TYPE_STRING)
                                continue;
+#ifdef IS_PY3K
+                       NOTICE("python: \"Encoding\" was used in the config file but Python3 was used, which does not support changing encodings. Ignoring this.");
+#else
                        /* Why is this even necessary? And undocumented? */
                        if (PyUnicode_SetDefaultEncoding(item->values[0].value.string))
                                cpy_log_exception("setting default encoding");
+#endif
                } else if (strcasecmp(item->key, "LogTraces") == 0) {
                        if (item->values_num != 1 || item->values[0].type != OCONFIG_TYPE_BOOLEAN)
                                continue;
@@ -1103,8 +1159,8 @@ static int cpy_config(oconfig_item_t *ci) {
                                cpy_log_exception("python initialization");
                                continue;
                        }
-                       if (PyList_Append(sys_path, dir_object) != 0) {
-                               ERROR("python plugin: Unable to append \"%s\" to "
+                       if (PyList_Insert(sys_path, 0, dir_object) != 0) {
+                               ERROR("python plugin: Unable to prepend \"%s\" to "
                                      "python module path.", dir);
                                cpy_log_exception("python initialization");
                        }
index 4f5c4ce..78e6cf9 100644 (file)
@@ -427,10 +427,11 @@ static meta_data_t *cpy_build_meta(PyObject *meta) {
                cpy_log_exception("building meta data");
                return NULL;
        }
-
        s = PyList_Size(l);
-       if (s < 0)
+       if (s <= 0) {
+               Py_XDECREF(l);
                return NULL;
+       }
 
        m = meta_data_create();
        for (i = 0; i < s; ++i) {
index 92be18f..7864ead 100644 (file)
@@ -26,7 +26,8 @@
 #include "configfile.h"
 
 #include <pthread.h>
-#include <credis.h>
+#include <sys/time.h>
+#include <hiredis/hiredis.h>
 
 #ifndef HOST_NAME_MAX
 # define HOST_NAME_MAX _POSIX_HOST_NAME_MAX
@@ -38,6 +39,8 @@
 #define REDIS_DEF_TIMEOUT 2000
 #define MAX_REDIS_NODE_NAME 64
 #define MAX_REDIS_PASSWD_LENGTH 512
+#define MAX_REDIS_VAL_SIZE 256
+#define MAX_REDIS_QUERY 2048
 
 /* Redis plugin configuration example:
  *
  *   <Node "mynode">
  *     Host "localhost"
  *     Port "6379"
- *     Timeout 2000
+ *     Timeout 2
+ *     Password "foobar"
  *   </Node>
  * </Plugin>
  */
 
+struct redis_query_s;
+typedef struct redis_query_s redis_query_t;
+struct redis_query_s
+{
+    char query[MAX_REDIS_QUERY];
+    char type[DATA_MAX_NAME_LEN];
+    char instance[DATA_MAX_NAME_LEN];
+    redis_query_t *next;
+};
+
 struct redis_node_s;
 typedef struct redis_node_s redis_node_t;
 struct redis_node_s
@@ -58,7 +72,8 @@ struct redis_node_s
   char host[HOST_NAME_MAX];
   char passwd[MAX_REDIS_PASSWD_LENGTH];
   int port;
-  int timeout;
+  struct timeval timeout;
+  redis_query_t *queries;
 
   redis_node_t *next;
 };
@@ -107,16 +122,61 @@ static int redis_node_add (const redis_node_t *rn) /* {{{ */
   return (0);
 } /* }}} */
 
+static redis_query_t *redis_config_query (oconfig_item_t *ci) /* {{{ */
+{
+    redis_query_t *rq;
+    int status;
+    int i;
+
+    rq = calloc(1, sizeof(*rq));
+    if (rq == NULL) {
+        ERROR("redis plugin: calloca failed adding redis_query.");
+        return NULL;
+    }
+    status = cf_util_get_string_buffer(ci, rq->query, sizeof(rq->query));
+    if (status != 0)
+        goto err;
+
+    /*
+     * Default to a gauge type.
+     */
+    (void)strncpy(rq->type, "gauge", sizeof(rq->type));
+    (void)strncpy(rq->instance, rq->query, sizeof(rq->instance));
+    replace_special(rq->instance, sizeof(rq->instance));
+
+    for (i = 0; i < ci->children_num; i++) {
+        oconfig_item_t *option = ci->children + i;
+
+        if (strcasecmp("Type", option->key) == 0) {
+            status = cf_util_get_string_buffer(option, rq->type, sizeof(rq->type));
+        } else if (strcasecmp("Instance", option->key) == 0) {
+            status = cf_util_get_string_buffer(option, rq->instance, sizeof(rq->instance));
+        } else {
+            WARNING("redis plugin: unknown configuration option: %s", option->key);
+            status = -1;
+        }
+        if (status != 0)
+            goto err;
+    }
+    return rq;
+ err:
+    free(rq);
+    return NULL;
+} /* }}} */
+
 static int redis_config_node (oconfig_item_t *ci) /* {{{ */
 {
   redis_node_t rn;
+  redis_query_t *rq;
   int i;
   int status;
+  int timeout;
 
   memset (&rn, 0, sizeof (rn));
   sstrncpy (rn.host, REDIS_DEF_HOST, sizeof (rn.host));
   rn.port = REDIS_DEF_PORT;
-  rn.timeout = REDIS_DEF_TIMEOUT;
+  rn.timeout.tv_usec = REDIS_DEF_TIMEOUT;
+  rn.queries = NULL;
 
   status = cf_util_get_string_buffer (ci, rn.name, sizeof (rn.name));
   if (status != 0)
@@ -137,8 +197,21 @@ static int redis_config_node (oconfig_item_t *ci) /* {{{ */
         status = 0;
       }
     }
+    else if (strcasecmp ("Query", option->key) == 0)
+    {
+      rq = redis_config_query(option);
+      if (rq == NULL) {
+          status =1;
+      } else {
+          rq->next = rn.queries;
+          rn.queries = rq;
+      }
+    }
     else if (strcasecmp ("Timeout", option->key) == 0)
-      status = cf_util_get_int (option, &rn.timeout);
+    {
+      status = cf_util_get_int (option, &timeout);
+      if (status == 0) rn.timeout.tv_usec = timeout;
+    }
     else if (strcasecmp ("Password", option->key) == 0)
       status = cf_util_get_string_buffer (option, rn.passwd, sizeof (rn.passwd));
     else
@@ -180,39 +253,14 @@ static int redis_config (oconfig_item_t *ci) /* {{{ */
 } /* }}} */
 
   __attribute__ ((nonnull(2)))
-static void redis_submit_g (char *plugin_instance,
-    const char *type, const char *type_instance,
-    gauge_t value) /* {{{ */
-{
-  value_t values[1];
-  value_list_t vl = VALUE_LIST_INIT;
-
-  values[0].gauge = value;
-
-  vl.values = values;
-  vl.values_len = 1;
-  sstrncpy (vl.host, hostname_g, sizeof (vl.host));
-  sstrncpy (vl.plugin, "redis", sizeof (vl.plugin));
-  if (plugin_instance != NULL)
-    sstrncpy (vl.plugin_instance, plugin_instance,
-        sizeof (vl.plugin_instance));
-  sstrncpy (vl.type, type, sizeof (vl.type));
-  if (type_instance != NULL)
-    sstrncpy (vl.type_instance, type_instance,
-        sizeof (vl.type_instance));
-
-  plugin_dispatch_values (&vl);
-} /* }}} */
-
-  __attribute__ ((nonnull(2)))
-static void redis_submit_d (char *plugin_instance,
+static void redis_submit (char *plugin_instance,
     const char *type, const char *type_instance,
-    derive_t value) /* {{{ */
+    value_t value) /* {{{ */
 {
   value_t values[1];
   value_list_t vl = VALUE_LIST_INIT;
 
-  values[0].derive = value;
+  values[0] = value;
 
   vl.values = values;
   vl.values_len = 1;
@@ -231,8 +279,14 @@ static void redis_submit_d (char *plugin_instance,
 
 static int redis_init (void) /* {{{ */
 {
-  redis_node_t rn = { "default", REDIS_DEF_HOST, REDIS_DEF_PASSWD,
-    REDIS_DEF_PORT, REDIS_DEF_TIMEOUT, /* next = */ NULL };
+  redis_node_t rn = {
+    .name = "default",
+    .host = REDIS_DEF_HOST,
+    .port = REDIS_DEF_PORT,
+    .timeout.tv_sec = 0,
+    .timeout.tv_usec = REDIS_DEF_TIMEOUT,
+    .next = NULL
+};
 
   if (nodes_head == NULL)
     redis_node_add (&rn);
@@ -240,20 +294,103 @@ static int redis_init (void) /* {{{ */
   return (0);
 } /* }}} int redis_init */
 
+int redis_handle_info (char *node, char const *info_line, char const *type, char const *type_instance, char const *field_name, int ds_type) /* {{{ */
+{
+  char *str = strstr (info_line, field_name);
+  static char buf[MAX_REDIS_VAL_SIZE];
+  value_t val;
+  if (str)
+  {
+    int i;
+
+    str += strlen (field_name) + 1; /* also skip the ':' */
+    for(i=0;(*str && (isdigit(*str) || *str == '.'));i++,str++)
+      buf[i] = *str;
+    buf[i] ='\0';
+
+    if(parse_value (buf, &val, ds_type) == -1)
+    {
+      WARNING ("redis plugin: Unable to parse field `%s'.", field_name);
+      return (-1);
+    }
+
+    redis_submit (node, type, type_instance, val);
+    return (0);
+  }
+  return (-1);
+
+} /* }}} int redis_handle_info */
+
+int redis_handle_query (redisContext *rh, redis_node_t *rn, redis_query_t *rq) /* {{{ */
+{
+    redisReply *rr;
+    const data_set_t *ds;
+    value_t val;
+
+    ds = plugin_get_ds (rq->type);
+    if (!ds) {
+        ERROR ("redis plugin: DataSet `%s' not defined.", rq->type);
+        return (-1);
+    }
+
+    if (ds->ds_num != 1) {
+        ERROR ("redis plugin: DS `%s' has too many types.", rq->type);
+        return (-1);
+    }
+
+    if ((rr = redisCommand(rh, rq->query)) == NULL) {
+        WARNING("redis plugin: unable to carry out query `%s'.", rq->query);
+        return (-1);
+    }
+
+    switch (rr->type) {
+    case REDIS_REPLY_INTEGER:
+        switch (ds->ds[0].type) {
+        case DS_TYPE_COUNTER:
+            val.counter = (counter_t)rr->integer;
+            break;
+        case DS_TYPE_GAUGE:
+            val.gauge = (gauge_t)rr->integer;
+            break;
+        case DS_TYPE_DERIVE:
+            val.gauge = (derive_t)rr->integer;
+            break;
+        case DS_TYPE_ABSOLUTE:
+            val.gauge = (absolute_t)rr->integer;
+            break;
+        }
+        break;
+    case REDIS_REPLY_STRING:
+        if (parse_value (rr->str, &val, ds->ds[0].type) == -1) {
+            WARNING("redis plugin: Unable to parse field `%s'.", rq->type);
+            freeReplyObject (rr);
+            return (-1);
+        }
+        break;
+    default:
+        WARNING("redis plugin: Cannot coerce redis type.");
+        freeReplyObject(rr);
+        return (-1);
+    }
+
+    redis_submit(rn->name, rq->type, (strlen(rq->instance) >0)?rq->instance:NULL, val);
+    freeReplyObject (rr);
+    return 0;
+} /* }}} int redis_handle_info */
+
 static int redis_read (void) /* {{{ */
 {
   redis_node_t *rn;
+  redis_query_t *rq;
 
   for (rn = nodes_head; rn != NULL; rn = rn->next)
   {
-    REDIS rh;
-    REDIS_INFO info;
-
-    int status;
+    redisContext *rh;
+    redisReply   *rr;
 
     DEBUG ("redis plugin: querying info from node `%s' (%s:%d).", rn->name, rn->host, rn->port);
 
-    rh = credis_connect (rn->host, rn->port, rn->timeout);
+    rh = redisConnectWithTimeout ((char *)rn->host, rn->port, rn->timeout);
     if (rh == NULL)
     {
       ERROR ("redis plugin: unable to connect to node `%s' (%s:%d).", rn->name, rn->host, rn->port);
@@ -263,56 +400,46 @@ static int redis_read (void) /* {{{ */
     if (strlen (rn->passwd) > 0)
     {
       DEBUG ("redis plugin: authenticanting node `%s' passwd(%s).", rn->name, rn->passwd);
-      status = credis_auth(rh, rn->passwd);
-      if (status != 0)
+      rr = redisCommand (rh, "AUTH %s", rn->passwd);
+
+      if (rr == NULL || rr->type != REDIS_REPLY_STATUS)
       {
         WARNING ("redis plugin: unable to authenticate on node `%s'.", rn->name);
-        credis_close (rh);
+        if (rr != NULL)
+          freeReplyObject (rr);
+
+        redisFree (rh);
         continue;
       }
     }
 
-    memset (&info, 0, sizeof (info));
-    status = credis_info (rh, &info);
-    if (status != 0)
+    if ((rr = redisCommand(rh, "INFO")) == NULL)
     {
-      WARNING ("redis plugin: unable to get info from node `%s'.", rn->name);
-      credis_close (rh);
+      WARNING ("redis plugin: unable to connect to node `%s'.", rn->name);
+      redisFree (rh);
       continue;
     }
 
-    /* typedef struct _cr_info {
-     *   char redis_version[CREDIS_VERSION_STRING_SIZE];
-     *   int bgsave_in_progress;
-     *   int connected_clients;
-     *   int connected_slaves;
-     *   unsigned int used_memory;
-     *   long long changes_since_last_save;
-     *   int last_save_time;
-     *   long long total_connections_received;
-     *   long long total_commands_processed;
-     *   int uptime_in_seconds;
-     *   int uptime_in_days;
-     *   int role;
-     * } REDIS_INFO; */
-
-    DEBUG ("redis plugin: received info from node `%s': connected_clients = %d; "
-        "connected_slaves = %d; used_memory = %lu; changes_since_last_save = %lld; "
-        "bgsave_in_progress = %d; total_connections_received = %lld; "
-        "total_commands_processed = %lld; uptime_in_seconds = %ld", rn->name,
-        info.connected_clients, info.connected_slaves, info.used_memory,
-        info.changes_since_last_save, info.bgsave_in_progress,
-        info.total_connections_received, info.total_commands_processed,
-        info.uptime_in_seconds);
-
-    redis_submit_g (rn->name, "current_connections", "clients", info.connected_clients);
-    redis_submit_g (rn->name, "current_connections", "slaves", info.connected_slaves);
-    redis_submit_g (rn->name, "memory", "used", info.used_memory);
-    redis_submit_g (rn->name, "volatile_changes", NULL, info.changes_since_last_save);
-    redis_submit_d (rn->name, "total_connections", NULL, info.total_connections_received);
-    redis_submit_d (rn->name, "total_operations", NULL, info.total_commands_processed);
-
-    credis_close (rh);
+    redis_handle_info (rn->name, rr->str, "uptime", NULL, "uptime_in_seconds", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "current_connections", "clients", "connected_clients", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "blocked_clients", NULL, "blocked_clients", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "memory", NULL, "used_memory", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "memory_lua", NULL, "used_memory_lua", DS_TYPE_GAUGE);
+    /* changes_since_last_save: Deprecated in redis version 2.6 and above */
+    redis_handle_info (rn->name, rr->str, "volatile_changes", NULL, "changes_since_last_save", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "total_connections", NULL, "total_connections_received", DS_TYPE_DERIVE);
+    redis_handle_info (rn->name, rr->str, "total_operations", NULL, "total_commands_processed", DS_TYPE_DERIVE);
+    redis_handle_info (rn->name, rr->str, "expired_keys", NULL, "expired_keys", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "pubsub", "channels", "pubsub_channels", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "pubsub", "patterns", "pubsub_patterns", DS_TYPE_GAUGE);
+    redis_handle_info (rn->name, rr->str, "current_connections", "slaves", "connected_slaves", DS_TYPE_GAUGE);
+
+    freeReplyObject (rr);
+
+    for (rq = rn->queries; rq != NULL; rq = rq->next)
+        redis_handle_query(rh, rn, rq);
+
+    redisFree (rh);
   }
 
   return 0;
index 7389449..f5b09bd 100644 (file)
@@ -62,7 +62,9 @@ static char *sensor_type_name_map[] =
        "fanspeed",
 # define SENSOR_TYPE_TEMPERATURE 2
        "temperature",
-# define SENSOR_TYPE_UNKNOWN     3
+# define SENSOR_TYPE_POWER       3
+       "power",
+# define SENSOR_TYPE_UNKNOWN     4
        NULL
 };
 
@@ -127,7 +129,8 @@ static sensors_labeltypes_t known_features[] =
        { "3.3V", SENSOR_TYPE_VOLTAGE },
        { "2.5V", SENSOR_TYPE_VOLTAGE },
        { "2.0V", SENSOR_TYPE_VOLTAGE },
-       { "12V", SENSOR_TYPE_VOLTAGE }
+       { "12V", SENSOR_TYPE_VOLTAGE },
+       { "power1", SENSOR_TYPE_POWER }
 };
 static int known_features_num = STATIC_ARRAY_SIZE (known_features);
 /* end new naming */
@@ -411,7 +414,8 @@ static int sensors_load_conf (void)
                        /* Only handle voltage, fanspeeds and temperatures */
                        if ((feature->type != SENSORS_FEATURE_IN)
                                        && (feature->type != SENSORS_FEATURE_FAN)
-                                       && (feature->type != SENSORS_FEATURE_TEMP))
+                                       && (feature->type != SENSORS_FEATURE_TEMP)
+                                       && (feature->type != SENSORS_FEATURE_POWER))
                        {
                                DEBUG ("sensors plugin: sensors_load_conf: "
                                                "Ignoring feature `%s', "
@@ -427,7 +431,8 @@ static int sensors_load_conf (void)
 
                                if ((subfeature->type != SENSORS_SUBFEATURE_IN_INPUT)
                                                && (subfeature->type != SENSORS_SUBFEATURE_FAN_INPUT)
-                                               && (subfeature->type != SENSORS_SUBFEATURE_TEMP_INPUT))
+                                               && (subfeature->type != SENSORS_SUBFEATURE_TEMP_INPUT)
+                                               && (subfeature->type != SENSORS_SUBFEATURE_POWER_INPUT))
                                        continue;
 
                                fl = (featurelist_t *) malloc (sizeof (featurelist_t));
@@ -573,6 +578,9 @@ static int sensors_read (void)
                else if (fl->feature->type
                                == SENSORS_FEATURE_TEMP)
                        type = "temperature";
+               else if (fl->feature->type
+                               == SENSORS_FEATURE_POWER)
+                       type = "power";
                else
                        continue;
 
diff --git a/src/smart.c b/src/smart.c
new file mode 100644 (file)
index 0000000..3b113bd
--- /dev/null
@@ -0,0 +1,269 @@
+/**
+ * collectd - src/smart.c
+ * Copyright (C) 2014       Vincent Bernat
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Vincent Bernat <vbe at exoscale.ch>
+ **/
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+#include "utils_ignorelist.h"
+
+#include <atasmart.h>
+#include <libudev.h>
+
+static const char *config_keys[] =
+{
+  "Disk",
+  "IgnoreSelected"
+};
+
+static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
+
+static ignorelist_t *ignorelist = NULL;
+
+static int smart_config (const char *key, const char *value)
+{
+  if (ignorelist == NULL)
+    ignorelist = ignorelist_create (/* invert = */ 1);
+  if (ignorelist == NULL)
+    return (1);
+
+  if (strcasecmp ("Disk", key) == 0)
+  {
+    ignorelist_add (ignorelist, value);
+  }
+  else if (strcasecmp ("IgnoreSelected", key) == 0)
+  {
+    int invert = 1;
+    if (IS_TRUE (value))
+      invert = 0;
+    ignorelist_set_invert (ignorelist, invert);
+  }
+  else
+  {
+    return (-1);
+  }
+
+  return (0);
+} /* int smart_config */
+
+static void smart_submit (const char *dev, char *type, char *type_inst, double value)
+{
+       value_t values[1];
+       value_list_t vl = VALUE_LIST_INIT;
+
+       values[0].gauge = value;
+
+       vl.values = values;
+       vl.values_len = 1;
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "smart", sizeof (vl.plugin));
+       sstrncpy (vl.plugin_instance, dev, sizeof (vl.plugin_instance));
+       sstrncpy (vl.type, type, sizeof (vl.type));
+       sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
+
+       plugin_dispatch_values (&vl);
+}
+
+static void smart_handle_disk_attribute(SkDisk *d, const SkSmartAttributeParsedData *a,
+                                        void* userdata)
+{
+  const char *dev = userdata;
+  value_t values[4];
+  value_list_t vl = VALUE_LIST_INIT;
+
+  if (!a->current_value_valid || !a->worst_value_valid) return;
+  values[0].gauge = a->current_value;
+  values[1].gauge = a->worst_value;
+  values[2].gauge = a->threshold_valid?a->threshold:0;
+  values[3].gauge = a->pretty_value;
+
+  vl.values = values;
+  vl.values_len = 4;
+  sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+  sstrncpy (vl.plugin, "smart", sizeof (vl.plugin));
+  sstrncpy (vl.plugin_instance, dev, sizeof (vl.plugin_instance));
+  sstrncpy (vl.type, "smart_attribute", sizeof (vl.type));
+  sstrncpy (vl.type_instance, a->name, sizeof (vl.type_instance));
+
+  plugin_dispatch_values (&vl);
+
+  if (a->threshold_valid && a->current_value <= a->threshold)
+  {
+    notification_t notif = { NOTIF_WARNING,
+                             cdtime (),
+                             "",
+                             "",
+                             "smart", "",
+                             "smart_attribute",
+                             "",
+                             NULL };
+    sstrncpy (notif.host, hostname_g, sizeof (notif.host));
+    sstrncpy (notif.plugin_instance, dev, sizeof (notif.plugin_instance));
+    sstrncpy (notif.type_instance, a->name, sizeof (notif.type_instance));
+    ssnprintf (notif.message, sizeof (notif.message),
+               "attribute %s is below allowed threshold (%d < %d)",
+               a->name, a->current_value, a->threshold);
+    plugin_dispatch_notification (&notif);
+  }
+}
+
+static void smart_handle_disk (const char *dev)
+{
+  SkDisk *d = NULL;
+  SkBool awake = FALSE;
+  SkBool available = FALSE;
+  const char *shortname;
+  const SkSmartParsedData *spd;
+  uint64_t poweron, powercycles, badsectors, temperature;
+
+  shortname = strrchr(dev, '/');
+  if (!shortname) return;
+  shortname++;
+  if (ignorelist_match (ignorelist, shortname) != 0) {
+    DEBUG ("smart plugin: ignoring %s.", dev);
+    return;
+  }
+
+  DEBUG ("smart plugin: checking SMART status of %s.",
+         dev);
+
+  if (sk_disk_open (dev, &d) < 0)
+  {
+    ERROR ("smart plugin: unable to open %s.", dev);
+    return;
+  }
+  if (sk_disk_identify_is_available (d, &available) < 0 || !available)
+  {
+    DEBUG ("smart plugin: disk %s cannot be identified.", dev);
+    goto end;
+  }
+  if (sk_disk_smart_is_available (d, &available) < 0 || !available)
+  {
+    DEBUG ("smart plugin: disk %s has no SMART support.", dev);
+    goto end;
+  }
+  if (sk_disk_check_sleep_mode (d, &awake) < 0 || !awake)
+  {
+    DEBUG ("smart plugin: disk %s is sleeping.", dev);
+    goto end;
+  }
+  if (sk_disk_smart_read_data (d) < 0)
+  {
+    ERROR ("smart plugin: unable to get SMART data for disk %s.", dev);
+    goto end;
+  }
+  if (sk_disk_smart_parse (d, &spd) < 0)
+  {
+    ERROR ("smart plugin: unable to parse SMART data for disk %s.", dev);
+    goto end;
+  }
+
+  /* Get some specific values */
+  if (sk_disk_smart_get_power_on (d, &poweron) < 0)
+  {
+    WARNING ("smart plugin: unable to get milliseconds since power on for %s.",
+             dev);
+  }
+  else
+    smart_submit (shortname, "smart_poweron", "", poweron / 1000.);
+
+  if (sk_disk_smart_get_power_cycle (d, &powercycles) < 0)
+  {
+    WARNING ("smart plugin: unable to get number of power cycles for %s.",
+             dev);
+  }
+  else
+    smart_submit (shortname, "smart_powercycles", "", powercycles);
+
+  if (sk_disk_smart_get_bad (d, &badsectors) < 0)
+  {
+    WARNING ("smart plugin: unable to get number of bad sectors for %s.",
+             dev);
+  }
+  else
+    smart_submit (shortname, "smart_badsectors", "", badsectors);
+
+  if (sk_disk_smart_get_temperature (d, &temperature) < 0)
+  {
+    WARNING ("smart plugin: unable to get temperature for %s.",
+             dev);
+  }
+  else
+    smart_submit (shortname, "smart_temperature", "", temperature / 1000. - 273.15);
+
+  /* Grab all attributes */
+  if (sk_disk_smart_parse_attributes(d, smart_handle_disk_attribute,
+                                     (char *)shortname) < 0)
+  {
+    ERROR ("smart plugin: unable to handle SMART attributes for %s.",
+           dev);
+  }
+
+end:
+  sk_disk_free(d);
+}
+
+static int smart_read (void)
+{
+  struct udev *handle_udev;
+  struct udev_enumerate *enumerate;
+  struct udev_list_entry *devices, *dev_list_entry;
+  struct udev_device *dev;
+
+  /* Use udev to get a list of disks */
+  handle_udev = udev_new();
+  if (!handle_udev)
+  {
+    ERROR ("smart plugin: unable to initialize udev.");
+    return (-1);
+  }
+  enumerate = udev_enumerate_new (handle_udev);
+  udev_enumerate_add_match_subsystem (enumerate, "block");
+  udev_enumerate_add_match_property (enumerate, "DEVTYPE", "disk");
+  udev_enumerate_scan_devices (enumerate);
+  devices = udev_enumerate_get_list_entry (enumerate);
+  udev_list_entry_foreach (dev_list_entry, devices)
+  {
+    const char *path, *devpath;
+    path = udev_list_entry_get_name (dev_list_entry);
+    dev = udev_device_new_from_syspath (handle_udev, path);
+    devpath = udev_device_get_devnode (dev);
+
+    /* Query status with libatasmart */
+    smart_handle_disk (devpath);
+  }
+
+  udev_enumerate_unref (enumerate);
+  udev_unref (handle_udev);
+
+  return (0);
+} /* int smart_read */
+
+void module_register (void)
+{
+  plugin_register_config ("smart", smart_config,
+                          config_keys, config_keys_num);
+  plugin_register_read ("smart", smart_read);
+} /* void module_register */
index 7d6e0a1..cb2bb36 100644 (file)
@@ -359,7 +359,7 @@ static int csnmp_config_add_data_blacklist(data_definition_t *dd, oconfig_item_t
     {
       ERROR("snmp plugin: Can't allocate memory");
       strarray_free(dd->ignores, dd->ignores_len);
-      return (ENOMEM); 
+      return (ENOMEM);
     }
   }
   return 0;
@@ -993,7 +993,8 @@ static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
       status = parse_value (string, &ret, type);
       if (status != 0)
       {
-        ERROR ("snmp plugin: csnmp_value_list_to_value: Parsing string as %s failed: %s",
+        ERROR ("snmp plugin: host %s: csnmp_value_list_to_value: Parsing string as %s failed: %s",
+            (host_name != NULL) ? host_name : "UNKNOWN",
             DS_TYPE_TO_STRING (type), string);
       }
     }
@@ -1497,6 +1498,8 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
         snmp_free_pdu (res);
       res = NULL;
 
+      /* snmp_synch_response already freed our PDU */
+      req = NULL;
       sfree (errstr);
       csnmp_host_close_session (host);
 
@@ -1544,7 +1547,8 @@ static int csnmp_read_table (host_definition_t *host, data_definition_t *data)
         if (csnmp_instance_list_add (&instance_list_head, &instance_list_tail,
               res, host, data) != 0)
         {
-          ERROR ("snmp plugin: csnmp_instance_list_add failed.");
+          ERROR ("snmp plugin: host %s: csnmp_instance_list_add failed.",
+              host->name);
           status = -1;
           break;
         }
index 0642afa..8af18f4 100644 (file)
@@ -205,11 +205,11 @@ static void swap_submit_usage (char const *plugin_instance, /* {{{ */
        sstrncpy (vl.type, "swap", sizeof (vl.type));
 
        if (values_absolute)
-               plugin_dispatch_multivalue (&vl, 0,
+               plugin_dispatch_multivalue (&vl, 0, DS_TYPE_GAUGE,
                                "used", used, "free", free,
                                other_name, other_value, NULL);
        if (values_percentage)
-               plugin_dispatch_multivalue (&vl, 1,
+               plugin_dispatch_multivalue (&vl, 1, DS_TYPE_GAUGE,
                                "used", used, "free", free,
                                other_name, other_value, NULL);
 } /* }}} void swap_submit_usage */
index 5a04231..0236c9d 100644 (file)
@@ -272,12 +272,15 @@ static const char *config_keys[] =
 {
   "ListeningPorts",
   "LocalPort",
-  "RemotePort"
+  "RemotePort",
+  "AllPortsSummary"
 };
 static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
 
 static int port_collect_listening = 0;
+static int port_collect_total = 0;
 static port_entry_t *port_list_head = NULL;
+static uint32_t count_total[TCP_STATE_MAX + 1];
 
 #if KERNEL_LINUX
 #if HAVE_STRUCT_LINUX_INET_DIAG_REQ
@@ -295,17 +298,22 @@ enum
 } linux_source = SRC_DUNNO;
 #endif
 
+static void conn_prepare_vl (value_list_t *vl, value_t *values)
+{
+  vl->values = values;
+  vl->values_len = 1;
+  sstrncpy (vl->host, hostname_g, sizeof (vl->host));
+  sstrncpy (vl->plugin, "tcpconns", sizeof (vl->plugin));
+  sstrncpy (vl->type, "tcp_connections", sizeof (vl->type));
+}
+
 static void conn_submit_port_entry (port_entry_t *pe)
 {
   value_t values[1];
   value_list_t vl = VALUE_LIST_INIT;
   int i;
 
-  vl.values = values;
-  vl.values_len = 1;
-  sstrncpy (vl.host, hostname_g, sizeof (vl.host));
-  sstrncpy (vl.plugin, "tcpconns", sizeof (vl.plugin));
-  sstrncpy (vl.type, "tcp_connections", sizeof (vl.type));
+  conn_prepare_vl (&vl, values);
 
   if (((port_collect_listening != 0) && (pe->flags & PORT_IS_LISTENING))
       || (pe->flags & PORT_COLLECT_LOCAL))
@@ -339,10 +347,33 @@ static void conn_submit_port_entry (port_entry_t *pe)
   }
 } /* void conn_submit */
 
+static void conn_submit_port_total (void)
+{
+  value_t values[1];
+  value_list_t vl = VALUE_LIST_INIT;
+  int i;
+
+  conn_prepare_vl (&vl, values);
+
+  sstrncpy (vl.plugin_instance, "all", sizeof (vl.plugin_instance));
+
+  for (i = 1; i <= TCP_STATE_MAX; i++)
+  {
+    vl.values[0].gauge = count_total[i];
+
+    sstrncpy (vl.type_instance, tcp_state[i], sizeof (vl.type_instance));
+
+    plugin_dispatch_values (&vl);
+  }
+}
+
 static void conn_submit_all (void)
 {
   port_entry_t *pe;
 
+  if (port_collect_total)
+    conn_submit_port_total ();
+
   for (pe = port_list_head; pe != NULL; pe = pe->next)
     conn_submit_port_entry (pe);
 } /* void conn_submit_all */
@@ -381,6 +412,8 @@ static void conn_reset_port_entry (void)
   port_entry_t *prev = NULL;
   port_entry_t *pe = port_list_head;
 
+  memset (&count_total, '\0', sizeof(count_total));
+
   while (pe != NULL)
   {
     /* If this entry was created while reading the files (ant not when handling
@@ -428,6 +461,8 @@ static int conn_handle_ports (uint16_t port_local, uint16_t port_remote, uint8_t
     return (-1);
   }
 
+  count_total[state]++;
+
   /* Listening sockets */
   if ((state == TCP_STATE_LISTEN) && (port_collect_listening != 0))
   {
@@ -704,6 +739,13 @@ static int conn_config (const char *key, const char *value)
       else
        pe->flags |= PORT_COLLECT_REMOTE;
   }
+  else if (strcasecmp (key, "AllPortsSummary") == 0)
+  {
+    if (IS_TRUE (value))
+      port_collect_total = 1;
+    else
+      port_collect_total = 0;
+  }
   else
   {
     return (-1);
@@ -715,7 +757,7 @@ static int conn_config (const char *key, const char *value)
 #if KERNEL_LINUX
 static int conn_init (void)
 {
-  if (port_list_head == NULL)
+  if (port_collect_total == 0 && port_list_head == NULL)
     port_collect_listening = 1;
 
   return (0);
@@ -909,7 +951,9 @@ static int conn_init (void)
 static int conn_read (void)
 {
   struct inpcbtable table;
+#if !defined(__OpenBSD__) && (defined(__NetBSD_Version__) && __NetBSD_Version__ <= 699002700)
   struct inpcb *head;
+#endif
   struct inpcb *next;
   struct inpcb inpcb;
   struct tcpcb tcpcb;
@@ -922,18 +966,30 @@ static int conn_read (void)
   if (status != 0)
     return (-1);
 
+#if defined(__OpenBSD__) || (defined(__NetBSD_Version__) && __NetBSD_Version__ > 699002700)
+  /* inpt_queue is a TAILQ on OpenBSD */
+  /* Get the first pcb */
+  next = (struct inpcb *)TAILQ_FIRST (&table.inpt_queue);
+  while (next)
+#else
   /* Get the `head' pcb */
   head = (struct inpcb *) &(inpcbtable_ptr->inpt_queue);
   /* Get the first pcb */
   next = (struct inpcb *)CIRCLEQ_FIRST (&table.inpt_queue);
 
   while (next != head)
+#endif
   {
     /* Read the pcb pointed to by `next' into `inpcb' */
     kread ((u_long) next, &inpcb, sizeof (inpcb));
 
     /* Advance `next' */
+#if defined(__OpenBSD__) || (defined(__NetBSD_Version__) && __NetBSD_Version__ > 699002700)
+    /* inpt_queue is a TAILQ on OpenBSD */
+    next = (struct inpcb *)TAILQ_NEXT (&inpcb, inp_queue);
+#else
     next = (struct inpcb *)CIRCLEQ_NEXT (&inpcb, inp_queue);
+#endif
 
     /* Ignore sockets, that are not connected. */
 #ifdef __NetBSD__
index 64137b0..be1df7f 100644 (file)
@@ -8,18 +8,24 @@ ath_nodes             value:GAUGE:0:65535
 ath_stat               value:DERIVE:0:U
 backends               value:GAUGE:0:65535
 bitrate                        value:GAUGE:0:4294967295
+blocked_clients value:GAUGE:0:U
 bytes                  value:GAUGE:0:U
 cache_eviction         value:DERIVE:0:U
 cache_operation                value:DERIVE:0:U
 cache_ratio            value:GAUGE:0:100
 cache_result           value:DERIVE:0:U
 cache_size             value:GAUGE:0:U
+ceph_bytes             value:GAUGE:U:U
+ceph_latency   value:GAUGE:U:U
+ceph_rate                      value:DERIVE:0:U
+changes_since_last_save   value:GAUGE:0:U
 charge                 value:GAUGE:0:U
 compression_ratio      value:GAUGE:0:2
 compression            uncompressed:DERIVE:0:U, compressed:DERIVE:0:U
 connections            value:DERIVE:0:U
 conntrack              value:GAUGE:0:4294967295
 contextswitch          value:DERIVE:0:U
+count                  value:GAUGE:0:U
 counter                        value:COUNTER:U:U
 cpufreq                        value:GAUGE:0:U
 cpu                    value:DERIVE:0:U
@@ -37,6 +43,7 @@ disk_octets           read:DERIVE:0:U, write:DERIVE:0:U
 disk_ops_complex       value:DERIVE:0:U
 disk_ops               read:DERIVE:0:U, write:DERIVE:0:U
 disk_time              read:DERIVE:0:U, write:DERIVE:0:U
+disk_io_time           io_time:DERIVE:0:U, weighted_io_time:DERIVE:0:U
 dns_answer             value:DERIVE:0:U
 dns_notify             value:DERIVE:0:U
 dns_octets             queries:DERIVE:0:U, responses:DERIVE:0:U
@@ -59,6 +66,7 @@ email_check           value:GAUGE:0:U
 email_count            value:GAUGE:0:U
 email_size             value:GAUGE:0:U
 entropy                        value:GAUGE:0:4294967295
+expired_keys    value:GAUGE:0:U
 fanspeed               value:GAUGE:0:U
 file_size              value:GAUGE:0:U
 files                  value:GAUGE:0:U
@@ -99,6 +107,7 @@ memcached_items              value:GAUGE:0:U
 memcached_octets       rx:DERIVE:0:U, tx:DERIVE:0:U
 memcached_ops          value:DERIVE:0:U
 memory                 value:GAUGE:0:281474976710656
+memory_lua             value:GAUGE:0:281474976710656
 multimeter             value:GAUGE:U:U
 mutex_operations       value:DERIVE:0:U
 mysql_commands         value:DERIVE:0:U
@@ -107,9 +116,13 @@ mysql_locks                value:DERIVE:0:U
 mysql_log_position     value:DERIVE:0:U
 mysql_octets           rx:DERIVE:0:U, tx:DERIVE:0:U
 mysql_bpool_pages      value:GAUGE:0:U
+mysql_bpool_bytes      value:GAUGE:0:U
 mysql_bpool_counters   value:DERIVE:0:U
 mysql_innodb_data      value:DERIVE:0:U
 mysql_innodb_dblwr     value:DERIVE:0:U
+mysql_innodb_log       value:DERIVE:0:U
+mysql_innodb_pages     value:DERIVE:0:U
+mysql_innodb_row_lock  value:DERIVE:0:U
 mysql_innodb_rows      value:DERIVE:0:U
 mysql_select           value:DERIVE:0:U
 mysql_sort             value:DERIVE:0:U
@@ -122,6 +135,7 @@ node_stat           value:DERIVE:0:U
 node_tx_rate           value:GAUGE:0:127
 objects                        value:GAUGE:0:U
 operations             value:DERIVE:0:U
+packets                        value:DERIVE:0:U
 pending_operations     value:GAUGE:0:U
 percent                        value:GAUGE:0:100.1
 percent_bytes          value:GAUGE:0:100.1
@@ -156,6 +170,7 @@ ps_rss                      value:GAUGE:0:9223372036854775807
 ps_stacksize           value:GAUGE:0:9223372036854775807
 ps_state               value:GAUGE:0:65535
 ps_vm                  value:GAUGE:0:9223372036854775807
+pubsub        value:GAUGE:0:U
 queue_length           value:GAUGE:0:U
 records                        value:GAUGE:0:U
 requests               value:GAUGE:0:U
@@ -168,6 +183,11 @@ serial_octets              rx:DERIVE:0:U, tx:DERIVE:0:U
 signal_noise           value:GAUGE:U:0
 signal_power           value:GAUGE:U:0
 signal_quality         value:GAUGE:0:U
+smart_poweron          value:GAUGE:0:U
+smart_powercycles      value:GAUGE:0:U
+smart_badsectors       value:GAUGE:0:U
+smart_temperature      value:GAUGE:-300:300
+smart_attribute         current:GAUGE:0:255, worst:GAUGE:0:255, threshold:GAUGE:0:255, pretty:GAUGE:0:U
 snr                    value:GAUGE:0:U
 spam_check             value:GAUGE:0:U
 spam_score             value:GAUGE:U:U
index 781e778..10f34ee 100644 (file)
@@ -102,11 +102,21 @@ static int users_read (void)
 #elif HAVE_LIBSTATGRAB
        sg_user_stats *us;
 
+# if HAVE_LIBSTATGRAB_0_90
+       size_t num_entries;
+       us = sg_get_user_stats (&num_entries);
+# else
        us = sg_get_user_stats ();
+# endif
        if (us == NULL)
                return (-1);   
 
-       users_submit ((gauge_t) us->num_entries);
+       users_submit ((gauge_t)
+# if HAVE_LIBSTATGRAB_0_90
+                     num_entries);
+# else
+                     us->num_entries);
+# endif
 /* #endif HAVE_LIBSTATGRAB */
 
 #else
index 30da630..089ab70 100644 (file)
 #include "utils_parse_option.h"
 
 #define print_to_socket(fh, ...) \
-       if (fprintf (fh, __VA_ARGS__) < 0) { \
-               char errbuf[1024]; \
-               WARNING ("handle_flush: failed to write to socket #%i: %s", \
-                               fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-               return -1; \
-       }
+       do { \
+               if (fprintf (fh, __VA_ARGS__) < 0) { \
+                       char errbuf[1024]; \
+                       WARNING ("handle_flush: failed to write to socket #%i: %s", \
+                                       fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
+                       return -1; \
+               } \
+               fflush(fh); \
+       } while (0)
 
 static int add_to_array (char ***array, int *array_num, char *value)
 {
index 354c553..196b45e 100644 (file)
 #include "utils_parse_option.h"
 
 #define print_to_socket(fh, ...) \
-  if (fprintf (fh, __VA_ARGS__) < 0) { \
-    char errbuf[1024]; \
-    WARNING ("handle_getval: failed to write to socket #%i: %s", \
-       fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-    return -1; \
-  }
+  do { \
+    if (fprintf (fh, __VA_ARGS__) < 0) { \
+      char errbuf[1024]; \
+      WARNING ("handle_getval: failed to write to socket #%i: %s", \
+          fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
+      return -1; \
+    } \
+    fflush(fh); \
+  } while (0)
 
 int handle_getval (FILE *fh, char *buffer)
 {
index d9dc5c1..b698388 100644 (file)
   } while (0)
 
 #define print_to_socket(fh, ...) \
-  if (fprintf (fh, __VA_ARGS__) < 0) { \
-    char errbuf[1024]; \
-    WARNING ("handle_listval: failed to write to socket #%i: %s", \
-       fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-    free_everything_and_return (-1); \
-  }
+  do { \
+    if (fprintf (fh, __VA_ARGS__) < 0) { \
+      char errbuf[1024]; \
+      WARNING ("handle_listval: failed to write to socket #%i: %s", \
+          fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
+      free_everything_and_return (-1); \
+    } \
+    fflush(fh); \
+  } while (0)
 
 int handle_listval (FILE *fh, char *buffer)
 {
index e14a258..530d153 100644 (file)
 #include "utils_parse_option.h"
 
 #define print_to_socket(fh, ...) \
-  if (fprintf (fh, __VA_ARGS__) < 0) { \
-    char errbuf[1024]; \
-    WARNING ("handle_putnotif: failed to write to socket #%i: %s", \
-       fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-    return -1; \
-  }
+  do { \
+    if (fprintf (fh, __VA_ARGS__) < 0) { \
+      char errbuf[1024]; \
+      WARNING ("handle_putnotif: failed to write to socket #%i: %s", \
+          fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
+      return -1; \
+    } \
+    fflush(fh); \
+  } while (0)
 
 static int set_option_severity (notification_t *n, const char *value)
 {
index 366b413..c717f0b 100644 (file)
 #include "utils_parse_option.h"
 
 #define print_to_socket(fh, ...) \
-       if (fprintf (fh, __VA_ARGS__) < 0) { \
-               char errbuf[1024]; \
-               WARNING ("handle_putval: failed to write to socket #%i: %s", \
-                               fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
-               return -1; \
-       }
+    do { \
+        if (fprintf (fh, __VA_ARGS__) < 0) { \
+            char errbuf[1024]; \
+            WARNING ("handle_putval: failed to write to socket #%i: %s", \
+                    fileno (fh), sstrerror (errno, errbuf, sizeof (errbuf))); \
+            return -1; \
+        } \
+        fflush(fh); \
+    } while (0)
 
 static int dispatch_values (const data_set_t *ds, value_list_t *vl,
                FILE *fh, char *buffer)
index 712b1ae..eefde96 100644 (file)
@@ -3,10 +3,10 @@
  * Copyright (C) 2006       Florian octo Forster
  * Copyright (C) 2002       The Measurement Factory, Inc.
  * All rights reserved.
- * 
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
- * 
+ *
  * 1. Redistributions of source code must retain the above copyright notice,
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
@@ -33,6 +33,7 @@
  *   Florian octo Forster <octo at collectd.org>
  */
 
+#define _DEFAULT_SOURCE
 #define _BSD_SOURCE
 
 #include "collectd.h"
index 91ddd5f..7f60e11 100644 (file)
  **/
 
 #include "collectd.h"
+#include "plugin.h"
 #include "utils_latency.h"
 #include "common.h"
 
-#ifndef LATENCY_HISTOGRAM_SIZE
-# define LATENCY_HISTOGRAM_SIZE 1000
+#include <math.h>
+
+#ifndef HISTOGRAM_NUM_BINS
+# define HISTOGRAM_NUM_BINS 1000
 #endif
 
+static const int HISTOGRAM_DEFAULT_BIN_WIDTH = 1;
+
 struct latency_counter_s
 {
   cdtime_t start_time;
@@ -42,9 +47,69 @@ struct latency_counter_s
   cdtime_t min;
   cdtime_t max;
 
-  int histogram[LATENCY_HISTOGRAM_SIZE];
+  int bin_width;
+  int histogram[HISTOGRAM_NUM_BINS];
 };
 
+/*
+* Histogram represents the distribution of data, it has a list of "bins".
+* Each bin represents an interval and has a count (frequency) of
+* number of values fall within its interval.
+*
+* Histogram's range is determined by the number of bins and the bin width,
+* There are 1000 bins and all bins have the same width of default 1 millisecond.
+* When a value above this range is added, Histogram's range is increased by
+* increasing the bin width (note that number of bins remains always at 1000).
+* This operation of increasing bin width is little expensive as each bin need
+* to be visited to update it's count. To reduce frequent change of bin width,
+* new bin width will be the next nearest power of 2. Example: 2, 4, 8, 16, 32,
+* 64, 128, 256, 512, 1024, 2048, 5086, ...
+*
+* So, if the required bin width is 300, then new bin width will be 512 as it is
+* the next nearest power of 2.
+*
+*/
+void change_bin_width (latency_counter_t *lc, size_t val) /* {{{ */
+{
+  int i=0;
+  /* This function is called because the new value is above histogram's range.
+   * First find the required bin width:
+   *           requiredBinWidth = (value + 1) / numBins
+   * then get the next nearest power of 2
+   *           newBinWidth = 2^(ceil(log2(requiredBinWidth)))
+   */
+  double required_bin_width = (double)(val + 1) / HISTOGRAM_NUM_BINS;
+  double required_bin_width_logbase2 = log(required_bin_width) / log(2.0);
+  int new_bin_width = (int)(pow(2.0, ceil( required_bin_width_logbase2)));
+  int old_bin_width = lc->bin_width;
+  lc->bin_width = new_bin_width;
+
+  /*
+   * bin width has been increased, now iterate through all bins and move the
+   * old bin's count to new bin.
+   */
+  if (lc->num > 0) // if the histogram has data then iterate else skip
+  {
+      double width_change_ratio = old_bin_width / new_bin_width;
+      for (i=0; i<HISTOGRAM_NUM_BINS; i++)
+      {
+         int new_bin = (int)(i * width_change_ratio);
+         if (i == new_bin)
+             continue;
+         lc->histogram[new_bin] += lc->histogram[i];
+         lc->histogram[i] = 0;
+      }
+      DEBUG("utils_latency: change_bin_width: fixed all bins");
+  }
+
+  DEBUG("utils_latency: change_bin_width: val-[%zu], oldBinWidth-[%d], "
+          "newBinWidth-[%d], required_bin_width-[%f], "
+          "required_bin_width_logbase2-[%f]",
+          val, old_bin_width, new_bin_width, required_bin_width,
+          required_bin_width_logbase2);
+
+} /* }}} void change_bin_width */
+
 latency_counter_t *latency_counter_create () /* {{{ */
 {
   latency_counter_t *lc;
@@ -54,6 +119,7 @@ latency_counter_t *latency_counter_create () /* {{{ */
     return (NULL);
 
   latency_counter_reset (lc);
+  lc->bin_width = HISTOGRAM_DEFAULT_BIN_WIDTH;
   return (lc);
 } /* }}} latency_counter_t *latency_counter_create */
 
@@ -83,8 +149,19 @@ void latency_counter_add (latency_counter_t *lc, cdtime_t latency) /* {{{ */
    * subtract one from the cdtime_t value so that exactly 1.0 ms get sorted
    * accordingly. */
   latency_ms = (size_t) CDTIME_T_TO_MS (latency - 1);
-  if (latency_ms < STATIC_ARRAY_SIZE (lc->histogram))
-    lc->histogram[latency_ms]++;
+
+  int bin = (int)(latency_ms / lc->bin_width);
+  if (bin >= HISTOGRAM_NUM_BINS)
+  {
+      change_bin_width(lc, latency_ms);
+      bin = (int)(latency_ms / lc->bin_width);
+      if (bin >= HISTOGRAM_NUM_BINS)
+      {
+          ERROR("utils_latency: latency_counter_add: Invalid bin %d", bin);
+          return;
+      }
+  }
+  lc->histogram[bin]++;
 } /* }}} void latency_counter_add */
 
 void latency_counter_reset (latency_counter_t *lc) /* {{{ */
@@ -92,7 +169,11 @@ void latency_counter_reset (latency_counter_t *lc) /* {{{ */
   if (lc == NULL)
     return;
 
+  int bin_width = lc->bin_width;
   memset (lc, 0, sizeof (*lc));
+
+  /* preserve bin width */
+  lc->bin_width = bin_width;
   lc->start_time = cdtime ();
 } /* }}} void latency_counter_reset */
 
@@ -153,7 +234,7 @@ cdtime_t latency_counter_get_percentile (latency_counter_t *lc,
   percent_upper = 0.0;
   percent_lower = 0.0;
   sum = 0;
-  for (i = 0; i < LATENCY_HISTOGRAM_SIZE; i++)
+  for (i = 0; i < HISTOGRAM_NUM_BINS; i++)
   {
     percent_lower = percent_upper;
     sum += lc->histogram[i];
@@ -166,14 +247,14 @@ cdtime_t latency_counter_get_percentile (latency_counter_t *lc,
       break;
   }
 
-  if (i >= LATENCY_HISTOGRAM_SIZE)
+  if (i >= HISTOGRAM_NUM_BINS)
     return (0);
 
   assert (percent_upper >= percent);
   assert (percent_lower < percent);
 
-  ms_upper = (double) (i + 1);
-  ms_lower = (double) i;
+  ms_upper = (double) ( (i + 1) * lc->bin_width );
+  ms_lower = (double) ( i * lc->bin_width );
   if (i == 0)
     return (MS_TO_CDTIME_T (ms_upper));
 
index 3a8dddd..8e6d95e 100644 (file)
 #include "plugin.h"
 #include "configfile.h"
 
-#include <varnish/varnishapi.h>
+#if HAVE_VARNISH_V4
+#include <varnish/vapi/vsm.h>
+#include <varnish/vapi/vsc.h>
+typedef struct VSC_C_main c_varnish_stats_t;
+#endif
 
 #if HAVE_VARNISH_V3
-# include <varnish/vsc.h>
+#include <varnish/varnishapi.h>
+#include <varnish/vsc.h>
 typedef struct VSC_C_main c_varnish_stats_t;
 #endif
 
 #if HAVE_VARNISH_V2
+#include <varnish/varnishapi.h>
 typedef struct varnish_stats c_varnish_stats_t;
 #endif
 
@@ -67,11 +73,14 @@ struct user_config_s {
 #endif
        _Bool collect_struct;
        _Bool collect_totals;
-#ifdef HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
        _Bool collect_uptime;
 #endif
        _Bool collect_vcl;
        _Bool collect_workers;
+#if HAVE_VARNISH_V4
+       _Bool collect_vsm;
+#endif
 };
 typedef struct user_config_s user_config_t; /* }}} */
 
@@ -141,10 +150,12 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
 
        if (conf->collect_connections)
        {
+#ifndef HAVE_VARNISH_V4
                /* Client connections accepted */
                varnish_submit_derive (conf->instance, "connections", "connections", "accepted", stats->client_conn);
                /* Connection dropped, no sess */
                varnish_submit_derive (conf->instance, "connections", "connections", "dropped" , stats->client_drop);
+#endif
                /* Client requests received    */
                varnish_submit_derive (conf->instance, "connections", "connections", "received", stats->client_req);
        }
@@ -225,7 +236,7 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                varnish_submit_derive (conf->instance, "fetch", "http_requests", "zero"       , stats->fetch_zero);
                /* Fetch failed              */
                varnish_submit_derive (conf->instance, "fetch", "http_requests", "failed"     , stats->fetch_failed);
-#if HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
                /* Fetch no body (1xx)       */
                varnish_submit_derive (conf->instance, "fetch", "http_requests", "no_body_1xx", stats->fetch_1xx);
                /* Fetch no body (204)       */
@@ -263,12 +274,17 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
 #endif
                /* HTTP header overflows         */
                varnish_submit_derive (conf->instance, "objects", "total_objects", "header_overflow",    stats->losthdr);
+#if HAVE_VARNISH_V4
+               /* N purged objects              */
+               varnish_submit_derive (conf->instance, "objects", "total_objects", "purged",             stats->n_obj_purged);
+#else
                /* Objects sent with sendfile    */
                varnish_submit_derive (conf->instance, "objects", "total_objects", "sent_sendfile",      stats->n_objsendfile);
                /* Objects sent with write       */
                varnish_submit_derive (conf->instance, "objects", "total_objects", "sent_write",         stats->n_objwrite);
                /* Objects overflowing workspace */
                varnish_submit_derive (conf->instance, "objects", "total_objects", "workspace_overflow", stats->n_objoverflow);
+#endif
        }
 
 #if HAVE_VARNISH_V2
@@ -287,7 +303,8 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                /* N duplicate purges removed */
                varnish_submit_derive (conf->instance, "purge", "total_operations", "duplicate",        stats->n_purge_dups);
        }
-#else
+#endif
+#if HAVE_VARNISH_V3
        if (conf->collect_ban)
        {
                /* N total active bans      */
@@ -304,6 +321,27 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                varnish_submit_derive (conf->instance, "ban", "total_operations", "duplicate",      stats->n_ban_dups);
        }
 #endif
+#if HAVE_VARNISH_V4
+       if (conf->collect_ban)
+       {
+               /* N total active bans      */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "total",          stats->bans);
+               /* N new bans added         */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "added",          stats->bans_added);
+               /* N bans using obj */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "obj",            stats->bans_obj);
+               /* N bans using req */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "req",            stats->bans_req);
+               /* N new bans completed     */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "completed",      stats->bans_completed);
+               /* N old bans deleted       */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "deleted",        stats->bans_deleted);
+               /* N objects tested         */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "tested",         stats->bans_tested);
+               /* N duplicate bans removed */
+               varnish_submit_derive (conf->instance, "ban", "total_operations", "duplicate",      stats->bans_dups);
+       }
+#endif
 
        if (conf->collect_session)
        {
@@ -313,8 +351,21 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                varnish_submit_derive (conf->instance, "session", "total_operations", "pipeline",  stats->sess_pipeline);
                /* Session Read Ahead */
                varnish_submit_derive (conf->instance, "session", "total_operations", "readahead", stats->sess_readahead);
+#if HAVE_VARNISH_V4
+               /* Sessions accepted */
+               varnish_submit_derive (conf->instance, "session", "total_operations", "accepted",  stats->sess_conn);
+               /* Sessions dropped for thread */
+               varnish_submit_derive (conf->instance, "session", "total_operations", "dropped",   stats->sess_drop);
+               /* Sessions accept failure */
+               varnish_submit_derive (conf->instance, "session", "total_operations", "failed",    stats->sess_fail);
+               /* Sessions pipe overflow */
+               varnish_submit_derive (conf->instance, "session", "total_operations", "overflow",  stats->sess_pipe_overflow);
+               /* Sessions queued for thread */
+               varnish_submit_derive (conf->instance, "session", "total_operations", "queued",    stats->sess_queued);
+#else
                /* Session Linger     */
                varnish_submit_derive (conf->instance, "session", "total_operations", "linger",    stats->sess_linger);
+#endif
                /* Session herd       */
                varnish_submit_derive (conf->instance, "session", "total_operations", "herd",      stats->sess_herd);
        }
@@ -377,17 +428,21 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
 
        if (conf->collect_struct)
        {
+#if !HAVE_VARNISH_V4
                /* N struct sess_mem       */
                varnish_submit_gauge (conf->instance, "struct", "current_sessions", "sess_mem",  stats->n_sess_mem);
                /* N struct sess           */
                varnish_submit_gauge (conf->instance, "struct", "current_sessions", "sess",      stats->n_sess);
+#endif
                /* N struct object         */
                varnish_submit_gauge (conf->instance, "struct", "objects", "object",             stats->n_object);
-#ifdef HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
                /* N unresurrected objects */
                varnish_submit_gauge (conf->instance, "struct", "objects", "vampireobject",      stats->n_vampireobject);
                /* N struct objectcore     */
                varnish_submit_gauge (conf->instance, "struct", "objects", "objectcore",         stats->n_objectcore);
+               /* N struct waitinglist    */
+               varnish_submit_gauge (conf->instance, "struct", "objects", "waitinglist",        stats->n_waitinglist);
 #endif
                /* N struct objecthead     */
                varnish_submit_gauge (conf->instance, "struct", "objects", "objecthead",         stats->n_objecthead);
@@ -415,13 +470,40 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                varnish_submit_derive (conf->instance, "totals", "total_operations", "pass",    stats->s_pass);
                /* Total fetch */
                varnish_submit_derive (conf->instance, "totals", "total_operations", "fetches", stats->s_fetch);
+#if HAVE_VARNISH_V4
+               /* Total synth */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "synth",       stats->s_synth);
+               /* Request header bytes */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "req_header",  stats->s_req_hdrbytes);
+               /* Request body byte */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "req_body",    stats->s_req_bodybytes);
+               /* Response header bytes */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "resp_header", stats->s_resp_hdrbytes);
+               /* Response body byte */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "resp_body",   stats->s_resp_bodybytes);
+               /* Pipe request header bytes */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "pipe_header", stats->s_pipe_hdrbytes);
+               /* Piped bytes from client */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "pipe_in",     stats->s_pipe_in);
+               /* Piped bytes to client */
+               varnish_submit_derive (conf->instance, "totals", "total_bytes", "pipe_out",    stats->s_pipe_out);
+               /* Number of purge operations */
+               varnish_submit_derive (conf->instance, "totals", "total_operations", "purges", stats->n_purges);
+#else
                /* Total header bytes */
                varnish_submit_derive (conf->instance, "totals", "total_bytes", "header-bytes", stats->s_hdrbytes);
                /* Total body byte */
                varnish_submit_derive (conf->instance, "totals", "total_bytes", "body-bytes",   stats->s_bodybytes);
+#endif
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+               /* Gzip operations */
+               varnish_submit_derive (conf->instance, "totals", "total_operations", "gzip",    stats->n_gzip);
+               /* Gunzip operations */
+               varnish_submit_derive (conf->instance, "totals", "total_operations", "gunzip",  stats->n_gunzip);
+#endif
        }
 
-#ifdef HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
        if (conf->collect_uptime)
        {
                /* Client uptime */
@@ -437,10 +519,28 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                varnish_submit_gauge (conf->instance, "vcl", "vcl", "avail_vcl",     stats->n_vcl_avail);
                /* N vcl discarded */
                varnish_submit_gauge (conf->instance, "vcl", "vcl", "discarded_vcl", stats->n_vcl_discard);
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+               /* Loaded VMODs */
+               varnish_submit_gauge (conf->instance, "vcl", "objects", "vmod",      stats->vmods);
+#endif
        }
 
        if (conf->collect_workers)
        {
+#ifdef HAVE_VARNISH_V4
+               /* total number of threads */
+               varnish_submit_gauge (conf->instance, "workers", "threads", "worker",             stats->threads);
+               /* threads created */
+               varnish_submit_derive (conf->instance, "workers", "total_threads", "created",     stats->threads_created);
+               /* thread creation failed */
+               varnish_submit_derive (conf->instance, "workers", "total_threads", "failed",      stats->threads_failed);
+               /* threads hit max */
+               varnish_submit_derive (conf->instance, "workers", "total_threads", "limited",     stats->threads_limited);
+               /* threads destroyed */
+               varnish_submit_derive (conf->instance, "workers", "total_threads", "dropped",     stats->threads_destroyed);
+               /* length of session queue */
+               varnish_submit_derive (conf->instance, "workers", "queue_length",  "threads",     stats->thread_queue_len);
+#else
                /* worker threads */
                varnish_submit_gauge (conf->instance, "workers", "threads", "worker",             stats->n_wrk);
                /* worker threads created */
@@ -450,22 +550,40 @@ static void varnish_monitor (const user_config_t *conf, /* {{{ */
                /* worker threads limited */
                varnish_submit_derive (conf->instance, "workers", "total_threads", "limited",     stats->n_wrk_max);
                /* dropped work requests */
-               varnish_submit_derive (conf->instance, "workers", "total_requests", "dropped",    stats->n_wrk_drop);
+               varnish_submit_derive (conf->instance, "workers", "total_threads", "dropped",     stats->n_wrk_drop);
 #ifdef HAVE_VARNISH_V2
                /* queued work requests */
                varnish_submit_derive (conf->instance, "workers", "total_requests", "queued",     stats->n_wrk_queue);
                /* overflowed work requests */
                varnish_submit_derive (conf->instance, "workers", "total_requests", "overflowed", stats->n_wrk_overflow);
-#else
+#else /* HAVE_VARNISH_V3 */
                /* queued work requests */
                varnish_submit_derive (conf->instance, "workers", "total_requests", "queued",       stats->n_wrk_queued);
                /* work request queue length */
                varnish_submit_derive (conf->instance, "workers", "total_requests", "queue_length", stats->n_wrk_lqueue);
 #endif
+#endif
+       }
+
+#if HAVE_VARNISH_V4
+       if (conf->collect_vsm)
+       {
+               /* Free VSM space */
+               varnish_submit_gauge (conf->instance, "vsm", "bytes", "free",              stats->vsm_free);
+               /* Used VSM space */
+               varnish_submit_gauge (conf->instance, "vsm", "bytes", "used",              stats->vsm_used);
+               /* Cooling VSM space */
+               varnish_submit_gauge (conf->instance, "vsm", "bytes", "cooling",           stats->vsm_cooling);
+               /* Overflow VSM space */
+               varnish_submit_gauge (conf->instance, "vsm", "bytes", "overflow",          stats->vsm_overflow);
+               /* Total overflowed VSM space */
+               varnish_submit_derive (conf->instance, "vsm", "total_bytes", "overflowed", stats->vsm_overflowed);
        }
+#endif
+
 } /* }}} void varnish_monitor */
 
-#if HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
 static int varnish_read (user_data_t *ud) /* {{{ */
 {
        struct VSM_data *vd;
@@ -479,7 +597,9 @@ static int varnish_read (user_data_t *ud) /* {{{ */
        conf = ud->data;
 
        vd = VSM_New();
+#if HAVE_VARNISH_V3
        VSC_Setup(vd);
+#endif
 
        if (conf->instance != NULL)
        {
@@ -495,14 +615,22 @@ static int varnish_read (user_data_t *ud) /* {{{ */
                }
        }
 
+#if HAVE_VARNISH_V3
        if (VSC_Open (vd, /* diag = */ 1))
+#else /* if HAVE_VARNISH_V4 */
+       if (VSM_Open (vd))
+#endif
        {
                ERROR ("varnish plugin: Unable to load statistics.");
 
                return (-1);
        }
 
+#if HAVE_VARNISH_V3
        stats = VSC_Main(vd);
+#else /* if HAVE_VARNISH_V4 */
+       stats = VSC_Main(vd, NULL);
+#endif
 
        varnish_monitor (conf, stats);
        VSM_Close (vd);
@@ -575,11 +703,14 @@ static int varnish_config_apply_default (user_config_t *conf) /* {{{ */
        conf->collect_sms         = 0;
        conf->collect_struct      = 0;
        conf->collect_totals      = 0;
-#ifdef HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
        conf->collect_uptime      = 0;
 #endif
        conf->collect_vcl         = 0;
        conf->collect_workers     = 0;
+#if HAVE_VARNISH_V4
+       conf->collect_vsm         = 0;
+#endif
 
        return (0);
 } /* }}} int varnish_config_apply_default */
@@ -699,7 +830,7 @@ static int varnish_config_instance (const oconfig_item_t *ci) /* {{{ */
                        cf_util_get_boolean (child, &conf->collect_struct);
                else if (strcasecmp ("CollectTotals", child->key) == 0)
                        cf_util_get_boolean (child, &conf->collect_totals);
-#ifdef HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
                else if (strcasecmp ("CollectUptime", child->key) == 0)
                        cf_util_get_boolean (child, &conf->collect_uptime);
 #endif
@@ -707,6 +838,10 @@ static int varnish_config_instance (const oconfig_item_t *ci) /* {{{ */
                        cf_util_get_boolean (child, &conf->collect_vcl);
                else if (strcasecmp ("CollectWorkers", child->key) == 0)
                        cf_util_get_boolean (child, &conf->collect_workers);
+#if HAVE_VARNISH_V4
+               else if (strcasecmp ("CollectVSM", child->key) == 0)
+                       cf_util_get_boolean (child, &conf->collect_vsm);
+#endif
                else
                {
                        WARNING ("Varnish plugin: Ignoring unknown "
@@ -741,11 +876,15 @@ static int varnish_config_instance (const oconfig_item_t *ci) /* {{{ */
 #endif
                        && !conf->collect_struct
                        && !conf->collect_totals
-#ifdef HAVE_VARNISH_V3
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
                        && !conf->collect_uptime
 #endif
                        && !conf->collect_vcl
-                       && !conf->collect_workers)
+                       && !conf->collect_workers
+#if HAVE_VARNISH_V4
+                       && !conf->collect_vsm
+#endif
+       )
        {
                WARNING ("Varnish plugin: No metric has been configured for "
                                "instance \"%s\". Disabling this instance.",
index 6118c0f..b6fedf5 100644 (file)
@@ -547,6 +547,12 @@ lv_read (void)
             continue;
         }
 
+        if (info.state != VIR_DOMAIN_RUNNING)
+        {
+            /* only gather stats for running domains */
+            continue;
+        }
+
         cpu_submit (info.cpuTime, domains[i], "virt_cpu_total");
         memory_submit ((gauge_t) info.memory * 1024, domains[i]);
 
@@ -588,7 +594,7 @@ lv_read (void)
         }
 
         for (j = 0; j < status; j++) {
-            memory_stats_submit ((gauge_t) minfo[j].val, domains[i], minfo[j].tag);
+            memory_stats_submit ((gauge_t) minfo[j].val * 1024, domains[i], minfo[j].tag);
         }
 
         sfree (minfo);
index d3d5202..41451a8 100644 (file)
@@ -197,6 +197,8 @@ static int wg_callback_init (struct wg_callback *cb)
     const char *service = cb->service ? cb->service : WG_DEFAULT_SERVICE;
     const char *protocol = cb->protocol ? cb->protocol : WG_DEFAULT_PROTOCOL;
 
+    char connerr[1024] = "";
+
     if (cb->sock_fd > 0)
         return (0);
 
@@ -233,12 +235,19 @@ static int wg_callback_init (struct wg_callback *cb)
     {
         cb->sock_fd = socket (ai_ptr->ai_family, ai_ptr->ai_socktype,
                 ai_ptr->ai_protocol);
-        if (cb->sock_fd < 0)
+        if (cb->sock_fd < 0) {
+            char errbuf[1024];
+            snprintf (connerr, sizeof (connerr), "failed to open socket: %s",
+                    sstrerror (errno, errbuf, sizeof (errbuf)));
             continue;
+        }
 
         status = connect (cb->sock_fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen);
         if (status != 0)
         {
+            char errbuf[1024];
+            snprintf (connerr, sizeof (connerr), "failed to connect to remote "
+                    "host: %s", sstrerror (errno, errbuf, sizeof (errbuf)));
             close (cb->sock_fd);
             cb->sock_fd = -1;
             continue;
@@ -251,11 +260,12 @@ static int wg_callback_init (struct wg_callback *cb)
 
     if (cb->sock_fd < 0)
     {
-        char errbuf[1024];
+        if (connerr[0] == '\0')
+            /* this should not happen but try to get a message anyway */
+            sstrerror (errno, connerr, sizeof (connerr));
         c_complain (LOG_ERR, &cb->init_complaint,
-                "write_graphite plugin: Connecting to %s:%s via %s failed. "
-                "The last error was: %s", node, service, protocol,
-                sstrerror (errno, errbuf, sizeof (errbuf)));
+                  "write_graphite plugin: Connecting to %s:%s via %s failed. "
+                  "The last error was: %s", node, service, protocol, connerr);
         return (-1);
     }
     else
index a48cdf3..0e1bc73 100644 (file)
@@ -45,8 +45,9 @@
  */
 struct wh_callback_s
 {
-        char *location;
+        char *name;
 
+        char *location;
         char *user;
         char *pass;
         char *credentials;
@@ -58,7 +59,7 @@ struct wh_callback_s
         char *clientcert;
         char *clientkeypass;
         long sslversion;
-        _Bool store_rates; 
+        _Bool store_rates;
         _Bool abort_on_slow;
         int   low_limit_bytes;
         time_t interval;
@@ -125,16 +126,16 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */
                 return (-1);
         }
 
-        if(cb->abort_on_slow && cb->interval > 0)
+        if (cb->abort_on_slow && cb->interval > 0)
         {
-            curl_easy_setopt(cb->curl, CURLOPT_LOW_SPEED_LIMIT, (cb->low_limit_bytes?cb->low_limit_bytes:WH_DEFAULT_LOW_LIMIT_BYTES_PER_SEC));
-            curl_easy_setopt(cb->curl, CURLOPT_LOW_SPEED_TIME, cb->interval);
-        }
-        if(cb->post_timeout >0)
-        {
-           curl_easy_setopt(cb->curl, CURLOPT_TIMEOUT, cb->post_timeout);
+                curl_easy_setopt (cb->curl, CURLOPT_LOW_SPEED_LIMIT,
+                                  (cb->low_limit_bytes ? cb->low_limit_bytes : WH_DEFAULT_LOW_LIMIT_BYTES_PER_SEC));
+                curl_easy_setopt (cb->curl, CURLOPT_LOW_SPEED_TIME, cb->interval);
         }
 
+        if (cb->post_timeout > 0)
+                curl_easy_setopt (cb->curl, CURLOPT_TIMEOUT, cb->post_timeout);
+
         curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L);
         curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, COLLECTD_USERAGENT);
 
@@ -149,9 +150,16 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */
 
         curl_easy_setopt (cb->curl, CURLOPT_ERRORBUFFER, cb->curl_errbuf);
         curl_easy_setopt (cb->curl, CURLOPT_URL, cb->location);
+        curl_easy_setopt (cb->curl, CURLOPT_FOLLOWLOCATION, 1L);
+        curl_easy_setopt (cb->curl, CURLOPT_MAXREDIRS, 50L);
 
         if (cb->user != NULL)
         {
+#ifdef HAVE_CURLOPT_USERNAME
+                curl_easy_setopt (cb->curl, CURLOPT_USERNAME, cb->user);
+                curl_easy_setopt (cb->curl, CURLOPT_PASSWORD,
+                        (cb->pass == NULL) ? "" : cb->pass);
+#else
                 size_t credentials_size;
 
                 credentials_size = strlen (cb->user) + 2;
@@ -168,6 +176,7 @@ static int wh_callback_init (wh_callback_t *cb) /* {{{ */
                 ssnprintf (cb->credentials, credentials_size, "%s:%s",
                                 cb->user, (cb->pass == NULL) ? "" : cb->pass);
                 curl_easy_setopt (cb->curl, CURLOPT_USERPWD, cb->credentials);
+#endif
                 curl_easy_setopt (cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
         }
 
@@ -304,6 +313,7 @@ static void wh_callback_free (void *data) /* {{{ */
                 curl_easy_cleanup (cb->curl);
                 cb->curl = NULL;
         }
+        sfree (cb->name);
         sfree (cb->location);
         sfree (cb->user);
         sfree (cb->pass);
@@ -410,7 +420,7 @@ static int wh_write_json (const data_set_t *ds, const value_list_t *vl, /* {{{ *
                 wh_callback_t *cb)
 {
         int status;
-               
+
         pthread_mutex_lock (&cb->send_lock);
 
         if (cb->curl == NULL)
@@ -509,11 +519,12 @@ static int config_set_format (wh_callback_t *cb, /* {{{ */
         return (0);
 } /* }}} int config_set_format */
 
-static int wh_config_url (oconfig_item_t *ci) /* {{{ */
+static int wh_config_node (oconfig_item_t *ci) /* {{{ */
 {
         wh_callback_t *cb;
         int buffer_size = 0;
         user_data_t user_data;
+        char callback_name[DATA_MAX_NAME_LEN];
         int i;
 
         cb = malloc (sizeof (*cb));
@@ -532,15 +543,19 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */
 
         pthread_mutex_init (&cb->send_lock, /* attr = */ NULL);
 
-        cf_util_get_string (ci, &cb->location);
-        if (cb->location == NULL)
-                return (-1);
+        cf_util_get_string (ci, &cb->name);
+
+        /* FIXME: Remove this legacy mode in version 6. */
+        if (strcasecmp ("URL", ci->key) == 0)
+                cf_util_get_string (ci, &cb->location);
 
         for (i = 0; i < ci->children_num; i++)
         {
                 oconfig_item_t *child = ci->children + i;
 
-                if (strcasecmp ("User", child->key) == 0)
+                if (strcasecmp ("URL", child->key) == 0)
+                        cf_util_get_string (child, &cb->location);
+                else if (strcasecmp ("User", child->key) == 0)
                         cf_util_get_string (child, &cb->user);
                 else if (strcasecmp ("Password", child->key) == 0)
                         cf_util_get_string (child, &cb->pass);
@@ -605,16 +620,21 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */
                 }
         }
 
-        if(cb->abort_on_slow)
-        {
-               cb->interval = CDTIME_T_TO_TIME_T(plugin_get_interval());
-        }
-        if(cb->post_timeout == 0)
+        if (cb->location == NULL)
         {
-               //setting default timeout to plugin interval.
-               cb->post_timeout = CDTIME_T_TO_TIME_T(plugin_get_interval());
+                ERROR ("write_http plugin: no URL defined for instance '%s'",
+                        cb->name);
+                wh_callback_free (cb);
+                return (-1);
         }
 
+        if (cb->abort_on_slow)
+                cb->interval = CDTIME_T_TO_TIME_T(plugin_get_interval());
+
+        if (cb->post_timeout == 0)
+                //setting default timeout to plugin interval.
+                cb->post_timeout = CDTIME_T_TO_TIME_T(plugin_get_interval());
+
         /* Determine send_buffer_size. */
         cb->send_buffer_size = WRITE_HTTP_DEFAULT_BUFFER_SIZE;
         if (buffer_size >= 1024)
@@ -634,19 +654,21 @@ static int wh_config_url (oconfig_item_t *ci) /* {{{ */
         /* Nulls the buffer and sets ..._free and ..._fill. */
         wh_reset_buffer (cb);
 
-        DEBUG ("write_http: Registering write callback with URL %s",
-                        cb->location);
+        ssnprintf (callback_name, sizeof (callback_name), "write_http/%s",
+                        cb->name);
+        DEBUG ("write_http: Registering write callback '%s' with URL '%s'",
+                        callback_name, cb->location);
 
         memset (&user_data, 0, sizeof (user_data));
         user_data.data = cb;
         user_data.free_func = NULL;
-        plugin_register_flush ("write_http", wh_flush, &user_data);
+        plugin_register_flush (callback_name, wh_flush, &user_data);
 
         user_data.free_func = wh_callback_free;
-        plugin_register_write ("write_http", wh_write, &user_data);
+        plugin_register_write (callback_name, wh_write, &user_data);
 
         return (0);
-} /* }}} int wh_config_url */
+} /* }}} int wh_config_node */
 
 static int wh_config (oconfig_item_t *ci) /* {{{ */
 {
@@ -656,8 +678,14 @@ static int wh_config (oconfig_item_t *ci) /* {{{ */
         {
                 oconfig_item_t *child = ci->children + i;
 
-                if (strcasecmp ("URL", child->key) == 0)
-                        wh_config_url (child);
+                if (strcasecmp ("Node", child->key) == 0)
+                        wh_config_node (child);
+                /* FIXME: Remove this legacy mode in version 6. */
+                else if (strcasecmp ("URL", child->key) == 0) {
+                        WARNING ("write_http plugin: Legacy <URL> block found. "
+                                "Please use <Node> instead.");
+                        wh_config_node (child);
+                }
                 else
                 {
                         ERROR ("write_http plugin: Invalid configuration "
index 3e683c8..a2947d1 100644 (file)
@@ -61,7 +61,7 @@ static int kafka_write(const data_set_t *, const value_list_t *, user_data_t *);
 static int32_t kafka_partition(const rd_kafka_topic_t *, const void *, size_t,
                                int32_t, void *, void *);
 
-#ifdef HAVE_LIBRDKAFKA_LOGGER
+#if defined HAVE_LIBRDKAFKA_LOGGER || defined HAVE_LIBRDKAFKA_LOG_CB
 static void kafka_log(const rd_kafka_t *, int, const char *, const char *);
 
 static void kafka_log(const rd_kafka_t *rkt, int level,
@@ -76,8 +76,13 @@ static int32_t kafka_partition(const rd_kafka_topic_t *rkt,
                                int32_t partition_cnt, void *p, void *m)
 {
     u_int32_t key = *((u_int32_t *)keydata );
+    u_int32_t target = key % partition_cnt;
+    int32_t   i = partition_cnt;
 
-    return key % partition_cnt;
+    while (--i > 0 && !rd_kafka_topic_partition_available(rkt, target)) {
+        target = (target + 1) % partition_cnt;
+    }
+    return target;
 }
 
 static int kafka_write(const data_set_t *ds, /* {{{ */
@@ -240,7 +245,7 @@ static void kafka_config_topic(rd_kafka_conf_t *conf, oconfig_item_t *ci) /* {{{
                 goto errout;
                        }
             key = child->values[0].value.string;
-            val = child->values[0].value.string;
+            val = child->values[1].value.string;
             ret = rd_kafka_topic_conf_set(tctx->conf,key, val,
                                           errbuf, sizeof(errbuf));
             if (ret != RD_KAFKA_CONF_OK) {
diff --git a/src/write_log.c b/src/write_log.c
new file mode 100644 (file)
index 0000000..e37aae9
--- /dev/null
@@ -0,0 +1,81 @@
+/**
+ * collectd - src/write_log.c
+ * Copyright (C) 2015       Pierre-Yves Ritschard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Pierre-Yves Ritschard <pyr at spootnik.org>
+ *
+ **/
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+#include "configfile.h"
+
+#include "utils_format_graphite.h"
+
+/* Folks without pthread will need to disable this plugin. */
+#include <pthread.h>
+
+#include <sys/socket.h>
+#include <netdb.h>
+
+#define WL_BUF_SIZE 8192
+
+static int wl_write_messages (const data_set_t *ds, const value_list_t *vl)
+{
+    char buffer[WL_BUF_SIZE];
+    int status;
+
+    if (0 != strcmp (ds->type, vl->type))
+    {
+        ERROR ("write_log plugin: DS type does not match "
+                "value list type");
+        return -1;
+    }
+
+    memset (buffer, 0, sizeof (buffer));
+    status = format_graphite (buffer, sizeof (buffer), ds, vl,
+                              NULL, NULL, '_', 0);
+    if (status != 0) /* error message has been printed already. */
+        return (status);
+
+    INFO ("write_log values:\n%s", buffer);
+
+    return (0);
+} /* int wl_write_messages */
+
+static int wl_write (const data_set_t *ds, const value_list_t *vl,
+        user_data_t *user_data)
+{
+    int status;
+
+    status = wl_write_messages (ds, vl);
+
+    return (status);
+}
+
+void module_register (void)
+{
+    plugin_register_write ("write_log", wl_write, NULL);
+}
+
+/* vim: set sw=4 ts=4 sts=4 tw=78 et : */
index 30e261c..24151ce 100644 (file)
 #endif
 #include <mongo.h>
 
+#if (MONGO_MAJOR == 0) && (MONGO_MINOR < 8)
+# define bson_alloc()    bson_create()
+# define bson_dealloc(b) bson_dispose(b)
+#endif
+
 struct wm_node_s
 {
   char name[DATA_MAX_NAME_LEN];
@@ -74,7 +79,7 @@ static bson *wm_create_bson (const data_set_t *ds, /* {{{ */
   gauge_t *rates;
   int i;
 
-  ret = bson_create ();
+  ret = bson_alloc (); /* matched by bson_dealloc() */
   if (ret == NULL)
   {
     ERROR ("write_mongodb plugin: bson_create failed.");
@@ -95,7 +100,7 @@ static bson *wm_create_bson (const data_set_t *ds, /* {{{ */
     rates = NULL;
   }
 
-  bson_init (ret);
+  bson_init (ret); /* matched by bson_destroy() */
   bson_append_date (ret, "time", (bson_date_t) CDTIME_T_TO_MS (vl->time));
   bson_append_string (ret, "host", vl->host);
   bson_append_string (ret, "plugin", vl->plugin);
@@ -243,7 +248,8 @@ static int wm_write (const data_set_t *ds, /* {{{ */
   pthread_mutex_unlock (&node->lock);
 
   /* free our resource as not to leak memory */
-  bson_dispose (bson_record);
+  bson_destroy (bson_record); /* matches bson_init() */
+  bson_dealloc (bson_record); /* matches bson_alloc() */
 
   return (0);
 } /* }}} int wm_write */
index 3defaca..b4c5e21 100644 (file)
@@ -30,7 +30,8 @@
 #include "configfile.h"
 
 #include <pthread.h>
-#include <credis.h>
+#include <sys/time.h>
+#include <hiredis/hiredis.h>
 
 struct wr_node_s
 {
@@ -38,9 +39,9 @@ struct wr_node_s
 
   char *host;
   int port;
-  int timeout;
+  struct timeval timeout;
 
-  REDIS conn;
+  redisContext *conn;
   pthread_mutex_t lock;
 };
 typedef struct wr_node_s wr_node_t;
@@ -56,15 +57,18 @@ static int wr_write (const data_set_t *ds, /* {{{ */
   char ident[512];
   char key[512];
   char value[512];
+  char time[24];
   size_t value_size;
   char *value_ptr;
   int status;
+  redisReply   *rr;
   int i;
 
   status = FORMAT_VL (ident, sizeof (ident), vl);
   if (status != 0)
     return (status);
   ssnprintf (key, sizeof (key), "collectd/%s", ident);
+  ssnprintf (time, sizeof (time), "%.9f", CDTIME_T_TO_DOUBLE(vl->time));
 
   memset (value, 0, sizeof (value));
   value_size = sizeof (value);
@@ -84,7 +88,8 @@ static int wr_write (const data_set_t *ds, /* {{{ */
   }                                                                  \
 } while (0)
 
-  APPEND ("%lu", (unsigned long) vl->time);
+  APPEND ("%s:", time);
+
   for (i = 0; i < ds->ds_num; i++)
   {
     if (ds->ds[i].type == DS_TYPE_COUNTER)
@@ -105,7 +110,7 @@ static int wr_write (const data_set_t *ds, /* {{{ */
 
   if (node->conn == NULL)
   {
-    node->conn = credis_connect (node->host, node->port, node->timeout);
+    node->conn = redisConnectWithTimeout ((char *)node->host, node->port, node->timeout);
     if (node->conn == NULL)
     {
       ERROR ("write_redis plugin: Connecting to host \"%s\" (port %i) failed.",
@@ -116,12 +121,14 @@ static int wr_write (const data_set_t *ds, /* {{{ */
     }
   }
 
-  /* "credis_zadd" doesn't handle a NULL pointer gracefully, so I'd rather
-   * have a meaningful assertion message than a normal segmentation fault. */
   assert (node->conn != NULL);
-  status = credis_zadd (node->conn, key, (double) vl->time, value);
+  rr = redisCommand (node->conn, "ZADD %s %s %s", key, time, value);
+  if (rr==NULL)
+    WARNING("ZADD command error. key:%s", key);
 
-  credis_sadd (node->conn, "collectd/values", ident);
+  rr = redisCommand (node->conn, "SADD collectd/values %s", ident);
+  if (rr==NULL)
+    WARNING("SADD command error. ident:%s", ident);
 
   pthread_mutex_unlock (&node->lock);
 
@@ -137,7 +144,7 @@ static void wr_config_free (void *ptr) /* {{{ */
 
   if (node->conn != NULL)
   {
-    credis_close (node->conn);
+    redisFree (node->conn);
     node->conn = NULL;
   }
 
@@ -148,6 +155,7 @@ static void wr_config_free (void *ptr) /* {{{ */
 static int wr_config_node (oconfig_item_t *ci) /* {{{ */
 {
   wr_node_t *node;
+  int timeout;
   int status;
   int i;
 
@@ -157,7 +165,8 @@ static int wr_config_node (oconfig_item_t *ci) /* {{{ */
   memset (node, 0, sizeof (*node));
   node->host = NULL;
   node->port = 0;
-  node->timeout = 1000;
+  node->timeout.tv_sec = 0;
+  node->timeout.tv_usec = 1000;
   node->conn = NULL;
   pthread_mutex_init (&node->lock, /* attr = */ NULL);
 
@@ -183,8 +192,10 @@ static int wr_config_node (oconfig_item_t *ci) /* {{{ */
         status = 0;
       }
     }
-    else if (strcasecmp ("Timeout", child->key) == 0)
-      status = cf_util_get_int (child, &node->timeout);
+    else if (strcasecmp ("Timeout", child->key) == 0) {
+      status = cf_util_get_int (child, &timeout);
+      if (status == 0) node->timeout.tv_usec = timeout;
+    }
     else
       WARNING ("write_redis plugin: Ignoring unknown config option \"%s\".",
           child->key);
index c3740e1..a09c723 100644 (file)
 #define RIEMANN_HOST           "localhost"
 #define RIEMANN_PORT           "5555"
 #define RIEMANN_TTL_FACTOR      2.0
+#define RIEMANN_BATCH_MAX      8192
 
 int write_riemann_threshold_check(const data_set_t *, const value_list_t *, int *);
 
 struct riemann_host {
        char                    *name;
        char                    *event_service_prefix;
-#define F_CONNECT               0x01
+#define F_CONNECT       0x01
        uint8_t                  flags;
-       pthread_mutex_t          lock;
-       _Bool                    notifications;
-       _Bool                    check_thresholds;
+       pthread_mutex_t  lock;
+    _Bool            batch_mode;
+       _Bool            notifications;
+       _Bool            check_thresholds;
        _Bool                    store_rates;
        _Bool                    always_append_ds;
        char                    *node;
        char                    *service;
        _Bool                    use_tcp;
-       int                      s;
+       int                          s;
        double                   ttl_factor;
-
-       int                      reference_count;
+    Msg             *batch_msg;
+    cdtime_t         batch_init;
+    int              batch_max;
+       int                          reference_count;
 };
 
 static char    **riemann_tags;
@@ -651,6 +655,103 @@ static Msg *riemann_value_list_to_protobuf (struct riemann_host const *host, /*
        return (msg);
 } /* }}} Msg *riemann_value_list_to_protobuf */
 
+
+/*
+ * Always call while holding host->lock !
+ */
+static int riemann_batch_flush_nolock (cdtime_t timeout,
+                                       struct riemann_host *host)
+{
+    cdtime_t    now;
+    int         status = 0;
+
+    if (timeout > 0) {
+        now = cdtime ();
+        if ((host->batch_init + timeout) > now)
+            return status;
+    }
+    riemann_send_msg(host, host->batch_msg);
+    riemann_msg_protobuf_free(host->batch_msg);
+
+       if (host->use_tcp && ((status = riemann_recv_ack(host)) != 0))
+        riemann_disconnect (host);
+
+    host->batch_init = cdtime();
+    host->batch_msg = NULL;
+    return status;
+}
+
+static int riemann_batch_flush (cdtime_t timeout,
+        const char *identifier __attribute__((unused)),
+        user_data_t *user_data)
+{
+    struct riemann_host *host;
+    int status;
+
+    if (user_data == NULL)
+        return (-EINVAL);
+
+    host = user_data->data;
+    pthread_mutex_lock (&host->lock);
+    status = riemann_batch_flush_nolock (timeout, host);
+    if (status != 0)
+        ERROR ("write_riemann plugin: riemann_send failed with status %i",
+               status);
+
+    pthread_mutex_unlock(&host->lock);
+    return status;
+}
+
+static int riemann_batch_add_value_list (struct riemann_host *host, /* {{{ */
+                                         data_set_t const *ds,
+                                         value_list_t const *vl,
+                                         int *statuses)
+{
+       size_t i;
+    Event **events;
+    Msg *msg;
+    size_t len;
+    int ret;
+
+    msg = riemann_value_list_to_protobuf (host, ds, vl, statuses);
+    if (msg == NULL)
+        return -1;
+
+    pthread_mutex_lock(&host->lock);
+
+    if (host->batch_msg == NULL) {
+        host->batch_msg = msg;
+    } else {
+        len = msg->n_events + host->batch_msg->n_events;
+        events = realloc(host->batch_msg->events,
+                         (len * sizeof(*host->batch_msg->events)));
+        if (events == NULL) {
+            pthread_mutex_unlock(&host->lock);
+            ERROR ("write_riemann plugin: out of memory");
+            riemann_msg_protobuf_free (msg);
+            return -1;
+        }
+        host->batch_msg->events = events;
+
+        for (i = host->batch_msg->n_events; i < len; i++)
+            host->batch_msg->events[i] = msg->events[i - host->batch_msg->n_events];
+
+        host->batch_msg->n_events = len;
+        sfree (msg->events);
+        msg->n_events = 0;
+        sfree (msg);
+    }
+
+       len = msg__get_packed_size(host->batch_msg);
+    ret = 0;
+    if (len >= host->batch_max) {
+        ret = riemann_batch_flush_nolock(0, host);
+    }
+
+    pthread_mutex_unlock(&host->lock);
+    return ret;
+} /* }}} Msg *riemann_batch_add_value_list */
+
 static int riemann_notification(const notification_t *n, user_data_t *ud) /* {{{ */
 {
        int                      status;
@@ -660,6 +761,9 @@ static int riemann_notification(const notification_t *n, user_data_t *ud) /* {{{
        if (!host->notifications)
                return 0;
 
+    /*
+     * Never batch for notifications, send them ASAP
+     */
        msg = riemann_notification_to_protobuf (host, n);
        if (msg == NULL)
                return (-1);
@@ -677,23 +781,32 @@ static int riemann_write(const data_set_t *ds, /* {{{ */
              const value_list_t *vl,
              user_data_t *ud)
 {
-       int                      status;
+       int                      status = 0;
        int                      statuses[vl->values_len];
        struct riemann_host     *host = ud->data;
        Msg                     *msg;
 
        if (host->check_thresholds)
                write_riemann_threshold_check(ds, vl, statuses);
-       msg = riemann_value_list_to_protobuf (host, ds, vl, statuses);
-       if (msg == NULL)
-               return (-1);
 
-       status = riemann_send (host, msg);
-       if (status != 0)
-               ERROR ("write_riemann plugin: riemann_send failed with status %i",
-                               status);
+    if (host->use_tcp == 1 && host->batch_mode) {
 
-       riemann_msg_protobuf_free (msg);
+        riemann_batch_add_value_list (host, ds, vl, statuses);
+
+
+    } else {
+
+        msg = riemann_value_list_to_protobuf (host, ds, vl, statuses);
+        if (msg == NULL)
+            return (-1);
+
+        status = riemann_send (host, msg);
+        if (status != 0)
+            ERROR ("write_riemann plugin: riemann_send failed with status %i",
+                   status);
+
+        riemann_msg_protobuf_free (msg);
+    }
        return status;
 } /* }}} int riemann_write */
 
@@ -741,7 +854,10 @@ static int riemann_config_node(oconfig_item_t *ci) /* {{{ */
        host->check_thresholds = 0;
        host->store_rates = 1;
        host->always_append_ds = 0;
-       host->use_tcp = 0;
+       host->use_tcp = 1;
+       host->batch_mode = 1;
+       host->batch_max = RIEMANN_BATCH_MAX; /* typical MSS */
+       host->batch_init = cdtime();
        host->ttl_factor = RIEMANN_TTL_FACTOR;
 
        status = cf_util_get_string (ci, &host->name);
@@ -775,6 +891,14 @@ static int riemann_config_node(oconfig_item_t *ci) /* {{{ */
                        status = cf_util_get_boolean(child, &host->check_thresholds);
                        if (status != 0)
                                break;
+        } else if (strcasecmp ("Batch", child->key) == 0) {
+            status = cf_util_get_boolean(child, &host->batch_mode);
+            if (status != 0)
+                break;
+        } else if (strcasecmp("BatchMaxSize", child->key) == 0) {
+            status = cf_util_get_int(child, &host->batch_max);
+            if (status != 0)
+                break;
                } else if (strcasecmp ("Port", child->key) == 0) {
                        status = cf_util_get_service (child, &host->service);
                        if (status != 0) {
@@ -859,6 +983,11 @@ static int riemann_config_node(oconfig_item_t *ci) /* {{{ */
        pthread_mutex_lock (&host->lock);
 
        status = plugin_register_write (callback_name, riemann_write, &ud);
+
+    if (host->use_tcp == 1 && host->batch_mode) {
+        ud.free_func = NULL;
+        plugin_register_flush(callback_name, riemann_batch_flush, &ud);
+    }
        if (status != 0)
                WARNING ("write_riemann plugin: plugin_register_write (\"%s\") "
                                "failed with status %i.",
index aeed635..9008a67 100644 (file)
@@ -365,30 +365,41 @@ static int wt_format_name(char *ret, int ret_len,
 
     if (ds_name != NULL) {
         if (vl->plugin_instance[0] == '\0') {
-            ssnprintf(ret, ret_len, "%s%s.%s",
-                      prefix, vl->plugin, ds_name);
-        } else if (vl->type_instance == '\0') {
-            ssnprintf(ret, ret_len, "%s%s.%s.%s.%s",
-                      prefix, vl->plugin, vl->plugin_instance,
-                      vl->type_instance, ds_name);
-        } else {
-            ssnprintf(ret, ret_len, "%s%s.%s.%s.%s",
-                      prefix, vl->plugin, vl->plugin_instance, vl->type,
-                      ds_name);
+            if (vl->type_instance[0] == '\0') {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s", prefix, vl->plugin,
+                        vl->type, ds_name);
+            } else {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s.%s", prefix, vl->plugin,
+                        vl->type, vl->type_instance, ds_name);
+            }
+        } else { /* vl->plugin_instance != "" */
+            if (vl->type_instance[0] == '\0') {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s.%s", prefix, vl->plugin,
+                        vl->plugin_instance, vl->type, ds_name);
+            } else {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s.%s.%s", prefix,
+                        vl->plugin, vl->plugin_instance, vl->type,
+                        vl->type_instance, ds_name);
+            }
+        }
+    } else { /* ds_name == NULL */
+        if (vl->plugin_instance[0] == '\0') {
+            if (vl->type_instance[0] == '\0') {
+                ssnprintf(ret, ret_len, "%s%s.%s", prefix, vl->plugin,
+                        vl->type);
+            } else {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s", prefix, vl->plugin,
+                        vl->type_instance, vl->type);
+            }
+        } else { /* vl->plugin_instance != "" */
+            if (vl->type_instance[0] == '\0') {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s", prefix, vl->plugin,
+                        vl->plugin_instance, vl->type);
+            } else {
+                ssnprintf(ret, ret_len, "%s%s.%s.%s.%s", prefix, vl->plugin,
+                        vl->plugin_instance, vl->type, vl->type_instance);
+            }
         }
-    } else if (vl->plugin_instance[0] == '\0') {
-        if (vl->type_instance[0] == '\0')
-            ssnprintf(ret, ret_len, "%s%s.%s",
-                      prefix, vl->plugin, vl->type);
-        else
-            ssnprintf(ret, ret_len, "%s%s.%s",
-                      prefix, vl->plugin, vl->type_instance);
-    } else if (vl->type_instance[0] == '\0') {
-        ssnprintf(ret, ret_len, "%s%s.%s.%s",
-                  prefix, vl->plugin, vl->plugin_instance, vl->type);
-    } else {
-        ssnprintf(ret, ret_len, "%s%s.%s.%s",
-                  prefix, vl->plugin, vl->plugin_instance, vl->type_instance);
     }
 
     sfree(temp);
diff --git a/src/zookeeper.c b/src/zookeeper.c
new file mode 100644 (file)
index 0000000..63ee6c9
--- /dev/null
@@ -0,0 +1,322 @@
+/**
+ * collectd - src/zookeeper.c
+ * Copyright (C) 2014       Google, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Jeremy Katz <jeremy at katzbox.net>
+ **/
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+
+#include <netdb.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+
+#define ZOOKEEPER_DEF_HOST "127.0.0.1"
+#define ZOOKEEPER_DEF_PORT "2181"
+
+static char *zk_host = NULL;
+static char *zk_port = NULL;
+
+static const char *config_keys[] =
+{
+       "Host",
+       "Port"
+};
+static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
+
+static int zookeeper_config(const char *key, const char *value)
+{
+       if (strncmp(key, "Host", strlen("Host")) == 0)
+       {
+               sfree (zk_host);
+               zk_host = strdup (value);
+       }
+       else if (strncmp(key, "Port", strlen("Port")) == 0)
+       {
+               sfree (zk_port);
+               zk_port = strdup (value);
+       }
+       else
+       {
+               return -1;
+       }
+       return 0;
+}
+
+static void zookeeper_submit_gauge (const char * type, const char * type_inst, gauge_t val)
+{
+       value_t values[1];
+       value_list_t vl = VALUE_LIST_INIT;
+
+       values[0].gauge = val;
+
+       vl.values = values;
+       vl.values_len = 1;
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "zookeeper", sizeof (vl.plugin));
+       sstrncpy (vl.type, type, sizeof (vl.type));
+       if (type_inst != NULL)
+               sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
+
+       plugin_dispatch_values (&vl);
+} /* zookeeper_submit_gauge */
+
+static void zookeeper_submit_derive (const char * type, const char * type_inst, derive_t val)
+{
+       value_t values[1];
+       value_list_t vl = VALUE_LIST_INIT;
+
+       values[0].derive = val;
+
+       vl.values = values;
+       vl.values_len = 1;
+       sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+       sstrncpy (vl.plugin, "zookeeper", sizeof (vl.plugin));
+       sstrncpy (vl.type, type, sizeof (vl.type));
+       if (type_inst != NULL)
+               sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
+
+       plugin_dispatch_values (&vl);
+} /* zookeeper_submit_derive */
+
+static int zookeeper_connect (void)
+{
+       int sk = -1;
+       int status;
+       struct addrinfo ai_hints;
+       struct addrinfo *ai;
+       struct addrinfo *ai_list;
+       char *host;
+       char *port;
+
+       memset ((void *) &ai_hints, '\0', sizeof (ai_hints));
+       ai_hints.ai_family   = AF_UNSPEC;
+       ai_hints.ai_socktype = SOCK_STREAM;
+
+       host = (zk_host != NULL) ? zk_host : ZOOKEEPER_DEF_HOST;
+       port = (zk_port != NULL) ? zk_port : ZOOKEEPER_DEF_PORT;
+       status = getaddrinfo (host, port, &ai_hints, &ai_list);
+       if (status != 0)
+       {
+               char errbuf[1024];
+               INFO ("getaddrinfo failed: %s",
+                         (status == EAI_SYSTEM)
+                         ? sstrerror (errno, errbuf, sizeof (errbuf))
+                         : gai_strerror (status));
+               return (-1);
+       }
+
+       for (ai = ai_list; ai != NULL; ai = ai->ai_next)
+       {
+               sk = socket (ai->ai_family, SOCK_STREAM, 0);
+               if (sk < 0)
+               {
+                       char errbuf[1024];
+                       WARNING ("zookeeper: socket(2) failed: %s",
+                                        sstrerror (errno, errbuf, sizeof(errbuf)));
+                       continue;
+               }
+               status = (int) connect (sk, ai->ai_addr, ai->ai_addrlen);
+               if (status != 0)
+               {
+                       char errbuf[1024];
+                       close (sk);
+                       sk = -1;
+                       WARNING ("zookeeper: connect(2) failed: %s",
+                                        sstrerror (errno, errbuf, sizeof(errbuf)));
+                       continue;
+               }
+
+               /* connected */
+               break;
+       }
+
+       freeaddrinfo(ai_list);
+       return (sk);
+} /* int zookeeper_connect */
+
+static int zookeeper_query (char *buffer, size_t buffer_size)
+{
+       int sk = -1;
+       int status;
+       size_t buffer_fill;
+
+       sk = zookeeper_connect();
+       if (sk < 0)
+       {
+               ERROR ("zookeeper: Could not connect to daemon");
+               return (-1);
+       }
+
+       status = (int) swrite (sk, "mntr\r\n", strlen("mntr\r\n"));
+       if (status != 0)
+       {
+               char errbuf[1024];
+               ERROR ("zookeeper: write(2) failed: %s",
+                          sstrerror (errno, errbuf, sizeof (errbuf)));
+               close (sk);
+               return (-1);
+       }
+
+       memset (buffer, 0, buffer_size);
+       buffer_fill = 0;
+
+       while ((status = (int) recv (sk, buffer + buffer_fill,
+          buffer_size - buffer_fill, /* flags = */ 0)) != 0)
+       {
+               if (status < 0)
+               {
+                       char errbuf[1024];
+                       if ((errno == EAGAIN) || (errno == EINTR))
+                               continue;
+                       ERROR ("zookeeper: Error reading from socket: %s",
+                                  sstrerror (errno, errbuf, sizeof (errbuf)));
+                       close (sk);
+                       return (-1);
+               }
+
+               buffer_fill += (size_t) status;
+               if (status == 0)
+               {
+                       /* done reading from the socket */
+                       break;
+               }
+       } /* while (recv) */
+
+       status = 0;
+       if (buffer_fill == 0)
+       {
+               WARNING ("zookeeper: No data returned by MNTR command.");
+               status = -1;
+       }
+
+       close(sk);
+       return (status);
+} /* int zookeeper_query */
+
+
+static int zookeeper_read (void) {
+       char buf[4096];
+       char *ptr;
+       char *save_ptr;
+       char *line;
+       char *fields[2];
+
+       if (zookeeper_query (buf, sizeof (buf)) < 0)
+       {
+               return (-1);
+       }
+
+       ptr = buf;
+       save_ptr = NULL;
+       while ((line = strtok_r (ptr, "\n\r", &save_ptr)) != NULL)
+       {
+               ptr = NULL;
+               if (strsplit(line, fields, 2) != 2)
+               {
+                       continue;
+               }
+#define FIELD_CHECK(check, expected) \
+       (strncmp (check, expected, strlen(expected)) == 0)
+
+               if (FIELD_CHECK (fields[0], "zk_avg_latency"))
+               {
+                       zookeeper_submit_gauge ("latency", "avg", atol(fields[1]));
+               }
+               else if (FIELD_CHECK(fields[0], "zk_min_latency"))
+               {
+                       zookeeper_submit_gauge ("latency", "min", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_max_latency"))
+               {
+                       zookeeper_submit_gauge ("latency", "max", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_packets_received"))
+               {
+                       zookeeper_submit_derive ("packets", "received", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_packets_sent"))
+               {
+                       zookeeper_submit_derive ("packets", "sent", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_num_alive_connections"))
+               {
+                       zookeeper_submit_gauge ("current_connections", NULL, atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_outstanding_requests"))
+               {
+                       zookeeper_submit_gauge ("requests", "outstanding", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_znode_count"))
+               {
+                       zookeeper_submit_gauge ("gauge", "znode", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_watch_count"))
+               {
+                       zookeeper_submit_gauge ("gauge", "watch", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_ephemerals_count"))
+               {
+                       zookeeper_submit_gauge ("gauge", "ephemerals", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_ephemerals_count"))
+               {
+                       zookeeper_submit_gauge ("gauge", "ephemerals", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_ephemerals_count"))
+               {
+                       zookeeper_submit_gauge ("gauge", "ephemerals", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_approximate_data_size"))
+               {
+                       zookeeper_submit_gauge ("bytes", "approximate_data_size", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_followers"))
+               {
+                       zookeeper_submit_gauge ("count", "followers", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_synced_followers"))
+               {
+                       zookeeper_submit_gauge ("count", "synced_followers", atol(fields[1]));
+               }
+               else if (FIELD_CHECK (fields[0], "zk_pending_syncs"))
+               {
+                       zookeeper_submit_gauge ("count", "pending_syncs", atol(fields[1]));
+               }
+               else
+               {
+                       DEBUG("Uncollected zookeeper MNTR field %s", fields[0]);
+               }
+       }
+
+       return (0);
+} /* zookeeper_read */
+
+void module_register (void)
+{
+       plugin_register_config ("zookeeper", zookeeper_config, config_keys, config_keys_num);
+       plugin_register_read ("zookeeper", zookeeper_read);
+} /* void module_register */
index 6b5e40e..e251950 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-DEFAULT_VERSION="5.4.1.git"
+DEFAULT_VERSION="5.4.2.git"
 
 VERSION="`git describe 2> /dev/null | grep collectd | sed -e 's/^collectd-//'`"