diff --git a/examples/metrics-advanced/src/main.rs b/examples/metrics-advanced/src/main.rs index 08fb026e42..6731071555 100644 --- a/examples/metrics-advanced/src/main.rs +++ b/examples/metrics-advanced/src/main.rs @@ -8,7 +8,7 @@ use opentelemetry_sdk::metrics::{ use opentelemetry_sdk::{runtime, Resource}; use std::error::Error; -fn init_meter_provider() { +fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider { // for example 1 let my_view_rename_and_unit = |i: &Instrument| { if i.name == "my_histogram" { @@ -61,12 +61,13 @@ fn init_meter_provider() { .with_view(my_view_drop_attributes) .with_view(my_view_change_aggregation) .build(); - global::set_meter_provider(provider); + global::set_meter_provider(provider.clone()); + provider } #[tokio::main] async fn main() -> Result<(), Box> { - init_meter_provider(); + let meter_provider = init_meter_provider(); let meter = global::meter("mylibraryname"); // Example 1 - Rename metric using View. @@ -153,6 +154,6 @@ async fn main() -> Result<(), Box> { // Metrics are exported by default every 30 seconds when using stdout exporter, // however shutting down the MeterProvider here instantly flushes // the metrics, instead of waiting for the 30 sec interval. - global::shutdown_meter_provider(); + meter_provider.shutdown()?; Ok(()) } diff --git a/examples/metrics-basic/src/main.rs b/examples/metrics-basic/src/main.rs index c6d7e6d303..e965ab6efa 100644 --- a/examples/metrics-basic/src/main.rs +++ b/examples/metrics-basic/src/main.rs @@ -138,7 +138,6 @@ async fn main() -> Result<(), Box> { // Metrics are exported by default every 30 seconds when using stdout exporter, // however shutting down the MeterProvider here instantly flushes // the metrics, instead of waiting for the 30 sec interval. - // global::shutdown_meter_provider(); meter_provider.shutdown()?; Ok(()) } diff --git a/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs b/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs index 32e50cb4d5..06ddaed292 100644 --- a/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs +++ b/opentelemetry-otlp/examples/basic-otlp-http/src/main.rs @@ -44,7 +44,7 @@ fn init_tracer() -> Result { .install_batch(opentelemetry_sdk::runtime::Tokio) } -fn init_metrics() -> Result<(), MetricsError> { +fn init_metrics() -> Result { let export_config = opentelemetry_otlp::ExportConfig { endpoint: "http://localhost:4318/v1/metrics".to_string(), ..opentelemetry_otlp::ExportConfig::default() @@ -57,7 +57,10 @@ fn init_metrics() -> Result<(), MetricsError> { .with_export_config(export_config), ) .build(); - provider.map(|_| ()) + match provider { + Ok(provider) => Ok(provider), + Err(err) => Err(err), + } } const LEMONS_KEY: Key = Key::from_static_str("ex.com/lemons"); @@ -88,6 +91,8 @@ async fn main() -> Result<(), Box> { result.err() ); + let meter_provider = result.unwrap(); + // Opentelemetry will not provide a global API to manage the logger provider. Application users must manage the lifecycle of the logger provider on their own. Dropping logger providers will disable log emitting. let logger_provider = init_logs().unwrap(); @@ -120,7 +125,7 @@ async fn main() -> Result<(), Box> { global::shutdown_tracer_provider(); logger_provider.shutdown(); - global::shutdown_meter_provider(); + meter_provider.shutdown()?; Ok(()) } diff --git a/opentelemetry-otlp/examples/basic-otlp/src/main.rs b/opentelemetry-otlp/examples/basic-otlp/src/main.rs index 97d2fd498f..b966b6efbf 100644 --- a/opentelemetry-otlp/examples/basic-otlp/src/main.rs +++ b/opentelemetry-otlp/examples/basic-otlp/src/main.rs @@ -31,7 +31,7 @@ fn init_tracer() -> Result { .install_batch(runtime::Tokio) } -fn init_metrics() -> Result<(), MetricsError> { +fn init_metrics() -> Result { let export_config = ExportConfig { endpoint: "http://localhost:4317".to_string(), ..ExportConfig::default() @@ -49,7 +49,7 @@ fn init_metrics() -> Result<(), MetricsError> { )])) .build(); match provider { - Ok(_provider) => Ok(()), + Ok(provider) => Ok(provider), Err(err) => Err(err), } } @@ -103,8 +103,9 @@ async fn main() -> Result<(), Box> { "Init metrics failed with error: {:?}", result.err() ); + let meter_provider = result.unwrap(); - // Initialize logs, which sets the global loggerprovider. + // Initialize logs and save the logger_provider. let logger_provider = init_logs().unwrap(); // Create a new OpenTelemetryLogBridge using the above LoggerProvider. @@ -148,7 +149,7 @@ async fn main() -> Result<(), Box> { global::shutdown_tracer_provider(); logger_provider.shutdown(); - global::shutdown_meter_provider(); + meter_provider.shutdown()?; Ok(()) } diff --git a/opentelemetry-sdk/src/metrics/meter_provider.rs b/opentelemetry-sdk/src/metrics/meter_provider.rs index da44a3ac05..bd8a92d811 100644 --- a/opentelemetry-sdk/src/metrics/meter_provider.rs +++ b/opentelemetry-sdk/src/metrics/meter_provider.rs @@ -397,13 +397,13 @@ mod tests { let provider = super::SdkMeterProvider::builder() .with_reader(reader.clone()) .build(); - global::set_meter_provider(provider); + global::set_meter_provider(provider.clone()); assert!(!reader.is_shutdown()); // create a meter and an instrument let meter = global::meter("test"); let counter = meter.u64_counter("test_counter").init(); // no need to drop a meter for meter_provider shutdown - global::shutdown_meter_provider(); + provider.shutdown().unwrap(); assert!(reader.is_shutdown()); // TODO Fix: the instrument is still available, and can be used. // While the reader is shutdown, and no collect is happening diff --git a/opentelemetry-stdout/examples/basic.rs b/opentelemetry-stdout/examples/basic.rs index 6c1ce10e03..b0bb566acd 100644 --- a/opentelemetry-stdout/examples/basic.rs +++ b/opentelemetry-stdout/examples/basic.rs @@ -24,11 +24,12 @@ fn init_trace() { } #[cfg(feature = "metrics")] -fn init_metrics() { +fn init_metrics() -> opentelemetry_sdk::metrics::SdkMeterProvider { let exporter = opentelemetry_stdout::MetricsExporter::default(); let reader = PeriodicReader::builder(exporter, runtime::Tokio).build(); let provider = SdkMeterProvider::builder().with_reader(reader).build(); - global::set_meter_provider(provider); + global::set_meter_provider(provider.clone()); + provider } #[cfg(feature = "logs")] @@ -77,7 +78,7 @@ async fn main() -> Result<(), Box> { init_trace(); #[cfg(feature = "metrics")] - init_metrics(); + let meter_provider = init_metrics(); #[cfg(feature = "logs")] let logger_provider = init_logs(); @@ -103,7 +104,7 @@ async fn main() -> Result<(), Box> { global::shutdown_tracer_provider(); #[cfg(feature = "metrics")] - global::shutdown_meter_provider(); + meter_provider.shutdown()?; #[cfg(feature = "logs")] drop(logger_provider);