jridky / rpms / collectd

Forked from rpms/collectd 3 years ago
Clone
Blob Blame History Raw
diff --git a/configure.ac b/configure.ac
index 9dd30c7..bee86bf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4590,25 +4590,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
diff --git a/src/collectd.conf.in b/src/collectd.conf.in
index 80e1d5c..19b3854 100644
--- a/src/collectd.conf.in
+++ b/src/collectd.conf.in
@@ -1159,25 +1159,26 @@
 #   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>
diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod
index ac0ff2a..60cc9b5 100644
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
@@ -6305,22 +6305,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 +6347,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 +6398,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 +6436,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.
diff --git a/src/varnish.c b/src/varnish.c
index 3a8dddd..8e6d95e 100644
--- a/src/varnish.c
+++ b/src/varnish.c
@@ -28,14 +28,20 @@
 #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.",