Auto-Merge pull request #2517 from trustchk/aix
authorcollectd bot <32910397+collectd-bot@users.noreply.github.com>
Sun, 12 Nov 2017 21:04:11 +0000 (22:04 +0100)
committerGitHub <noreply@github.com>
Sun, 12 Nov 2017 21:04:11 +0000 (22:04 +0100)
Automatically merged due to "Automerge" label

ChangeLog
configure.ac
contrib/redhat/collectd.spec
src/libcollectdclient/server.c
src/netlink.c
src/varnish.c
version-gen.sh

index f990dd4..86b7cb8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,179 @@
+2017-11-15, Version 5.8.0 (RC0)
+       * collectd: The core daemon is now completely licensed under the MIT
+         license.
+       * collectd: Added daemon option to avoid making BaseDir. Thanks to
+         Nathaniel Wesley Filardo and Florian Forster. #2422
+       * collectd: Global variables have been moved to their own module to make
+         porting collectd easier. Thanks to Sean Campbell. #2467
+       * collectd as well as Apache, memcached, OpenLDAP, Perl, RouterOS, SNMP,
+         Tail-CSV plugins: Free userdata for "plugin_register_complex_read()".
+         Thanks to Pavel Rochnyack. #2349
+       * Collectd client library: Added parsing and server code. Thanks to
+         Florian Forster. #2258
+       * Build system: Dependency on libltdl has been removed, support for
+         libtool 1 has been dropped. Thanks to Ruben Kerkhof. #1898
+       * Build system: The build system has been switched to non-recursive
+         make. Thanks to Ruben Kerkhof. #2085
+       * APC UPS plugin: The plugin's configuration is now optional. Without a
+         "<Plugin />" block reasonable defaults will be used. Thanks to Pavel
+         Rochnyack. #2351
+       * Chrony plugin: Several issues found when working with a stratum-1
+         server have been fixed. Thanks to Miroslav Lichvar. #2190
+       * Ceph plugin: Support for the Ceph version "Luminous" has been added.
+         Thanks to Aleksei Zakharov. #2464
+       * CPU plugin : Linux-specific "guest" states have been added. Thanks to
+         Xavier G. #2439
+       * cURL plugin, cURL-JSON, cURL-XML, DBI, FileCount, memcachec, Oracle,
+         PostgreSQL, Table, Tail, Tail CSV plugins: The ability to configure
+         the "plugin" field of generated metrics has been added. Thanks to
+         Pavel Rochnyack. #1944, #1681, #1558
+       * cURL-JSON plugin: Parsing of arrays has been fixed. Thanks to Florian
+         Forster. #2281
+       * DPDKEvents plugin: This new plugin reports link status and keep alive
+         events. Thanks to Maryam Tahhan, Harry van Haaren, Serhiy Pshyk,
+         Kim-Marie Jones, Krzysztof Matczak, Przemyslaw Szczerbik, Christian
+         Ehrhardt and Luca Boccassi. #2157, #2348, #2400, #2405, #2417
+       * DPDKStat plugin: The plugin has been refactored to make DPDK related
+         utility functions reusable. Thanks to Krzysztof Matczak, Przemyslaw
+         Szczerbik, Christian Ehrhardt and Luca Boccassi. #2130, #2348, #2400,
+         #2405, #2417
+       * DPDKStat plugin: The "LogLevel" and "RteDriverLibPath" config options
+         have been added. Thanks to Jiri Prokes. #2505
+       * Email plugin as well as Exec and Unixsock plugins: Use
+         "_SC_GETPW_R_SIZE_MAX". Thanks to Florian Forster. #2451
+       * FileCount plugin: Custom values for reported plugin, type and type
+         instance. Thanks to Pavel Rochnyack. #1979
+       * GenericJMX plugin: Support for "AtomicInteger" and "AtomicLong" has
+         been added. Thanks to Pierre Mauduit. #2158
+       * gRPC plugin: Support for meta data has been added. Thanks to Taylor
+         Cramer. #2378
+       * IPC plugin: Fixed failed compilation on AIX. Thanks to Pavel
+         Rochnyack. #2357
+       * Intel PMU plugin: This new plugin collects CPU performance metrics
+         using Intel's Performance Monitoring Unit (PMU). Scaling information
+         added to metadata. Thanks to Serhiy Pshyk and Roman Korynkevych.
+         #2276, #2398, #2374
+       * Intel RDT plugin: Support for collectd's logging infrastructure has
+         been added. PQoS monitoring groups are being reset on start-up to fix
+         potential previous unclean shutdowns. Thanks to Roman Korynkevych.
+         #2089.
+       * IPMI plugin: Support for System Event Log (SEL) has been added. Thanks
+         to Roman Korynkevych. #2091
+       * IPMI plugin: Support for remote IPMI controllers has been added.
+         Thanks to Pavel Rochnyack. #2024
+       * LVM plugin: A check for the "CAP_SYS_ADMIN" capability has been added.
+         This will give users an informative warning when the process is not
+         running with the required privileges for this plugin. Thanks to
+         Florian Forster. #2426, #2499
+       * mcelog plugin: This new plugin subscribes to Machine Check Exceptions
+         (MCE) and dispatches notifications. Metadata reset. Thanks to Maryam
+         Tahhan, Volodymyr Mytnyk, Taras Chornyi, Krzysztof Matczak and Roman
+         Korynkevych. #2003, #2246, #2380
+       * MQTT plugin: Add support for TLS in "Subscriber" blocks. Thanks to
+         Florian Forster. #2434
+       * memcached plugin: Persistent connections have been implemented. Fix
+         hit ratio reporting, add connections rate report. Thanks to Pavel
+         Rochnyack. #2388, #2385
+       * memcached plugin: The type of the "listen_disabled" metric has been
+         changed to "total_events". Thanks to Florian Forster. #2386, #2468
+       * Netlink plugin: The dropped packets metric has been added. Thanks to
+         Denys Fedoryshchenko. #2053
+       * NFS plugin: Support for NFS 4.2 metrics has been added. Thanks to
+         Marek Becka. #2369
+       * NFS plugin: Config options to ignore specified NFS versions have been
+         added. Thanks to Christian Bartolomäus. #2430
+       * NUT plugin: The "ConnectTimeout", "ForceSSL", "VerifyPeer" and
+         "CAPath" options have been added. Thanks to Pavel Rochnyack and Steven
+         Bell. #2145, #2354
+       * OpenLDAP plugin: A segfault after a connection failure has been fixed.
+         Thanks to Pavel Rochnyack. #2377
+       * Openvpn plugin: Added support for status files from latest OpenVPN-2.4
+         and possible from future versions. Thanks to Pavel Rochnyack. #2352
+       * OVS Events plugin: This new plugin reports link state changes from
+         Open vSwitch (OVS). Thanks to Volodymyr Mytnyk. #1971
+       * OVS Stats plugin: This new plugin reports bridge / interface
+         statistics from Open vSwitch (OVS). Thanks to Volodymyr Mytnyk and
+         Taras Chornyi. #2137
+       * Perl plugin: Bugfix, added check of proper interpreter initialization.
+         Thanks to Pavel Rochnyack. #2391
+       * PostgreSQL plugin: The plugin now sets the "application_name"
+         parameter when connecting to the database. Thanks to daniacs. #2497
+       * Processes plugin: The I/O operations reported for selected processes
+         has been fixed. The metric "ps_disk_octets" has been renamed to
+         "io_octets" because it actually contains the number of I/O operation
+         by the process, not just disk related I/O. Same for "io_ops"
+         (previously "ps_disk_ops"). The new metric "disk_octets" has been
+         added and is reporting disk I/O only. Add option to collect the count
+         of active memory maps for Linux processes. The "CollectFileDescriptor"
+         and "CollectContextSwitch" options have been added. Thanks to Pavel
+         Rochnyack and to Wilfried Goesgens. #2232, #2454, #1989
+       * Processes and TCPConns plugins: The OpenBSD implementation has been
+         changed to use "kvm_openfiles" with "KVM_NO_FILES". Thanks to Jeremie
+         Courreges-Anglas. #2061
+       * Python plugin: Extend Notification class to include metadata. Thanks
+         to Volodymyr Mytnyk. #2135
+       * Python plugin: The "CollectdException" class has been added. This
+         allows to throw an exception without a stack trace being logged.
+         Thanks to Sven Trenkel. #2330, #2346
+       * Sensors plugin: Support for (electrical) current has been added.
+         Thanks to Clemens Gruber. #2255
+       * SNMP plugin: Error handling has been improved: a potential double-free
+         is now avoided (potentially leaking memory) and handling of
+         non-failing subtrees has been fixed. Thanks to Pavel Rochnyack. #2449
+       * SNMP plugin: The "Timeout" and "Retries" config options have been
+         added. Thanks to Carlos Vicente. #1472, #2488
+       * SNMP Agent plugin: This new plugin implements an SNMP AgentX subagent
+         that receives and handles queries from SNMP master agent and returns
+         configured metrics. Thanks to Roman Korynkevych, Serhiy Pshyk and
+         Pavel Rochnyack. #2105, #2362
+       * Synproxy plugin: This new plugin provides statistics for Linux
+         SYNPROXY. Thanks to Marek Bečka. #2381
+       * Tail plugin: Allow the calculation of several distributions in one
+         "tail" instance through a "bucket" type. Thanks to Pavel Rochnyack.
+         #2442
+       * Turbostat plugin: Import "msr-index.h" header from Linux and better
+         support for mutliple packages. Thanks to Vincent Brillault. #2445,
+         #2446
+       * Uptime plugin: Changed implementation to read from "/proc/uptime"
+         instead of "/proc/stat". Update for Linux and AIX, uptime is read
+         directly using a system call. Update for BSD and Solaris, uptime is
+         calculated by subtracting boot time from current time. Thanks to Ivan
+         Kurnosov and Marcin Jurkowski. #2431, #2034
+       * UUID plugin: Support for libhal has been removed. Thanks to Ruben
+         Kerkhof. #2080
+       * Varnish plugin: Extended the varnish plugin with varnish-plus
+         counters. Fixed invalid data source type. Thanks to Denes Matetelki.
+         #2453, #2463
+       * virt plugin: The plugin has been updated to use
+         "virConnectListAllDomains()". Thanks to Denis Silakov. #2051
+       * virt plugin: Support for domain tags has been added. Thanks to
+         Francesco Romani. #2048
+       * virt plugin: Connection handling has been improved. Thanks to
+         Francesco Romani. #2100, #2101
+       * virt plugin: Many metrics have been added, including disk, hypervisor
+         CPU usage, performance monitoring events, domain state, CPU pinning
+         (affinity), file system, and job statistics. Thanks to Francesco
+         Romani and Przemyslaw Szczerbik. #2103, #2175, #2168
+       * Write Graphite plugin: Additional tests have been added. Thanks to
+         Florian Forster.
+       * Write HTTP plugin: The "Attribute" and "TTL" options for the KairosDB
+         format have been added. Implementation of "Prefix" option. Thanks to
+         jaroug, Denis Pompilio and Pavel Rochnyack. #2199, #2252, #2482
+       * Write MongoDB plugin: Memory leaks have been fixed. Thanks to
+         Saikrishna Arcot. #2307
+       * Write Prometheus plugin: Label values are now properly escaped. Thanks
+         to Florian Forster. #2035
+       * Write Redis plugin: Add "max_set_duration" to set duration for value.
+         Thanks to Tomofumi Hayashi. #2440
+       * Write Riemann plugin: Export times with microsecond resolution. Thanks
+         to mcorbin. #2315
+       * Write TSDB plugin: The options "ResolveInterval" and "ResolveJitter"
+         have been added to control DNS lookup behavior. This prevents DNS
+         flooding in case TSDB is not available. Thanks to Yves Mettier and
+         Florian Forster. #2059
+       * ZFS ARC plugin: Header lines are now ignored in the Linux
+         implementation. Thanks to YmrDtnJu. #2097
+
 2017-06-06, Version 5.7.2
        * Build system: The Notify Email plugin is no longer linked with
          indirect dependencies. Thanks to Marc Fournier.
index 55f78d8..e869a6a 100644 (file)
@@ -5718,20 +5718,25 @@ if test "x$with_libvarnish" = "xyes"; then
   SAVE_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $with_libvarnish_cflags"
 
-  AC_CHECK_HEADERS([vapi/vsc.h],
-    [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
-    [
-      AC_CHECK_HEADERS([vsc.h],
-        [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support]) ],
-        [
-          AC_CHECK_HEADERS([varnishapi.h],
-            [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
-            [with_libvarnish="no (found none of the varnish header files)"]
-          )
-        ]
-      )
-    ]
-  )
+  $PKG_CONFIG --atleast-version=5.2 'varnishapi' 2>/dev/null
+  if test $? -eq 0; then
+    AC_DEFINE([HAVE_VARNISH_V5], [1], [Varnish 5 API support])
+  else
+    AC_CHECK_HEADERS([vapi/vsc.h],
+      [AC_DEFINE([HAVE_VARNISH_V4], [1], [Varnish 4 API support])],
+      [
+        AC_CHECK_HEADERS([vsc.h],
+          [AC_DEFINE([HAVE_VARNISH_V3], [1], [Varnish 3 API support]) ],
+          [
+            AC_CHECK_HEADERS([varnishapi.h],
+              [AC_DEFINE([HAVE_VARNISH_V2], [1], [Varnish 2 API support])],
+              [with_libvarnish="no (found none of the varnish header files)"]
+            )
+          ]
+        )
+      ]
+    )
+  fi
 
   CPPFLAGS="$SAVE_CPPFLAGS"
 fi
index 7862663..d84b457 100644 (file)
 %define with_snmp_agent 0%{!?_without_snmp_agent:1}
 %define with_statsd 0%{!?_without_statsd:1}
 %define with_swap 0%{!?_without_swap:1}
+%define with_synproxy 0%{!?_without_synproxy:0}
 %define with_syslog 0%{!?_without_syslog:1}
 %define with_table 0%{!?_without_table:1}
 %define with_tail 0%{!?_without_tail:1}
 Summary:       Statistics collection and monitoring daemon
 Name:          collectd
 Version:       5.7.1
-Release:       7%{?dist}
+Release:       8%{?dist}
 URL:           https://collectd.org
 Source:                https://collectd.org/files/%{name}-%{version}.tar.bz2
 License:       GPLv2
@@ -1655,6 +1656,12 @@ Collectd utilities
 %define _with_swap --disable-swap
 %endif
 
+%if %{with_synproxy}
+%define _with_synproxy --enable-synproxy
+%else
+%define _with_synproxy --disable-synproxy
+%endif
+
 %if %{with_syslog}
 %define _with_syslog --enable-syslog
 %else
@@ -1986,6 +1993,7 @@ Collectd utilities
        %{?_with_snmp_agent} \
        %{?_with_statsd} \
        %{?_with_swap} \
+       %{?_with_synproxy} \
        %{?_with_syslog} \
        %{?_with_table} \
        %{?_with_tail_csv} \
@@ -2291,6 +2299,9 @@ fi
 %if %{with_swap}
 %{_libdir}/%{name}/swap.so
 %endif
+%if %{with_synproxy}
+%{_libdir}/%{name}/synproxy.so
+%endif
 %if %{with_syslog}
 %{_libdir}/%{name}/syslog.so
 %endif
@@ -2367,6 +2378,9 @@ fi
 %{_includedir}/collectd/network_buffer.h
 %{_includedir}/collectd/lcc_features.h
 %{_libdir}/pkgconfig/libcollectdclient.pc
+%{_includedir}/collectd/network_parse.h
+%{_includedir}/collectd/server.h
+%{_includedir}/collectd/types.h
 %{_libdir}/libcollectdclient.so
 
 %files -n libcollectdclient
@@ -2723,6 +2737,12 @@ fi
 %doc contrib/
 
 %changelog
+* Thu Sep 28 2017 xakru <calvinxakru@gmail.com> - 5.7.1-8
+- Add new libcollectdclient/network_parse
+- Add new libcollectdclient/server
+- Add new libcollectdclient/types
+- Add new synproxy plugin
+
 * Fri Aug 18 2017 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.1-7
 - Add new intel_pmu plugin
 
index d18cc7d..a81afda 100644 (file)
@@ -82,7 +82,7 @@ static int server_multicast_join(lcc_listener_t *srv,
     };
 #else
     struct ip_mreq mreq = {
-        .imr_address.s_addr = INADDR_ANY, .imr_multiaddr.s_addr = sa->s_addr,
+        .imr_multiaddr.s_addr = sa->sin_addr.s_addr,
     };
 #endif
     status = setsockopt(srv->conn, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
index 0bac3e7..b5ae3bd 100644 (file)
@@ -358,8 +358,10 @@ static int link_filter_cb(const struct nlmsghdr *nlh,
       continue;
 
     if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(*stats.stats64)) < 0) {
+      char errbuf[1024];
       ERROR("netlink plugin: link_filter_cb: IFLA_STATS64 mnl_attr_validate2 "
-            "failed.");
+            "failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
       return MNL_CB_ERROR;
     }
     stats.stats64 = mnl_attr_get_payload(attr);
@@ -374,8 +376,10 @@ static int link_filter_cb(const struct nlmsghdr *nlh,
       continue;
 
     if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(*stats.stats32)) < 0) {
+      char errbuf[1024];
       ERROR("netlink plugin: link_filter_cb: IFLA_STATS mnl_attr_validate2 "
-            "failed.");
+            "failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
       return MNL_CB_ERROR;
     }
     stats.stats32 = mnl_attr_get_payload(attr);
@@ -400,8 +404,10 @@ static int qos_attr_cb(const struct nlattr *attr, void *data) {
 
   if (mnl_attr_get_type(attr) == TCA_STATS_BASIC) {
     if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(*q_stats->bs)) < 0) {
+      char errbuf[1024];
       ERROR("netlink plugin: qos_attr_cb: TCA_STATS_BASIC mnl_attr_validate2 "
-            "failed.");
+            "failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
       return MNL_CB_ERROR;
     }
     q_stats->bs = mnl_attr_get_payload(attr);
@@ -550,8 +556,10 @@ static int qos_filter_cb(const struct nlmsghdr *nlh, void *args) {
       continue;
 
     if (mnl_attr_validate2(attr, MNL_TYPE_UNSPEC, sizeof(*ts)) < 0) {
+      char errbuf[1024];
       ERROR("netlink plugin: qos_filter_cb: TCA_STATS mnl_attr_validate2 "
-            "failed.");
+            "failed: %s",
+            sstrerror(errno, errbuf, sizeof(errbuf)));
       return MNL_CB_ERROR;
     }
     ts = mnl_attr_get_payload(attr);
@@ -686,8 +694,10 @@ static int ir_read(void) {
     ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
   }
   if (ret < 0) {
-    ERROR("netlink plugin: ir_read: mnl_socket_recvfrom failed.");
-    return -1;
+    char errbuf[1024];
+    ERROR("netlink plugin: ir_read: mnl_socket_recvfrom failed: %s",
+          sstrerror(errno, errbuf, sizeof(errbuf)));
+    return (-1);
   }
 
   /* `link_filter_cb' will update `iflist' which is used here to iterate
@@ -731,10 +741,11 @@ static int ir_read(void) {
         ret = mnl_socket_recvfrom(nl, buf, sizeof(buf));
       }
       if (ret < 0) {
-        ERROR("netlink plugin: ir_read:mnl_socket_recvfrom failed.");
+        char errbuf[1024];
+        ERROR("netlink plugin: ir_read: mnl_socket_recvfrom failed: %s",
+              sstrerror(errno, errbuf, sizeof(errbuf)));
         continue;
       }
-
     } /* for (type_index) */
   }   /* for (if_index) */
 
index e4daf4b..08260dc 100644 (file)
@@ -29,7 +29,7 @@
 #include "common.h"
 #include "plugin.h"
 
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
 #include <vapi/vsc.h>
 #include <vapi/vsm.h>
 typedef struct VSC_C_main c_varnish_stats_t;
@@ -71,17 +71,17 @@ struct user_config_s {
 #if HAVE_VARNISH_V2
   _Bool collect_sm;
 #endif
-#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   _Bool collect_sma;
 #endif
   _Bool collect_struct;
   _Bool collect_totals;
-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   _Bool collect_uptime;
 #endif
   _Bool collect_vcl;
   _Bool collect_workers;
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   _Bool collect_vsm;
   _Bool collect_lck;
   _Bool collect_mempool;
@@ -138,13 +138,12 @@ static int varnish_submit_derive(const char *plugin_instance, /* {{{ */
                         });
 } /* }}} int varnish_submit_derive */
 
-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
 static int varnish_monitor(void *priv,
                            const struct VSC_point *const pt) /* {{{ */
 {
   uint64_t val;
   const user_config_t *conf;
-  const char *class;
   const char *name;
 
   if (pt == NULL)
@@ -152,19 +151,26 @@ static int varnish_monitor(void *priv,
 
   conf = priv;
 
-#if HAVE_VARNISH_V4
-  class = pt->section->fantom->type;
-  name = pt->desc->name;
+#if HAVE_VARNISH_V5
+  char namebuff[DATA_MAX_NAME_LEN];
+
+  char const *c = strrchr(pt->name, '.');
+  if (c == NULL) {
+    return EINVAL;
+  }
+  sstrncpy(namebuff, c + 1, sizeof(namebuff));
+  name = namebuff;
 
-  if (strcmp(class, "MAIN") != 0)
+#elif HAVE_VARNISH_V4
+  if (strcmp(pt->section->fantom->type, "MAIN") != 0)
     return 0;
 
+  name = pt->desc->name;
 #elif HAVE_VARNISH_V3
-  class = pt->class;
-  name = pt->name;
-
-  if (strcmp(class, "") != 0)
+  if (strcmp(pt->class, "") != 0)
     return 0;
+
+  name = pt->name;
 #endif
 
   val = *(const volatile uint64_t *)pt->ptr;
@@ -191,7 +197,7 @@ static int varnish_monitor(void *priv,
     else if (strcmp(name, "client_req") == 0)
       return varnish_submit_derive(conf->instance, "connections", "connections",
                                    "received", val);
-#ifdef HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
     else if (strcmp(name, "client_req_400") == 0)
       return varnish_submit_derive(conf->instance, "connections", "connections",
                                    "error_400", val);
@@ -306,7 +312,7 @@ static int varnish_monitor(void *priv,
     else if (strcmp(name, "fetch_304") == 0)
       return varnish_submit_derive(conf->instance, "fetch", "http_requests",
                                    "no_body_304", val);
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
     else if (strcmp(name, "fetch_no_thread") == 0)
       return varnish_submit_derive(conf->instance, "fetch", "http_requests",
                                    "no_thread", val);
@@ -365,7 +371,7 @@ static int varnish_monitor(void *priv,
     else if (strcmp(name, "n_objoverflow") == 0)
       return varnish_submit_derive(conf->instance, "objects", "total_objects",
                                    "workspace_overflow", val);
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
     else if (strcmp(name, "exp_mailed") == 0)
       return varnish_submit_gauge(conf->instance, "struct", "objects",
                                   "exp_mailed", val);
@@ -397,7 +403,7 @@ static int varnish_monitor(void *priv,
                                    "duplicate", val);
   }
 #endif
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   if (conf->collect_ban) {
     if (strcmp(name, "bans") == 0)
       return varnish_submit_derive(conf->instance, "ban", "total_operations",
@@ -450,7 +456,6 @@ static int varnish_monitor(void *priv,
     else if (strcmp(name, "bans_tests_tested") == 0)
       return varnish_submit_derive(conf->instance, "ban", "total_operations",
                                    "tests_tested", val);
-
   }
 #endif
 
@@ -485,13 +490,14 @@ static int varnish_monitor(void *priv,
     else if (strcmp(name, "sess_herd") == 0)
       return varnish_submit_derive(conf->instance, "session",
                                    "total_operations", "herd", val);
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
     else if (strcmp(name, "sess_closed_err") == 0)
       return varnish_submit_derive(conf->instance, "session",
                                    "total_operations", "closed_err", val);
     else if (strcmp(name, "sess_dropped") == 0)
       return varnish_submit_derive(conf->instance, "session",
-                                   "total_operations", "dropped_for_thread", val);
+                                   "total_operations", "dropped_for_thread",
+                                   val);
 #endif
   }
 
@@ -669,7 +675,7 @@ static int varnish_monitor(void *priv,
                                    "dropped", val);
     else if (strcmp(name, "thread_queue_len") == 0)
       return varnish_submit_gauge(conf->instance, "workers", "queue_length",
-                                   "threads", val);
+                                  "threads", val);
     else if (strcmp(name, "n_wrk") == 0)
       return varnish_submit_gauge(conf->instance, "workers", "threads",
                                   "worker", val);
@@ -697,17 +703,17 @@ static int varnish_monitor(void *priv,
     else if (strcmp(name, "n_wrk_lqueue") == 0)
       return varnish_submit_derive(conf->instance, "workers", "total_requests",
                                    "queue_length", val);
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
     else if (strcmp(name, "pools") == 0)
-      return varnish_submit_gauge(conf->instance, "workers", "pools",
-                                  "pools", val);
+      return varnish_submit_gauge(conf->instance, "workers", "pools", "pools",
+                                  val);
     else if (strcmp(name, "busy_killed") == 0)
       return varnish_submit_derive(conf->instance, "workers", "http_requests",
                                    "busy_killed", val);
 #endif
   }
 
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   if (conf->collect_vsm) {
     if (strcmp(name, "vsm_free") == 0)
       return varnish_submit_gauge(conf->instance, "vsm", "bytes", "free", val);
@@ -731,38 +737,38 @@ static int varnish_monitor(void *priv,
                                    "bitmap", "happy_hprobes", val);
     */
     if (strcmp(name, "bereq_hdrbytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "bereq_hdrbytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "bereq_hdrbytes", val);
     else if (strcmp(name, "bereq_bodybytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "bereq_bodybytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "bereq_bodybytes", val);
     else if (strcmp(name, "bereq_protobytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "bereq_protobytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "bereq_protobytes", val);
     else if (strcmp(name, "beresp_hdrbytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "beresp_hdrbytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "beresp_hdrbytes", val);
     else if (strcmp(name, "beresp_bodybytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "beresp_bodybytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "beresp_bodybytes", val);
     else if (strcmp(name, "beresp_protobytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "beresp_protobytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "beresp_protobytes", val);
     else if (strcmp(name, "pipe_hdrbytes") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "pipe_hdrbytes", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "pipe_hdrbytes", val);
     else if (strcmp(name, "pipe_out") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "pipe_out", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "pipe_out", val);
     else if (strcmp(name, "pipe_in") == 0)
-      return varnish_submit_derive(conf->instance, "vbe",
-                                   "total_bytes", "pipe_in", val);
+      return varnish_submit_derive(conf->instance, "vbe", "total_bytes",
+                                   "pipe_in", val);
     else if (strcmp(name, "conn") == 0)
       return varnish_submit_derive(conf->instance, "vbe", "connections",
-                                  "c_conns", val);
+                                   "c_conns", val);
     else if (strcmp(name, "req") == 0)
       return varnish_submit_derive(conf->instance, "vbe", "http_requests",
-                                  "b_reqs", val);
+                                   "b_reqs", val);
   }
 
   /* All Stevedores support these counters */
@@ -777,20 +783,20 @@ static int varnish_monitor(void *priv,
       strncpy(category, "mse", 4);
 
     if (strcmp(name, "c_req") == 0)
-      return varnish_submit_derive(conf->instance, category,
-                                   "total_operations", "alloc_req", val);
+      return varnish_submit_derive(conf->instance, category, "total_operations",
+                                   "alloc_req", val);
     else if (strcmp(name, "c_fail") == 0)
-      return varnish_submit_derive(conf->instance, category,
-                                   "total_operations", "alloc_fail", val);
+      return varnish_submit_derive(conf->instance, category, "total_operations",
+                                   "alloc_fail", val);
     else if (strcmp(name, "c_bytes") == 0)
-      return varnish_submit_derive(conf->instance, category,
-                                   "total_bytes", "bytes_allocated", val);
+      return varnish_submit_derive(conf->instance, category, "total_bytes",
+                                   "bytes_allocated", val);
     else if (strcmp(name, "c_freed") == 0)
-      return varnish_submit_derive(conf->instance, category,
-                                   "total_bytes", "bytes_freed", val);
+      return varnish_submit_derive(conf->instance, category, "total_bytes",
+                                   "bytes_freed", val);
     else if (strcmp(name, "g_alloc") == 0)
-      return varnish_submit_derive(conf->instance, category,
-                                  "total_operations", "alloc_outstanding", val);
+      return varnish_submit_derive(conf->instance, category, "total_operations",
+                                   "alloc_outstanding", val);
     else if (strcmp(name, "g_bytes") == 0)
       return varnish_submit_gauge(conf->instance, category, "bytes",
                                   "bytes_outstanding", val);
@@ -803,14 +809,14 @@ static int varnish_monitor(void *priv,
 
   if (conf->collect_smf) {
     if (strcmp(name, "g_smf") == 0)
-        return varnish_submit_gauge(conf->instance, "smf", "objects",
-                                    "n_struct_smf", val);
-      else if (strcmp(name, "g_smf_frag") == 0)
-        return varnish_submit_gauge(conf->instance, "smf", "objects",
-                                    "n_small_free_smf", val);
-      else if (strcmp(name, "g_smf_large") == 0)
-        return varnish_submit_gauge(conf->instance, "smf", "objects",
-                                    "n_large_free_smf", val);
+      return varnish_submit_gauge(conf->instance, "smf", "objects",
+                                  "n_struct_smf", val);
+    else if (strcmp(name, "g_smf_frag") == 0)
+      return varnish_submit_gauge(conf->instance, "smf", "objects",
+                                  "n_small_free_smf", val);
+    else if (strcmp(name, "g_smf_large") == 0)
+      return varnish_submit_gauge(conf->instance, "smf", "objects",
+                                  "n_large_free_smf", val);
   }
 
   if (conf->collect_mgt) {
@@ -818,35 +824,35 @@ static int varnish_monitor(void *priv,
       return varnish_submit_gauge(conf->instance, "mgt", "uptime",
                                   "mgt_proc_uptime", val);
     else if (strcmp(name, "child_start") == 0)
-      return varnish_submit_derive(conf->instance, "mgt",
-                                   "total_operations", "child_start", val);
+      return varnish_submit_derive(conf->instance, "mgt", "total_operations",
+                                   "child_start", val);
     else if (strcmp(name, "child_exit") == 0)
-      return varnish_submit_derive(conf->instance, "mgt",
-                                   "total_operations", "child_exit", val);
+      return varnish_submit_derive(conf->instance, "mgt", "total_operations",
+                                   "child_exit", val);
     else if (strcmp(name, "child_stop") == 0)
-      return varnish_submit_derive(conf->instance, "mgt",
-                                   "total_operations", "child_stop", val);
+      return varnish_submit_derive(conf->instance, "mgt", "total_operations",
+                                   "child_stop", val);
     else if (strcmp(name, "child_died") == 0)
-      return varnish_submit_derive(conf->instance, "mgt",
-                                   "total_operations", "child_died", val);
+      return varnish_submit_derive(conf->instance, "mgt", "total_operations",
+                                   "child_died", val);
     else if (strcmp(name, "child_dump") == 0)
-      return varnish_submit_derive(conf->instance, "mgt",
-                                   "total_operations", "child_dump", val);
+      return varnish_submit_derive(conf->instance, "mgt", "total_operations",
+                                   "child_dump", val);
     else if (strcmp(name, "child_panic") == 0)
-      return varnish_submit_derive(conf->instance, "mgt",
-                                   "total_operations", "child_panic", val);
+      return varnish_submit_derive(conf->instance, "mgt", "total_operations",
+                                   "child_panic", val);
   }
 
   if (conf->collect_lck) {
     if (strcmp(name, "creat") == 0)
-      return varnish_submit_gauge(conf->instance, "lck", "objects",
-                                  "created", val);
+      return varnish_submit_gauge(conf->instance, "lck", "objects", "created",
+                                  val);
     else if (strcmp(name, "destroy") == 0)
-      return varnish_submit_gauge(conf->instance, "lck", "objects",
-                                  "destroyed", val);
+      return varnish_submit_gauge(conf->instance, "lck", "objects", "destroyed",
+                                  val);
     else if (strcmp(name, "locks") == 0)
       return varnish_submit_derive(conf->instance, "lck", "total_operations",
-                                  "lock_ops", val);
+                                   "lock_ops", val);
   }
 
   if (conf->collect_mempool) {
@@ -869,112 +875,111 @@ static int varnish_monitor(void *priv,
       return varnish_submit_derive(conf->instance, "mempool",
                                    "total_operations", "frees", val);
     else if (strcmp(name, "recycle") == 0)
-      return varnish_submit_gauge(conf->instance, "mempool",
-                                   "objects", "recycled", val);
+      return varnish_submit_gauge(conf->instance, "mempool", "objects",
+                                  "recycled", val);
     else if (strcmp(name, "timeout") == 0)
-      return varnish_submit_gauge(conf->instance, "mempool",
-                                   "objects", "timed_out", val);
+      return varnish_submit_gauge(conf->instance, "mempool", "objects",
+                                  "timed_out", val);
     else if (strcmp(name, "toosmall") == 0)
-      return varnish_submit_gauge(conf->instance, "mempool",
-                                   "objects", "too_small", val);
+      return varnish_submit_gauge(conf->instance, "mempool", "objects",
+                                  "too_small", val);
     else if (strcmp(name, "surplus") == 0)
-      return varnish_submit_gauge(conf->instance, "mempool",
-                                   "objects", "surplus", val);
+      return varnish_submit_gauge(conf->instance, "mempool", "objects",
+                                  "surplus", val);
     else if (strcmp(name, "randry") == 0)
-      return varnish_submit_gauge(conf->instance, "mempool",
-                                   "objects", "ran_dry", val);
+      return varnish_submit_gauge(conf->instance, "mempool", "objects",
+                                  "ran_dry", val);
   }
 
   if (conf->collect_mse) {
     if (strcmp(name, "c_full") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "full_allocs", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "full_allocs", val);
     else if (strcmp(name, "c_truncated") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "truncated_allocs", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "truncated_allocs", val);
     else if (strcmp(name, "c_expanded") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "expanded_allocs", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "expanded_allocs", val);
     else if (strcmp(name, "c_failed") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "failed_allocs", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "failed_allocs", val);
     else if (strcmp(name, "c_bytes") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_bytes", "bytes_allocated", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_bytes",
+                                   "bytes_allocated", val);
     else if (strcmp(name, "c_freed") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_bytes", "bytes_freed", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_bytes",
+                                   "bytes_freed", val);
     else if (strcmp(name, "g_fo_alloc") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "fo_allocs_outstanding", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "fo_allocs_outstanding", val);
     else if (strcmp(name, "g_fo_bytes") == 0)
-      return varnish_submit_gauge(conf->instance, "mse",
-                                  "bytes", "fo_bytes_outstanding", val);
+      return varnish_submit_gauge(conf->instance, "mse", "bytes",
+                                  "fo_bytes_outstanding", val);
     else if (strcmp(name, "g_membuf_alloc") == 0)
-      return varnish_submit_gauge(conf->instance, "mse",
-                                  "objects", "membufs_allocated", val);
+      return varnish_submit_gauge(conf->instance, "mse", "objects",
+                                  "membufs_allocated", val);
     else if (strcmp(name, "g_membuf_inuse") == 0)
-      return varnish_submit_gauge(conf->instance, "mse",
-                                  "objects", "membufs_inuse", val);
+      return varnish_submit_gauge(conf->instance, "mse", "objects",
+                                  "membufs_inuse", val);
     else if (strcmp(name, "g_bans_bytes") == 0)
-      return varnish_submit_gauge(conf->instance, "mse",
-                                  "bytes", "persisted_banspace_used", val);
+      return varnish_submit_gauge(conf->instance, "mse", "bytes",
+                                  "persisted_banspace_used", val);
     else if (strcmp(name, "g_bans_space") == 0)
-      return varnish_submit_gauge(conf->instance, "mse",
-                                  "bytes", "persisted_banspace_available", val);
+      return varnish_submit_gauge(conf->instance, "mse", "bytes",
+                                  "persisted_banspace_available", val);
     else if (strcmp(name, "g_bans_persisted") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "bans_persisted", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "bans_persisted", val);
     else if (strcmp(name, "g_bans_lost") == 0)
-      return varnish_submit_derive(conf->instance, "mse",
-                                  "total_operations", "bans_lost", val);
+      return varnish_submit_derive(conf->instance, "mse", "total_operations",
+                                   "bans_lost", val);
 
-     /* mse seg */
+    /* mse seg */
     else if (strcmp(name, "g_journal_bytes") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_reg",
-                                  "bytes", "journal_bytes_used", val);
+      return varnish_submit_gauge(conf->instance, "mse_reg", "bytes",
+                                  "journal_bytes_used", val);
     else if (strcmp(name, "g_journal_space") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_reg",
-                                  "bytes", "journal_bytes_free", val);
+      return varnish_submit_gauge(conf->instance, "mse_reg", "bytes",
+                                  "journal_bytes_free", val);
 
     /* mse segagg */
     else if (strcmp(name, "g_bigspace") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_segagg",
-                                  "bytes", "big_extents_bytes_available", val);
+      return varnish_submit_gauge(conf->instance, "mse_segagg", "bytes",
+                                  "big_extents_bytes_available", val);
     else if (strcmp(name, "g_extfree") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_segagg",
-                                  "objects", "free_extents", val);
+      return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
+                                  "free_extents", val);
     else if (strcmp(name, "g_sparenode") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_segagg",
-                                  "objects", "spare_nodes_available", val);
+      return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
+                                  "spare_nodes_available", val);
     else if (strcmp(name, "g_objnode") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_segagg",
-                                  "objects", "object_nodes_in_use", val);
+      return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
+                                  "object_nodes_in_use", val);
     else if (strcmp(name, "g_extnode") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_segagg",
-                                  "objects", "extent_nodes_in_use", val);
+      return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
+                                  "extent_nodes_in_use", val);
     else if (strcmp(name, "g_bigextfree") == 0)
-      return varnish_submit_gauge(conf->instance, "mse_segagg",
-                                  "objects", "free_big_extents", val);
+      return varnish_submit_gauge(conf->instance, "mse_segagg", "objects",
+                                  "free_big_extents", val);
     else if (strcmp(name, "c_pruneloop") == 0)
       return varnish_submit_derive(conf->instance, "mse_segagg",
-                                  "total_operations", "prune_loops", val);
+                                   "total_operations", "prune_loops", val);
     else if (strcmp(name, "c_pruned") == 0)
       return varnish_submit_derive(conf->instance, "mse_segagg",
-                                  "total_objects", "pruned_objects", val);
+                                   "total_objects", "pruned_objects", val);
     else if (strcmp(name, "c_spared") == 0)
       return varnish_submit_derive(conf->instance, "mse_segagg",
-                                  "total_operations", "spared_objects", val);
+                                   "total_operations", "spared_objects", val);
     else if (strcmp(name, "c_skipped") == 0)
       return varnish_submit_derive(conf->instance, "mse_segagg",
-                                  "total_operations", "missed_objects", val);
+                                   "total_operations", "missed_objects", val);
     else if (strcmp(name, "c_nuked") == 0)
       return varnish_submit_derive(conf->instance, "mse_segagg",
-                                  "total_operations", "nuked_objects", val);
+                                   "total_operations", "nuked_objects", val);
     else if (strcmp(name, "c_sniped") == 0)
       return varnish_submit_derive(conf->instance, "mse_segagg",
-                                  "total_operations", "sniped_objects", val);
-
+                                   "total_operations", "sniped_objects", val);
   }
 
 #endif
@@ -1321,12 +1326,18 @@ static void varnish_monitor(const user_config_t *conf, /* {{{ */
 } /* }}} void varnish_monitor */
 #endif
 
-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
 static int varnish_read(user_data_t *ud) /* {{{ */
 {
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
   struct VSM_data *vd;
-  const c_varnish_stats_t *stats;
   _Bool ok;
+  const c_varnish_stats_t *stats;
+#elif HAVE_VARNISH_V5
+  struct vsm *vd;
+  struct vsc *vsc;
+  int vsm_status;
+#endif
 
   user_config_t *conf;
 
@@ -1336,6 +1347,11 @@ static int varnish_read(user_data_t *ud) /* {{{ */
   conf = ud->data;
 
   vd = VSM_New();
+
+#if HAVE_VARNISH_V5
+  vsc = VSC_New();
+#endif
+
 #if HAVE_VARNISH_V3
   VSC_Setup(vd);
 #endif
@@ -1343,10 +1359,20 @@ static int varnish_read(user_data_t *ud) /* {{{ */
   if (conf->instance != NULL) {
     int status;
 
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
     status = VSM_n_Arg(vd, conf->instance);
+#elif HAVE_VARNISH_V5
+    status = VSM_Arg(vd, 'n', conf->instance);
+#endif
+
     if (status < 0) {
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
       VSM_Delete(vd);
-      ERROR("varnish plugin: VSM_n_Arg (\"%s\") failed "
+#elif HAVE_VARNISH_V5
+      VSC_Destroy(&vsc, vd);
+      VSM_Destroy(&vd);
+#endif
+      ERROR("varnish plugin: VSM_Arg (\"%s\") failed "
             "with status %i.",
             conf->instance, status);
       return -1;
@@ -1355,34 +1381,61 @@ static int varnish_read(user_data_t *ud) /* {{{ */
 
 #if HAVE_VARNISH_V3
   ok = (VSC_Open(vd, /* diag = */ 1) == 0);
-#else /* if HAVE_VARNISH_V4 */
+#elif HAVE_VARNISH_V4
   ok = (VSM_Open(vd) == 0);
 #endif
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
   if (!ok) {
     VSM_Delete(vd);
     ERROR("varnish plugin: Unable to open connection.");
-
     return -1;
   }
+#endif
 
 #if HAVE_VARNISH_V3
   stats = VSC_Main(vd);
-#else /* if HAVE_VARNISH_V4 */
+#elif HAVE_VARNISH_V4
   stats = VSC_Main(vd, NULL);
 #endif
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
   if (!stats) {
     VSM_Delete(vd);
     ERROR("varnish plugin: Unable to get statistics.");
+    return -1;
+  }
+#endif
+
+#if HAVE_VARNISH_V5
+  if (VSM_Attach(vd, STDERR_FILENO)) {
+    ERROR("varnish plugin: Cannot attach to varnish. %s", VSM_Error(vd));
+    VSC_Destroy(&vsc, vd);
+    VSM_Destroy(&vd);
+    return -1;
+  }
 
+  vsm_status = VSM_Status(vd);
+  if (vsm_status & ~(VSM_MGT_RUNNING | VSM_WRK_RUNNING)) {
+    ERROR("varnish plugin: Unable to get statistics.");
+    VSC_Destroy(&vsc, vd);
+    VSM_Destroy(&vd);
     return -1;
   }
+#endif
 
 #if HAVE_VARNISH_V3
   VSC_Iter(vd, varnish_monitor, conf);
-#else /* if HAVE_VARNISH_V4 */
+#elif HAVE_VARNISH_V4
   VSC_Iter(vd, NULL, varnish_monitor, conf);
+#elif HAVE_VARNISH_V5
+  VSC_Iter(vsc, vd, varnish_monitor, conf);
 #endif
+
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
   VSM_Delete(vd);
+#elif HAVE_VARNISH_V5
+  VSC_Destroy(&vsc, vd);
+  VSM_Destroy(&vd);
+#endif
 
   return 0;
 } /* }}} */
@@ -1447,18 +1500,18 @@ static int varnish_config_apply_default(user_config_t *conf) /* {{{ */
 #if HAVE_VARNISH_V2
   conf->collect_sm = 0;
 #endif
-#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   conf->collect_sma = 0;
 #endif
   conf->collect_sms = 0;
   conf->collect_struct = 0;
   conf->collect_totals = 0;
-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   conf->collect_uptime = 0;
 #endif
   conf->collect_vcl = 0;
   conf->collect_workers = 0;
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
   conf->collect_vsm = 0;
   conf->collect_lck = 0;
   conf->collect_mempool = 0;
@@ -1577,7 +1630,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
     else if (strcasecmp("CollectSMS", child->key) == 0)
       cf_util_get_boolean(child, &conf->collect_sms);
     else if (strcasecmp("CollectSMA", child->key) == 0)
-#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_sma);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
@@ -1595,7 +1648,7 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
     else if (strcasecmp("CollectTotals", child->key) == 0)
       cf_util_get_boolean(child, &conf->collect_totals);
     else if (strcasecmp("CollectUptime", child->key) == 0)
-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_uptime);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
@@ -1606,56 +1659,56 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
     else if (strcasecmp("CollectWorkers", child->key) == 0)
       cf_util_get_boolean(child, &conf->collect_workers);
     else if (strcasecmp("CollectVSM", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_vsm);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectLock", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_lck);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectMempool", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_mempool);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectManagement", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_mgt);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectSMF", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_smf);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectSMF", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_smf);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectVBE", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_vbe);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
               child->key, "v4");
 #endif
     else if (strcasecmp("CollectMSE", child->key) == 0)
-#if HAVE_VARNISH_V4
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       cf_util_get_boolean(child, &conf->collect_mse);
 #else
       WARNING("Varnish plugin: \"%s\" is available for Varnish %s only.",
@@ -1685,18 +1738,18 @@ static int varnish_config_instance(const oconfig_item_t *ci) /* {{{ */
 #if HAVE_VARNISH_V2
       && !conf->collect_sm
 #endif
-#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V2 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       && !conf->collect_sma
 #endif
       && !conf->collect_struct && !conf->collect_totals
-#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4
+#if HAVE_VARNISH_V3 || HAVE_VARNISH_V4 || HAVE_VARNISH_V5
       && !conf->collect_uptime
 #endif
       && !conf->collect_vcl && !conf->collect_workers
-#if HAVE_VARNISH_V4
-      && !conf->collect_vsm && !conf->collect_vbe && !conf->collect_smf
-      && !conf->collect_mgt && !conf->collect_lck && !conf->collect_mempool
-      && !conf->collect_mse
+#if HAVE_VARNISH_V4 || HAVE_VARNISH_V5
+      && !conf->collect_vsm && !conf->collect_vbe && !conf->collect_smf &&
+      !conf->collect_mgt && !conf->collect_lck && !conf->collect_mempool &&
+      !conf->collect_mse
 #endif
       ) {
     WARNING("Varnish plugin: No metric has been configured for "
index 2c7a2e5..620f46e 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-DEFAULT_VERSION="5.7.2.git"
+DEFAULT_VERSION="5.8.0-RC0.git"
 
 if [ -d .git ]; then
        VERSION="`git describe --dirty=+ --abbrev=7 2> /dev/null | grep collectd | sed -e 's/^collectd-//' -e 's/-/./g'`"