Skip to content

Commit 1a4e931

Browse files
authored
Minor fixes to PeriodicReader and examples (#2409)
1 parent 238a8f2 commit 1a4e931

File tree

6 files changed

+39
-35
lines changed

6 files changed

+39
-35
lines changed

opentelemetry-otlp/examples/basic-otlp-http/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ experimental_metrics_periodicreader_with_async_runtime = ["opentelemetry_sdk/exp
1515
[dependencies]
1616
once_cell = { workspace = true }
1717
opentelemetry = { path = "../../../opentelemetry" }
18-
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "metrics", "logs", "experimental_metrics_periodicreader_with_async_runtime"]}
18+
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "experimental_metrics_periodicreader_with_async_runtime"]}
1919
opentelemetry-http = { path = "../../../opentelemetry-http", optional = true, default-features = false}
2020
opentelemetry-otlp = { path = "../..", features = ["http-proto", "http-json", "logs"] , default-features = false}
2121
opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing", default-features = false}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,6 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
8282

8383
#[tokio::main]
8484
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
85-
let tracer_provider = init_traces()?;
86-
global::set_tracer_provider(tracer_provider.clone());
87-
88-
let meter_provider = init_metrics()?;
89-
global::set_meter_provider(meter_provider.clone());
90-
9185
let logger_provider = init_logs()?;
9286

9387
// Create a new OpenTelemetryTracingBridge using the above LoggerProvider.
@@ -126,6 +120,12 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
126120
.with(fmt_layer)
127121
.init();
128122

123+
let tracer_provider = init_traces()?;
124+
global::set_tracer_provider(tracer_provider.clone());
125+
126+
let meter_provider = init_metrics()?;
127+
global::set_meter_provider(meter_provider.clone());
128+
129129
let common_scope_attributes = vec![KeyValue::new("scope-key", "scope-value")];
130130
let scope = InstrumentationScope::builder("basic")
131131
.with_version("1.0")

opentelemetry-otlp/examples/basic-otlp/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ publish = false
77

88
[dependencies]
99
once_cell = { workspace = true }
10-
opentelemetry = { path = "../../../opentelemetry", features = ["metrics", "logs"] }
11-
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio", "logs"] }
12-
opentelemetry-otlp = { path = "../../../opentelemetry-otlp", features = ["tonic", "metrics", "logs"] }
10+
opentelemetry = { path = "../../../opentelemetry" }
11+
opentelemetry_sdk = { path = "../../../opentelemetry-sdk", features = ["rt-tokio"] }
12+
opentelemetry-otlp = { path = "../../../opentelemetry-otlp" }
1313
opentelemetry-semantic-conventions = { path = "../../../opentelemetry-semantic-conventions" }
1414
tokio = { version = "1.0", features = ["full"] }
1515
opentelemetry-appender-tracing = { path = "../../../opentelemetry-appender-tracing", default-features = false}

opentelemetry-otlp/examples/basic-otlp/README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,16 @@ The example employs a `BatchExporter` for logs and traces, which is the
1414
recommended approach when using OTLP exporters. While it can be modified to use
1515
a `SimpleExporter`, this requires the main method to be a `tokio::main` function
1616
since the `tonic` client requires a Tokio runtime. If you prefer not to use
17-
`tokio::main`, then the `init_logs`, `init_traces`, and `init_metrics` functions
18-
must be executed within a Tokio runtime. Below is an example:
17+
`tokio::main`, then the `init_logs` and `init_traces` functions must be executed
18+
within a Tokio runtime.
19+
20+
This examples uses the default `PeriodicReader` for metrics, which uses own
21+
thread for background processing/exporting. Since the `tonic` client requires a
22+
Tokio runtime, the main method must be a `tokio::main` function. If you prefer not
23+
to use `tokio::main`, then the `init_metrics` function must be executed within a
24+
Tokio runtime.
25+
26+
Below is an example on how to use non `tokio::main`:
1927

2028
```rust
2129
fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,6 @@ fn init_logs() -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
5656

5757
#[tokio::main]
5858
async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
59-
let tracer_provider = init_traces()?;
60-
global::set_tracer_provider(tracer_provider.clone());
61-
62-
let meter_provider = init_metrics()?;
63-
global::set_meter_provider(meter_provider.clone());
64-
6559
let logger_provider = init_logs()?;
6660

6761
// Create a new OpenTelemetryTracingBridge using the above LoggerProvider.
@@ -100,6 +94,12 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
10094
.with(fmt_layer)
10195
.init();
10296

97+
let tracer_provider = init_traces()?;
98+
global::set_tracer_provider(tracer_provider.clone());
99+
100+
let meter_provider = init_metrics()?;
101+
global::set_meter_provider(meter_provider.clone());
102+
103103
let common_scope_attributes = vec![KeyValue::new("scope-key", "scope-value")];
104104
let scope = InstrumentationScope::builder("basic")
105105
.with_version("1.0")

opentelemetry-sdk/src/metrics/periodic_reader.rs

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,12 @@ impl PeriodicReader {
175175
let mut remaining_interval = interval;
176176
otel_info!(
177177
name: "PeriodReaderThreadStarted",
178-
interval = interval.as_secs(),
179-
timeout = timeout.as_secs()
178+
interval_in_millisecs = interval.as_millis(),
179+
timeout_in_millisecs = timeout.as_millis()
180180
);
181181
loop {
182182
otel_debug!(
183-
name: "PeriodReaderThreadLoopAlive", message = "Next export will happen after interval, unless flush or shutdown is triggered.", interval = remaining_interval.as_millis()
183+
name: "PeriodReaderThreadLoopAlive", message = "Next export will happen after interval, unless flush or shutdown is triggered.", interval_in_millisecs = remaining_interval.as_millis()
184184
);
185185
match message_receiver.recv_timeout(remaining_interval) {
186186
Ok(Message::Flush(response_sender)) => {
@@ -228,22 +228,19 @@ impl PeriodicReader {
228228
Err(mpsc::RecvTimeoutError::Timeout) => {
229229
let export_start = Instant::now();
230230
otel_debug!(
231-
name: "PeriodReaderThreadExportingDueToTimer",
232-
event_name = "PeriodReaderThreadExportingDueToTimer"
231+
name: "PeriodReaderThreadExportingDueToTimer"
233232
);
234233

235234
if let Err(_e) = cloned_reader.collect_and_export(timeout) {
236235
otel_debug!(
237-
name: "PeriodReaderThreadExportingDueToTimerFailed",
238-
event_name = "PeriodReaderThreadExportingDueToTimerFailed"
236+
name: "PeriodReaderThreadExportingDueToTimerFailed"
239237
);
240238
}
241239

242240
let time_taken_for_export = export_start.elapsed();
243241
if time_taken_for_export > interval {
244242
otel_debug!(
245-
name: "PeriodReaderThreadExportTookLongerThanInterval",
246-
event_name = "PeriodReaderThreadExportTookLongerThanInterval"
243+
name: "PeriodReaderThreadExportTookLongerThanInterval"
247244
);
248245
// if export took longer than interval, do the
249246
// next export immediately.
@@ -265,8 +262,7 @@ impl PeriodicReader {
265262
}
266263
}
267264
otel_info!(
268-
name: "PeriodReaderThreadStopped",
269-
event_name = "PeriodReaderThreadStopped"
265+
name: "PeriodReaderThreadStopped"
270266
);
271267
});
272268

@@ -275,7 +271,6 @@ impl PeriodicReader {
275271
if let Err(e) = result_thread_creation {
276272
otel_error!(
277273
name: "PeriodReaderThreadStartError",
278-
event_name = "PeriodReaderThreadStartError",
279274
error = format!("{:?}", e)
280275
);
281276
}
@@ -339,7 +334,6 @@ impl PeriodicReaderInner {
339334
if let Err(e) = collect_result {
340335
otel_warn!(
341336
name: "PeriodReaderCollectError",
342-
event_name = "PeriodReaderCollectError",
343337
error = format!("{:?}", e)
344338
);
345339
return Err(e);
@@ -350,6 +344,11 @@ impl PeriodicReaderInner {
350344
return Ok(());
351345
}
352346

347+
let metrics_count = rm.scope_metrics.iter().fold(0, |count, scope_metrics| {
348+
count + scope_metrics.metrics.len()
349+
});
350+
otel_debug!(name: "PeriodicReaderMetricsCollected", count = metrics_count);
351+
353352
// TODO: substract the time taken for collect from the timeout. collect
354353
// involves observable callbacks too, which are user defined and can
355354
// take arbitrary time.
@@ -362,7 +361,6 @@ impl PeriodicReaderInner {
362361
if let Err(e) = exporter_result {
363362
otel_warn!(
364363
name: "PeriodReaderExportError",
365-
event_name = "PeriodReaderExportError",
366364
error = format!("{:?}", e)
367365
);
368366
return Err(e);
@@ -385,7 +383,6 @@ impl PeriodicReaderInner {
385383
Err(e) => {
386384
otel_debug!(
387385
name: "PeriodReaderForceFlushError",
388-
event_name = "PeriodReaderForceFlushError",
389386
error = format!("{:?}", e)
390387
);
391388
return Err(MetricError::Other(e.to_string()));
@@ -420,7 +417,6 @@ impl PeriodicReaderInner {
420417
Err(e) => {
421418
otel_debug!(
422419
name: "PeriodReaderShutdownError",
423-
event_name = "PeriodReaderShutdownError",
424420
error = format!("{:?}", e)
425421
);
426422
return Err(MetricError::Other(e.to_string()));
@@ -504,7 +500,7 @@ mod tests {
504500
};
505501

506502
// use below command to run all tests
507-
// cargo test metrics::periodic_reader_with_own_thread::tests --features=testing,experimental_metrics_periodic_reader_no_runtime -- --nocapture
503+
// cargo test metrics::periodic_reader::tests --features=testing,spec_unstable_metrics_views -- --nocapture
508504

509505
#[derive(Debug, Clone)]
510506
struct MetricExporterThatFailsOnlyOnFirst {

0 commit comments

Comments
 (0)