Code

virt plugin: Add option to disable extra stats
[collectd.git] / src / virt.c
index ee51bb50a45d7502198ab9bfff437dc13af1beb5..06081097cb7e2116071ec3599d770d5a1eb39b59 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;
@@ -373,6 +380,11 @@ static void submit_derive2(const char *type, derive_t v0, derive_t v1,
 
 static void disk_submit(struct lv_block_info *binfo, virDomainPtr dom,
                         const char *type_instance) {
+  char flush_type_instance[DATA_MAX_NAME_LEN];
+
+  ssnprintf(flush_type_instance, sizeof(flush_type_instance), "flush-%s",
+            type_instance);
+
   if ((binfo->bi.rd_req != -1) && (binfo->bi.wr_req != -1))
     submit_derive2("disk_ops", (derive_t)binfo->bi.rd_req,
                    (derive_t)binfo->bi.wr_req, dom, type_instance);
@@ -381,9 +393,20 @@ 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 (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);
+    }
+  }
 }
 
 static int lv_config(const char *key, const char *value) {
@@ -580,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;
 }