ih_muse_core/buffer/
metric_buffer.rs

1// crates/ih-muse-core/src/buffer/metric_buffer.rs
2
3use std::collections::HashMap;
4
5use tokio::sync::Mutex;
6
7use ih_muse_proto::{LocalElementId, MetricValue};
8
9pub struct MetricBuffer {
10    buffer: Mutex<HashMap<LocalElementId, HashMap<String, MetricValue>>>,
11}
12
13impl Default for MetricBuffer {
14    fn default() -> Self {
15        Self::new()
16    }
17}
18
19impl MetricBuffer {
20    pub fn new() -> Self {
21        Self {
22            buffer: Mutex::new(HashMap::new()),
23        }
24    }
25
26    /// Adds a metric to the buffer.
27    pub async fn add_metric(
28        &self,
29        local_elem_id: LocalElementId,
30        metric_code: String,
31        value: MetricValue,
32    ) {
33        let mut buffer = self.buffer.lock().await;
34        buffer
35            .entry(local_elem_id)
36            .or_insert_with(HashMap::new)
37            .insert(metric_code, value);
38    }
39
40    /// Retrieves and clears all buffered metrics.
41    pub async fn get_and_clear(&self) -> HashMap<LocalElementId, HashMap<String, MetricValue>> {
42        let mut buffer = self.buffer.lock().await;
43        let data = buffer.clone();
44        buffer.clear();
45        data
46    }
47}