Skip to content

Commit 6c813c9

Browse files
committed
tests: add a test for pallel events
1 parent fda011c commit 6c813c9

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

tests/parallel.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use futures_util::future::BoxFuture;
2+
use opentelemetry::trace::TracerProvider as _;
3+
use opentelemetry_sdk::{
4+
export::trace::{ExportResult, SpanData, SpanExporter},
5+
trace::{Config, SpanLimits, Tracer, TracerProvider},
6+
};
7+
use std::sync::{Arc, Mutex};
8+
use tracing::level_filters::LevelFilter;
9+
use tracing::Subscriber;
10+
use tracing_opentelemetry::layer;
11+
use tracing_subscriber::prelude::*;
12+
13+
#[derive(Clone, Default, Debug)]
14+
struct TestExporter(Arc<Mutex<Vec<SpanData>>>);
15+
16+
impl SpanExporter for TestExporter {
17+
fn export(&mut self, mut batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
18+
let spans = self.0.clone();
19+
Box::pin(async move {
20+
if let Ok(mut inner) = spans.lock() {
21+
inner.append(&mut batch);
22+
}
23+
Ok(())
24+
})
25+
}
26+
}
27+
28+
fn test_tracer() -> (
29+
Tracer,
30+
TracerProvider,
31+
TestExporter,
32+
impl Subscriber + Clone,
33+
) {
34+
let exporter = TestExporter::default();
35+
let provider = TracerProvider::builder()
36+
.with_simple_exporter(exporter.clone())
37+
.with_config(Config {
38+
span_limits: SpanLimits {
39+
max_events_per_span: u32::MAX,
40+
..SpanLimits::default()
41+
},
42+
..Config::default()
43+
})
44+
.build();
45+
let tracer = provider.tracer("test");
46+
47+
let subscriber = tracing_subscriber::registry()
48+
.with(
49+
layer()
50+
.with_tracer(tracer.clone())
51+
.with_filter(LevelFilter::TRACE),
52+
)
53+
.with(tracing_subscriber::fmt::layer().with_filter(LevelFilter::DEBUG));
54+
55+
(tracer, provider, exporter, Arc::new(subscriber))
56+
}
57+
58+
#[test]
59+
fn multi_threading() {
60+
let (_tracer, provider, exporter, subscriber) = test_tracer();
61+
62+
tracing::subscriber::with_default(subscriber.clone(), || {
63+
let root = tracing::debug_span!("root");
64+
std::thread::scope(|scope| {
65+
for _ in 0..10 {
66+
scope.spawn(|| {
67+
let _guard = tracing::subscriber::set_default(subscriber.clone());
68+
let _guard = root.enter();
69+
for _ in 0..1000 {
70+
tracing::trace!("event");
71+
}
72+
});
73+
}
74+
});
75+
});
76+
77+
drop(provider); // flush all spans
78+
let spans = exporter.0.lock().unwrap();
79+
80+
assert_eq!(spans.len(), 1);
81+
82+
assert_eq!(spans.iter().next().unwrap().events.len(), 10_000);
83+
}

0 commit comments

Comments
 (0)