bare_metrics_core/
structures.rs1use hdrhistogram::serialization::{
2 Deserializer as HistogramDeserialiser, Serializer as HistogramSerializer, V2Serializer,
3};
4use hdrhistogram::Histogram;
5use serde::de::Error;
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7use serde_bare::Uint;
8use std::collections::{BTreeMap, HashMap};
9
10pub fn get_supported_version() -> String {
11 format!("bare-metrics:{}", env!("CARGO_PKG_VERSION"))
12}
13
14#[derive(
15 Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize, Default,
16)]
17pub struct UnixTimestampMilliseconds(pub u64);
18
19impl UnixTimestampMilliseconds {
20 pub fn as_f64_seconds(self) -> f64 {
21 self.0 as f64 * 0.001
22 }
23}
24
25#[derive(Serialize, Deserialize, Clone, Debug, Default)]
27pub struct LogHeader {
28 pub bare_metrics_version: String,
30 pub application_name: String,
33 pub start_time: UnixTimestampMilliseconds,
35}
36
37#[derive(Serialize, Deserialize, Clone, Debug, Default)]
41pub struct Frame {
42 pub end_time: UnixTimestampMilliseconds,
44 pub gauge_updates: HashMap<MetricId, f64>,
46 pub counter_updates: HashMap<MetricId, Uint>,
49 pub histograms: HashMap<MetricId, SerialisableHistogram>,
51 pub new_metrics: HashMap<MetricId, MetricDescriptor>,
53}
54
55#[derive(Serialize, Deserialize, Copy, Clone, Debug)]
56pub enum MetricKind {
57 Histogram,
58 Gauge,
59 Counter,
60}
61
62#[derive(Serialize, Deserialize, Copy, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
63pub struct MetricId(pub u16);
64
65#[derive(Serialize, Deserialize, Clone, Debug)]
66pub struct MetricDescriptor {
67 pub kind: MetricKind,
68 pub unit: Option<String>,
69 pub description: String,
70 pub name: String,
71 pub labels: BTreeMap<String, String>,
72}
73
74#[derive(Clone, Debug)]
75pub struct SerialisableHistogram {
76 pub underlying: Histogram<u64>,
77}
78
79impl Serialize for SerialisableHistogram {
80 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
81 where
82 S: Serializer,
83 {
84 let mut buf = Vec::new();
85 V2Serializer::new()
86 .serialize(&self.underlying, &mut buf)
87 .expect("can't fail writing to buf");
88 serializer.serialize_bytes(&buf)
89 }
90}
91
92impl<'a> Deserialize<'a> for SerialisableHistogram {
93 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
94 where
95 D: Deserializer<'a>,
96 {
97 let bytes = Vec::<u8>::deserialize(deserializer)?;
98 let histogram = HistogramDeserialiser::new()
99 .deserialize(&mut &bytes[..])
100 .map_err(|e| D::Error::custom(format!("{:?}", e)))?;
101 Ok(SerialisableHistogram {
102 underlying: histogram,
103 })
104 }
105}