Skip to content

Commit 938893c

Browse files
authored
Handle batch log processing in a dedicated background thread (open-telemetry#2436)
1 parent 0605341 commit 938893c

File tree

11 files changed

+485
-99
lines changed

11 files changed

+485
-99
lines changed

opentelemetry-appender-log/examples/logs-basic.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
use log::{error, info, warn, Level};
88
use opentelemetry_appender_log::OpenTelemetryLogBridge;
99
use opentelemetry_sdk::logs::{BatchLogProcessor, LoggerProvider};
10-
use opentelemetry_sdk::runtime;
1110
use opentelemetry_stdout::LogExporter;
1211

1312
#[tokio::main]
@@ -16,7 +15,7 @@ async fn main() {
1615
let exporter = LogExporter::default();
1716
//Create a LoggerProvider and register the exporter
1817
let logger_provider = LoggerProvider::builder()
19-
.with_log_processor(BatchLogProcessor::builder(exporter, runtime::Tokio).build())
18+
.with_log_processor(BatchLogProcessor::builder(exporter).build())
2019
.build();
2120

2221
// Setup Log Appender for the log crate.

opentelemetry-appender-tracing/src/layer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ mod tests {
296296
async fn batch_processor_no_deadlock() {
297297
let exporter: ReentrantLogExporter = ReentrantLogExporter;
298298
let logger_provider = LoggerProvider::builder()
299-
.with_batch_exporter(exporter.clone(), opentelemetry_sdk::runtime::Tokio)
299+
.with_batch_exporter(exporter.clone())
300300
.build();
301301

302302
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ fn init_logs() -> Result<sdklogs::LoggerProvider, opentelemetry_sdk::logs::LogEr
3737
.build()?;
3838

3939
Ok(LoggerProvider::builder()
40-
.with_batch_exporter(exporter, runtime::Tokio)
40+
.with_batch_exporter(exporter)
4141
.with_resource(RESOURCE.clone())
4242
.build())
4343
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn init_logs() -> Result<opentelemetry_sdk::logs::LoggerProvider, LogError> {
4949

5050
Ok(LoggerProvider::builder()
5151
.with_resource(RESOURCE.clone())
52-
.with_batch_exporter(exporter, runtime::Tokio)
52+
.with_batch_exporter(exporter)
5353
.build())
5454
}
5555

opentelemetry-otlp/tests/integration_test/tests/logs.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use log::{info, Level};
88
use opentelemetry_appender_log::OpenTelemetryLogBridge;
99
use opentelemetry_otlp::LogExporter;
1010
use opentelemetry_sdk::logs::LoggerProvider;
11-
use opentelemetry_sdk::{logs as sdklogs, runtime, Resource};
11+
use opentelemetry_sdk::{logs as sdklogs, Resource};
1212
use std::fs::File;
1313
use std::os::unix::fs::MetadataExt;
1414
use std::time::Duration;
@@ -28,7 +28,7 @@ fn init_logs() -> Result<sdklogs::LoggerProvider> {
2828
let exporter = exporter_builder.build()?;
2929

3030
Ok(LoggerProvider::builder()
31-
.with_batch_exporter(exporter, runtime::Tokio)
31+
.with_batch_exporter(exporter)
3232
.with_resource(
3333
Resource::builder_empty()
3434
.with_service_name("logs-integration-test")
@@ -48,6 +48,9 @@ pub async fn test_logs() -> Result<()> {
4848
log::set_max_level(Level::Info.to_level_filter());
4949

5050
info!(target: "my-target", "hello from {}. My price is {}.", "banana", 2.99);
51+
52+
// TODO: remove below wait before calling logger_provider.shutdown()
53+
tokio::time::sleep(Duration::from_secs(10)).await;
5154
let _ = logger_provider.shutdown();
5255

5356
tokio::time::sleep(Duration::from_secs(10)).await;

opentelemetry-sdk/CHANGELOG.md

+52-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@
9595

9696
- Bump msrv to 1.75.0.
9797

98-
9998
- *Breaking* : [#2314](https://github.com/open-telemetry/opentelemetry-rust/pull/2314)
10099
- The LogRecord struct has been updated:
101100
- All fields are now pub(crate) instead of pub.
@@ -105,6 +104,58 @@
105104
- Upgrade the tracing crate used for internal logging to version 0.1.40 or later. This is necessary because the internal logging macros utilize the name field as
106105
metadata, a feature introduced in version 0.1.40. [#2418](https://github.com/open-telemetry/opentelemetry-rust/pull/2418)
107106

107+
- **Breaking** [#2436](https://github.com/open-telemetry/opentelemetry-rust/pull/2436)
108+
109+
`BatchLogProcessor` no longer requires an async runtime by default. Instead, a dedicated
110+
background thread is created to do the batch processing and exporting.
111+
112+
For users who prefer the previous behavior of relying on a specific
113+
`Runtime`, they can do so by enabling the feature flag
114+
**`experimental_logs_batch_log_processor_with_async_runtime`**.
115+
116+
1. *Default Implementation, requires no async runtime* (**Recommended**) The
117+
new default implementation does not require a runtime argument. Replace the
118+
builder method accordingly:
119+
- *Before:*
120+
```rust
121+
let logger_provider = LoggerProvider::builder()
122+
.with_log_processor(BatchLogProcessor::builder(exporter, runtime::Tokio).build())
123+
.build();
124+
```
125+
126+
- *After:*
127+
```rust
128+
let logger_provider = LoggerProvider::builder()
129+
.with_log_processor(BatchLogProcessor::builder(exporter).build())
130+
.build();
131+
```
132+
133+
2. *Async Runtime Support*
134+
If your application cannot spin up new threads or you prefer using async
135+
runtimes, enable the
136+
"experimental_logs_batch_log_processor_with_async_runtime" feature flag and
137+
adjust code as below.
138+
139+
- *Before:*
140+
```rust
141+
let logger_provider = LoggerProvider::builder()
142+
.with_log_processor(BatchLogProcessor::builder(exporter, runtime::Tokio).build())
143+
.build();
144+
```
145+
146+
- *After:*
147+
```rust
148+
let logger_provider = LoggerProvider::builder()
149+
.with_log_processor(BatchLogProcessorWithAsyncRuntime::builder(exporter, runtime::Tokio).build())
150+
.build();
151+
```
152+
153+
*Requirements:*
154+
- Enable the feature flag:
155+
`experimental_logs_batch_log_processor_with_async_runtime`.
156+
- Continue enabling one of the async runtime feature flags: `rt-tokio`,
157+
`rt-tokio-current-thread`, or `rt-async-std`.
158+
108159
## 0.27.1
109160

110161
Released 2024-Nov-27

opentelemetry-sdk/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ internal-logs = ["tracing"]
5656
experimental_metrics_periodic_reader_no_runtime = ["metrics"]
5757
experimental_metrics_periodicreader_with_async_runtime = ["metrics"]
5858
spec_unstable_metrics_views = ["metrics"]
59+
experimental_logs_batch_log_processor_with_async_runtime = ["logs"]
5960

6061
[[bench]]
6162
name = "context"

opentelemetry-sdk/src/logs/log_emitter.rs

+3-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::{BatchLogProcessor, LogProcessor, LogRecord, SimpleLogProcessor, TraceContext};
2-
use crate::{export::logs::LogExporter, runtime::RuntimeChannel, Resource};
2+
use crate::{export::logs::LogExporter, Resource};
33
use crate::{logs::LogError, logs::LogResult};
44
use opentelemetry::{otel_debug, otel_info, trace::TraceContextExt, Context, InstrumentationScope};
55

@@ -194,12 +194,8 @@ impl Builder {
194194
}
195195

196196
/// The `LogExporter` setup using a default `BatchLogProcessor` that this provider should use.
197-
pub fn with_batch_exporter<T: LogExporter + 'static, R: RuntimeChannel>(
198-
self,
199-
exporter: T,
200-
runtime: R,
201-
) -> Self {
202-
let batch = BatchLogProcessor::builder(exporter, runtime).build();
197+
pub fn with_batch_exporter<T: LogExporter + 'static>(self, exporter: T) -> Self {
198+
let batch = BatchLogProcessor::builder(exporter).build();
203199
self.with_log_processor(batch)
204200
}
205201

0 commit comments

Comments
 (0)