1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
use super::{Metric, TimedEvent}; use crate::io::provider::{StreamType, Timestamp}; use crate::range::Range; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] pub struct GaugeMetric { pub range: Range, } impl Metric for GaugeMetric { type State = GaugeState; type Event = GaugeEvent; fn stream_type() -> StreamType { StreamType::from("rillrate.gauge.v0") } fn apply(&self, state: &mut Self::State, event: TimedEvent<Self::Event>) { match event.event { GaugeEvent::Set(delta) => { state.timestamp = Some(event.timestamp); state.value = delta; } } } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct GaugeState { pub timestamp: Option<Timestamp>, pub value: f64, } #[allow(clippy::new_without_default)] impl GaugeState { pub fn new() -> Self { Self { timestamp: None, value: 0.0, } } pub fn last(&self) -> Option<TimedEvent<f64>> { self.timestamp.map(|ts| TimedEvent { timestamp: ts, event: self.value, }) } } pub type GaugeDelta = Vec<TimedEvent<GaugeEvent>>; #[derive(Debug, Clone, Serialize, Deserialize)] pub enum GaugeEvent { Set(f64), }