Skip to content

Commit a30b850

Browse files
authored
Add stress test to etw exporter (#160)
1 parent 434cc86 commit a30b850

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

stress/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ name = "user_events"
1414
path = "src/user_events.rs"
1515
doc = false
1616

17+
[[bin]]
18+
name = "etw"
19+
path = "src/etw_logs.rs"
20+
doc = false
21+
1722
[dependencies]
1823
ctrlc = "3.2.5"
1924
lazy_static = "1.4.0"
@@ -25,6 +30,7 @@ eventheader_dynamic = "0.4.0"
2530
opentelemetry-appender-tracing = { workspace = true, features= ["spec_unstable_logs_enabled"] }
2631
opentelemetry_sdk = { workspace = true, features = ["logs", "spec_unstable_logs_enabled"] }
2732
opentelemetry-user-events-logs = { path = "../opentelemetry-user-events-logs", features = ["spec_unstable_logs_enabled"]}
33+
opentelemetry-etw-logs = { path = "../opentelemetry-etw-logs"}
2834
tracing = { version = "0.1", default-features = false, features = ["std"] }
2935
tracing-subscriber = { version = "0.3.0", default-features = false, features = ["registry", "std"] }
3036

stress/src/etw_logs.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//! Run this stress test using `cargo run --bin etw --release -- <num-of-threads>`.
2+
//!
3+
// Conf - AMD EPYC 7763 64-Core Processor 2.44 GHz, 64GB RAM, Cores:8 , Logical processors: 16
4+
// Stress Test Results (no listener)
5+
// Threads: 1 - Average Throughput: 52M iterations/sec
6+
// Threads: 5 - Average Throughput: 250M iterations/sec
7+
// Threads: 10 - Average Throughput: 320M iterations/sec
8+
// Threads: 16 - Average Throughput: 400M iterations/sec
9+
10+
// Stress Test Results (logman is listening)
11+
// Threads: 1 - Average Throughput: 600K iterations/sec
12+
// Threads: 5 - Average Throughput: 2.7M iterations/sec
13+
// Threads: 10 - Average Throughput: 4.1M iterations/sec
14+
// Threads: 16 - Average Throughput: 5M iterations/sec
15+
// $EtwSessionGuid = (new-object System.Diagnostics.Tracing.EventSource("my-provider-name")).Guid.ToString()`
16+
// logman create trace OtelETWExampleBasic -o OtelETWExampleBasic.log -p "{$EtwSessionGuid}" -f bincirc -max 1000
17+
// logman start OtelETWExampleBasic
18+
// RUN test here...
19+
// logman stop OtelETWExampleBasic
20+
21+
use opentelemetry_appender_tracing::layer;
22+
use opentelemetry_etw_logs::{ExporterConfig, ReentrantLogProcessor};
23+
use opentelemetry_sdk::logs::LoggerProvider;
24+
use std::collections::HashMap;
25+
use tracing::info;
26+
use tracing_subscriber::prelude::*;
27+
mod throughput;
28+
29+
// Function to initialize the logger
30+
fn init_logger() -> LoggerProvider {
31+
let exporter_config = ExporterConfig {
32+
default_keyword: 1,
33+
keywords_map: HashMap::new(),
34+
};
35+
let reenterant_processor = ReentrantLogProcessor::new(
36+
"my-provider-name",
37+
"my-event-name".into(),
38+
None,
39+
exporter_config,
40+
);
41+
LoggerProvider::builder()
42+
.with_log_processor(reenterant_processor)
43+
.build()
44+
}
45+
46+
// Function that performs the logging task
47+
fn log_event_task() {
48+
info!(
49+
name = "my-event-name",
50+
event_id = 20,
51+
user_name = "otel user",
52+
user_email = "[email protected]"
53+
);
54+
}
55+
56+
fn main() {
57+
let logger_provider = init_logger();
58+
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);
59+
tracing_subscriber::registry().with(layer).init();
60+
61+
throughput::test_throughput(|| {
62+
log_event_task();
63+
});
64+
65+
println!("Stress test completed.");
66+
}

0 commit comments

Comments
 (0)