
On Tue, Feb 25, 2025 at 15:52:30 +0100, Martin Kletzander wrote:
With qemu guest agent 9.3 we are able to get the load averages with a new command.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/qemu/qemu_agent.c | 55 +++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_agent.h | 6 +++++ tests/qemuagenttest.c | 53 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index 43fca86f10ed..27efb4b389ee 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -2568,3 +2568,58 @@ int qemuAgentGetDisks(qemuAgent *agent, g_free(*disks); return -1; } + + +int +qemuAgentGetLoadAvg(qemuAgent *agent, + double *load1m, + double *load5m, + double *load15m, + bool report_unsupported) +{ + g_autoptr(virJSONValue) cmd = NULL; + g_autoptr(virJSONValue) reply = NULL; + virJSONValue *data = NULL; + int rc; + + if (load1m) + *load1m = 0; + + if (load5m) + *load5m = 0; + + if (load15m) + *load15m = 0;
Clearing these is pointless ...
+ + if (!(cmd = qemuAgentMakeCommand("guest-get-load", NULL))) + return -1; + + if ((rc = qemuAgentCommandFull(agent, cmd, &reply, agent->timeout, + report_unsupported)) < 0) + return rc; + + if (!(data = virJSONValueObjectGetObject(reply, "return"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qemu agent didn't return an array of loads")); + return -1; + } + +#define GET_NUMBER_PARAM(param_) \ + do { \ + if (param_ && \ + virJSONValueObjectGetNumberDouble(data, #param_, param_) < 0) { \
... as they are unconditionally overwritten ...
+ virReportError(VIR_ERR_INTERNAL_ERROR, \ + _("'%1$s' missing in reply of guest-get-load"), \
How about: parameter '%1%s' missing ...
+ #param_); \ + return -1; \
... or error is returned.
+ } \ + } while (0) + + GET_NUMBER_PARAM(load1m); + GET_NUMBER_PARAM(load5m); + GET_NUMBER_PARAM(load15m);