Skip to content

Commit 7a6f339

Browse files
committed
refactor: extract test of fake-collector to be like demo & doc
1 parent c028ae6 commit 7a6f339

File tree

6 files changed

+178
-137
lines changed

6 files changed

+178
-137
lines changed
Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,70 @@
11
# fake-opentelemetry-collector
22

3-
A Fake (basic) opentelemetry collector, useful to test what is collected opentelemetry
3+
A Fake (basic) opentelemetry collector, useful to test what is collected by opentelemetry
44

55
Usage example with [insta](https://crates.io/crates/insta) (snapshot testing)
66

77
```rust
8-
#[tokio::test(flavor = "multi_thread")]
9-
async fn test_fake_tracer_and_collector() {
10-
let fake_collector = FakeCollectorServer::start()
11-
.await
12-
.expect("fake collector setup and started");
13-
let tracer = setup_tracer(&fake_collector).await;
14-
15-
debug!("Sending span...");
16-
let mut span = tracer
17-
.span_builder("my-test-span")
18-
.with_kind(SpanKind::Server)
19-
.start(&tracer);
20-
span.add_event("my-test-event", vec![]);
21-
span.end();
22-
23-
shutdown_tracer_provider();
24-
25-
let otel_spans = fake_collector.exported_spans();
26-
//insta::assert_debug_snapshot!(otel_spans);
27-
insta::assert_yaml_snapshot!(otel_spans, {
28-
"[].start_time_unix_nano" => "[timestamp]",
29-
"[].end_time_unix_nano" => "[timestamp]",
30-
"[].events[].time_unix_nano" => "[timestamp]",
31-
"[].trace_id" => insta::dynamic_redaction(|value, _path| {
32-
assert2::let_assert!(Some(trace_id) = value.as_str());
33-
format!("[trace_id:lg{}]", trace_id.len())
34-
}),
35-
"[].span_id" => insta::dynamic_redaction(|value, _path| {
36-
assert2::let_assert!(Some(span_id) = value.as_str());
37-
format!("[span_id:lg{}]", span_id.len())
38-
}),
39-
"[].links[].trace_id" => insta::dynamic_redaction(|value, _path| {
40-
assert2::let_assert!(Some(trace_id) = value.as_str());
41-
format!("[trace_id:lg{}]", trace_id.len())
42-
}),
43-
"[].links[].span_id" => insta::dynamic_redaction(|value, _path| {
44-
assert2::let_assert!(Some(span_id) = value.as_str());
45-
format!("[span_id:lg{}]", span_id.len())
46-
}),
47-
});
48-
}
8+
use std::time::Duration;
9+
10+
use fake_opentelemetry_collector::{setup_tracer_provider, FakeCollectorServer};
11+
use opentelemetry::trace::TracerProvider;
12+
use opentelemetry::trace::{Span, SpanKind, Tracer};
13+
use tracing::debug;
14+
15+
#[tokio::test(flavor = "multi_thread")]
16+
async fn demo_fake_tracer_and_collector() {
17+
debug!("Start the fake collector");
18+
let mut fake_collector = FakeCollectorServer::start()
19+
.await
20+
.expect("fake collector setup and started");
21+
22+
debug!("Init the 'application' & tracer provider");
23+
let tracer_provider = setup_tracer_provider(&fake_collector).await;
24+
let tracer = tracer_provider.tracer("test");
25+
26+
debug!("Run the 'application' & sending span...");
27+
let mut span = tracer
28+
.span_builder("my-test-span")
29+
.with_kind(SpanKind::Server)
30+
.start(&tracer);
31+
span.add_event("my-test-event", vec![]);
32+
span.end();
33+
34+
debug!("Shutdown the 'application' & tracer provider and force flush the spans");
35+
let _ = tracer_provider.force_flush();
36+
tracer_provider
37+
.shutdown()
38+
.expect("no error during shutdown");
39+
drop(tracer_provider);
40+
41+
debug!("Collect & check the spans");
42+
let otel_spans = fake_collector
43+
.exported_spans(1, Duration::from_secs(20))
44+
.await;
45+
//insta::assert_debug_snapshot!(otel_spans);
46+
insta::assert_yaml_snapshot!(otel_spans, {
47+
"[].start_time_unix_nano" => "[timestamp]",
48+
"[].end_time_unix_nano" => "[timestamp]",
49+
"[].events[].time_unix_nano" => "[timestamp]",
50+
"[].trace_id" => insta::dynamic_redaction(|value, _path| {
51+
assert2::let_assert!(Some(trace_id) = value.as_str());
52+
format!("[trace_id:lg{}]", trace_id.len())
53+
}),
54+
"[].span_id" => insta::dynamic_redaction(|value, _path| {
55+
assert2::let_assert!(Some(span_id) = value.as_str());
56+
format!("[span_id:lg{}]", span_id.len())
57+
}),
58+
"[].links[].trace_id" => insta::dynamic_redaction(|value, _path| {
59+
assert2::let_assert!(Some(trace_id) = value.as_str());
60+
format!("[trace_id:lg{}]", trace_id.len())
61+
}),
62+
"[].links[].span_id" => insta::dynamic_redaction(|value, _path| {
63+
assert2::let_assert!(Some(span_id) = value.as_str());
64+
format!("[span_id:lg{}]", span_id.len())
65+
}),
66+
});
67+
}
4968
```
69+
70+
test example at <https://github.com/davidB/tracing-opentelemetry-instrumentation-sdk/tree/main/fake-opentelemetry-collector/tests>

fake-opentelemetry-collector/src/lib.rs

Lines changed: 0 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -126,95 +126,3 @@ pub async fn setup_logger_provider(
126126
)
127127
.build()
128128
}
129-
130-
#[cfg(test)]
131-
mod tests {
132-
use super::*;
133-
134-
use opentelemetry::logs::{LogRecord, Logger, LoggerProvider, Severity};
135-
use opentelemetry::trace::TracerProvider;
136-
use opentelemetry::trace::{Span, SpanKind, Tracer};
137-
138-
#[tokio::test(flavor = "multi_thread")]
139-
async fn test_fake_tracer_and_collector() {
140-
let mut fake_collector = FakeCollectorServer::start()
141-
.await
142-
.expect("fake collector setup and started");
143-
let tracer_provider = setup_tracer_provider(&fake_collector).await;
144-
let tracer = tracer_provider.tracer("test");
145-
146-
debug!("Sending span...");
147-
let mut span = tracer
148-
.span_builder("my-test-span")
149-
.with_kind(SpanKind::Server)
150-
.start(&tracer);
151-
span.add_event("my-test-event", vec![]);
152-
span.end();
153-
154-
let _ = tracer_provider.force_flush();
155-
tracer_provider
156-
.shutdown()
157-
.expect("no error during shutdown");
158-
drop(tracer_provider);
159-
160-
let otel_spans = fake_collector
161-
.exported_spans(1, Duration::from_secs(20))
162-
.await;
163-
//insta::assert_debug_snapshot!(otel_spans);
164-
insta::assert_yaml_snapshot!(otel_spans, {
165-
"[].start_time_unix_nano" => "[timestamp]",
166-
"[].end_time_unix_nano" => "[timestamp]",
167-
"[].events[].time_unix_nano" => "[timestamp]",
168-
"[].trace_id" => insta::dynamic_redaction(|value, _path| {
169-
assert2::let_assert!(Some(trace_id) = value.as_str());
170-
format!("[trace_id:lg{}]", trace_id.len())
171-
}),
172-
"[].span_id" => insta::dynamic_redaction(|value, _path| {
173-
assert2::let_assert!(Some(span_id) = value.as_str());
174-
format!("[span_id:lg{}]", span_id.len())
175-
}),
176-
"[].links[].trace_id" => insta::dynamic_redaction(|value, _path| {
177-
assert2::let_assert!(Some(trace_id) = value.as_str());
178-
format!("[trace_id:lg{}]", trace_id.len())
179-
}),
180-
"[].links[].span_id" => insta::dynamic_redaction(|value, _path| {
181-
assert2::let_assert!(Some(span_id) = value.as_str());
182-
format!("[span_id:lg{}]", span_id.len())
183-
}),
184-
});
185-
}
186-
187-
#[tokio::test(flavor = "multi_thread")]
188-
async fn test_fake_logger_and_collector() {
189-
let mut fake_collector = FakeCollectorServer::start()
190-
.await
191-
.expect("fake collector setup and started");
192-
193-
let logger_provider = setup_logger_provider(&fake_collector).await;
194-
let logger = logger_provider.logger("test");
195-
let mut record = logger.create_log_record();
196-
record.set_body("This is information".into());
197-
record.set_severity_number(Severity::Info);
198-
record.set_severity_text("info");
199-
logger.emit(record);
200-
201-
let otel_logs = fake_collector
202-
.exported_logs(1, Duration::from_millis(500))
203-
.await;
204-
205-
insta::assert_yaml_snapshot!(otel_logs, {
206-
"[].trace_id" => insta::dynamic_redaction(|value, _path| {
207-
assert2::let_assert!(Some(trace_id) = value.as_str());
208-
format!("[trace_id:lg{}]", trace_id.len())
209-
}),
210-
"[].span_id" => insta::dynamic_redaction(|value, _path| {
211-
assert2::let_assert!(Some(span_id) = value.as_str());
212-
format!("[span_id:lg{}]", span_id.len())
213-
}),
214-
"[].observed_time_unix_nano" => "[timestamp]",
215-
"[].severity_number" => 9,
216-
"[].severity_text" => "info",
217-
"[].body" => "AnyValue { value: Some(StringValue(\"This is information\")) }",
218-
});
219-
}
220-
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
use std::time::Duration;
2+
3+
use fake_opentelemetry_collector::{setup_logger_provider, FakeCollectorServer};
4+
use opentelemetry::logs::{LogRecord, Logger, LoggerProvider, Severity};
5+
use tracing::debug;
6+
7+
#[tokio::test(flavor = "multi_thread")]
8+
async fn demo_fake_logger_and_collector() {
9+
debug!("Start the fake collector");
10+
let mut fake_collector = FakeCollectorServer::start()
11+
.await
12+
.expect("fake collector setup and started");
13+
14+
debug!("Init the 'application' & logger provider");
15+
let logger_provider = setup_logger_provider(&fake_collector).await;
16+
let logger = logger_provider.logger("test");
17+
18+
debug!("Run the 'application' & send log ...");
19+
let mut record = logger.create_log_record();
20+
record.set_body("This is information".into());
21+
record.set_severity_number(Severity::Info);
22+
record.set_severity_text("info");
23+
logger.emit(record);
24+
25+
debug!("Shutdown the 'application' & logger provider");
26+
let _ = logger_provider.force_flush();
27+
logger_provider
28+
.shutdown()
29+
.expect("no error during shutdown");
30+
drop(logger_provider);
31+
32+
debug!("Collect & check the logs");
33+
let otel_logs = fake_collector
34+
.exported_logs(1, Duration::from_millis(500))
35+
.await;
36+
37+
insta::assert_yaml_snapshot!(otel_logs, {
38+
"[].trace_id" => insta::dynamic_redaction(|value, _path| {
39+
assert2::let_assert!(Some(trace_id) = value.as_str());
40+
format!("[trace_id:lg{}]", trace_id.len())
41+
}),
42+
"[].span_id" => insta::dynamic_redaction(|value, _path| {
43+
assert2::let_assert!(Some(span_id) = value.as_str());
44+
format!("[span_id:lg{}]", span_id.len())
45+
}),
46+
"[].observed_time_unix_nano" => "[timestamp]",
47+
"[].severity_number" => 9,
48+
"[].severity_text" => "info",
49+
"[].body" => "AnyValue { value: Some(StringValue(\"This is information\")) }",
50+
});
51+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use std::time::Duration;
2+
3+
use fake_opentelemetry_collector::{setup_tracer_provider, FakeCollectorServer};
4+
use opentelemetry::trace::TracerProvider;
5+
use opentelemetry::trace::{Span, SpanKind, Tracer};
6+
use tracing::debug;
7+
8+
#[tokio::test(flavor = "multi_thread")]
9+
async fn demo_fake_tracer_and_collector() {
10+
debug!("Start the fake collector");
11+
let mut fake_collector = FakeCollectorServer::start()
12+
.await
13+
.expect("fake collector setup and started");
14+
15+
debug!("Init the 'application' & tracer provider");
16+
let tracer_provider = setup_tracer_provider(&fake_collector).await;
17+
let tracer = tracer_provider.tracer("test");
18+
19+
debug!("Run the 'application' & sending span...");
20+
let mut span = tracer
21+
.span_builder("my-test-span")
22+
.with_kind(SpanKind::Server)
23+
.start(&tracer);
24+
span.add_event("my-test-event", vec![]);
25+
span.end();
26+
27+
debug!("Shutdown the 'application' & tracer provider and force flush the spans");
28+
let _ = tracer_provider.force_flush();
29+
tracer_provider
30+
.shutdown()
31+
.expect("no error during shutdown");
32+
drop(tracer_provider);
33+
34+
debug!("Collect & check the spans");
35+
let otel_spans = fake_collector
36+
.exported_spans(1, Duration::from_secs(20))
37+
.await;
38+
//insta::assert_debug_snapshot!(otel_spans);
39+
insta::assert_yaml_snapshot!(otel_spans, {
40+
"[].start_time_unix_nano" => "[timestamp]",
41+
"[].end_time_unix_nano" => "[timestamp]",
42+
"[].events[].time_unix_nano" => "[timestamp]",
43+
"[].trace_id" => insta::dynamic_redaction(|value, _path| {
44+
assert2::let_assert!(Some(trace_id) = value.as_str());
45+
format!("[trace_id:lg{}]", trace_id.len())
46+
}),
47+
"[].span_id" => insta::dynamic_redaction(|value, _path| {
48+
assert2::let_assert!(Some(span_id) = value.as_str());
49+
format!("[span_id:lg{}]", span_id.len())
50+
}),
51+
"[].links[].trace_id" => insta::dynamic_redaction(|value, _path| {
52+
assert2::let_assert!(Some(trace_id) = value.as_str());
53+
format!("[trace_id:lg{}]", trace_id.len())
54+
}),
55+
"[].links[].span_id" => insta::dynamic_redaction(|value, _path| {
56+
assert2::let_assert!(Some(span_id) = value.as_str());
57+
format!("[span_id:lg{}]", span_id.len())
58+
}),
59+
});
60+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
2-
source: fake-opentelemetry-collector/src/lib.rs
2+
source: fake-opentelemetry-collector/tests/demo_log.rs
33
expression: otel_logs
4+
snapshot_kind: text
45
---
56
- trace_id: "[trace_id:lg0]"
67
span_id: "[span_id:lg0]"
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
---
2-
source: fake-opentelemetry-collector/src/lib.rs
2+
source: fake-opentelemetry-collector/tests/demo_trace.rs
33
expression: otel_spans
4+
snapshot_kind: text
45
---
56
- trace_id: "[trace_id:lg32]"
67
span_id: "[span_id:lg16]"
@@ -23,4 +24,3 @@ expression: otel_spans
2324
status:
2425
message: ""
2526
code: STATUS_CODE_UNSET
26-

0 commit comments

Comments
 (0)