From: Derbyshev Dmitry <dderbyshev(a)virtuozzo.com>
QEMU reports timestamp along with other memory statistics, but this
information is not reported by libvirt statistics API.
It could be useful to determine if the data reported is fresh or not.
Signed-off-by: Derbyshev Dmitry <dderbyshev(a)virtuozzo.com>
---
include/libvirt/libvirt-domain.h | 5 ++++-
src/libvirt-domain.c | 2 ++
src/qemu/qemu_monitor_json.c | 22 ++++++++++++----------
tools/virsh-domain-monitor.c | 2 ++
tools/virsh.pod | 1 +
5 files changed, 21 insertions(+), 11 deletions(-)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 3fb482b..01a2649 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -609,11 +609,14 @@ typedef enum {
*/
VIR_DOMAIN_MEMORY_STAT_USABLE = 8,
+ /* Timestamp of the last update of statistics, in seconds. */
+ VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE = 9,
+
/*
* The number of statistics supported by this version of the interface.
* To add new statistics, add them to the enum and increase this value.
*/
- VIR_DOMAIN_MEMORY_STAT_NR = 9,
+ VIR_DOMAIN_MEMORY_STAT_NR = 10,
# ifdef VIR_ENUM_SENTINELS
VIR_DOMAIN_MEMORY_STAT_LAST = VIR_DOMAIN_MEMORY_STAT_NR
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 1467030..413f8af 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -5991,6 +5991,8 @@ virDomainGetInterfaceParameters(virDomainPtr domain,
* to swap, corresponds to 'Available' in /proc/meminfo
* VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON:
* Current balloon value (in kb).
+ * VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE
+ * Timestamp of the last statistic
*
* Returns: The number of stats provided or -1 in case of failure.
*/
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index c83e0cc..6b955f8 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1633,10 +1633,10 @@ qemuMonitorJSONGetBalloonInfo(qemuMonitorPtr mon,
* rates and/or whether data has been collected since a previous cycle.
* It's currently unused.
*/
-#define GET_BALLOON_STATS(FIELD, TAG, DIVISOR) \
- if (virJSONValueObjectHasKey(statsdata, FIELD) && \
+#define GET_BALLOON_STATS(OBJECT, FIELD, TAG, DIVISOR) \
+ if (virJSONValueObjectHasKey(OBJECT, FIELD) && \
(got < nr_stats)) { \
- if (virJSONValueObjectGetNumberUlong(statsdata, FIELD, &mem) < 0) { \
+ if (virJSONValueObjectGetNumberUlong(OBJECT, FIELD, &mem) < 0) { \
VIR_DEBUG("Failed to get '%s' value", FIELD);
\
} else { \
/* Not being collected? No point in providing bad data */ \
@@ -1707,20 +1707,22 @@ int qemuMonitorJSONGetMemoryStats(qemuMonitorPtr mon,
goto cleanup;
}
- GET_BALLOON_STATS("stat-swap-in",
+ GET_BALLOON_STATS(statsdata, "stat-swap-in",
VIR_DOMAIN_MEMORY_STAT_SWAP_IN, 1024);
- GET_BALLOON_STATS("stat-swap-out",
+ GET_BALLOON_STATS(statsdata, "stat-swap-out",
VIR_DOMAIN_MEMORY_STAT_SWAP_OUT, 1024);
- GET_BALLOON_STATS("stat-major-faults",
+ GET_BALLOON_STATS(statsdata, "stat-major-faults",
VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT, 1);
- GET_BALLOON_STATS("stat-minor-faults",
+ GET_BALLOON_STATS(statsdata, "stat-minor-faults",
VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT, 1);
- GET_BALLOON_STATS("stat-free-memory",
+ GET_BALLOON_STATS(statsdata, "stat-free-memory",
VIR_DOMAIN_MEMORY_STAT_UNUSED, 1024);
- GET_BALLOON_STATS("stat-total-memory",
+ GET_BALLOON_STATS(statsdata, "stat-total-memory",
VIR_DOMAIN_MEMORY_STAT_AVAILABLE, 1024);
- GET_BALLOON_STATS("stat-available-memory",
+ GET_BALLOON_STATS(statsdata, "stat-available-memory",
VIR_DOMAIN_MEMORY_STAT_USABLE, 1024);
+ GET_BALLOON_STATS(data, "last-update",
+ VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE, 1);
ret = got;
diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c
index 1921ff5..b4ccbf6 100644
--- a/tools/virsh-domain-monitor.c
+++ b/tools/virsh-domain-monitor.c
@@ -375,6 +375,8 @@ cmdDomMemStat(vshControl *ctl, const vshCmd *cmd)
vshPrint(ctl, "actual %llu\n", stats[i].val);
if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_RSS)
vshPrint(ctl, "rss %llu\n", stats[i].val);
+ if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_LAST_UPDATE)
+ vshPrint(ctl, "last_update %llu\n", stats[i].val);
}
ret = true;
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 2dee87a..881ab76 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -815,6 +815,7 @@ B<Explanation of fields>:
rss - Resident Set Size of the running domain's process (in kB)
usable - The amount of memory which can be reclaimed by balloon
without causing host swapping (in KB)
+ last-update - Timestamp of the last update of statistics (in seconds)
For QEMU/KVM with a memory balloon, setting the optional I<--period> to a
value larger than 0 in seconds will allow the balloon driver to return
--
1.9.5.msysgit.0