]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_driver: add new stats worker qemuDomainGetStatsVm
authorAmneesh Singh <natto@weirdnatto.in>
Wed, 7 Sep 2022 10:34:23 +0000 (16:04 +0530)
committerMartin Kletzander <mkletzan@redhat.com>
Wed, 19 Oct 2022 13:58:29 +0000 (15:58 +0200)
This patch adds a new worker qemuDomainGetStatsVm which reports the
stats returned by "query-stats" via qemuMonitorQueryStats for the VM
target.

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
include/libvirt/libvirt-domain.h
src/libvirt-domain.c
src/qemu/qemu_driver.c
tools/virsh-domain-monitor.c

index 8357aea7970d87835e21276950c96f25531be103..a37244e4b1483dbdf2f7507d529af62196ce3518 100644 (file)
@@ -2710,6 +2710,7 @@ typedef enum {
     VIR_DOMAIN_STATS_IOTHREAD = (1 << 7), /* return iothread poll info (Since: 4.10.0) */
     VIR_DOMAIN_STATS_MEMORY = (1 << 8), /* return domain memory info (Since: 6.0.0) */
     VIR_DOMAIN_STATS_DIRTYRATE = (1 << 9), /* return domain dirty rate info (Since: 7.2.0) */
+    VIR_DOMAIN_STATS_VM = (1 << 10), /* return vm info (Since: 8.6.0) */
 } virDomainStatsTypes;
 
 /**
index 80a6f0f269b66efc114d79e0dfeb39dcecf4d142..52fa136186b6a5d57abc5a355d61a6a74f0f8ff5 100644 (file)
@@ -12481,6 +12481,9 @@ virConnectGetDomainCapabilities(virConnectPtr conn,
  *                                                   rate for a virtual cpu as
  *                                                   unsigned long long.
  *
+ * VIR_DOMAIN_STATS_VM:
+ *     Return fd-based KVM statistics for the target VM
+ *
  * Note that entire stats groups or individual stat fields may be missing from
  * the output in case they are not supported by the given hypervisor, are not
  * applicable for the current state of the guest domain, or their retrieval
index 109aec4502f39742d99364803aa4f55577c33017..833b32e5ef4ae36c7ecfdd40cc9f45ab6075d80b 100644 (file)
@@ -18709,6 +18709,41 @@ qemuDomainGetStatsDirtyRate(virQEMUDriver *driver G_GNUC_UNUSED,
     return 0;
 }
 
+
+static int
+qemuDomainGetStatsVm(virQEMUDriver *driver G_GNUC_UNUSED,
+                     virDomainObj *dom,
+                     virTypedParamList *params,
+                     unsigned int privflags)
+{
+    qemuDomainObjPrivate *priv = dom->privateData;
+    g_autoptr(virJSONValue) queried_stats = NULL;
+    g_autoptr(GHashTable) stats = NULL;
+    virJSONValue *stats_obj = NULL;
+
+    if (!HAVE_JOB(privflags) || !virDomainObjIsActive(dom))
+        return 0;
+
+    if (qemuDomainRefreshStatsSchema(dom) < 0)
+        return 0;
+
+    qemuDomainObjEnterMonitor(dom);
+    queried_stats = qemuMonitorQueryStats(priv->mon,
+                                          QEMU_MONITOR_QUERY_STATS_TARGET_VM,
+                                          NULL, NULL);
+    qemuDomainObjExitMonitor(dom);
+
+    if (!queried_stats || virJSONValueArraySize(queried_stats) != 1)
+        return 0;
+
+    stats_obj = virJSONValueArrayGet(queried_stats, 0);
+    stats = qemuMonitorExtractQueryStats(stats_obj);
+
+    qemuDomainAddStatsFromHashTable(stats, priv->statsSchema, "vm", params);
+
+    return 0;
+}
+
 typedef int
 (*qemuDomainGetStatsFunc)(virQEMUDriver *driver,
                           virDomainObj *dom,
@@ -18733,6 +18768,11 @@ static virQEMUCapsFlags queryDirtyRateRequired[] = {
     QEMU_CAPS_LAST
 };
 
+static virQEMUCapsFlags queryVmRequired[] = {
+    QEMU_CAPS_QUERY_STATS,
+    QEMU_CAPS_LAST
+};
+
 static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] = {
     { qemuDomainGetStatsState, VIR_DOMAIN_STATS_STATE, false, NULL },
     { qemuDomainGetStatsCpu, VIR_DOMAIN_STATS_CPU_TOTAL, true, NULL },
@@ -18744,6 +18784,7 @@ static struct qemuDomainGetStatsWorker qemuDomainGetStatsWorkers[] = {
     { qemuDomainGetStatsIOThread, VIR_DOMAIN_STATS_IOTHREAD, true, queryIOThreadRequired },
     { qemuDomainGetStatsMemory, VIR_DOMAIN_STATS_MEMORY, false, NULL },
     { qemuDomainGetStatsDirtyRate, VIR_DOMAIN_STATS_DIRTYRATE, true, queryDirtyRateRequired },
+    { qemuDomainGetStatsVm, VIR_DOMAIN_STATS_VM, true, queryVmRequired },
     { NULL, 0, false, NULL }
 };
 
index dc5fe13e49de10548882642f785fcc2386e5fee8..be8f827685c1669102d6eba60da713ca0c3fb5f3 100644 (file)
@@ -2065,6 +2065,10 @@ static const vshCmdOptDef opts_domstats[] = {
      .type = VSH_OT_BOOL,
      .help = N_("report domain dirty rate information"),
     },
+    {.name = "vm",
+     .type = VSH_OT_BOOL,
+     .help = N_("report fd-based VM statistics by KVM"),
+    },
     {.name = "list-active",
      .type = VSH_OT_BOOL,
      .help = N_("list only active domains"),
@@ -2186,6 +2190,9 @@ cmdDomstats(vshControl *ctl, const vshCmd *cmd)
     if (vshCommandOptBool(cmd, "dirtyrate"))
         stats |= VIR_DOMAIN_STATS_DIRTYRATE;
 
+    if (vshCommandOptBool(cmd, "vm"))
+        stats |= VIR_DOMAIN_STATS_VM;
+
     if (vshCommandOptBool(cmd, "list-active"))
         flags |= VIR_CONNECT_GET_ALL_DOMAINS_STATS_ACTIVE;