diff --git a/src/virt.c b/src/virt.c
index bb5443cbcd8e7507c2b072d202f79947e576b674..06081097cb7e2116071ec3599d770d5a1eb39b59 100644 (file)
--- a/src/virt.c
+++ b/src/virt.c
"PluginInstanceFormat",
"Instances",
+ "ExtraStats",
NULL};
#define NR_CONFIG_KEYS ((sizeof config_keys / sizeof config_keys[0]) - 1)
/* 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;
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);
if ((binfo->bi.rd_bytes != -1) && (binfo->bi.wr_bytes != -1))
submit_derive2("disk_octets", (derive_t)binfo->bi.rd_bytes,
(derive_t)binfo->bi.wr_bytes, 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) {
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;
}