From: Peter Krempa <[email protected]>

Add documentation and constants for constructing the stats field names
for latency histograms and expose them in the qemu driver:

Example:

  block.1.latency_histogram.read.bin.count=9
  block.1.latency_histogram.read.bin.0.start=0
  block.1.latency_histogram.read.bin.0.value=0
  block.1.latency_histogram.read.bin.1.start=10
  block.1.latency_histogram.read.bin.1.value=0
  block.1.latency_histogram.read.bin.2.start=100
  block.1.latency_histogram.read.bin.2.value=0
  block.1.latency_histogram.read.bin.3.start=1000
  block.1.latency_histogram.read.bin.3.value=1047
  block.1.latency_histogram.read.bin.4.start=10000
  block.1.latency_histogram.read.bin.4.value=2131
  block.1.latency_histogram.read.bin.5.start=100000
  block.1.latency_histogram.read.bin.5.value=0
  block.1.latency_histogram.read.bin.6.start=1000000
  block.1.latency_histogram.read.bin.6.value=0
  block.1.latency_histogram.read.bin.7.start=10000000
  block.1.latency_histogram.read.bin.7.value=0
  block.1.latency_histogram.read.bin.8.start=100000000
  block.1.latency_histogram.read.bin.8.value=0

Signed-off-by: Peter Krempa <[email protected]>
---
 docs/manpages/virsh.rst          |   7 ++
 include/libvirt/libvirt-domain.h | 113 +++++++++++++++++++++++++++++++
 src/qemu/qemu_driver.c           |  43 ++++++++++++
 3 files changed, 163 insertions(+)

diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index a9d691824e..ff0cf1a715 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -2811,6 +2811,13 @@ Information listed includes:
   pending write operations in the defined interval
 * ``block.<num>.timed_group.<num>.zone_append_queue_depth_avg`` - average 
number
   of pending zone append operations in the defined interval
+* ``block.<num>.latency_histogram.<type>.bin.count`` - number of bins in
+  latency histogram. <type> is one of ``read``, ``write``, ``zone_append``, or
+  ``flush``
+* ``block.<num>.latency_histogram.<type>.bin.<num>.start`` start boundary of
+  a latency histogram bin in nanoseconds of given operation duration
+* ``block.<num>.latency_histogram.<type>.bin.<num>.value`` current number of
+  events corresponding to the given bin and type


 *--iothread* returns information about IOThreads on the running guest
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 893359aaae..56c21dcf25 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -3896,6 +3896,119 @@ struct _virDomainStatsRecord {
  */
 # define 
VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_QUEUE_DEPTH_AVG 
".zone_append_queue_depth_avg"

+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX:
+ *
+ * The parameter name prefix to access 'read' latency histograms. Concatenate
+ * the prefix with either:
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT
+ *    to get the number of bins in given histogram
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and
+ *    entry number formatted as an unsigned integer and one of the latency
+ *    histogram suffix parameters to compelte a full bin parameter name
+ *
+ * Since: 12.1.0
+ */
+# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX 
".latency_histogram.read."
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX:
+ *
+ * The parameter name prefix to access 'write' latency histograms. Concatenate
+ * the prefix with either:
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT
+ *    to get the number of bins in given histogram
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and
+ *    entry number formatted as an unsigned integer and one of the latency
+ *    histogram suffix parameters to compelte a full bin parameter name
+ *
+ * Since: 12.1.0
+ */
+# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX 
".latency_histogram.write."
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX:
+ *
+ * The parameter name prefix to access 'zone_append' latency histograms. 
Concatenate
+ * the prefix with either:
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT
+ *    to get the number of bins in given histogram
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and
+ *    entry number formatted as an unsigned integer and one of the latency
+ *    histogram suffix parameters to compelte a full bin parameter name
+ *
+ * Since: 12.1.0
+ */
+# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX 
".latency_histogram.zone_append."
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX:
+ *
+ * The parameter name prefix to access 'flush' latency histograms. Concatenate
+ * the prefix with either:
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT
+ *    to get the number of bins in given histogram
+ *  - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX and
+ *    entry number formatted as an unsigned integer and one of the latency
+ *    histogram suffix parameters to compelte a full bin parameter name
+ *
+ * Since: 12.1.0
+ */
+# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX 
".latency_histogram.flush."
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT:
+ *
+ * The parameter name suffix to access number of bins in one of the following
+ * latency histogram types:
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX
+ *
+ * Number of bins in latency histogram as unsigned long long.
+ *
+ * Since: 12.1.0
+ */
+# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT 
"bin.count"
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX:
+ *
+ * The parameter name suffix to access a latency histogram bin in one of the
+ * following latency histogram types:
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX
+ *   - VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX
+ *
+ * Concatenate with a bin number as unsigned int and one of the other field
+ * suffixes to access bin parameters.
+ *
+ * Since: 12.1.0
+ */
+# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX 
"bin."
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_START:
+ *
+ * Start of the current latency histogram bin in nanoseconds as unsigned long 
long.
+ *
+ * Since: 12.1.0
+ */
+# define 
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_START ".start"
+
+/**
+ * VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_VALUE:
+ *
+ * Current value of the number of occurences of the latency within this bin
+ * as unsigned long long.
+ *
+ * Since: 12.1.0
+ */
+# define 
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_VALUE ".value"
+
+
 /**
  * VIR_DOMAIN_STATS_PERF_CMT:
  *
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index cdd333c882..d8cc32eee8 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -17606,6 +17606,36 @@ qemuDomainGetStatsBlockExportBackendStorage(const char 
*entryname,
 }


+static void
+qemuDomainGetStatsBlockExportFrontendLatencyHistogram(struct 
qemuBlockStatsLatencyHistogram *h,
+                                                      size_t disk_idx,
+                                                      const char *prefix_hist,
+                                                      virTypedParamList *par)
+{
+    size_t i;
+
+    if (!h)
+        return;
+
+    virTypedParamListAddULLong(par, h->nbins,
+                               VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu%s" 
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_COUNT,
+                               disk_idx, prefix_hist);
+
+    for (i = 0; i < h->nbins; i++) {
+        virTypedParamListAddULLong(par, h->bins[i].start,
+                                   VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu%s"
+                                   
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX "%zu"
+                                   
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_START,
+                                   disk_idx, prefix_hist, i);
+        virTypedParamListAddULLong(par, h->bins[i].value,
+                                   VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu%s"
+                                   
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_PREFIX "%zu"
+                                   
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_SUFFIX_BIN_SUFFIX_VALUE,
+                                   disk_idx, prefix_hist, i);
+    }
+}
+
+
 static void
 qemuDomainGetStatsBlockExportFrontend(const char *frontendname,
                                       GHashTable *stats,
@@ -17730,6 +17760,19 @@ qemuDomainGetStatsBlockExportFrontend(const char 
*frontendname,
                                        idx, i);
         }
     }
+
+    qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_read, 
idx,
+                                                          
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_READ_PREFIX,
+                                                          par);
+    qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_write, 
idx,
+                                                          
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_WRITE_PREFIX,
+                                                          par);
+    qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_zone, 
idx,
+                                                          
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_ZONE_APPEND_PREFIX,
+                                                          par);
+    qemuDomainGetStatsBlockExportFrontendLatencyHistogram(en->histogram_flush, 
idx,
+                                                          
VIR_DOMAIN_STATS_BLOCK_SUFFIX_LATENCY_HISTOGRAM_FLUSH_PREFIX,
+                                                          par);
 }


-- 
2.52.0

Reply via email to