X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fvirt.c;h=06081097cb7e2116071ec3599d770d5a1eb39b59;hb=3eebd68c6d41a672e64caecd82f57d08d0d0cf3d;hp=ee51bb50a45d7502198ab9bfff437dc13af1beb5;hpb=41f4ec04a138e865189d0fb798a2e1c6832851b0;p=collectd.git diff --git a/src/virt.c b/src/virt.c index ee51bb50..06081097 100644 --- a/src/virt.c +++ b/src/virt.c @@ -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; }