saluki_core/data_model/event/
mod.rs

1//! Telemetry events.
2
3use std::fmt;
4
5use bitmask_enum::bitmask;
6
7pub mod metric;
8use self::metric::Metric;
9
10pub mod eventd;
11use self::eventd::EventD;
12
13pub mod service_check;
14use self::service_check::ServiceCheck;
15
16pub mod log;
17use self::log::Log;
18
19/// Telemetry event type.
20///
21/// This type is a bitmask, which means different event types can be combined together. This makes `EventType` mainly
22/// useful for defining the type of telemetry events that a component emits, or can handle.
23#[bitmask(u8)]
24#[bitmask_config(vec_debug)]
25pub enum EventType {
26    /// Metrics.
27    Metric,
28
29    /// Datadog Events.
30    EventD,
31
32    /// Service checks.
33    ServiceCheck,
34
35    /// Logs.
36    Log,
37}
38
39impl Default for EventType {
40    fn default() -> Self {
41        Self::none()
42    }
43}
44
45impl fmt::Display for EventType {
46    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
47        let mut types = Vec::new();
48
49        if self.contains(Self::Metric) {
50            types.push("Metric");
51        }
52
53        if self.contains(Self::EventD) {
54            types.push("DatadogEvent");
55        }
56
57        if self.contains(Self::ServiceCheck) {
58            types.push("ServiceCheck");
59        }
60
61        if self.contains(Self::Log) {
62            types.push("Log");
63        }
64
65        write!(f, "{}", types.join("|"))
66    }
67}
68
69/// A telemetry event.
70#[derive(Clone, Debug, PartialEq)]
71pub enum Event {
72    /// A metric.
73    Metric(Metric),
74
75    /// A Datadog Event.
76    EventD(EventD),
77
78    /// A service check.
79    ServiceCheck(ServiceCheck),
80
81    /// A log.
82    Log(Log),
83}
84
85impl Event {
86    /// Gets the type of this event.
87    pub fn event_type(&self) -> EventType {
88        match self {
89            Event::Metric(_) => EventType::Metric,
90            Event::EventD(_) => EventType::EventD,
91            Event::ServiceCheck(_) => EventType::ServiceCheck,
92            Event::Log(_) => EventType::Log,
93        }
94    }
95
96    /// Returns the inner event value, if this event is a `Metric`.
97    ///
98    /// Otherwise, `None` is returned and the original event is consumed.
99    pub fn try_into_metric(self) -> Option<Metric> {
100        match self {
101            Event::Metric(metric) => Some(metric),
102            _ => None,
103        }
104    }
105
106    /// Returns a reference inner event value, if this event is a `Metric`.
107    ///
108    /// Otherwise, `None` is returned.
109    pub fn try_as_metric(&self) -> Option<&Metric> {
110        match self {
111            Event::Metric(metric) => Some(metric),
112            _ => None,
113        }
114    }
115
116    /// Returns a mutable reference inner event value, if this event is a `Metric`.
117    ///
118    /// Otherwise, `None` is returned.
119    pub fn try_as_metric_mut(&mut self) -> Option<&mut Metric> {
120        match self {
121            Event::Metric(metric) => Some(metric),
122            _ => None,
123        }
124    }
125
126    /// Returns the inner event value, if this event is a `EventD`.
127    ///
128    /// Otherwise, `None` is returned and the original event is consumed.
129    pub fn try_into_eventd(self) -> Option<EventD> {
130        match self {
131            Event::EventD(eventd) => Some(eventd),
132            _ => None,
133        }
134    }
135
136    /// Returns the inner event value, if this event is a `ServiceCheck`.
137    ///
138    /// Otherwise, `None` is returned and the original event is consumed.
139    pub fn try_into_service_check(self) -> Option<ServiceCheck> {
140        match self {
141            Event::ServiceCheck(service_check) => Some(service_check),
142            _ => None,
143        }
144    }
145
146    #[allow(unused)]
147    /// Returns `true` if the event is a metric.
148    pub fn is_metric(&self) -> bool {
149        matches!(self, Event::Metric(_))
150    }
151
152    /// Returns `true` if the event is a eventd.
153    pub fn is_eventd(&self) -> bool {
154        matches!(self, Event::EventD(_))
155    }
156
157    /// Returns `true` if the event is a service check.
158    pub fn is_service_check(&self) -> bool {
159        matches!(self, Event::ServiceCheck(_))
160    }
161
162    /// Returns `true` if the event is a log.
163    pub fn is_log(&self) -> bool {
164        matches!(self, Event::Log(_))
165    }
166}
167
168#[cfg(test)]
169mod tests {
170    use super::*;
171
172    #[test]
173    #[ignore = "only used to get struct sizes for core event data types"]
174    fn sizes() {
175        println!("Event: {} bytes", std::mem::size_of::<Event>());
176        println!("Metric: {} bytes", std::mem::size_of::<Metric>());
177        println!("  Context: {} bytes", std::mem::size_of::<saluki_context::Context>());
178        println!(
179            "  MetricValues: {} bytes",
180            std::mem::size_of::<super::metric::MetricValues>()
181        );
182        println!(
183            "  MetricMetadata: {} bytes",
184            std::mem::size_of::<super::metric::MetricMetadata>()
185        );
186        println!("EventD: {} bytes", std::mem::size_of::<EventD>());
187        println!("ServiceCheck: {} bytes", std::mem::size_of::<ServiceCheck>());
188        println!("Log: {} bytes", std::mem::size_of::<Log>());
189    }
190}