qga: implement a 'guest-get-load' command

Provide a way to report the process load average, via a new
'guest-get-load' command.

This is only implemented for POSIX platforms providing 'getloadavg'.

Example illustrated with qmp-shell:

(QEMU) guest-get-load
{
    "return": {
        "load15m": 1.546875,
        "load1m": 1.669921875,
        "load5m": 1.9306640625
    }
}

Windows has no native equivalent API, but it would be possible to
simulate it as illustrated here (BSD-3-Clause):

  https://github.com/giampaolo/psutil/pull/1485

This is left as an exercise for future contributors.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com>
Message-ID: <20241202121927.864335-1-berrange@redhat.com>
Signed-off-by: Konstantin Kostiuk <kkostiuk@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2024-12-02 12:19:27 +00:00 committed by Konstantin Kostiuk
parent 9ee90cfc25
commit 5288d9d085
3 changed files with 58 additions and 0 deletions

View File

@ -2646,6 +2646,7 @@ config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_functio
config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)

View File

@ -1368,3 +1368,23 @@ char *qga_get_host_name(Error **errp)
return g_steal_pointer(&hostname);
}
#ifdef CONFIG_GETLOADAVG
GuestLoadAverage *qmp_guest_get_load(Error **errp)
{
double loadavg[3];
GuestLoadAverage *ret = NULL;
if (getloadavg(loadavg, G_N_ELEMENTS(loadavg)) < 0) {
error_setg_errno(errp, errno,
"cannot query load average");
return NULL;
}
ret = g_new0(GuestLoadAverage, 1);
ret->load1m = loadavg[0];
ret->load5m = loadavg[1];
ret->load15m = loadavg[2];
return ret;
}
#endif

View File

@ -1843,6 +1843,43 @@
'if': 'CONFIG_LINUX'
}
##
# @GuestLoadAverage:
#
# Statistics about process load information
#
# @load1m: 1-minute load avage
#
# @load5m: 5-minute load avage
#
# @load15m: 15-minute load avage
#
# Since: 10.0
##
{ 'struct': 'GuestLoadAverage',
'data': {
'load1m': 'number',
'load5m': 'number',
'load15m': 'number'
},
'if': 'CONFIG_GETLOADAVG'
}
##
# @guest-get-load:
#
# Retrieve CPU process load information
#
# Returns: load information
#
# Since: 10.0
##
{ 'command': 'guest-get-load',
'returns': 'GuestLoadAverage',
'if': 'CONFIG_GETLOADAVG'
}
##
# @GuestNetworkRoute:
#