xref: /openbmc/qemu/qapi/stats.json (revision 81ae37db)
1# -*- Mode: Python -*-
2# vim: filetype=python
3#
4# Copyright (c) 2022 Oracle and/or its affiliates.
5#
6# This work is licensed under the terms of the GNU GPL, version 2 or later.
7# See the COPYING file in the top-level directory.
8#
9# SPDX-License-Identifier: GPL-2.0-or-later
10
11##
12# = Statistics
13##
14
15##
16# @StatsType:
17#
18# Enumeration of statistics types
19#
20# @cumulative: stat is cumulative; value can only increase.
21#
22# @instant: stat is instantaneous; value can increase or decrease.
23#
24# @peak: stat is the peak value; value can only increase.
25#
26# @linear-histogram: stat is a linear histogram.
27#
28# @log2-histogram: stat is a logarithmic histogram, with one bucket
29#     for each power of two.
30#
31# Since: 7.1
32##
33{ 'enum' : 'StatsType',
34  'data' : [ 'cumulative', 'instant', 'peak', 'linear-histogram',
35             'log2-histogram' ] }
36
37##
38# @StatsUnit:
39#
40# Enumeration of unit of measurement for statistics
41#
42# @bytes: stat reported in bytes.
43#
44# @seconds: stat reported in seconds.
45#
46# @cycles: stat reported in clock cycles.
47#
48# @boolean: stat is a boolean value.
49#
50# Since: 7.1
51##
52{ 'enum' : 'StatsUnit',
53  'data' : [ 'bytes', 'seconds', 'cycles', 'boolean' ] }
54
55##
56# @StatsProvider:
57#
58# Enumeration of statistics providers.
59#
60# @kvm: since 7.1
61#
62# @cryptodev: since 8.0
63#
64# Since: 7.1
65##
66{ 'enum': 'StatsProvider',
67  'data': [ 'kvm', 'cryptodev' ] }
68
69##
70# @StatsTarget:
71#
72# The kinds of objects on which one can request statistics.
73#
74# @vm: statistics that apply to the entire virtual machine or the
75#     entire QEMU process.
76#
77# @vcpu: statistics that apply to a single virtual CPU.
78#
79# @cryptodev: statistics that apply to a crypto device (since 8.0)
80#
81# Since: 7.1
82##
83{ 'enum': 'StatsTarget',
84  'data': [ 'vm', 'vcpu', 'cryptodev' ] }
85
86##
87# @StatsRequest:
88#
89# Indicates a set of statistics that should be returned by
90# query-stats.
91#
92# @provider: provider for which to return statistics.
93#
94# @names: statistics to be returned (all if omitted).
95#
96# Since: 7.1
97##
98{ 'struct': 'StatsRequest',
99  'data': { 'provider': 'StatsProvider',
100            '*names': [ 'str' ] } }
101
102##
103# @StatsVCPUFilter:
104#
105# @vcpus: list of QOM paths for the desired vCPU objects.
106#
107# Since: 7.1
108##
109{ 'struct': 'StatsVCPUFilter',
110  'data': { '*vcpus': [ 'str' ] } }
111
112##
113# @StatsFilter:
114#
115# The arguments to the query-stats command; specifies a target for
116# which to request statistics and optionally the required subset of
117# information for that target.
118#
119# @target: the kind of objects to query.  Note that each possible
120#          target may enable additional filtering options
121#
122# @providers: which providers to request statistics from, and optionally
123#             which named values to return within each provider
124#
125# Since: 7.1
126##
127{ 'union': 'StatsFilter',
128  'base': {
129      'target': 'StatsTarget',
130      '*providers': [ 'StatsRequest' ] },
131  'discriminator': 'target',
132  'data': { 'vcpu': 'StatsVCPUFilter' } }
133
134##
135# @StatsValue:
136#
137# @scalar: single unsigned 64-bit integers.
138#
139# @boolean: single boolean value.
140#
141# @list: list of unsigned 64-bit integers (used for histograms).
142#
143# Since: 7.1
144##
145{ 'alternate': 'StatsValue',
146  'data': { 'scalar': 'uint64',
147            'boolean': 'bool',
148            'list': [ 'uint64' ] } }
149
150##
151# @Stats:
152#
153# @name: name of stat.
154#
155# @value: stat value.
156#
157# Since: 7.1
158##
159{ 'struct': 'Stats',
160  'data': { 'name': 'str',
161            'value' : 'StatsValue' } }
162
163##
164# @StatsResult:
165#
166# @provider: provider for this set of statistics.
167#
168# @qom-path: Path to the object for which the statistics are returned,
169#     if the object is exposed in the QOM tree
170#
171# @stats: list of statistics.
172#
173# Since: 7.1
174##
175{ 'struct': 'StatsResult',
176  'data': { 'provider': 'StatsProvider',
177            '*qom-path': 'str',
178            'stats': [ 'Stats' ] } }
179
180##
181# @query-stats:
182#
183# Return runtime-collected statistics for objects such as the VM or
184# its vCPUs.
185#
186# The arguments are a StatsFilter and specify the provider and objects
187# to return statistics about.
188#
189# Returns: a list of StatsResult, one for each provider and object
190#     (e.g., for each vCPU).
191#
192# Since: 7.1
193##
194{ 'command': 'query-stats',
195  'data': 'StatsFilter',
196  'boxed': true,
197  'returns': [ 'StatsResult' ] }
198
199##
200# @StatsSchemaValue:
201#
202# Schema for a single statistic.
203#
204# @name: name of the statistic; each element of the schema is uniquely
205#     identified by a target, a provider (both available in
206#     @StatsSchema) and the name.
207#
208# @type: kind of statistic.
209#
210# @unit: basic unit of measure for the statistic; if missing, the
211#     statistic is a simple number or counter.
212#
213# @base: base for the multiple of @unit in which the statistic is
214#     measured.  Only present if @exponent is non-zero; @base and
215#     @exponent together form a SI prefix (e.g., _nano-_ for
216#     ``base=10`` and ``exponent=-9``) or IEC binary prefix (e.g.
217#     _kibi-_ for ``base=2`` and ``exponent=10``)
218#
219# @exponent: exponent for the multiple of @unit in which the statistic
220#     is expressed, or 0 for the basic unit
221#
222# @bucket-size: Present when @type is "linear-histogram", contains the
223#     width of each bucket of the histogram.
224#
225# Since: 7.1
226##
227{ 'struct': 'StatsSchemaValue',
228  'data': { 'name': 'str',
229            'type': 'StatsType',
230            '*unit': 'StatsUnit',
231            '*base': 'int8',
232            'exponent': 'int16',
233            '*bucket-size': 'uint32' } }
234
235##
236# @StatsSchema:
237#
238# Schema for all available statistics for a provider and target.
239#
240# @provider: provider for this set of statistics.
241#
242# @target: the kind of object that can be queried through the
243#     provider.
244#
245# @stats: list of statistics.
246#
247# Since: 7.1
248##
249{ 'struct': 'StatsSchema',
250  'data': { 'provider': 'StatsProvider',
251            'target': 'StatsTarget',
252            'stats': [ 'StatsSchemaValue' ] } }
253
254##
255# @query-stats-schemas:
256#
257# Return the schema for all available runtime-collected statistics.
258#
259# @provider: a provider to restrict the query to.
260#
261# .. note:: Runtime-collected statistics and their names fall outside
262#    QEMU's usual deprecation policies.  QEMU will try to keep the set
263#    of available data stable, together with their names, but will not
264#    guarantee stability at all costs; the same is true of providers
265#    that source statistics externally, e.g. from Linux.  For example,
266#    if the same value is being tracked with different names on
267#    different architectures or by different providers, one of them
268#    might be renamed.  A statistic might go away if an algorithm is
269#    changed or some code is removed; changing a default might cause
270#    previously useful statistics to always report 0.  Such changes,
271#    however, are expected to be rare.
272#
273# Since: 7.1
274##
275{ 'command': 'query-stats-schemas',
276  'data': { '*provider': 'StatsProvider' },
277  'returns': [ 'StatsSchema' ] }
278