1
1
use crate :: sdk:: InstrumentationLibrary ;
2
2
use crate :: {
3
3
metrics:: {
4
- sdk_api, AsyncRunner , BatchObserver , BatchObserverCallback , CounterBuilder , Descriptor ,
4
+ sdk_api, AsyncRunner , BatchObserver , BatchObserverResult , CounterBuilder , Descriptor ,
5
5
Measurement , NumberKind , ObserverResult , Result , SumObserverBuilder , UpDownCounterBuilder ,
6
6
UpDownSumObserverBuilder , ValueObserverBuilder , ValueRecorderBuilder ,
7
7
} ,
@@ -93,7 +93,7 @@ impl Meter {
93
93
SumObserverBuilder :: new (
94
94
self ,
95
95
name. into ( ) ,
96
- AsyncRunner :: F64 ( Box :: new ( callback) ) ,
96
+ Some ( AsyncRunner :: F64 ( Box :: new ( callback) ) ) ,
97
97
NumberKind :: F64 ,
98
98
)
99
99
}
@@ -111,7 +111,7 @@ impl Meter {
111
111
UpDownSumObserverBuilder :: new (
112
112
self ,
113
113
name. into ( ) ,
114
- AsyncRunner :: F64 ( Box :: new ( callback) ) ,
114
+ Some ( AsyncRunner :: F64 ( Box :: new ( callback) ) ) ,
115
115
NumberKind :: F64 ,
116
116
)
117
117
}
@@ -125,7 +125,7 @@ impl Meter {
125
125
ValueObserverBuilder :: new (
126
126
self ,
127
127
name. into ( ) ,
128
- AsyncRunner :: F64 ( Box :: new ( callback) ) ,
128
+ Some ( AsyncRunner :: F64 ( Box :: new ( callback) ) ) ,
129
129
NumberKind :: F64 ,
130
130
)
131
131
}
@@ -163,7 +163,7 @@ impl Meter {
163
163
SumObserverBuilder :: new (
164
164
self ,
165
165
name. into ( ) ,
166
- AsyncRunner :: I64 ( Box :: new ( callback) ) ,
166
+ Some ( AsyncRunner :: I64 ( Box :: new ( callback) ) ) ,
167
167
NumberKind :: I64 ,
168
168
)
169
169
}
@@ -181,7 +181,7 @@ impl Meter {
181
181
UpDownSumObserverBuilder :: new (
182
182
self ,
183
183
name. into ( ) ,
184
- AsyncRunner :: I64 ( Box :: new ( callback) ) ,
184
+ Some ( AsyncRunner :: I64 ( Box :: new ( callback) ) ) ,
185
185
NumberKind :: I64 ,
186
186
)
187
187
}
@@ -195,7 +195,7 @@ impl Meter {
195
195
ValueObserverBuilder :: new (
196
196
self ,
197
197
name. into ( ) ,
198
- AsyncRunner :: I64 ( Box :: new ( callback) ) ,
198
+ Some ( AsyncRunner :: I64 ( Box :: new ( callback) ) ) ,
199
199
NumberKind :: I64 ,
200
200
)
201
201
}
@@ -233,7 +233,7 @@ impl Meter {
233
233
SumObserverBuilder :: new (
234
234
self ,
235
235
name. into ( ) ,
236
- AsyncRunner :: U64 ( Box :: new ( callback) ) ,
236
+ Some ( AsyncRunner :: U64 ( Box :: new ( callback) ) ) ,
237
237
NumberKind :: U64 ,
238
238
)
239
239
}
@@ -251,7 +251,7 @@ impl Meter {
251
251
UpDownSumObserverBuilder :: new (
252
252
self ,
253
253
name. into ( ) ,
254
- AsyncRunner :: U64 ( Box :: new ( callback) ) ,
254
+ Some ( AsyncRunner :: U64 ( Box :: new ( callback) ) ) ,
255
255
NumberKind :: U64 ,
256
256
)
257
257
}
@@ -265,15 +265,75 @@ impl Meter {
265
265
ValueObserverBuilder :: new (
266
266
self ,
267
267
name. into ( ) ,
268
- AsyncRunner :: U64 ( Box :: new ( callback) ) ,
268
+ Some ( AsyncRunner :: U64 ( Box :: new ( callback) ) ) ,
269
269
NumberKind :: U64 ,
270
270
)
271
271
}
272
272
273
- /// Creates a new `BatchObserver` that supports making batches of observations for
274
- /// multiple instruments.
275
- pub fn batch_observer ( & self , callback : BatchObserverCallback ) -> BatchObserver < ' _ > {
276
- BatchObserver :: new ( self , AsyncRunner :: Batch ( callback) )
273
+ /// Creates a new `BatchObserver` that supports making batches of observations
274
+ /// for multiple instruments or returns an error if instrument initialization
275
+ /// fails.
276
+ ///
277
+ /// # Examples
278
+ ///
279
+ /// ```
280
+ /// use opentelemetry::{global, metrics::BatchObserverResult, KeyValue};
281
+ ///
282
+ /// # fn init_observer() -> opentelemetry::metrics::Result<()> {
283
+ /// let meter = global::meter("test");
284
+ ///
285
+ /// meter.build_batch_observer(|batch| {
286
+ /// let instrument = batch.u64_value_observer("test_instrument").try_init()?;
287
+ ///
288
+ /// Ok(move |result: BatchObserverResult| {
289
+ /// result.observe(&[KeyValue::new("my-key", "my-value")], &[instrument.observation(1)]);
290
+ /// })
291
+ /// })?;
292
+ /// # Ok(())
293
+ /// # }
294
+ /// ```
295
+ pub fn build_batch_observer < B , F > ( & self , builder : B ) -> Result < ( ) >
296
+ where
297
+ B : Fn ( BatchObserver < ' _ > ) -> Result < F > ,
298
+ F : Fn ( BatchObserverResult ) + Send + Sync + ' static ,
299
+ {
300
+ let observer = builder ( BatchObserver :: new ( self ) ) ?;
301
+ self . core
302
+ . new_batch_observer ( AsyncRunner :: Batch ( Box :: new ( observer) ) )
303
+ }
304
+
305
+ /// Creates a new `BatchObserver` that supports making batches of observations
306
+ /// for multiple instruments.
307
+ ///
308
+ /// # Panics
309
+ ///
310
+ /// Panics if instrument initialization or observer registration returns an
311
+ /// error.
312
+ ///
313
+ /// # Examples
314
+ ///
315
+ /// ```
316
+ /// use opentelemetry::{global, metrics::BatchObserverResult, KeyValue};
317
+ ///
318
+ /// let meter = global::meter("test");
319
+ ///
320
+ /// meter.batch_observer(|batch| {
321
+ /// let instrument = batch.u64_value_observer("test_instrument").init();
322
+ ///
323
+ /// move |result: BatchObserverResult| {
324
+ /// result.observe(&[KeyValue::new("my-key", "my-value")], &[instrument.observation(1)]);
325
+ /// }
326
+ /// });
327
+ /// ```
328
+ pub fn batch_observer < B , F > ( & self , builder : B )
329
+ where
330
+ B : Fn ( BatchObserver < ' _ > ) -> F ,
331
+ F : Fn ( BatchObserverResult ) + Send + Sync + ' static ,
332
+ {
333
+ let observer = builder ( BatchObserver :: new ( self ) ) ;
334
+ self . core
335
+ . new_batch_observer ( AsyncRunner :: Batch ( Box :: new ( observer) ) )
336
+ . unwrap ( )
277
337
}
278
338
279
339
/// Atomically record a batch of measurements.
@@ -306,7 +366,7 @@ impl Meter {
306
366
pub ( crate ) fn new_async_instrument (
307
367
& self ,
308
368
descriptor : Descriptor ,
309
- runner : AsyncRunner ,
369
+ runner : Option < AsyncRunner > ,
310
370
) -> Result < Arc < dyn sdk_api:: AsyncInstrumentCore > > {
311
371
self . core . new_async_instrument ( descriptor, runner)
312
372
}
0 commit comments