From 03aca511206e9c80436e3470421ea16d6bdc9643 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:23:44 +0000 Subject: [PATCH 1/5] Initial plan From b6dc2aa586441c7963cff3e382b5b130ecd2e1b9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:36:55 +0000 Subject: [PATCH 2/5] Implement automatic enable/disable functionality for user-events benchmarks Co-authored-by: cijothomas <5232798+cijothomas@users.noreply.github.com> --- .../benches/logs.rs | 207 ++++++++++++++---- 1 file changed, 165 insertions(+), 42 deletions(-) diff --git a/opentelemetry-user-events-logs/benches/logs.rs b/opentelemetry-user-events-logs/benches/logs.rs index 4e61d6835..32a1a4453 100644 --- a/opentelemetry-user-events-logs/benches/logs.rs +++ b/opentelemetry-user-events-logs/benches/logs.rs @@ -2,24 +2,30 @@ The benchmark results: criterion = "0.5.1" - Hardware: Apple M4 Pro - Total Number of Cores: 10 - (Inside multipass vm running Ubuntu 22.04) - // When no listener - | Test | Average time| - |-----------------------------|-------------| - | User_Event_4_Attributes | 8 ns | - | User_Event_6_Attributes | 8 ns | - - // When listener is enabled - // Run below to enable - // echo 1 | sudo tee /sys/kernel/debug/tracing/events/user_events/myprovider_L2K1/enable - // Run below to disable - // echo 0 | sudo tee /sys/kernel/debug/tracing/events/user_events/myprovider_L2K1/enable - | Test | Average time| - |-----------------------------|-------------| - | User_Event_4_Attributes | 530 ns | - | User_Event_6_Attributes | 586 ns | + Hardware: + Total Number of Cores: + (Environment details) + + // When no listener (automatically set by benchmark) + | Test | Average time | + |-----------------------------------|--------------| + | User_Event_4_Attributes_Disabled | X ns | + | User_Event_6_Attributes_Disabled | X ns | + + // When listener is enabled (automatically set by benchmark) + | Test | Average time | + |-----------------------------------|--------------| + | User_Event_4_Attributes_Enabled | X ns | + | User_Event_6_Attributes_Enabled | X ns | + + // Fallback tests (when user_events is not available) + | Test | Average time | + |-----------------------------|--------------| + | User_Event_4_Attributes | X ns | + | User_Event_6_Attributes | X ns | + + Note: The benchmark now automatically enables and disables the user-events listener. + If user_events is not available on the system, it falls back to the original test names. */ // running the following from the current directory @@ -30,10 +36,51 @@ use opentelemetry_appender_tracing::layer as tracing_layer; use opentelemetry_sdk::logs::SdkLoggerProvider; use opentelemetry_sdk::Resource; use opentelemetry_user_events_logs::Processor; +use std::fs; +use std::io::Write; +use std::process::Command; use tracing::error; use tracing_subscriber::prelude::*; use tracing_subscriber::Registry; +/// Attempts to enable or disable the user_events listener +/// Returns true if the operation was successful, false otherwise +fn set_user_events_listener(enabled: bool) -> bool { + let enable_path = "/sys/kernel/debug/tracing/events/user_events/myprovider_L2K1/enable"; + let value = if enabled { "1" } else { "0" }; + + // First try direct write (if we have permissions) + if let Ok(mut file) = fs::OpenOptions::new().write(true).open(enable_path) { + if file.write_all(value.as_bytes()).is_ok() { + return true; + } + } + + // Fallback to using sudo with echo command + let output = Command::new("sudo") + .args(["tee", enable_path]) + .stdin(std::process::Stdio::piped()) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .spawn() + .and_then(|mut child| { + if let Some(stdin) = child.stdin.as_mut() { + stdin.write_all(value.as_bytes()).ok(); + } + child.wait() + }); + + match output { + Ok(status) => status.success(), + Err(_) => false, + } +} + +/// Checks if user_events is available on the system +fn is_user_events_available() -> bool { + fs::metadata("/sys/kernel/debug/tracing/events/user_events/myprovider_L2K1/enable").is_ok() +} + fn setup_provider() -> SdkLoggerProvider { let user_event_processor = Processor::builder("myprovider").build().unwrap(); SdkLoggerProvider::builder() @@ -52,18 +99,54 @@ fn benchmark_4_attributes(c: &mut Criterion) { let subscriber = Registry::default().with(ot_layer); tracing::subscriber::with_default(subscriber, || { - c.bench_function("User_Event_4_Attributes", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - message = "Unable to process checkout." - ); + // Test with listener disabled + if is_user_events_available() { + set_user_events_listener(false); + c.bench_function("User_Event_4_Attributes_Disabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + message = "Unable to process checkout." + ); + }); }); - }); + + // Test with listener enabled + set_user_events_listener(true); + c.bench_function("User_Event_4_Attributes_Enabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + message = "Unable to process checkout." + ); + }); + }); + + // Cleanup: disable listener + set_user_events_listener(false); + } else { + // Fallback for systems without user_events support + c.bench_function("User_Event_4_Attributes", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + message = "Unable to process checkout." + ); + }); + }); + } }); } @@ -73,20 +156,60 @@ fn benchmark_6_attributes(c: &mut Criterion) { let subscriber = Registry::default().with(ot_layer); tracing::subscriber::with_default(subscriber, || { - c.bench_function("User_Event_6_Attributes", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - field5 = "field5", - field6 = "field6", - message = "Unable to process checkout." - ); + // Test with listener disabled + if is_user_events_available() { + set_user_events_listener(false); + c.bench_function("User_Event_6_Attributes_Disabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + field5 = "field5", + field6 = "field6", + message = "Unable to process checkout." + ); + }); }); - }); + + // Test with listener enabled + set_user_events_listener(true); + c.bench_function("User_Event_6_Attributes_Enabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + field5 = "field5", + field6 = "field6", + message = "Unable to process checkout." + ); + }); + }); + + // Cleanup: disable listener + set_user_events_listener(false); + } else { + // Fallback for systems without user_events support + c.bench_function("User_Event_6_Attributes", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + field5 = "field5", + field6 = "field6", + message = "Unable to process checkout." + ); + }); + }); + } }); } From 06fb3cb0db544d98c6eb2934e2be616b7bc729d0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:50:56 +0000 Subject: [PATCH 3/5] Remove fallback tests functionality from user-events benchmarks Co-authored-by: cijothomas <5232798+cijothomas@users.noreply.github.com> --- .../benches/logs.rs | 167 +++++++----------- 1 file changed, 61 insertions(+), 106 deletions(-) diff --git a/opentelemetry-user-events-logs/benches/logs.rs b/opentelemetry-user-events-logs/benches/logs.rs index 32a1a4453..94bcd7410 100644 --- a/opentelemetry-user-events-logs/benches/logs.rs +++ b/opentelemetry-user-events-logs/benches/logs.rs @@ -17,15 +17,9 @@ |-----------------------------------|--------------| | User_Event_4_Attributes_Enabled | X ns | | User_Event_6_Attributes_Enabled | X ns | - - // Fallback tests (when user_events is not available) - | Test | Average time | - |-----------------------------|--------------| - | User_Event_4_Attributes | X ns | - | User_Event_6_Attributes | X ns | - - Note: The benchmark now automatically enables and disables the user-events listener. - If user_events is not available on the system, it falls back to the original test names. + + Note: The benchmark automatically enables and disables the user-events listener + to compare performance between the two states. */ // running the following from the current directory @@ -76,11 +70,6 @@ fn set_user_events_listener(enabled: bool) -> bool { } } -/// Checks if user_events is available on the system -fn is_user_events_available() -> bool { - fs::metadata("/sys/kernel/debug/tracing/events/user_events/myprovider_L2K1/enable").is_ok() -} - fn setup_provider() -> SdkLoggerProvider { let user_event_processor = Processor::builder("myprovider").build().unwrap(); SdkLoggerProvider::builder() @@ -100,53 +89,37 @@ fn benchmark_4_attributes(c: &mut Criterion) { tracing::subscriber::with_default(subscriber, || { // Test with listener disabled - if is_user_events_available() { - set_user_events_listener(false); - c.bench_function("User_Event_4_Attributes_Disabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - message = "Unable to process checkout." - ); - }); + set_user_events_listener(false); + c.bench_function("User_Event_4_Attributes_Disabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + message = "Unable to process checkout." + ); }); + }); - // Test with listener enabled - set_user_events_listener(true); - c.bench_function("User_Event_4_Attributes_Enabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - message = "Unable to process checkout." - ); - }); + // Test with listener enabled + set_user_events_listener(true); + c.bench_function("User_Event_4_Attributes_Enabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + message = "Unable to process checkout." + ); }); + }); - // Cleanup: disable listener - set_user_events_listener(false); - } else { - // Fallback for systems without user_events support - c.bench_function("User_Event_4_Attributes", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - message = "Unable to process checkout." - ); - }); - }); - } + // Cleanup: disable listener + set_user_events_listener(false); }); } @@ -157,59 +130,41 @@ fn benchmark_6_attributes(c: &mut Criterion) { tracing::subscriber::with_default(subscriber, || { // Test with listener disabled - if is_user_events_available() { - set_user_events_listener(false); - c.bench_function("User_Event_6_Attributes_Disabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - field5 = "field5", - field6 = "field6", - message = "Unable to process checkout." - ); - }); + set_user_events_listener(false); + c.bench_function("User_Event_6_Attributes_Disabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + field5 = "field5", + field6 = "field6", + message = "Unable to process checkout." + ); }); + }); - // Test with listener enabled - set_user_events_listener(true); - c.bench_function("User_Event_6_Attributes_Enabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - field5 = "field5", - field6 = "field6", - message = "Unable to process checkout." - ); - }); + // Test with listener enabled + set_user_events_listener(true); + c.bench_function("User_Event_6_Attributes_Enabled", |b| { + b.iter(|| { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + field5 = "field5", + field6 = "field6", + message = "Unable to process checkout." + ); }); + }); - // Cleanup: disable listener - set_user_events_listener(false); - } else { - // Fallback for systems without user_events support - c.bench_function("User_Event_6_Attributes", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - field5 = "field5", - field6 = "field6", - message = "Unable to process checkout." - ); - }); - }); - } + // Cleanup: disable listener + set_user_events_listener(false); }); } From f56358892c7078fe88cfbf286a6cb404c56c1da9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:05:36 +0000 Subject: [PATCH 4/5] Refactor benchmarks to use Criterion groups and eliminate code duplication Co-authored-by: cijothomas <5232798+cijothomas@users.noreply.github.com> --- .../benches/logs.rs | 48 +++++++------------ 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/opentelemetry-user-events-logs/benches/logs.rs b/opentelemetry-user-events-logs/benches/logs.rs index 94bcd7410..62a7bdec3 100644 --- a/opentelemetry-user-events-logs/benches/logs.rs +++ b/opentelemetry-user-events-logs/benches/logs.rs @@ -9,14 +9,14 @@ // When no listener (automatically set by benchmark) | Test | Average time | |-----------------------------------|--------------| - | User_Event_4_Attributes_Disabled | X ns | - | User_Event_6_Attributes_Disabled | X ns | + | User_Events/4_Attributes_Disabled | X ns | + | User_Events/6_Attributes_Disabled | X ns | // When listener is enabled (automatically set by benchmark) | Test | Average time | |-----------------------------------|--------------| - | User_Event_4_Attributes_Enabled | X ns | - | User_Event_6_Attributes_Enabled | X ns | + | User_Events/4_Attributes_Enabled | X ns | + | User_Events/6_Attributes_Enabled | X ns | Note: The benchmark automatically enables and disables the user-events listener to compare performance between the two states. @@ -82,15 +82,17 @@ fn setup_provider() -> SdkLoggerProvider { .build() } -fn benchmark_4_attributes(c: &mut Criterion) { +fn benchmark_user_events(c: &mut Criterion) { + let mut group = c.benchmark_group("User_Events"); + let provider = setup_provider(); let ot_layer = tracing_layer::OpenTelemetryTracingBridge::new(&provider); let subscriber = Registry::default().with(ot_layer); tracing::subscriber::with_default(subscriber, || { - // Test with listener disabled + // Test 4 attributes with listener disabled set_user_events_listener(false); - c.bench_function("User_Event_4_Attributes_Disabled", |b| { + group.bench_function("4_Attributes_Disabled", |b| { b.iter(|| { error!( name : "CheckoutFailed", @@ -103,9 +105,9 @@ fn benchmark_4_attributes(c: &mut Criterion) { }); }); - // Test with listener enabled + // Test 4 attributes with listener enabled set_user_events_listener(true); - c.bench_function("User_Event_4_Attributes_Enabled", |b| { + group.bench_function("4_Attributes_Enabled", |b| { b.iter(|| { error!( name : "CheckoutFailed", @@ -118,20 +120,9 @@ fn benchmark_4_attributes(c: &mut Criterion) { }); }); - // Cleanup: disable listener - set_user_events_listener(false); - }); -} - -fn benchmark_6_attributes(c: &mut Criterion) { - let provider = setup_provider(); - let ot_layer = tracing_layer::OpenTelemetryTracingBridge::new(&provider); - let subscriber = Registry::default().with(ot_layer); - - tracing::subscriber::with_default(subscriber, || { - // Test with listener disabled + // Test 6 attributes with listener disabled set_user_events_listener(false); - c.bench_function("User_Event_6_Attributes_Disabled", |b| { + group.bench_function("6_Attributes_Disabled", |b| { b.iter(|| { error!( name : "CheckoutFailed", @@ -146,9 +137,9 @@ fn benchmark_6_attributes(c: &mut Criterion) { }); }); - // Test with listener enabled + // Test 6 attributes with listener enabled set_user_events_listener(true); - c.bench_function("User_Event_6_Attributes_Enabled", |b| { + group.bench_function("6_Attributes_Enabled", |b| { b.iter(|| { error!( name : "CheckoutFailed", @@ -166,16 +157,13 @@ fn benchmark_6_attributes(c: &mut Criterion) { // Cleanup: disable listener set_user_events_listener(false); }); -} - -fn criterion_benchmark(c: &mut Criterion) { - benchmark_4_attributes(c); - benchmark_6_attributes(c); + + group.finish(); } criterion_group! { name = benches; config = Criterion::default(); - targets = criterion_benchmark + targets = benchmark_user_events } criterion_main!(benches); From bd2f62e6174c89c0791e63373ef1f7b6279ee4c6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:10:51 +0000 Subject: [PATCH 5/5] Refactor benchmark to use idiomatic Criterion patterns and eliminate code duplication Co-authored-by: cijothomas <5232798+cijothomas@users.noreply.github.com> --- .../benches/logs.rs | 106 ++++++++---------- 1 file changed, 46 insertions(+), 60 deletions(-) diff --git a/opentelemetry-user-events-logs/benches/logs.rs b/opentelemetry-user-events-logs/benches/logs.rs index 62a7bdec3..1d0cddb99 100644 --- a/opentelemetry-user-events-logs/benches/logs.rs +++ b/opentelemetry-user-events-logs/benches/logs.rs @@ -82,6 +82,35 @@ fn setup_provider() -> SdkLoggerProvider { .build() } +/// Helper function to emit a log event with the specified number of attributes +fn emit_log_event(attribute_count: u8) { + match attribute_count { + 4 => { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + message = "Unable to process checkout." + ); + } + 6 => { + error!( + name : "CheckoutFailed", + field1 = "field1", + field2 = "field2", + field3 = "field3", + field4 = "field4", + field5 = "field5", + field6 = "field6", + message = "Unable to process checkout." + ); + } + _ => panic!("Unsupported attribute count: {}", attribute_count), + } +} + fn benchmark_user_events(c: &mut Criterion) { let mut group = c.benchmark_group("User_Events"); @@ -90,69 +119,26 @@ fn benchmark_user_events(c: &mut Criterion) { let subscriber = Registry::default().with(ot_layer); tracing::subscriber::with_default(subscriber, || { - // Test 4 attributes with listener disabled - set_user_events_listener(false); - group.bench_function("4_Attributes_Disabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - message = "Unable to process checkout." - ); - }); - }); + // Test configurations: (attribute_count, listener_enabled) + let test_configs = [ + (4, false), + (4, true), + (6, false), + (6, true), + ]; - // Test 4 attributes with listener enabled - set_user_events_listener(true); - group.bench_function("4_Attributes_Enabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - message = "Unable to process checkout." - ); - }); - }); - - // Test 6 attributes with listener disabled - set_user_events_listener(false); - group.bench_function("6_Attributes_Disabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - field5 = "field5", - field6 = "field6", - message = "Unable to process checkout." - ); - }); - }); + for (attribute_count, listener_enabled) in test_configs { + let test_name = format!( + "{}_Attributes_{}", + attribute_count, + if listener_enabled { "Enabled" } else { "Disabled" } + ); - // Test 6 attributes with listener enabled - set_user_events_listener(true); - group.bench_function("6_Attributes_Enabled", |b| { - b.iter(|| { - error!( - name : "CheckoutFailed", - field1 = "field1", - field2 = "field2", - field3 = "field3", - field4 = "field4", - field5 = "field5", - field6 = "field6", - message = "Unable to process checkout." - ); + set_user_events_listener(listener_enabled); + group.bench_function(&test_name, |b| { + b.iter(|| emit_log_event(attribute_count)); }); - }); + } // Cleanup: disable listener set_user_events_listener(false);