use crate::metrics::{
sdk_api, AsyncRunner, Descriptor, InstrumentKind, Meter, Number, NumberKind, Observation,
Result,
};
use std::sync::Arc;
#[derive(Debug)]
pub struct BatchObserver<'a> {
meter: &'a Meter,
runner: AsyncRunner,
}
impl<'a> BatchObserver<'a> {
pub(crate) fn new(meter: &'a Meter, runner: AsyncRunner) -> Self {
BatchObserver { meter, runner }
}
}
#[derive(Debug)]
pub struct SumObserver<T> {
instrument: Arc<dyn sdk_api::AsyncInstrumentCore>,
_marker: std::marker::PhantomData<T>,
}
impl<T> SumObserver<T>
where
T: Into<Number>,
{
pub fn observation(&self, value: T) -> Observation {
Observation::new(value.into(), self.instrument.clone())
}
}
#[derive(Debug)]
pub struct SumObserverBuilder<'a, T> {
meter: &'a Meter,
descriptor: Descriptor,
runner: AsyncRunner,
_marker: std::marker::PhantomData<T>,
}
impl<'a, T> SumObserverBuilder<'a, T> {
pub(crate) fn new(
meter: &'a Meter,
name: String,
runner: AsyncRunner,
number_kind: NumberKind,
) -> Self {
SumObserverBuilder {
meter,
descriptor: Descriptor::new(
name,
meter.instrumentation_name().to_string(),
InstrumentKind::SumObserver,
number_kind,
),
runner,
_marker: std::marker::PhantomData,
}
}
pub fn with_description<S: Into<String>>(mut self, description: S) -> Self {
self.descriptor.set_description(description.into());
self
}
pub fn try_init(self) -> Result<SumObserver<T>> {
let instrument = self
.meter
.new_async_instrument(self.descriptor, self.runner)?;
Ok(SumObserver {
instrument,
_marker: std::marker::PhantomData,
})
}
pub fn init(self) -> SumObserver<T> {
SumObserver {
instrument: self
.meter
.new_async_instrument(self.descriptor, self.runner)
.unwrap(),
_marker: std::marker::PhantomData,
}
}
}
#[derive(Debug)]
pub struct UpDownSumObserver<T> {
instrument: Arc<dyn sdk_api::AsyncInstrumentCore>,
_marker: std::marker::PhantomData<T>,
}
impl<T> UpDownSumObserver<T>
where
T: Into<Number>,
{
pub fn observation(&self, value: T) -> Observation {
Observation::new(value.into(), self.instrument.clone())
}
}
#[derive(Debug)]
pub struct UpDownSumObserverBuilder<'a, T> {
meter: &'a Meter,
descriptor: Descriptor,
runner: AsyncRunner,
_marker: std::marker::PhantomData<T>,
}
impl<'a, T> UpDownSumObserverBuilder<'a, T> {
pub(crate) fn new(
meter: &'a Meter,
name: String,
runner: AsyncRunner,
number_kind: NumberKind,
) -> Self {
UpDownSumObserverBuilder {
meter,
descriptor: Descriptor::new(
name,
meter.instrumentation_name().to_string(),
InstrumentKind::UpDownSumObserver,
number_kind,
),
runner,
_marker: std::marker::PhantomData,
}
}
pub fn with_description<S: Into<String>>(mut self, description: S) -> Self {
self.descriptor.set_description(description.into());
self
}
pub fn try_init(self) -> Result<UpDownSumObserver<T>> {
let instrument = self
.meter
.new_async_instrument(self.descriptor, self.runner)?;
Ok(UpDownSumObserver {
instrument,
_marker: std::marker::PhantomData,
})
}
pub fn init(self) -> UpDownSumObserver<T> {
UpDownSumObserver {
instrument: self
.meter
.new_async_instrument(self.descriptor, self.runner)
.unwrap(),
_marker: std::marker::PhantomData,
}
}
}
#[derive(Debug)]
pub struct ValueObserver<T> {
instrument: Arc<dyn sdk_api::AsyncInstrumentCore>,
_marker: std::marker::PhantomData<T>,
}
impl<T> ValueObserver<T>
where
T: Into<Number>,
{
pub fn observation(&self, value: T) -> Observation {
Observation::new(value.into(), self.instrument.clone())
}
}
#[derive(Debug)]
pub struct ValueObserverBuilder<'a, T> {
meter: &'a Meter,
descriptor: Descriptor,
runner: AsyncRunner,
_marker: std::marker::PhantomData<T>,
}
impl<'a, T> ValueObserverBuilder<'a, T> {
pub(crate) fn new(
meter: &'a Meter,
name: String,
runner: AsyncRunner,
number_kind: NumberKind,
) -> Self {
ValueObserverBuilder {
meter,
descriptor: Descriptor::new(
name,
meter.instrumentation_name().to_string(),
InstrumentKind::ValueObserver,
number_kind,
),
runner,
_marker: std::marker::PhantomData,
}
}
pub fn with_description<S: Into<String>>(mut self, description: S) -> Self {
self.descriptor.set_description(description.into());
self
}
pub fn try_init(self) -> Result<ValueObserver<T>> {
let instrument = self
.meter
.new_async_instrument(self.descriptor, self.runner)?;
Ok(ValueObserver {
instrument,
_marker: std::marker::PhantomData,
})
}
pub fn init(self) -> ValueObserver<T> {
ValueObserver {
instrument: self
.meter
.new_async_instrument(self.descriptor, self.runner)
.unwrap(),
_marker: std::marker::PhantomData,
}
}
}