@@ -409,20 +409,52 @@ impl MetricReader for PeriodicReader {
409
409
mod tests {
410
410
use super :: PeriodicReader ;
411
411
use crate :: {
412
- metrics:: data:: ResourceMetrics , metrics:: reader:: MetricReader , runtime ,
413
- testing:: metrics:: InMemoryMetricsExporter , Resource ,
412
+ metrics:: data:: ResourceMetrics , metrics:: reader:: MetricReader , metrics :: SdkMeterProvider ,
413
+ runtime , testing:: metrics:: InMemoryMetricsExporter , Resource ,
414
414
} ;
415
+ use opentelemetry:: metrics:: MeterProvider ;
416
+ use std:: sync:: mpsc;
417
+
418
+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
419
+ async fn registration_triggers_collection ( ) {
420
+ // Arrange
421
+ let interval = std:: time:: Duration :: from_millis ( 1 ) ;
422
+ let exporter = InMemoryMetricsExporter :: default ( ) ;
423
+ let reader = PeriodicReader :: builder ( exporter. clone ( ) , runtime:: Tokio )
424
+ . with_interval ( interval)
425
+ . build ( ) ;
426
+ let ( sender, receiver) = mpsc:: channel ( ) ;
427
+
428
+ // Act
429
+ let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
430
+ let meter = meter_provider. meter ( "test" ) ;
431
+ let counter = meter. u64_observable_counter ( "testcounter" ) . init ( ) ;
432
+ meter
433
+ . register_callback ( & [ counter. as_any ( ) ] , move |_| {
434
+ sender. send ( ( ) ) . expect ( "channel should still be open" ) ;
435
+ } )
436
+ . expect ( "callback registration should succeed" ) ;
437
+
438
+ // Assert
439
+ receiver
440
+ . recv_timeout ( interval * 2 )
441
+ . expect ( "message should be available in channel, indicating a collection occurred" ) ;
442
+ }
415
443
416
444
#[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
417
445
async fn unregistered_collect ( ) {
446
+ // Arrange
418
447
let exporter = InMemoryMetricsExporter :: default ( ) ;
419
448
let reader = PeriodicReader :: builder ( exporter. clone ( ) , runtime:: Tokio ) . build ( ) ;
420
-
421
449
let mut rm = ResourceMetrics {
422
450
resource : Resource :: empty ( ) ,
423
451
scope_metrics : Vec :: new ( ) ,
424
452
} ;
453
+
454
+ // Act
425
455
let result = reader. collect ( & mut rm) ;
456
+
457
+ // Assert
426
458
result. expect_err ( "error expected when reader is not registered" ) ;
427
459
}
428
460
}
0 commit comments