#[derive(Clone, Copy, Debug, PartialEq, Eq, prost::Enumeration)]
#[repr(i32)]
pub(crate) enum MetricType {
Counter = 0,
Gauge = 1,
Summary = 2,
Untyped = 3,
Histogram = 4,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct MetricFamily {
#[prost(string, optional, tag = "1")]
pub(crate) name: Option<String>,
#[prost(string, optional, tag = "2")]
pub(crate) help: Option<String>,
#[prost(enumeration = "MetricType", optional, tag = "3")]
pub(crate) r#type: Option<i32>,
#[prost(message, repeated, tag = "4")]
pub(crate) metric: Vec<Metric>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct Metric {
#[prost(message, repeated, tag = "1")]
pub(crate) label: Vec<LabelPair>,
#[prost(message, optional, tag = "2")]
pub(crate) gauge: Option<Gauge>,
#[prost(message, optional, tag = "3")]
pub(crate) counter: Option<Counter>,
#[prost(message, optional, tag = "7")]
pub(crate) histogram: Option<Histogram>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct LabelPair {
#[prost(string, optional, tag = "1")]
pub(crate) name: Option<String>,
#[prost(string, optional, tag = "2")]
pub(crate) value: Option<String>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct Counter {
#[prost(double, optional, tag = "1")]
pub(crate) value: Option<f64>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct Gauge {
#[prost(double, optional, tag = "1")]
pub(crate) value: Option<f64>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct Histogram {
#[prost(uint64, optional, tag = "1")]
pub(crate) sample_count: Option<u64>,
#[prost(double, optional, tag = "2")]
pub(crate) sample_sum: Option<f64>,
#[prost(message, repeated, tag = "3")]
pub(crate) bucket: Vec<Bucket>,
#[prost(sint32, optional, tag = "5")]
pub(crate) schema: Option<i32>,
#[prost(double, optional, tag = "6")]
pub(crate) zero_threshold: Option<f64>,
#[prost(uint64, optional, tag = "7")]
pub(crate) zero_count: Option<u64>,
#[prost(message, repeated, tag = "12")]
pub(crate) positive_span: Vec<BucketSpan>,
#[prost(sint64, repeated, packed = "false", tag = "13")]
pub(crate) positive_delta: Vec<i64>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct Bucket {
#[prost(uint64, optional, tag = "1")]
pub(crate) cumulative_count: Option<u64>,
#[prost(double, optional, tag = "2")]
pub(crate) upper_bound: Option<f64>,
}
#[derive(Clone, PartialEq, prost::Message)]
pub(crate) struct BucketSpan {
#[prost(sint32, optional, tag = "1")]
pub(crate) offset: Option<i32>,
#[prost(uint32, optional, tag = "2")]
pub(crate) length: Option<u32>,
}
pub(crate) fn label(name: &str, value: &str) -> LabelPair {
LabelPair {
name: Some(name.to_string()),
value: Some(value.to_string()),
}
}
#[cfg(test)]
mod tests {
use prost::Message;
use crate::prometheus_server::protobuf::{label, Gauge, Metric, MetricFamily, MetricType};
#[test]
fn golden_gauge_family() {
let family = MetricFamily {
name: Some("up".into()),
help: None,
r#type: Some(MetricType::Gauge as i32),
metric: vec![Metric {
label: vec![label("a", "b")],
gauge: Some(Gauge { value: Some(1.0) }),
counter: None,
histogram: None,
}],
};
let bytes = family.encode_to_vec();
let expected: &[u8] = &[
0x0a, 0x02, b'u', b'p', 0x18, 0x01, 0x22, 0x13, 0x0a, 0x06, 0x0a, 0x01, b'a', 0x12, 0x01, b'b', 0x12, 0x09, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, ];
assert_eq!(bytes, expected);
}
}