[PATCH v4 1/3] qemu_monitor: add qemuMonitorQueryStats
Martin Kletzander
mkletzan at redhat.com
Thu Aug 18 10:37:12 UTC 2022
On Thu, Aug 18, 2022 at 08:47:18AM +0530, Amneesh Singh wrote:
>Related: https://gitlab.com/libvirt/libvirt/-/issues/276
>
>This patch adds an API for the "query-stats" QMP command.
>
>The query returns a JSON containing the statistics based on the target,
>which can either be vCPU or VM, and the providers. The API deserializes
>the query result into an array of GHashMaps, which can later be used to
>extract all the query statistics. GHashMaps are used to avoid traversing
>the entire array to find the statistics you are looking for. This would
>be a singleton array if the target is a VM since the returned JSON is
>also a singleton array in that case.
>
>Signed-off-by: Amneesh Singh <natto at weirdnatto.in>
>---
> src/qemu/qemu_monitor.c | 117 +++++++++++++++++++++++++++++++++++
> src/qemu/qemu_monitor.h | 48 ++++++++++++++
> src/qemu/qemu_monitor_json.c | 91 +++++++++++++++++++++++++++
> src/qemu/qemu_monitor_json.h | 6 ++
> 4 files changed, 262 insertions(+)
>
>diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
>index 4739810c9b..1488f7481f 100644
>--- a/src/qemu/qemu_monitor.c
>+++ b/src/qemu/qemu_monitor.c
>@@ -4297,3 +4297,120 @@ qemuMonitorGetMigrationBlockers(qemuMonitor *mon,
>
> return qemuMonitorJSONGetMigrationBlockers(mon, blockers);
> }
>+
>+
>+VIR_ENUM_IMPL(qemuMonitorQueryStatsTarget,
>+ QEMU_MONITOR_QUERY_STATS_TARGET_LAST,
>+ "vm",
>+ "vcpu",
>+);
>+
>+
>+VIR_ENUM_IMPL(qemuMonitorQueryStatsName,
>+ QEMU_MONITOR_QUERY_STATS_NAME_LAST,
>+ "halt_poll_success_ns",
>+ "halt_poll_fail_ns",
>+);
>+
>+
>+VIR_ENUM_IMPL(qemuMonitorQueryStatsProvider,
>+ QEMU_MONITOR_QUERY_STATS_PROVIDER_LAST,
>+ "kvm",
>+);
>+
>+
>+void
>+qemuMonitorQueryStatsProviderFree(qemuMonitorQueryStatsProvider *provider)
>+{
>+ virBitmapFree(provider->names);
>+ g_free(provider);
>+}
>+
>+
>+qemuMonitorQueryStatsProvider *
>+qemuMonitorQueryStatsProviderNew(qemuMonitorQueryStatsProviderType provider_type,
>+ ...)
>+{
>+ qemuMonitorQueryStatsProvider *provider = g_new0(qemuMonitorQueryStatsProvider, 1);
>+ qemuMonitorQueryStatsNameType stat;
>+ va_list name_list;
>+
>+ /*
>+ * This can be lowered later in case of the enum getting quite large, hence
>+ * the virBitmapSetExpand below which also incidently makes this function
>+ * non-fallible.
>+ */
>+ provider->names = virBitmapNew(QEMU_MONITOR_QUERY_STATS_NAME_LAST);
>+ provider->type = provider_type;
>+
>+ va_start(name_list, provider_type);
>+
>+ while ((stat = va_arg(name_list, qemuMonitorQueryStatsNameType)) !=
>+ QEMU_MONITOR_QUERY_STATS_NAME_LAST)
>+ virBitmapSetBitExpand(provider->names, stat);
>+
>+ va_end(name_list);
>+
>+ return provider;
>+}
>+
>+
>+virJSONValue *
>+qemuMonitorQueryStats(qemuMonitor *mon,
>+ qemuMonitorQueryStatsTargetType target,
>+ char **vcpus,
>+ GPtrArray *providers)
>+{
>+ VIR_DEBUG("target=%u vcpus=%p providers=%p", target, vcpus, providers);
>+
>+ QEMU_CHECK_MONITOR_NULL(mon);
>+
>+ if (target != QEMU_MONITOR_QUERY_STATS_TARGET_VCPU && vcpus)
>+ return NULL;
>+
>+ return qemuMonitorJSONQueryStats(mon, target, vcpus, providers);
>+}
>+
>+
>+/**
>+ * qemuMonitorExtractQueryStats:
>+ * @info: One of the array members returned by qemuMonitorQueryStat
>+ *
>+ * Converts all the statistics into a GHashTable similar to virQEMU
>+ * except only object with the key "value" is stored as the value i
>+ *
>+ * Returns NULL on failure.
>+ */
>+GHashTable *
>+qemuMonitorExtractQueryStats(virJSONValue *info)
>+{
>+ g_autoptr(GHashTable) hash_table = NULL;
>+ virJSONValue *stats = NULL;
>+ size_t i;
>+
>+ if (!virJSONValueIsObject(info))
>+ return NULL;
>+
>+ stats = virJSONValueObjectGetArray(info, "stats");
I added a check that stats is not NULL here.
Reviewed-by: Martin Kletzander <mkletzan at redhat.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20220818/6dc12461/attachment.sig>
More information about the libvir-list
mailing list