Skip to content

Commit 11fdef8

Browse files
lalitbcijothomasTommyCpp
authored
Use native Rust support for async traits in LogExporter::export() method (11% improvement) (open-telemetry#2374)
Co-authored-by: Cijo Thomas <[email protected]> Co-authored-by: Zhongyang Wu <[email protected]>
1 parent c205921 commit 11fdef8

File tree

3 files changed

+23
-18
lines changed

3 files changed

+23
-18
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ opentelemetry-stdout = { path = "../opentelemetry-stdout", features = ["logs"] }
2424
opentelemetry_sdk = { path = "../opentelemetry-sdk", features = ["logs", "testing"] }
2525
tracing-subscriber = { workspace = true, features = ["registry", "std", "env-filter"] }
2626
tracing-log = "0.2"
27-
async-trait = { workspace = true }
2827
criterion = { workspace = true }
2928
tokio = { workspace = true, features = ["full"]}
3029

benches/logs.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
| ot_layer_enabled | 196 ns |
1414
*/
1515

16-
use async_trait::async_trait;
1716
use criterion::{criterion_group, criterion_main, Criterion};
1817
use opentelemetry::InstrumentationScope;
1918
use opentelemetry_appender_tracing::layer as tracing_layer;
@@ -32,10 +31,13 @@ struct NoopExporter {
3231
enabled: bool,
3332
}
3433

35-
#[async_trait]
3634
impl LogExporter for NoopExporter {
37-
async fn export(&self, _: LogBatch<'_>) -> LogResult<()> {
38-
LogResult::Ok(())
35+
#[allow(clippy::manual_async_fn)]
36+
fn export(
37+
&self,
38+
_batch: LogBatch<'_>,
39+
) -> impl std::future::Future<Output = LogResult<()>> + Send {
40+
async { LogResult::Ok(()) }
3941
}
4042

4143
fn event_enabled(&self, _: opentelemetry::logs::Severity, _: &str, _: &str) -> bool {
@@ -44,17 +46,17 @@ impl LogExporter for NoopExporter {
4446
}
4547

4648
#[derive(Debug)]
47-
struct NoopProcessor {
48-
exporter: Box<dyn LogExporter>,
49+
struct NoopProcessor<E: LogExporter> {
50+
exporter: E,
4951
}
5052

51-
impl NoopProcessor {
52-
fn new(exporter: Box<dyn LogExporter>) -> Self {
53+
impl<E: LogExporter> NoopProcessor<E> {
54+
fn new(exporter: E) -> Self {
5355
Self { exporter }
5456
}
5557
}
5658

57-
impl LogProcessor for NoopProcessor {
59+
impl<E: LogExporter> LogProcessor for NoopProcessor<E> {
5860
fn emit(&self, _: &mut LogRecord, _: &InstrumentationScope) {
5961
// no-op
6062
}
@@ -124,7 +126,7 @@ fn benchmark_no_subscriber(c: &mut Criterion) {
124126

125127
fn benchmark_with_ot_layer(c: &mut Criterion, enabled: bool, bench_name: &str) {
126128
let exporter = NoopExporter { enabled };
127-
let processor = NoopProcessor::new(Box::new(exporter));
129+
let processor = NoopProcessor::new(exporter);
128130
let provider = LoggerProvider::builder()
129131
.with_resource(
130132
Resource::builder_empty()

src/layer.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ const fn severity_of_level(level: &Level) -> Severity {
209209
#[cfg(test)]
210210
mod tests {
211211
use crate::layer;
212-
use async_trait::async_trait;
213212
use opentelemetry::logs::Severity;
214213
use opentelemetry::trace::TracerProvider as _;
215214
use opentelemetry::trace::{TraceContextExt, TraceFlags, Tracer};
@@ -245,13 +244,18 @@ mod tests {
245244
#[derive(Clone, Debug, Default)]
246245
struct ReentrantLogExporter;
247246

248-
#[async_trait]
249247
impl LogExporter for ReentrantLogExporter {
250-
async fn export(&self, _batch: LogBatch<'_>) -> LogResult<()> {
251-
// This will cause a deadlock as the export itself creates a log
252-
// while still within the lock of the SimpleLogProcessor.
253-
warn!(name: "my-event-name", target: "reentrant", event_id = 20, user_name = "otel", user_email = "[email protected]");
254-
Ok(())
248+
#[allow(clippy::manual_async_fn)]
249+
fn export(
250+
&self,
251+
_batch: LogBatch<'_>,
252+
) -> impl std::future::Future<Output = LogResult<()>> + Send {
253+
async {
254+
// This will cause a deadlock as the export itself creates a log
255+
// while still within the lock of the SimpleLogProcessor.
256+
warn!(name: "my-event-name", target: "reentrant", event_id = 20, user_name = "otel", user_email = "[email protected]");
257+
Ok(())
258+
}
255259
}
256260
}
257261

0 commit comments

Comments
 (0)