use hdrhistogram::serialization::{
Deserializer as HistogramDeserialiser, Serializer as HistogramSerializer, V2Serializer,
};
use hdrhistogram::Histogram;
use serde::de::Error;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use serde_bare::Uint;
use std::collections::{BTreeMap, HashMap};
pub fn get_supported_version() -> String {
format!("bare-metrics:{}", env!("CARGO_PKG_VERSION"))
}
#[derive(
Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash, Serialize, Deserialize, Default,
)]
pub struct UnixTimestampMilliseconds(pub u64);
impl UnixTimestampMilliseconds {
pub fn as_f64_seconds(self) -> f64 {
self.0 as f64 * 0.001
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct LogHeader {
pub bare_metrics_version: String,
pub application_name: String,
pub start_time: UnixTimestampMilliseconds,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct Frame {
pub end_time: UnixTimestampMilliseconds,
pub gauge_updates: HashMap<MetricId, f64>,
pub counter_updates: HashMap<MetricId, Uint>,
pub histograms: HashMap<MetricId, SerialisableHistogram>,
pub new_metrics: HashMap<MetricId, MetricDescriptor>,
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug)]
pub enum MetricKind {
Histogram,
Gauge,
Counter,
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub struct MetricId(pub u16);
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct MetricDescriptor {
pub kind: MetricKind,
pub unit: Option<String>,
pub description: String,
pub name: String,
pub labels: BTreeMap<String, String>,
}
#[derive(Clone, Debug)]
pub struct SerialisableHistogram {
pub underlying: Histogram<u64>,
}
impl Serialize for SerialisableHistogram {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut buf = Vec::new();
V2Serializer::new()
.serialize(&self.underlying, &mut buf)
.expect("can't fail writing to buf");
serializer.serialize_bytes(&buf)
}
}
impl<'a> Deserialize<'a> for SerialisableHistogram {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'a>,
{
let bytes = Vec::<u8>::deserialize(deserializer)?;
let histogram = HistogramDeserialiser::new()
.deserialize(&mut &bytes[..])
.map_err(|e| D::Error::custom(format!("{:?}", e)))?;
Ok(SerialisableHistogram {
underlying: histogram,
})
}
}