Skip to content

Commit 0f7b461

Browse files
committed
✨ introduce tracer for stdout, stderr, nowrite
1 parent d71c525 commit 0f7b461

File tree

3 files changed

+65
-8
lines changed

3 files changed

+65
-8
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,6 @@ tracing-subscriber = { version = "0.3", default-features = false, features = [
4343

4444

4545
[features]
46-
jaeger = ["opentelemetry-jaeger", "opentelemetry-semantic-conventions"]
47-
otlp = ["opentelemetry-otlp", "opentelemetry-semantic-conventions"]
46+
jaeger = ["opentelemetry-jaeger", "tracer"]
47+
otlp = ["opentelemetry-otlp", "tracer"]
48+
tracer = ["opentelemetry-semantic-conventions"]

src/tools/mod.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,41 @@
22
use opentelemetry::sdk::Resource;
33
#[cfg(any(feature = "jaeger", feature = "otlp"))]
44
use opentelemetry::{sdk::trace as sdktrace, trace::TraceError};
5-
#[cfg(any(feature = "jaeger", feature = "otlp"))]
5+
#[cfg(feature = "tracer")]
66
use opentelemetry_semantic_conventions as semcov;
77

88
#[cfg(feature = "jaeger")]
9-
mod jaeger;
9+
pub mod jaeger;
1010
#[cfg(feature = "otlp")]
11-
mod otlp;
11+
pub mod otlp;
12+
#[cfg(feature = "tracer")]
13+
pub mod write;
1214

1315
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
1416
pub enum CollectorKind {
1517
#[cfg(feature = "otlp")]
1618
Otlp,
1719
#[cfg(feature = "jaeger")]
1820
Jaeger,
19-
// Stdout,
21+
#[cfg(feature = "tracer")]
22+
Stdout,
23+
#[cfg(feature = "tracer")]
24+
Stderr,
25+
#[cfg(feature = "tracer")]
26+
NoWrite,
2027
}
2128

22-
#[cfg(any(feature = "jaeger", feature = "otlp"))]
29+
#[cfg(feature = "tracer")]
2330
pub fn init_tracer(
2431
kind: CollectorKind,
2532
resource: Resource,
2633
) -> Result<sdktrace::Tracer, TraceError> {
2734
match kind {
35+
CollectorKind::Stdout => write::init_tracer(resource, write::identity, std::io::stdout()),
36+
CollectorKind::Stderr => write::init_tracer(resource, write::identity, std::io::stderr()),
37+
CollectorKind::NoWrite => {
38+
write::init_tracer(resource, write::identity, write::WriteNoWhere::default())
39+
}
2840
#[cfg(feature = "otlp")]
2941
CollectorKind::Otlp => {
3042
// if let Some(url) = std::env::var_os("OTEL_COLLECTOR_URL")
@@ -52,7 +64,7 @@ pub fn init_tracer(
5264
/// # }
5365
///
5466
/// ```
55-
#[cfg(any(feature = "jaeger", feature = "otlp"))]
67+
#[cfg(feature = "tracer")]
5668
pub fn make_resource<S>(service_name: S, service_version: S) -> Resource
5769
where
5870
S: Into<String>,

src/tools/write.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use opentelemetry::sdk::export::trace::stdout::PipelineBuilder;
2+
use opentelemetry::sdk::Resource;
3+
use opentelemetry::{
4+
global, sdk::propagation::TraceContextPropagator, sdk::trace as sdktrace, trace::TraceError,
5+
};
6+
use std::fmt::Debug;
7+
use std::io::Write;
8+
9+
pub fn identity<W: Write>(v: PipelineBuilder<W>) -> PipelineBuilder<W> {
10+
v
11+
}
12+
13+
pub fn init_tracer<F, W>(
14+
resource: Resource,
15+
transform: F,
16+
w: W,
17+
) -> Result<sdktrace::Tracer, TraceError>
18+
where
19+
F: FnOnce(PipelineBuilder<W>) -> PipelineBuilder<W>,
20+
W: Write + Debug + Send + 'static,
21+
{
22+
global::set_text_map_propagator(TraceContextPropagator::new());
23+
24+
let mut pipeline = PipelineBuilder::default().with_writer(w).with_trace_config(
25+
sdktrace::config()
26+
.with_resource(resource)
27+
.with_sampler(sdktrace::Sampler::AlwaysOn),
28+
);
29+
pipeline = transform(pipeline);
30+
Ok(pipeline.install_simple())
31+
}
32+
33+
#[derive(Debug, Default)]
34+
pub struct WriteNoWhere;
35+
36+
impl Write for WriteNoWhere {
37+
fn write(&mut self, _buf: &[u8]) -> std::io::Result<usize> {
38+
Ok(0)
39+
}
40+
41+
fn flush(&mut self) -> std::io::Result<()> {
42+
Ok(())
43+
}
44+
}

0 commit comments

Comments
 (0)