Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metrics examples to stop using global shutdown #1742

Merged
merged 1 commit into from
May 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions examples/metrics-advanced/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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" {
Expand Down Expand Up @@ -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<dyn Error + Send + Sync + 'static>> {
init_meter_provider();
let meter_provider = init_meter_provider();
let meter = global::meter("mylibraryname");

// Example 1 - Rename metric using View.
Expand Down Expand Up @@ -153,6 +154,6 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
// 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(())
}
1 change: 0 additions & 1 deletion examples/metrics-basic/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
// 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(())
}
11 changes: 8 additions & 3 deletions opentelemetry-otlp/examples/basic-otlp-http/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
.install_batch(opentelemetry_sdk::runtime::Tokio)
}

fn init_metrics() -> Result<(), MetricsError> {
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
let export_config = opentelemetry_otlp::ExportConfig {
endpoint: "http://localhost:4318/v1/metrics".to_string(),
..opentelemetry_otlp::ExportConfig::default()
Expand All @@ -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");
Expand Down Expand Up @@ -88,6 +91,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
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();

Expand Down Expand Up @@ -120,7 +125,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {

global::shutdown_tracer_provider();
logger_provider.shutdown();
global::shutdown_meter_provider();
meter_provider.shutdown()?;

Ok(())
}
9 changes: 5 additions & 4 deletions opentelemetry-otlp/examples/basic-otlp/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
.install_batch(runtime::Tokio)
}

fn init_metrics() -> Result<(), MetricsError> {
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
let export_config = ExportConfig {
endpoint: "http://localhost:4317".to_string(),
..ExportConfig::default()
Expand All @@ -49,7 +49,7 @@ fn init_metrics() -> Result<(), MetricsError> {
)]))
.build();
match provider {
Ok(_provider) => Ok(()),
Ok(provider) => Ok(provider),
Err(err) => Err(err),
}
}
Expand Down Expand Up @@ -103,8 +103,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
"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.
Expand Down Expand Up @@ -148,7 +149,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {

global::shutdown_tracer_provider();
logger_provider.shutdown();
global::shutdown_meter_provider();
meter_provider.shutdown()?;

Ok(())
}
4 changes: 2 additions & 2 deletions opentelemetry-sdk/src/metrics/meter_provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 5 additions & 4 deletions opentelemetry-stdout/examples/basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")]
Expand Down Expand Up @@ -77,7 +78,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
init_trace();

#[cfg(feature = "metrics")]
init_metrics();
let meter_provider = init_metrics();

#[cfg(feature = "logs")]
let logger_provider = init_logs();
Expand All @@ -103,7 +104,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
global::shutdown_tracer_provider();

#[cfg(feature = "metrics")]
global::shutdown_meter_provider();
meter_provider.shutdown()?;

#[cfg(feature = "logs")]
drop(logger_provider);
Expand Down
Loading