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
9pub trait SyncGauge<T> {
11 fn record(&self, value: T, attributes: &[KeyValue]);
13}
14
15#[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 pub fn new(inner: Arc<dyn SyncGauge<T> + Send + Sync>) -> Self {
31 Gauge(inner)
32 }
33
34 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#[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 pub fn observe(&self, measurement: T, attributes: &[KeyValue]) {
93 self.0.observe(measurement, attributes)
94 }
95
96 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 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}