*/
# define VIR_DOMAIN_STATS_BALLOON_HUGETLB_PGFAIL "balloon.hugetlb_pgfail"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_CURRENT:
+ *
+ * Current number of online virtual CPUs as unsigned int.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_CURRENT "vcpu.current"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_MAXIMUM:
+ *
+ * Maximum number of online virtual CPUs as unsigned int.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_MAXIMUM "vcpu.maximum"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_PREFIX:
+ *
+ * The parameter name prefix to access each vCPU entry. Concatenate the
+ * prefix, the entry number formatted as an unsigned integer and one of the
+ * vCPU suffix parameters to form a complete parameter name.
+ *
+ * Due to VCPU hotplug, the array could be sparse. The actual number of
+ * entries present corresponds to VIR_DOMAIN_STATS_VCPU_CURRENT, while the
+ * array size will never exceed VIR_DOMAIN_STATS_VCPU_MAXIMUM.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_PREFIX "vcpu."
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_SUFFIX_STATE:
+ *
+ * State of the virtual CPU <num>, as int from virVcpuState enum.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_SUFFIX_STATE ".state"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_SUFFIX_TIME:
+ *
+ * Virtual cpu time spent by virtual CPU as unsigned long long.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_SUFFIX_TIME ".time"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_SUFFIX_WAIT:
+ *
+ * Time the vCPU wants to run, but the host scheduler has something else
+ * running ahead of it as unsigned long long.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_SUFFIX_WAIT ".wait"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_SUFFIX_HALTED:
+ *
+ * Virtual CPU is halted as a boolean, may indicate the processor is idle or
+ * even disabled, depending on the architecture.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_SUFFIX_HALTED ".halted"
+
+/**
+ * VIR_DOMAIN_STATS_VCPU_SUFFIX_DELAY:
+ *
+ * Time the vCPU thread was enqueued by the host scheduler, but was waiting in
+ * the queue instead of running. Exposed to the VM as a steal time. In
+ * nanoseconds as unsigned long long.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_VCPU_SUFFIX_DELAY ".delay"
+
+
+/**
+ * VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_CUR:
+ *
+ * Hypervisor specific custom data type for current instant value
+ *
+ * The complete parameter name is formed by concatenating the field prefix,
+ * the array index formatted as an unsigned integer, a hypervisor specific
+ * parameter name, and this data type suffix.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_CUR ".cur"
+
+/**
+ * VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_SUM:
+ *
+ * Hypervisor specific custom data type for aggregate value
+ *
+ * The complete parameter name is formed by concatenating the field prefix,
+ * the array index formatted as an unsigned integer, a hypervisor specific
+ * parameter name, and this data type suffix.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_SUM ".sum"
+
+/**
+ * VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_MAX:
+ *
+ * Hypervisor specific custom data type for peak value.
+ *
+ * The complete parameter name is formed by concatenating the field prefix,
+ * the array index formatted as an unsigned integer, a hypervisor specific
+ * parameter name, and this data type suffix.
+ *
+ * Since: 11.2.0
+ */
+# define VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_MAX ".max"
+
/**
* virDomainStatsTypes:
*
*
* VIR_DOMAIN_STATS_VCPU:
* Return virtual CPU statistics.
- * Due to VCPU hotplug, the vcpu.<num>.* array could be sparse.
- * The actual size of the array corresponds to "vcpu.current".
- * The array size will never exceed "vcpu.maximum".
- * The typed parameter keys are in this format:
+ * The VIR_DOMAIN_STATS_VCPU_* constants define the known typed
+ * parameter keys.
*
- * "vcpu.current" - current number of online virtual CPUs as unsigned int.
- * "vcpu.maximum" - maximum number of online virtual CPUs as unsigned int.
- * "vcpu.<num>.state" - state of the virtual CPU <num>, as int
- * from virVcpuState enum.
- * "vcpu.<num>.time" - virtual cpu time spent by virtual CPU <num>
- * as unsigned long long.
- * "vcpu.<num>.wait" - time the vCPU <num> wants to run, but the host
- * scheduler has something else running ahead of it.
- * "vcpu.<num>.halted" - virtual CPU <num> is halted, may indicate the
- * processor is idle or even disabled, depending
- * on the architecture)
- * "vcpu.<num>.delay" - time the vCPU <num> thread was enqueued by the
- * host scheduler, but was waiting in the queue
- * instead of running. Exposed to the VM as a steal
- * time. (in nanoseconds)
- *
- * This group of statistics also reports additional hypervisor-originating
- * per-vCPU stats. The hypervisor-specific statistics in this group have the
- * following naming scheme:
+ * This group of statistics also reports additional hypervisor-originating
+ * per-vCPU stats. The hypervisor-specific statistics in this group have the
+ * following naming scheme:
*
* "vcpu.<num>.$NAME.$TYPE"
*
- * $NAME - name of the statistics field provided by the hypervisor
+ * Where $NAME is an arbitrary choice of the hypervisor driver, for
+ * which no API constants are defined.
+ * The $TYPE values are defined by VIR_DOMAIN_STATS_CUSTOM_TYPE_*
+ * constants.
*
- * $TYPE - Type of the value. The following types are returned:
- * 'cur' - current instant value
- * 'sum' - aggregate value
- * 'max' - peak value
- *
- * The returned value may be either an unsigned long long or a boolean.
- * Meaning is hypervisor specific. Please see the disclaimer for the
- * VIR_DOMAIN_STATS_VM group below.
+ * The returned value may be either an unsigned long long or a boolean.
+ * Meaning is hypervisor specific. Please see the disclaimer for the
+ * VIR_DOMAIN_STATS_VM group below.
*
* VIR_DOMAIN_STATS_INTERFACE:
* Return network interface statistics (from domain point of view).
switch (data->type) {
case QEMU_MONITOR_QUERY_STATS_TYPE_CUMULATIVE:
- type = "sum";
+ type = VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_SUM;
break;
+
case QEMU_MONITOR_QUERY_STATS_TYPE_INSTANT:
- type = "cur";
+ type = VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_CUR;
break;
case QEMU_MONITOR_QUERY_STATS_TYPE_PEAK:
- type = "max";
+ type = VIR_DOMAIN_STATS_CUSTOM_SUFFIX_TYPE_MAX;
break;
case QEMU_MONITOR_QUERY_STATS_TYPE_LOG2_HISTOGRAM:
if (virJSONValueGetBoolean(value, &stat) < 0)
continue;
- virTypedParamListAddBoolean(params, stat, "%s.%s.%s", prefix, key, type);
+ virTypedParamListAddBoolean(params, stat, "%s.%s%s", prefix, key, type);
} else {
unsigned long long stat;
if (virJSONValueGetNumberUlong(value, &stat) < 0)
continue;
- virTypedParamListAddULLong(params, stat, "%s.%s.%s", prefix, key, type);
+ virTypedParamListAddULLong(params, stat, "%s.%s%s", prefix, key, type);
}
}
}
qemuDomainObjPrivate *priv = dom->privateData;
g_autoptr(virJSONValue) queried_stats = NULL;
- virTypedParamListAddUInt(params, virDomainDefGetVcpus(dom->def), "vcpu.current");
- virTypedParamListAddUInt(params, virDomainDefGetVcpusMax(dom->def), "vcpu.maximum");
+ virTypedParamListAddUInt(params, virDomainDefGetVcpus(dom->def),
+ VIR_DOMAIN_STATS_VCPU_CURRENT);
+ virTypedParamListAddUInt(params, virDomainDefGetVcpusMax(dom->def),
+ VIR_DOMAIN_STATS_VCPU_MAXIMUM);
cpuinfo = g_new0(virVcpuInfo, virDomainDefGetVcpus(dom->def));
cpuwait = g_new0(unsigned long long, virDomainDefGetVcpus(dom->def));
for (i = 0; i < virDomainDefGetVcpus(dom->def); i++) {
virJSONValue *stat_obj = NULL;
g_autoptr(GHashTable) stats = NULL;
- g_autofree char *prefix = g_strdup_printf("vcpu.%u", cpuinfo[i].number);
+ g_autofree char *prefix = g_strdup_printf(VIR_DOMAIN_STATS_VCPU_PREFIX "%u",
+ cpuinfo[i].number);
- virTypedParamListAddInt(params, cpuinfo[i].state, "vcpu.%u.state", cpuinfo[i].number);
+ virTypedParamListAddInt(params, cpuinfo[i].state,
+ VIR_DOMAIN_STATS_VCPU_PREFIX "%u" VIR_DOMAIN_STATS_VCPU_SUFFIX_STATE,
+ cpuinfo[i].number);
/* stats below are available only if the VM is alive */
if (!virDomainObjIsActive(dom))
continue;
- virTypedParamListAddULLong(params, cpuinfo[i].cpuTime, "vcpu.%u.time", cpuinfo[i].number);
- virTypedParamListAddULLong(params, cpuwait[i], "vcpu.%u.wait", cpuinfo[i].number);
- virTypedParamListAddULLong(params, cpudelay[i], "vcpu.%u.delay", cpuinfo[i].number);
+ virTypedParamListAddULLong(params, cpuinfo[i].cpuTime,
+ VIR_DOMAIN_STATS_VCPU_PREFIX "%u" VIR_DOMAIN_STATS_VCPU_SUFFIX_TIME,
+ cpuinfo[i].number);
+ virTypedParamListAddULLong(params, cpuwait[i],
+ VIR_DOMAIN_STATS_VCPU_PREFIX "%u" VIR_DOMAIN_STATS_VCPU_SUFFIX_WAIT,
+ cpuinfo[i].number);
+ virTypedParamListAddULLong(params, cpudelay[i],
+ VIR_DOMAIN_STATS_VCPU_PREFIX "%u" VIR_DOMAIN_STATS_VCPU_SUFFIX_DELAY,
+ cpuinfo[i].number);
/* state below is extracted from the individual vcpu structs */
if (!(vcpu = virDomainDefGetVcpu(dom->def, cpuinfo[i].number)))
if (vcpupriv->halted != VIR_TRISTATE_BOOL_ABSENT) {
virTypedParamListAddBoolean(params, vcpupriv->halted == VIR_TRISTATE_BOOL_YES,
- "vcpu.%u.halted", cpuinfo[i].number);
+ VIR_DOMAIN_STATS_VCPU_PREFIX "%u" VIR_DOMAIN_STATS_VCPU_SUFFIX_HALTED,
+ cpuinfo[i].number);
}
if (!queried_stats)