Skip to content

Commit d970f28

Browse files
authored
Fix userevents exporter (#191)
1 parent aa7698d commit d970f28

File tree

7 files changed

+41
-45
lines changed

7 files changed

+41
-45
lines changed

.cspell.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,22 @@
2929
"appender",
3030
"appenders",
3131
"Bhasin",
32+
"chrono",
3233
"Cijo",
3334
"codecov",
3435
"deque",
3536
"Dirkjan",
3637
"errno",
38+
"eventheader",
39+
"ftrace",
3740
"hasher",
3841
"isahc",
3942
"Isobel",
4043
"jaegertracing",
4144
"Kühle",
4245
"Kumar",
4346
"Lalit",
47+
"microbench",
4448
"msrv",
4549
"myprovider",
4650
"Ochtman",
@@ -54,6 +58,7 @@
5458
"rustc",
5559
"Tescher",
5660
"tracepoint",
61+
"Tracepoints",
5762
"Zhongyang",
5863
"zipkin"
5964
],

opentelemetry-user-events-logs/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "opentelemetry-user-events-logs"
3-
description = "OpenTelemetry-Rust exporter to userevents"
3+
description = "OpenTelemetry-Rust exporter to user_events"
44
version = "0.10.0"
55
edition = "2021"
66
homepage = "https://github.com/open-telemetry/opentelemetry-rust-contrib/tree/main/opentelemetry-user-events-logs"
@@ -17,14 +17,14 @@ opentelemetry = { workspace = true, features = ["logs"] }
1717
opentelemetry_sdk = { workspace = true, features = ["logs"] }
1818
chrono = { version = "0.4", default-features = false, features = ["std"] }
1919
tracing = { version = "0.1", optional = true }
20+
futures-executor = "0.3"
2021

2122
[dev-dependencies]
2223
opentelemetry-appender-tracing = { workspace = true }
2324
tracing = { version = "0.1", default-features = false, features = ["std"] }
2425
tracing-core = "0.1.31"
2526
tracing-subscriber = { version = "0.3.0", default-features = false, features = ["env-filter", "fmt", "registry", "std"] }
26-
microbench = "0.5"
27-
ctrlc = "3.4"
27+
ctrlc = "3.4"
2828

2929
[features]
3030
spec_unstable_logs_enabled = ["opentelemetry/spec_unstable_logs_enabled", "opentelemetry_sdk/spec_unstable_logs_enabled", "opentelemetry-appender-tracing/spec_unstable_logs_enabled"]

opentelemetry-user-events-logs/README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ Windows. It builds on top of the Linux Tracepoints, and so allows user processes
1616
to create events and trace data that can be viewed via existing tools like
1717
ftrace and perf.
1818

19-
This kernel feature is supported started in Linux kernel 5.18 onwards. The feature enables
20-
- A faster path for tracing from user mode application utilizing kernel mode memory address space.
21-
- User processes can now export telemetry events only when it is useful i.e, when the registered set of tracepoint events are enabled.
19+
This kernel feature is supported started in Linux kernel 6.4 onwards. The feature enables
2220

23-
This user_events exporter enables applications to use OpenTelemetry API to capture the telemetry events, and write to user_events subsystem. From user_events, the events can be
24-
- Captured by the agents running locally, and listening for specific events withing user_events subsystem.
25-
- Or real-time monitoring using local Linux tool like [perf](https://perf.wiki.kernel.org/index.php/Main_Page) or ftrace.
21+
- A faster path for tracing from user mode application utilizing kernel mode memory address space.
22+
- User processes can now export telemetry events only when it is useful i.e, when the registered set of tracepoint events are enabled.
23+
24+
This user_events exporter enables applications to use OpenTelemetry API to capture the telemetry events, and write to user_events subsystem. From user_events, the events can be
25+
26+
- Captured by the agents running locally, and listening for specific events withing user_events subsystem.
27+
- Or real-time monitoring using local Linux tool like [perf](https://perf.wiki.kernel.org/index.php/Main_Page) or ftrace.
2628

2729
[![Crates.io: opentelemetry-user-events-logs](https://img.shields.io/crates/v/opentelemetry-user-events-logs.svg)](https://crates.io/crates/opentelemetry-user-events-logs)
2830
[![Documentation](https://docs.rs/opentelemetry-user-events-logs/badge.svg)](https://docs.rs/opentelemetry-user-events-logs)

opentelemetry-user-events-logs/src/logs/exporter.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -383,17 +383,11 @@ impl Debug for UserEventsExporter {
383383
}
384384

385385
impl opentelemetry_sdk::logs::LogExporter for UserEventsExporter {
386-
#[allow(clippy::manual_async_fn)]
387-
fn export(
388-
&self,
389-
batch: opentelemetry_sdk::logs::LogBatch<'_>,
390-
) -> impl std::future::Future<Output = OTelSdkResult> + Send {
391-
async move {
392-
for (record, instrumentation) in batch.iter() {
393-
let _ = self.export_log_data(record, instrumentation);
394-
}
395-
Ok(())
386+
async fn export(&self, batch: opentelemetry_sdk::logs::LogBatch<'_>) -> OTelSdkResult {
387+
for (record, instrumentation) in batch.iter() {
388+
let _ = self.export_log_data(record, instrumentation);
396389
}
390+
Ok(())
397391
}
398392

399393
#[cfg(feature = "spec_unstable_logs_enabled")]
Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,40 @@
11
use std::fmt::Debug;
22

3-
use opentelemetry_sdk::error::OTelSdkResult;
4-
5-
#[cfg(feature = "spec_unstable_logs_enabled")]
3+
use opentelemetry::InstrumentationScope;
64
use opentelemetry_sdk::logs::LogExporter;
7-
8-
use crate::logs::exporter::*;
5+
use opentelemetry_sdk::{
6+
error::OTelSdkResult,
7+
logs::{LogBatch, SdkLogRecord},
8+
};
99

1010
/// This export processor exports without synchronization.
1111
/// This is currently only used in users_event exporter, where we know
1212
/// that the underlying exporter is safe under concurrent calls
1313
1414
#[derive(Debug)]
15-
pub struct ReentrantLogProcessor {
16-
event_exporter: UserEventsExporter,
15+
pub struct ReentrantLogProcessor<T: LogExporter> {
16+
exporter: T,
1717
}
1818

19-
impl ReentrantLogProcessor {
19+
impl<T: LogExporter> ReentrantLogProcessor<T> {
2020
/// constructor that accepts an exporter instance
21-
pub fn new(exporter: UserEventsExporter) -> Self {
22-
ReentrantLogProcessor {
23-
event_exporter: exporter,
24-
}
21+
pub fn new(exporter: T) -> Self {
22+
ReentrantLogProcessor { exporter }
2523
}
2624
}
2725

28-
impl opentelemetry_sdk::logs::LogProcessor for ReentrantLogProcessor {
29-
fn emit(
30-
&self,
31-
record: &mut opentelemetry_sdk::logs::SdkLogRecord,
32-
instrumentation: &opentelemetry::InstrumentationScope,
33-
) {
34-
_ = self.event_exporter.export_log_data(record, instrumentation);
26+
impl<T: LogExporter> opentelemetry_sdk::logs::LogProcessor for ReentrantLogProcessor<T> {
27+
fn emit(&self, record: &mut SdkLogRecord, scope: &InstrumentationScope) {
28+
let log_tuple = &[(record as &SdkLogRecord, scope)];
29+
let _ = futures_executor::block_on(self.exporter.export(LogBatch::new(log_tuple)));
3530
}
3631

37-
// This is a no-op as this processor doesn't keep anything
38-
// in memory to be flushed out.
32+
// Nothing to flush
3933
fn force_flush(&self) -> OTelSdkResult {
4034
Ok(())
4135
}
4236

43-
// This is a no-op no special cleanup is required before
44-
// shutdown.
37+
// Nothing to shutdown
4538
fn shutdown(&self) -> OTelSdkResult {
4639
Ok(())
4740
}
@@ -53,6 +46,6 @@ impl opentelemetry_sdk::logs::LogProcessor for ReentrantLogProcessor {
5346
target: &str,
5447
name: &str,
5548
) -> bool {
56-
self.event_exporter.event_enabled(level, target, name)
49+
self.exporter.event_enabled(level, target, name)
5750
}
5851
}

stress/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ opentelemetry_sdk = { workspace = true, features = ["logs", "spec_unstable_logs_
3232
opentelemetry-user-events-logs = { path = "../opentelemetry-user-events-logs", features = ["spec_unstable_logs_enabled"]}
3333
opentelemetry-etw-logs = { path = "../opentelemetry-etw-logs"}
3434
tracing = { version = "0.1", default-features = false, features = ["std"] }
35-
tracing-subscriber = { version = "0.3.0", default-features = false, features = ["registry", "std"] }
35+
tracing-subscriber = { version = "0.3.0", default-features = false, features = ["env-filter","registry", "std"] }
3636

3737
[features]
3838
stats = ["sysinfo"]

stress/src/user_events.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use opentelemetry_appender_tracing::layer;
2626
use opentelemetry_sdk::logs::SdkLoggerProvider;
2727
use opentelemetry_user_events_logs::UserEventsLoggerProviderBuilderExt;
2828
use tracing::info;
29-
use tracing_subscriber::prelude::*;
29+
use tracing_subscriber::{prelude::*, EnvFilter};
3030
mod throughput;
3131

3232
// Function to initialize the logger
@@ -49,7 +49,9 @@ fn log_event_task() {
4949
fn main() {
5050
// Initialize the logger
5151
let logger_provider = init_logger();
52+
let filter_otel = EnvFilter::new("info").add_directive("opentelemetry=off".parse().unwrap());
5253
let layer = layer::OpenTelemetryTracingBridge::new(&logger_provider);
54+
let layer = layer.with_filter(filter_otel);
5355
tracing_subscriber::registry().with(layer).init();
5456

5557
// Use the provided stress test framework

0 commit comments

Comments
 (0)