opentelemetry/metrics/instruments/
gauge.rs

1use crate::{
2    metrics::{AsyncInstrument, AsyncInstrumentBuilder, InstrumentBuilder, MetricsError},
3    KeyValue,
4};
5use core::fmt;
6use std::any::Any;
7use std::sync::Arc;
8
9/// An SDK implemented instrument that records independent values
10pub trait SyncGauge<T> {
11    /// Records an independent value.
12    fn record(&self, value: T, attributes: &[KeyValue]);
13}
14
15/// An instrument that records independent values
16#[derive(Clone)]
17pub struct Gauge<T>(Arc<dyn SyncGauge<T> + Send + Sync>);
18
19impl<T> fmt::Debug for Gauge<T>
20where
21    T: fmt::Debug,
22{
23    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24        f.write_fmt(format_args!("Gauge<{}>", std::any::type_name::<T>()))
25    }
26}
27
28impl<T> Gauge<T> {
29    /// Create a new gauge.
30    pub fn new(inner: Arc<dyn SyncGauge<T> + Send + Sync>) -> Self {
31        Gauge(inner)
32    }
33
34    /// Records an independent value.
35    pub fn record(&self, value: T, attributes: &[KeyValue]) {
36        self.0.record(value, attributes)
37    }
38}
39
40impl TryFrom<InstrumentBuilder<'_, Gauge<u64>>> for Gauge<u64> {
41    type Error = MetricsError;
42
43    fn try_from(builder: InstrumentBuilder<'_, Gauge<u64>>) -> Result<Self, Self::Error> {
44        builder
45            .instrument_provider
46            .u64_gauge(builder.name, builder.description, builder.unit)
47    }
48}
49
50impl TryFrom<InstrumentBuilder<'_, Gauge<f64>>> for Gauge<f64> {
51    type Error = MetricsError;
52
53    fn try_from(builder: InstrumentBuilder<'_, Gauge<f64>>) -> Result<Self, Self::Error> {
54        builder
55            .instrument_provider
56            .f64_gauge(builder.name, builder.description, builder.unit)
57    }
58}
59
60impl TryFrom<InstrumentBuilder<'_, Gauge<i64>>> for Gauge<i64> {
61    type Error = MetricsError;
62
63    fn try_from(builder: InstrumentBuilder<'_, Gauge<i64>>) -> Result<Self, Self::Error> {
64        builder
65            .instrument_provider
66            .i64_gauge(builder.name, builder.description, builder.unit)
67    }
68}
69
70/// An async instrument that records independent readings.
71#[derive(Clone)]
72pub struct ObservableGauge<T>(Arc<dyn AsyncInstrument<T>>);
73
74impl<T> fmt::Debug for ObservableGauge<T>
75where
76    T: fmt::Debug,
77{
78    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
79        f.write_fmt(format_args!(
80            "ObservableGauge<{}>",
81            std::any::type_name::<T>()
82        ))
83    }
84}
85
86impl<T> ObservableGauge<T> {
87    /// Records the state of the instrument.
88    ///
89    /// It is only valid to call this within a callback. If called outside of the
90    /// registered callback it should have no effect on the instrument, and an
91    /// error will be reported via the error handler.
92    pub fn observe(&self, measurement: T, attributes: &[KeyValue]) {
93        self.0.observe(measurement, attributes)
94    }
95
96    /// Used by SDKs to downcast instruments in callbacks.
97    pub fn as_any(&self) -> Arc<dyn Any> {
98        self.0.as_any()
99    }
100}
101
102impl<M> AsyncInstrument<M> for ObservableGauge<M> {
103    fn observe(&self, measurement: M, attributes: &[KeyValue]) {
104        self.observe(measurement, attributes)
105    }
106
107    fn as_any(&self) -> Arc<dyn Any> {
108        self.0.as_any()
109    }
110}
111
112impl<T> ObservableGauge<T> {
113    /// Create a new gauge
114    pub fn new(inner: Arc<dyn AsyncInstrument<T>>) -> Self {
115        ObservableGauge(inner)
116    }
117}
118
119impl TryFrom<AsyncInstrumentBuilder<'_, ObservableGauge<u64>, u64>> for ObservableGauge<u64> {
120    type Error = MetricsError;
121
122    fn try_from(
123        builder: AsyncInstrumentBuilder<'_, ObservableGauge<u64>, u64>,
124    ) -> Result<Self, Self::Error> {
125        builder.meter.instrument_provider.u64_observable_gauge(
126            builder.name,
127            builder.description,
128            builder.unit,
129            builder.callbacks,
130        )
131    }
132}
133
134impl TryFrom<AsyncInstrumentBuilder<'_, ObservableGauge<f64>, f64>> for ObservableGauge<f64> {
135    type Error = MetricsError;
136
137    fn try_from(
138        builder: AsyncInstrumentBuilder<'_, ObservableGauge<f64>, f64>,
139    ) -> Result<Self, Self::Error> {
140        builder.meter.instrument_provider.f64_observable_gauge(
141            builder.name,
142            builder.description,
143            builder.unit,
144            builder.callbacks,
145        )
146    }
147}
148
149impl TryFrom<AsyncInstrumentBuilder<'_, ObservableGauge<i64>, i64>> for ObservableGauge<i64> {
150    type Error = MetricsError;
151
152    fn try_from(
153        builder: AsyncInstrumentBuilder<'_, ObservableGauge<i64>, i64>,
154    ) -> Result<Self, Self::Error> {
155        builder.meter.instrument_provider.i64_observable_gauge(
156            builder.name,
157            builder.description,
158            builder.unit,
159            builder.callbacks,
160        )
161    }
162}