virt plugin: Add option to disable extra stats
authorFrancesco Romani <fromani@redhat.com>
Mon, 13 Feb 2017 08:08:02 +0000 (09:08 +0100)
committerFrancesco Romani <fromani@redhat.com>
Mon, 13 Feb 2017 14:06:13 +0000 (15:06 +0100)
We are adding more metrics to the virt plugin, but not everyone
may be interested in those.
This patch add one more option to the virt plugin to enable
or disable the new stats.
For backward compatibility, the default is disabled.

Signed-off-by: Francesco Romani <fromani@redhat.com>
src/collectd.conf.in
src/collectd.conf.pod
src/virt.c

index 1cc86af..982cba9 100644 (file)
 #      InterfaceFormat name
 #      PluginInstanceFormat name
 #      Instances 1
+#      ExtraStats "disk"
 #</Plugin>
 
 #<Plugin vmem>
index 6931066..57f2897 100644 (file)
@@ -8076,6 +8076,12 @@ How many read instances you want to use for this plugin. The default is one,
 and the sensible setting is a multiple of the B<ReadThreads> value.
 If you are not sure, just use the default setting.
 
+=item B<ExtraStats> B<string>
+
+Enable extra statistics. This allows the plugin to reported more detailed
+statistics about the behaviour of Virtual Machines. The argument is a
+space-separated list of selectors. Currently only B<disk> is supported.
+
 =back
 
 =head2 Plugin C<vmem>
index acdc11f..0608109 100644 (file)
@@ -60,6 +60,7 @@ static const char *config_keys[] = {"Connection",
                                     "PluginInstanceFormat",
 
                                     "Instances",
+                                    "ExtraStats",
 
                                     NULL};
 #define NR_CONFIG_KEYS ((sizeof config_keys / sizeof config_keys[0]) - 1)
@@ -164,6 +165,12 @@ enum bd_field { target, source };
 /* InterfaceFormat. */
 enum if_field { if_address, if_name, if_number };
 
+/* ExtraStats */
+#define EX_STATS_MAX_FIELDS 8
+#define EX_STATS_DISK "disk"
+enum ex_stats { ex_stats_none = 0, ex_stats_disk = 1 };
+static enum ex_stats extra_stats = ex_stats_none;
+
 /* BlockDeviceFormatBasename */
 _Bool blockdevice_format_basename = 0;
 static enum bd_field blockdevice_format = target;
@@ -386,17 +393,19 @@ static void disk_submit(struct lv_block_info *binfo, virDomainPtr dom,
     submit_derive2("disk_octets", (derive_t)binfo->bi.rd_bytes,
                    (derive_t)binfo->bi.wr_bytes, dom, type_instance);
 
-  if ((binfo->rd_total_times != -1) && (binfo->wr_total_times != -1))
-    submit_derive2("disk_time", (derive_t)binfo->rd_total_times,
-                   (derive_t)binfo->wr_total_times, dom, type_instance);
-
-  if (binfo->fl_req != -1)
-    submit(dom, "total_requests", flush_type_instance,
-           &(value_t){.derive = (derive_t)binfo->fl_req}, 1);
-  if (binfo->fl_total_times != -1) {
-    derive_t value = binfo->fl_total_times / 1000; // ns -> ms
-    submit(dom, "total_time_in_ms", flush_type_instance,
-           &(value_t){.derive = value}, 1);
+  if (extra_stats & ex_stats_disk) {
+    if ((binfo->rd_total_times != -1) && (binfo->wr_total_times != -1))
+      submit_derive2("disk_time", (derive_t)binfo->rd_total_times,
+                     (derive_t)binfo->wr_total_times, dom, type_instance);
+
+    if (binfo->fl_req != -1)
+      submit(dom, "total_requests", flush_type_instance,
+             &(value_t){.derive = (derive_t)binfo->fl_req}, 1);
+    if (binfo->fl_total_times != -1) {
+      derive_t value = binfo->fl_total_times / 1000; // ns -> ms
+      submit(dom, "total_time_in_ms", flush_type_instance,
+             &(value_t){.derive = value}, 1);
+    }
   }
 }
 
@@ -594,6 +603,24 @@ static int lv_config(const char *key, const char *value) {
     return 0;
   }
 
+  if (strcasecmp(key, "ExtraStats") == 0) {
+    char *localvalue = sstrdup(value);
+    if (localvalue != NULL) {
+      char *exstats[EX_STATS_MAX_FIELDS];
+      int numexstats;
+
+      numexstats = strsplit(localvalue, exstats, STATIC_ARRAY_SIZE(exstats));
+      for (int i = 0; i < numexstats; i++) {
+        if (strcasecmp(exstats[i], EX_STATS_DISK) == 0) {
+          DEBUG(PLUGIN_NAME " plugin: enabling extra stats for '%s'",
+                EX_STATS_DISK);
+          extra_stats |= ex_stats_disk;
+        }
+      }
+      sfree(localvalue);
+    }
+  }
+
   /* Unrecognised option. */
   return -1;
 }