Skip to content

Commit 161d28d

Browse files
authored
Metrics examples to stop using global shutdown (#1742)
1 parent bf7b4a0 commit 161d28d

File tree

6 files changed

+25
-18
lines changed

6 files changed

+25
-18
lines changed

examples/metrics-advanced/src/main.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use opentelemetry_sdk::metrics::{
88
use opentelemetry_sdk::{runtime, Resource};
99
use std::error::Error;
1010

11-
fn init_meter_provider() {
11+
fn init_meter_provider() -> opentelemetry_sdk::metrics::SdkMeterProvider {
1212
// for example 1
1313
let my_view_rename_and_unit = |i: &Instrument| {
1414
if i.name == "my_histogram" {
@@ -61,12 +61,13 @@ fn init_meter_provider() {
6161
.with_view(my_view_drop_attributes)
6262
.with_view(my_view_change_aggregation)
6363
.build();
64-
global::set_meter_provider(provider);
64+
global::set_meter_provider(provider.clone());
65+
provider
6566
}
6667

6768
#[tokio::main]
6869
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
69-
init_meter_provider();
70+
let meter_provider = init_meter_provider();
7071
let meter = global::meter("mylibraryname");
7172

7273
// Example 1 - Rename metric using View.
@@ -153,6 +154,6 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
153154
// Metrics are exported by default every 30 seconds when using stdout exporter,
154155
// however shutting down the MeterProvider here instantly flushes
155156
// the metrics, instead of waiting for the 30 sec interval.
156-
global::shutdown_meter_provider();
157+
meter_provider.shutdown()?;
157158
Ok(())
158159
}

examples/metrics-basic/src/main.rs

-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,6 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
138138
// Metrics are exported by default every 30 seconds when using stdout exporter,
139139
// however shutting down the MeterProvider here instantly flushes
140140
// the metrics, instead of waiting for the 30 sec interval.
141-
// global::shutdown_meter_provider();
142141
meter_provider.shutdown()?;
143142
Ok(())
144143
}

opentelemetry-otlp/examples/basic-otlp-http/src/main.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
4444
.install_batch(opentelemetry_sdk::runtime::Tokio)
4545
}
4646

47-
fn init_metrics() -> Result<(), MetricsError> {
47+
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
4848
let export_config = opentelemetry_otlp::ExportConfig {
4949
endpoint: "http://localhost:4318/v1/metrics".to_string(),
5050
..opentelemetry_otlp::ExportConfig::default()
@@ -57,7 +57,10 @@ fn init_metrics() -> Result<(), MetricsError> {
5757
.with_export_config(export_config),
5858
)
5959
.build();
60-
provider.map(|_| ())
60+
match provider {
61+
Ok(provider) => Ok(provider),
62+
Err(err) => Err(err),
63+
}
6164
}
6265

6366
const LEMONS_KEY: Key = Key::from_static_str("ex.com/lemons");
@@ -88,6 +91,8 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
8891
result.err()
8992
);
9093

94+
let meter_provider = result.unwrap();
95+
9196
// 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.
9297
let logger_provider = init_logs().unwrap();
9398

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

121126
global::shutdown_tracer_provider();
122127
logger_provider.shutdown();
123-
global::shutdown_meter_provider();
128+
meter_provider.shutdown()?;
124129

125130
Ok(())
126131
}

opentelemetry-otlp/examples/basic-otlp/src/main.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ fn init_tracer() -> Result<sdktrace::Tracer, TraceError> {
3131
.install_batch(runtime::Tokio)
3232
}
3333

34-
fn init_metrics() -> Result<(), MetricsError> {
34+
fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, MetricsError> {
3535
let export_config = ExportConfig {
3636
endpoint: "http://localhost:4317".to_string(),
3737
..ExportConfig::default()
@@ -49,7 +49,7 @@ fn init_metrics() -> Result<(), MetricsError> {
4949
)]))
5050
.build();
5151
match provider {
52-
Ok(_provider) => Ok(()),
52+
Ok(provider) => Ok(provider),
5353
Err(err) => Err(err),
5454
}
5555
}
@@ -103,8 +103,9 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
103103
"Init metrics failed with error: {:?}",
104104
result.err()
105105
);
106+
let meter_provider = result.unwrap();
106107

107-
// Initialize logs, which sets the global loggerprovider.
108+
// Initialize logs and save the logger_provider.
108109
let logger_provider = init_logs().unwrap();
109110

110111
// Create a new OpenTelemetryLogBridge using the above LoggerProvider.
@@ -148,7 +149,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
148149

149150
global::shutdown_tracer_provider();
150151
logger_provider.shutdown();
151-
global::shutdown_meter_provider();
152+
meter_provider.shutdown()?;
152153

153154
Ok(())
154155
}

opentelemetry-sdk/src/metrics/meter_provider.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -397,13 +397,13 @@ mod tests {
397397
let provider = super::SdkMeterProvider::builder()
398398
.with_reader(reader.clone())
399399
.build();
400-
global::set_meter_provider(provider);
400+
global::set_meter_provider(provider.clone());
401401
assert!(!reader.is_shutdown());
402402
// create a meter and an instrument
403403
let meter = global::meter("test");
404404
let counter = meter.u64_counter("test_counter").init();
405405
// no need to drop a meter for meter_provider shutdown
406-
global::shutdown_meter_provider();
406+
provider.shutdown().unwrap();
407407
assert!(reader.is_shutdown());
408408
// TODO Fix: the instrument is still available, and can be used.
409409
// While the reader is shutdown, and no collect is happening

opentelemetry-stdout/examples/basic.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ fn init_trace() {
2424
}
2525

2626
#[cfg(feature = "metrics")]
27-
fn init_metrics() {
27+
fn init_metrics() -> opentelemetry_sdk::metrics::SdkMeterProvider {
2828
let exporter = opentelemetry_stdout::MetricsExporter::default();
2929
let reader = PeriodicReader::builder(exporter, runtime::Tokio).build();
3030
let provider = SdkMeterProvider::builder().with_reader(reader).build();
31-
global::set_meter_provider(provider);
31+
global::set_meter_provider(provider.clone());
32+
provider
3233
}
3334

3435
#[cfg(feature = "logs")]
@@ -77,7 +78,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
7778
init_trace();
7879

7980
#[cfg(feature = "metrics")]
80-
init_metrics();
81+
let meter_provider = init_metrics();
8182

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

105106
#[cfg(feature = "metrics")]
106-
global::shutdown_meter_provider();
107+
meter_provider.shutdown()?;
107108

108109
#[cfg(feature = "logs")]
109110
drop(logger_provider);

0 commit comments

Comments
 (0)