use std::fmt;
use std::sync::Arc;
use crate::sdk::InstrumentationLibrary;
use crate::{
metrics::{
sdk_api, AsyncRunner, BatchObserver, BatchObserverResult, CounterBuilder, Descriptor,
Measurement, NumberKind, ObserverResult, Result, SumObserverBuilder, UpDownCounterBuilder,
UpDownSumObserverBuilder, ValueObserverBuilder, ValueRecorderBuilder,
},
Context, KeyValue,
};
pub trait MeterProvider: fmt::Debug {
fn meter(
&self,
instrumentation_name: &'static str,
instrumentation_version: Option<&'static str>,
) -> Meter;
}
#[derive(Debug)]
pub struct Meter {
instrumentation_library: InstrumentationLibrary,
core: Arc<dyn sdk_api::MeterCore + Send + Sync>,
}
impl Meter {
pub fn new<T: Into<&'static str>>(
instrumentation_name: T,
instrumentation_version: Option<T>,
core: Arc<dyn sdk_api::MeterCore + Send + Sync>,
) -> Self {
Meter {
instrumentation_library: InstrumentationLibrary::new(
instrumentation_name.into(),
instrumentation_version.map(Into::into),
),
core,
}
}
pub(crate) fn instrumentation_library(&self) -> InstrumentationLibrary {
self.instrumentation_library.clone()
}
pub fn u64_counter<T>(&self, name: T) -> CounterBuilder<'_, u64>
where
T: Into<String>,
{
CounterBuilder::new(self, name.into(), NumberKind::U64)
}
pub fn f64_counter<T>(&self, name: T) -> CounterBuilder<'_, f64>
where
T: Into<String>,
{
CounterBuilder::new(self, name.into(), NumberKind::F64)
}
pub fn i64_up_down_counter<T>(&self, name: T) -> UpDownCounterBuilder<'_, i64>
where
T: Into<String>,
{
UpDownCounterBuilder::new(self, name.into(), NumberKind::I64)
}
pub fn f64_up_down_counter<T>(&self, name: T) -> UpDownCounterBuilder<'_, f64>
where
T: Into<String>,
{
UpDownCounterBuilder::new(self, name.into(), NumberKind::F64)
}
pub fn i64_value_recorder<T>(&self, name: T) -> ValueRecorderBuilder<'_, i64>
where
T: Into<String>,
{
ValueRecorderBuilder::new(self, name.into(), NumberKind::I64)
}
pub fn u64_value_recorder<T>(&self, name: T) -> ValueRecorderBuilder<'_, u64>
where
T: Into<String>,
{
ValueRecorderBuilder::new(self, name.into(), NumberKind::U64)
}
pub fn f64_value_recorder<T>(&self, name: T) -> ValueRecorderBuilder<'_, f64>
where
T: Into<String>,
{
ValueRecorderBuilder::new(self, name.into(), NumberKind::F64)
}
pub fn u64_sum_observer<T, F>(&self, name: T, callback: F) -> SumObserverBuilder<'_, u64>
where
T: Into<String>,
F: Fn(ObserverResult<u64>) + Send + Sync + 'static,
{
SumObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::U64(Box::new(callback))),
NumberKind::U64,
)
}
pub fn f64_sum_observer<T, F>(&self, name: T, callback: F) -> SumObserverBuilder<'_, f64>
where
T: Into<String>,
F: Fn(ObserverResult<f64>) + Send + Sync + 'static,
{
SumObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::F64(Box::new(callback))),
NumberKind::F64,
)
}
pub fn i64_up_down_sum_observer<T, F>(
&self,
name: T,
callback: F,
) -> UpDownSumObserverBuilder<'_, i64>
where
T: Into<String>,
F: Fn(ObserverResult<i64>) + Send + Sync + 'static,
{
UpDownSumObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::I64(Box::new(callback))),
NumberKind::I64,
)
}
pub fn f64_up_down_sum_observer<T, F>(
&self,
name: T,
callback: F,
) -> UpDownSumObserverBuilder<'_, f64>
where
T: Into<String>,
F: Fn(ObserverResult<f64>) + Send + Sync + 'static,
{
UpDownSumObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::F64(Box::new(callback))),
NumberKind::F64,
)
}
pub fn u64_value_observer<T, F>(&self, name: T, callback: F) -> ValueObserverBuilder<'_, u64>
where
T: Into<String>,
F: Fn(ObserverResult<u64>) + Send + Sync + 'static,
{
ValueObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::U64(Box::new(callback))),
NumberKind::U64,
)
}
pub fn i64_value_observer<T, F>(&self, name: T, callback: F) -> ValueObserverBuilder<'_, i64>
where
T: Into<String>,
F: Fn(ObserverResult<i64>) + Send + Sync + 'static,
{
ValueObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::I64(Box::new(callback))),
NumberKind::I64,
)
}
pub fn f64_value_observer<T, F>(&self, name: T, callback: F) -> ValueObserverBuilder<'_, f64>
where
T: Into<String>,
F: Fn(ObserverResult<f64>) + Send + Sync + 'static,
{
ValueObserverBuilder::new(
self,
name.into(),
Some(AsyncRunner::F64(Box::new(callback))),
NumberKind::F64,
)
}
pub fn build_batch_observer<B, F>(&self, builder: B) -> Result<()>
where
B: Fn(BatchObserver<'_>) -> Result<F>,
F: Fn(BatchObserverResult) + Send + Sync + 'static,
{
let observer = builder(BatchObserver::new(self))?;
self.core
.new_batch_observer(AsyncRunner::Batch(Box::new(observer)))
}
pub fn batch_observer<B, F>(&self, builder: B)
where
B: Fn(BatchObserver<'_>) -> F,
F: Fn(BatchObserverResult) + Send + Sync + 'static,
{
let observer = builder(BatchObserver::new(self));
self.core
.new_batch_observer(AsyncRunner::Batch(Box::new(observer)))
.unwrap()
}
pub fn record_batch<T: IntoIterator<Item = Measurement>>(
&self,
attributes: &[KeyValue],
measurements: T,
) {
self.record_batch_with_context(&Context::current(), attributes, measurements)
}
pub fn record_batch_with_context<T: IntoIterator<Item = Measurement>>(
&self,
cx: &Context,
attributes: &[KeyValue],
measurements: T,
) {
self.core
.record_batch_with_context(cx, attributes, measurements.into_iter().collect())
}
pub(crate) fn new_sync_instrument(
&self,
descriptor: Descriptor,
) -> Result<Arc<dyn sdk_api::SyncInstrumentCore>> {
self.core.new_sync_instrument(descriptor)
}
pub(crate) fn new_async_instrument(
&self,
descriptor: Descriptor,
runner: Option<AsyncRunner>,
) -> Result<Arc<dyn sdk_api::AsyncInstrumentCore>> {
self.core.new_async_instrument(descriptor, runner)
}
}