emit_otlp 1.18.0

Emit diagnostic events to an OpenTelemetry-compatible collector.
Documentation
use sval_derive::Value;

use crate::data::{AnyValue, KeyValue};

#[derive(Value)]
pub struct Metric<'a, N: ?Sized = str, U: ?Sized = str, D: ?Sized = MetricData<'a>> {
    #[sval(label = "name", index = 1)]
    pub name: &'a N,
    #[sval(label = "unit", index = 3)]
    pub unit: &'a U,
    #[sval(flatten)]
    pub data: &'a D,
}

#[derive(Value)]
pub enum MetricData<'a, DP: ?Sized = [NumberDataPoint<'a>]> {
    #[sval(label = "gauge", index = 5)]
    Gauge(Gauge<'a, DP>),
    #[sval(label = "sum", index = 7)]
    Sum(Sum<'a, DP>),
    #[sval(label = "exponentialHistogram", index = 10)]
    ExponentialHistogram(ExponentialHistogram<'a, DP>),
}

#[derive(Value)]
pub struct Gauge<'a, DP: ?Sized = [NumberDataPoint<'a>]> {
    #[sval(label = "dataPoints", index = 1)]
    pub data_points: &'a DP,
}

#[derive(Value)]
pub struct Sum<'a, DP: ?Sized = [NumberDataPoint<'a>]> {
    #[sval(label = "dataPoints", index = 1)]
    pub data_points: &'a DP,
    #[sval(label = "aggregationTemporality", index = 2)]
    pub aggregation_temporality: AggregationTemporality,
    #[sval(label = "isMonotonic", index = 3)]
    pub is_monotonic: bool,
}

#[derive(Value)]
pub struct ExponentialHistogram<'a, DP: ?Sized = [ExponentialHistogramDataPoint<'a>]> {
    #[sval(label = "dataPoints", index = 1)]
    pub data_points: &'a DP,
    #[sval(label = "aggregationTemporality", index = 2)]
    pub aggregation_temporality: AggregationTemporality,
}

#[derive(Value)]
#[repr(i32)]
#[sval(unlabeled_variants)]
pub enum AggregationTemporality {
    Unspecified = 0,
    Delta = 1,
    Cumulative = 2,
}

#[derive(Value)]
pub struct NumberDataPoint<'a, A: ?Sized = [KeyValue<&'a str, &'a AnyValue<'a>>]> {
    #[sval(label = "attributes", index = 7)]
    pub attributes: &'a A,
    #[sval(
        label = "startTimeUnixNano",
        index = 2,
        data_tag = "sval_protobuf::tags::PROTOBUF_I64"
    )]
    pub start_time_unix_nano: u64,
    #[sval(
        label = "timeUnixNano",
        index = 3,
        data_tag = "sval_protobuf::tags::PROTOBUF_I64"
    )]
    pub time_unix_nano: u64,
    #[sval(flatten)]
    pub value: NumberDataPointValue,
}

#[derive(Value)]
pub enum NumberDataPointValue {
    #[sval(label = "value", index = 4)]
    AsDouble(AsDouble),
    #[sval(label = "value", index = 6)]
    AsInt(AsInt),
}

#[derive(Value)]
pub struct AsDouble(pub f64);

#[derive(Value)]
#[sval(tag = "sval_protobuf::tags::PROTOBUF_I64")]
pub struct AsInt(pub i64);

#[derive(Value)]
pub struct ExponentialHistogramDataPoint<
    'a,
    A: ?Sized = [KeyValue<&'a str, &'a AnyValue<'a>>],
    P: ?Sized = [u64],
> {
    #[sval(label = "attributes", index = 1)]
    pub attributes: &'a A,
    #[sval(
        label = "startTimeUnixNano",
        index = 2,
        data_tag = "sval_protobuf::tags::PROTOBUF_I64"
    )]
    pub start_time_unix_nano: u64,
    #[sval(
        label = "timeUnixNano",
        index = 3,
        data_tag = "sval_protobuf::tags::PROTOBUF_I64"
    )]
    pub time_unix_nano: u64,
    #[sval(
        label = "count",
        index = 4,
        data_tag = "sval_protobuf::tags::PROTOBUF_I64"
    )]
    pub count: u64,
    #[sval(
        label = "scale",
        index = 6,
        data_tag = "sval_protobuf::tags::PROTOBUF_VARINT_SIGNED"
    )]
    pub scale: i32,
    #[sval(
        label = "zeroCount",
        index = 7,
        data_tag = "sval_protobuf::tags::PROTOBUF_I64"
    )]
    pub zero_count: u64,
    #[sval(label = "positive", index = 8)]
    pub positive: Option<Buckets<'a, P>>,
    #[sval(label = "negative", index = 9)]
    pub negative: Option<Buckets<'a, P>>,
}

#[derive(Value)]
pub struct Buckets<'a, P: ?Sized = [u64]> {
    #[sval(
        label = "offset",
        index = 1,
        data_tag = "sval_protobuf::tags::PROTOBUF_VARINT_SIGNED"
    )]
    pub offset: i32,
    #[sval(label = "bucketCounts", index = 2)]
    pub bucket_counts: &'a P,
}