use crate::metrics::{Descriptor, InstrumentKind};
use crate::sdk::export::metrics::{Aggregator, AggregatorSelector};
use crate::sdk::metrics::aggregators;
use std::sync::Arc;
#[derive(Debug)]
pub enum Selector {
Sketch(aggregators::DdSketchConfig),
Inexpensive,
Exact,
Histogram(Vec<f64>),
}
impl AggregatorSelector for Selector {
fn aggregator_for(&self, descriptor: &Descriptor) -> Option<Arc<dyn Aggregator + Send + Sync>> {
match self {
Selector::Sketch(config) => match descriptor.instrument_kind() {
InstrumentKind::ValueObserver => Some(Arc::new(aggregators::last_value())),
InstrumentKind::ValueRecorder => Some(Arc::new(aggregators::ddsketch(
config,
descriptor.number_kind().clone(),
))),
_ => Some(Arc::new(aggregators::sum())),
},
Selector::Inexpensive => match descriptor.instrument_kind() {
InstrumentKind::ValueObserver => Some(Arc::new(aggregators::last_value())),
InstrumentKind::ValueRecorder => {
Some(Arc::new(aggregators::min_max_sum_count(descriptor)))
}
_ => Some(Arc::new(aggregators::sum())),
},
Selector::Exact => match descriptor.instrument_kind() {
InstrumentKind::ValueObserver => Some(Arc::new(aggregators::last_value())),
InstrumentKind::ValueRecorder => Some(Arc::new(aggregators::array())),
_ => Some(Arc::new(aggregators::sum())),
},
Selector::Histogram(boundaries) => match descriptor.instrument_kind() {
InstrumentKind::ValueObserver => Some(Arc::new(aggregators::last_value())),
InstrumentKind::ValueRecorder => {
Some(Arc::new(aggregators::histogram(descriptor, boundaries)))
}
_ => Some(Arc::new(aggregators::sum())),
},
}
}
}