use core::fmt;
use std::any::Any;
use std::borrow::Cow;
use std::sync::Arc;
use crate::metrics::{
AsyncInstrumentBuilder, Counter, Histogram, InstrumentBuilder, InstrumentProvider,
ObservableCounter, ObservableGauge, ObservableUpDownCounter, Result, UpDownCounter,
};
use crate::KeyValue;
use super::AsyncInstrument;
pub trait MeterProvider {
fn meter(&self, name: impl Into<Cow<'static, str>>) -> Meter {
self.versioned_meter(
name,
None::<Cow<'static, str>>,
None::<Cow<'static, str>>,
None,
)
}
fn versioned_meter(
&self,
name: impl Into<Cow<'static, str>>,
version: Option<impl Into<Cow<'static, str>>>,
schema_url: Option<impl Into<Cow<'static, str>>>,
attributes: Option<Vec<KeyValue>>,
) -> Meter;
}
#[derive(Clone)]
pub struct Meter {
pub(crate) instrument_provider: Arc<dyn InstrumentProvider + Send + Sync>,
}
impl Meter {
#[doc(hidden)]
pub fn new(instrument_provider: Arc<dyn InstrumentProvider + Send + Sync>) -> Self {
Meter {
instrument_provider,
}
}
pub fn u64_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, Counter<u64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn f64_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, Counter<f64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn u64_observable_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableCounter<u64>, u64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn f64_observable_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableCounter<f64>, f64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn i64_up_down_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, UpDownCounter<i64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn f64_up_down_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, UpDownCounter<f64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn i64_observable_up_down_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableUpDownCounter<i64>, i64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn f64_observable_up_down_counter(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableUpDownCounter<f64>, f64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn u64_observable_gauge(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableGauge<u64>, u64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn i64_observable_gauge(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableGauge<i64>, i64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn f64_observable_gauge(
&self,
name: impl Into<Cow<'static, str>>,
) -> AsyncInstrumentBuilder<'_, ObservableGauge<f64>, f64> {
AsyncInstrumentBuilder::new(self, name.into())
}
pub fn f64_histogram(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, Histogram<f64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn u64_histogram(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, Histogram<u64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn i64_histogram(
&self,
name: impl Into<Cow<'static, str>>,
) -> InstrumentBuilder<'_, Histogram<i64>> {
InstrumentBuilder::new(self, name.into())
}
pub fn register_callback<F>(
&self,
instruments: &[Arc<dyn Any>],
callback: F,
) -> Result<Box<dyn CallbackRegistration>>
where
F: Fn(&dyn Observer) + Send + Sync + 'static,
{
self.instrument_provider
.register_callback(instruments, Box::new(callback))
}
}
pub trait CallbackRegistration: Send + Sync {
fn unregister(&mut self) -> Result<()>;
}
pub trait Observer {
fn observe_f64(&self, inst: &dyn AsyncInstrument<f64>, measurement: f64, attrs: &[KeyValue]);
fn observe_u64(&self, inst: &dyn AsyncInstrument<u64>, measurement: u64, attrs: &[KeyValue]);
fn observe_i64(&self, inst: &dyn AsyncInstrument<i64>, measurement: i64, attrs: &[KeyValue]);
}
impl fmt::Debug for Meter {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("Meter")
}
}