@@ -317,7 +317,13 @@ impl PeriodicReaderInner {
317317 . produce ( rm) ?;
318318 Ok ( ( ) )
319319 } else {
320- Err ( MetricError :: Other ( "pipeline is not registered" . into ( ) ) )
320+ otel_warn ! (
321+ name: "PeriodReader.MeterProviderNotRegistered" ,
322+ message = "PeriodicReader is not registered with MeterProvider. Metrics will not be collected. \
323+ This occurs when a periodic reader is created but not associated with a MeterProvider \
324+ by calling `.with_reader(reader)` on MeterProviderBuilder."
325+ ) ;
326+ Err ( MetricError :: Other ( "MeterProvider is not registered" . into ( ) ) )
321327 }
322328 }
323329
@@ -472,7 +478,7 @@ impl MetricReader for PeriodicReader {
472478mod tests {
473479 use super :: PeriodicReader ;
474480 use crate :: {
475- error:: ShutdownResult ,
481+ error:: { ShutdownError , ShutdownResult } ,
476482 metrics:: {
477483 data:: ResourceMetrics , exporter:: PushMetricExporter , reader:: MetricReader ,
478484 InMemoryMetricExporter , MetricError , MetricResult , SdkMeterProvider , Temporality ,
@@ -594,11 +600,8 @@ mod tests {
594600 #[ test]
595601 fn shutdown_repeat ( ) {
596602 // Arrange
597- let interval = std:: time:: Duration :: from_millis ( 1 ) ;
598603 let exporter = InMemoryMetricExporter :: default ( ) ;
599- let reader = PeriodicReader :: builder ( exporter. clone ( ) )
600- . with_interval ( interval)
601- . build ( ) ;
604+ let reader = PeriodicReader :: builder ( exporter. clone ( ) ) . build ( ) ;
602605
603606 let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
604607 let result = meter_provider. shutdown ( ) ;
@@ -607,20 +610,19 @@ mod tests {
607610 // calling shutdown again should return Err
608611 let result = meter_provider. shutdown ( ) ;
609612 assert ! ( result. is_err( ) ) ;
613+ assert ! ( matches!( result, Err ( ShutdownError :: AlreadyShutdown ) ) ) ;
610614
611615 // calling shutdown again should return Err
612616 let result = meter_provider. shutdown ( ) ;
613617 assert ! ( result. is_err( ) ) ;
618+ assert ! ( matches!( result, Err ( ShutdownError :: AlreadyShutdown ) ) ) ;
614619 }
615620
616621 #[ test]
617622 fn flush_after_shutdown ( ) {
618623 // Arrange
619- let interval = std:: time:: Duration :: from_millis ( 1 ) ;
620624 let exporter = InMemoryMetricExporter :: default ( ) ;
621- let reader = PeriodicReader :: builder ( exporter. clone ( ) )
622- . with_interval ( interval)
623- . build ( ) ;
625+ let reader = PeriodicReader :: builder ( exporter. clone ( ) ) . build ( ) ;
624626
625627 let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
626628 let result = meter_provider. force_flush ( ) ;
@@ -637,11 +639,8 @@ mod tests {
637639 #[ test]
638640 fn flush_repeat ( ) {
639641 // Arrange
640- let interval = std:: time:: Duration :: from_millis ( 1 ) ;
641642 let exporter = InMemoryMetricExporter :: default ( ) ;
642- let reader = PeriodicReader :: builder ( exporter. clone ( ) )
643- . with_interval ( interval)
644- . build ( ) ;
643+ let reader = PeriodicReader :: builder ( exporter. clone ( ) ) . build ( ) ;
645644
646645 let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
647646 let result = meter_provider. force_flush ( ) ;
@@ -655,11 +654,8 @@ mod tests {
655654 #[ test]
656655 fn periodic_reader_without_pipeline ( ) {
657656 // Arrange
658- let interval = std:: time:: Duration :: from_millis ( 1 ) ;
659657 let exporter = InMemoryMetricExporter :: default ( ) ;
660- let reader = PeriodicReader :: builder ( exporter. clone ( ) )
661- . with_interval ( interval)
662- . build ( ) ;
658+ let reader = PeriodicReader :: builder ( exporter. clone ( ) ) . build ( ) ;
663659
664660 let rm = & mut ResourceMetrics {
665661 resource : Resource :: empty ( ) ,
@@ -801,11 +797,8 @@ mod tests {
801797
802798 fn collection_helper ( trigger : fn ( SdkMeterProvider ) ) {
803799 // Arrange
804- let interval = std:: time:: Duration :: from_millis ( 10 ) ;
805800 let exporter = InMemoryMetricExporter :: default ( ) ;
806- let reader = PeriodicReader :: builder ( exporter. clone ( ) )
807- . with_interval ( interval)
808- . build ( ) ;
801+ let reader = PeriodicReader :: builder ( exporter. clone ( ) ) . build ( ) ;
809802 let ( sender, receiver) = mpsc:: channel ( ) ;
810803
811804 let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
@@ -919,11 +912,8 @@ mod tests {
919912 }
920913
921914 fn tokio_async_inside_observable_callback_helper ( use_current_tokio_runtime : bool ) {
922- let interval = std:: time:: Duration :: from_millis ( 10 ) ;
923915 let exporter = InMemoryMetricExporter :: default ( ) ;
924- let reader = PeriodicReader :: builder ( exporter. clone ( ) )
925- . with_interval ( interval)
926- . build ( ) ;
916+ let reader = PeriodicReader :: builder ( exporter. clone ( ) ) . build ( ) ;
927917
928918 let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
929919 let meter = meter_provider. meter ( "test" ) ;
0 commit comments