vmm/devices/virtio/mem/
metrics.rs1use serde::ser::SerializeMap;
26use serde::{Serialize, Serializer};
27
28use crate::logger::{LatencyAggregateMetrics, SharedIncMetric};
29
30pub(super) static METRICS: VirtioMemDeviceMetrics = VirtioMemDeviceMetrics::new();
32
33pub fn flush_metrics<S: Serializer>(serializer: S) -> Result<S::Ok, S::Error> {
35 let mut seq = serializer.serialize_map(Some(1))?;
36 seq.serialize_entry("memory_hotplug", &METRICS)?;
37 seq.end()
38}
39
40#[derive(Debug, Serialize)]
41pub(super) struct VirtioMemDeviceMetrics {
42 pub activate_fails: SharedIncMetric,
44 pub queue_event_fails: SharedIncMetric,
46 pub queue_event_count: SharedIncMetric,
48 pub plug_agg: LatencyAggregateMetrics,
50 pub plug_count: SharedIncMetric,
52 pub plug_bytes: SharedIncMetric,
54 pub plug_fails: SharedIncMetric,
56 pub unplug_agg: LatencyAggregateMetrics,
58 pub unplug_count: SharedIncMetric,
60 pub unplug_bytes: SharedIncMetric,
62 pub unplug_fails: SharedIncMetric,
64 pub unplug_discard_fails: SharedIncMetric,
66 pub unplug_all_agg: LatencyAggregateMetrics,
68 pub unplug_all_count: SharedIncMetric,
70 pub unplug_all_fails: SharedIncMetric,
72 pub state_agg: LatencyAggregateMetrics,
74 pub state_count: SharedIncMetric,
76 pub state_fails: SharedIncMetric,
78}
79
80impl VirtioMemDeviceMetrics {
81 const fn new() -> Self {
83 Self {
84 activate_fails: SharedIncMetric::new(),
85 queue_event_fails: SharedIncMetric::new(),
86 queue_event_count: SharedIncMetric::new(),
87 plug_agg: LatencyAggregateMetrics::new(),
88 plug_count: SharedIncMetric::new(),
89 plug_bytes: SharedIncMetric::new(),
90 plug_fails: SharedIncMetric::new(),
91 unplug_agg: LatencyAggregateMetrics::new(),
92 unplug_count: SharedIncMetric::new(),
93 unplug_bytes: SharedIncMetric::new(),
94 unplug_fails: SharedIncMetric::new(),
95 unplug_discard_fails: SharedIncMetric::new(),
96 unplug_all_agg: LatencyAggregateMetrics::new(),
97 unplug_all_count: SharedIncMetric::new(),
98 unplug_all_fails: SharedIncMetric::new(),
99 state_agg: LatencyAggregateMetrics::new(),
100 state_count: SharedIncMetric::new(),
101 state_fails: SharedIncMetric::new(),
102 }
103 }
104}
105
106#[cfg(test)]
107pub mod tests {
108 use super::*;
109 use crate::logger::IncMetric;
110
111 #[test]
112 fn test_memory_hotplug_metrics() {
113 let mem_metrics: VirtioMemDeviceMetrics = VirtioMemDeviceMetrics::new();
114 mem_metrics.queue_event_count.inc();
115 assert_eq!(mem_metrics.queue_event_count.count(), 1);
116 let _ = serde_json::to_string(&mem_metrics).unwrap();
117 }
118}