Skip to content

Commit 33ee164

Browse files
authored
Pipeline builder for stdout trace exporter (#224)
1 parent 0fa4e7d commit 33ee164

8 files changed

Lines changed: 104 additions & 100 deletions

File tree

examples/aws-xray/src/client.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,17 @@ use opentelemetry::{api, exporter::trace::stdout, global, sdk};
44
use opentelemetry_contrib::{XrayIdGenerator, XrayTraceContextPropagator};
55

66
fn init_tracer() {
7-
// Create stdout exporter to be able to retrieve the collected spans.
8-
let exporter = stdout::Builder::default().init();
9-
7+
// Install stdout exporter pipeline to be able to retrieve the collected spans.
108
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
119
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
12-
let provider = sdk::TracerProvider::builder()
13-
.with_simple_exporter(exporter)
14-
.with_config(sdk::Config {
10+
stdout::new_pipeline()
11+
.with_trace_config(sdk::Config {
1512
default_sampler: Box::new(sdk::Sampler::AlwaysOn),
1613
id_generator: Box::new(XrayIdGenerator::default()),
1714
..Default::default()
1815
})
19-
.build();
16+
.install();
2017

21-
global::set_provider(provider);
2218
global::set_text_map_propagator(XrayTraceContextPropagator::new());
2319
}
2420

examples/aws-xray/src/server.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,17 @@ async fn handle(req: Request<Body>) -> Result<Response<Body>, Infallible> {
2828
}
2929

3030
fn init_tracer() {
31-
// Create stdout exporter to be able to retrieve the collected spans.
32-
let exporter = stdout::Builder::default().init();
33-
31+
// Install stdout exporter pipeline to be able to retrieve the collected spans.
3432
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
3533
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
36-
let provider = sdk::TracerProvider::builder()
37-
.with_simple_exporter(exporter)
38-
.with_config(sdk::Config {
34+
stdout::new_pipeline()
35+
.with_trace_config(sdk::Config {
3936
default_sampler: Box::new(sdk::Sampler::AlwaysOn),
4037
id_generator: Box::new(XrayIdGenerator::default()),
4138
..Default::default()
4239
})
43-
.build();
40+
.install();
4441

45-
global::set_provider(provider);
4642
global::set_text_map_propagator(XrayTraceContextPropagator::new());
4743
}
4844

examples/http/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ path = "src/client.rs"
1515
hyper = "0.13"
1616
tokio = { version = "0.2", features = ["full"] }
1717
opentelemetry = { path = "../../", features = ["http"] }
18-
opentelemetry-jaeger = { path = "../../opentelemetry-jaeger" }

examples/http/src/client.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,15 @@ use opentelemetry::api::{Context, TextMapFormat, TraceContextExt, Tracer};
33
use opentelemetry::{api, exporter::trace::stdout, global, sdk};
44

55
fn init_tracer() {
6-
// Create stdout exporter to be able to retrieve the collected spans.
7-
let exporter = stdout::Builder::default().init();
8-
6+
// Install stdout exporter pipeline to be able to retrieve the collected spans.
97
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
108
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
11-
let provider = sdk::TracerProvider::builder()
12-
.with_simple_exporter(exporter)
13-
.with_config(sdk::Config {
9+
stdout::new_pipeline()
10+
.with_trace_config(sdk::Config {
1411
default_sampler: Box::new(sdk::Sampler::AlwaysOn),
1512
..Default::default()
1613
})
17-
.build();
18-
19-
global::set_provider(provider);
14+
.install();
2015
}
2116

2217
#[tokio::main]

examples/http/src/server.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,15 @@ async fn handle(req: Request<Body>) -> Result<Response<Body>, Infallible> {
1717
}
1818

1919
fn init_tracer() {
20-
// Create stdout exporter to be able to retrieve the collected spans.
21-
let exporter = stdout::Builder::default().init();
22-
20+
// Install stdout exporter pipeline to be able to retrieve the collected spans.
2321
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
2422
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
25-
let provider = sdk::TracerProvider::builder()
26-
.with_simple_exporter(exporter)
27-
.with_config(sdk::Config {
23+
stdout::new_pipeline()
24+
.with_trace_config(sdk::Config {
2825
default_sampler: Box::new(sdk::Sampler::AlwaysOn),
2926
..Default::default()
3027
})
31-
.build();
32-
33-
global::set_provider(provider);
28+
.install();
3429
}
3530

3631
#[tokio::main]

examples/stdout.rs

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
use opentelemetry::exporter::trace::stdout;
2-
use opentelemetry::{
3-
api::{Tracer, TracerProvider},
4-
global, sdk,
5-
};
2+
use opentelemetry::{api::Tracer, sdk};
63

74
fn main() {
8-
// Create stdout exporter to be able to retrieve the collected spans.
9-
let exporter = stdout::Builder::default().init();
10-
5+
// Install stdout exporter pipeline to be able to retrieve collected spans.
116
// For the demonstration, use `Sampler::AlwaysOn` sampler to sample all traces. In a production
127
// application, use `Sampler::ParentBased` or `Sampler::TraceIdRatioBased` with a desired ratio.
13-
let provider = sdk::TracerProvider::builder()
14-
.with_simple_exporter(exporter)
15-
.with_config(sdk::Config {
8+
let tracer = stdout::new_pipeline()
9+
.with_trace_config(sdk::Config {
1610
default_sampler: Box::new(sdk::Sampler::AlwaysOn),
1711
..Default::default()
1812
})
19-
.build();
20-
global::set_provider(provider);
13+
.install();
2114

22-
global::trace_provider()
23-
.get_tracer("component-main", None)
24-
.in_span("operation", |_cx| {});
15+
tracer.in_span("operation", |_cx| {});
2516
}

opentelemetry-semantic-conventions/src/resource.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,20 @@
77
//!
88
//! ## Usage
99
//!
10-
//! ```rust
10+
//! ```rust,no_run
1111
//! use opentelemetry::sdk;
1212
//! use opentelemetry_semantic_conventions as semcov;
1313
//! use std::sync::Arc;
1414
//!
15-
//! let exporter = opentelemetry::exporter::trace::stdout::Builder::default().init();
16-
//! let provider = sdk::TracerProvider::builder()
17-
//! .with_simple_exporter(exporter)
18-
//! .with_config(sdk::Config {
19-
//! resource: Arc::new(sdk::Resource::new(vec![
20-
//! semcov::resource::SERVICE_NAME.string("my-service"),
21-
//! semcov::resource::SERVICE_NAMESPACE.string("my-namespace"),
22-
//! ])),
23-
//! ..sdk::Config::default()
24-
//! })
25-
//! .build();
15+
//! let _tracer = opentelemetry::exporter::trace::stdout::new_pipeline()
16+
//! .with_trace_config(sdk::Config {
17+
//! resource: Arc::new(sdk::Resource::new(vec![
18+
//! semcov::resource::SERVICE_NAME.string("my-service"),
19+
//! semcov::resource::SERVICE_NAMESPACE.string("my-namespace"),
20+
//! ])),
21+
//! ..sdk::Config::default()
22+
//! })
23+
//! .install();
2624
//! ```
2725
2826
use opentelemetry::api::Key;

src/exporter/trace/stdout.rs

Lines changed: 72 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,62 +10,89 @@
1010
//!
1111
//! # Examples
1212
//!
13-
//! ```
13+
//! ```no_run
14+
//! use opentelemetry::api::Tracer;
1415
//! use opentelemetry::exporter::trace::stdout;
15-
//! use opentelemetry::{sdk, global};
1616
//!
17-
//! // Create a new stdout exporter that writes pretty printed span output
18-
//! let exporter = stdout::Builder::default().with_pretty_print(true).init();
19-
//! let provider = sdk::TracerProvider::builder()
20-
//! .with_simple_exporter(exporter)
21-
//! .build();
22-
//! global::set_provider(provider);
17+
//! fn main() {
18+
//! let tracer = stdout::new_pipeline()
19+
//! .with_pretty_print(true)
20+
//! .install();
21+
//!
22+
//! tracer.in_span("doing_work", |cx| {
23+
//! // Traced app logic here...
24+
//! });
25+
//! }
2326
//! ```
24-
use crate::exporter::trace;
27+
use crate::{api::TracerProvider, exporter::trace, global, sdk};
2528
use std::fmt::Debug;
2629
use std::io::{self, stdout, Stdout, Write};
2730
use std::sync::{Arc, Mutex};
2831

29-
/// Builder
32+
/// Pipeline builder
3033
#[derive(Debug)]
31-
pub struct Builder<W: Write + Debug> {
32-
writer: Mutex<W>,
34+
pub struct PipelineBuilder<W: Write> {
3335
pretty_print: bool,
36+
trace_config: Option<sdk::Config>,
37+
writer: W,
3438
}
3539

36-
impl<W: Write + Debug> Builder<W> {
37-
/// Specify the writer to use with this exporter
38-
pub fn with_writer<T: Write + Debug>(self, writer: T) -> Builder<T> {
39-
Builder {
40-
writer: Mutex::new(writer),
41-
pretty_print: self.pretty_print,
40+
/// Create a new stdout exporter pipeline builder.
41+
pub fn new_pipeline() -> PipelineBuilder<Stdout> {
42+
PipelineBuilder::default()
43+
}
44+
45+
impl Default for PipelineBuilder<Stdout> {
46+
/// Return the default pipeline builder.
47+
fn default() -> Self {
48+
Self {
49+
pretty_print: false,
50+
trace_config: None,
51+
writer: stdout(),
4252
}
4353
}
54+
}
4455

45-
/// Specify the pretty print setting for this exporter
46-
pub fn with_pretty_print(self, pretty_print: bool) -> Self {
47-
Builder {
48-
pretty_print,
49-
..self
50-
}
56+
impl<W: Write> PipelineBuilder<W> {
57+
/// Specify the pretty print setting.
58+
pub fn with_pretty_print(mut self, pretty_print: bool) -> Self {
59+
self.pretty_print = pretty_print;
60+
self
61+
}
62+
63+
/// Assign the SDK trace configuration.
64+
pub fn with_trace_config(mut self, config: sdk::Config) -> Self {
65+
self.trace_config = Some(config);
66+
self
5167
}
5268

53-
/// Build a new exporter
54-
pub fn init(self) -> Exporter<W> {
55-
Exporter {
56-
writer: self.writer,
69+
/// Specify the writer to use.
70+
pub fn with_writer<T: Write>(self, writer: T) -> PipelineBuilder<T> {
71+
PipelineBuilder {
5772
pretty_print: self.pretty_print,
73+
trace_config: self.trace_config,
74+
writer,
5875
}
5976
}
6077
}
6178

62-
impl Default for Builder<Stdout> {
63-
/// Return the default Exporter Builder.
64-
fn default() -> Self {
65-
Builder {
66-
writer: Mutex::new(stdout()),
67-
pretty_print: false,
79+
impl<W> PipelineBuilder<W>
80+
where
81+
W: Write + Debug + Send + 'static,
82+
{
83+
/// Install the stdout exporter pipeline with the recommended defaults.
84+
pub fn install(mut self) -> sdk::Tracer {
85+
let exporter = Exporter::new(self.writer, self.pretty_print);
86+
87+
let mut provider_builder = sdk::TracerProvider::builder().with_exporter(exporter);
88+
if let Some(config) = self.trace_config.take() {
89+
provider_builder = provider_builder.with_config(config);
6890
}
91+
let provider = provider_builder.build();
92+
let tracer = provider.get_tracer("opentelemetry", Some(env!("CARGO_PKG_VERSION")));
93+
global::set_provider(provider);
94+
95+
tracer
6996
}
7097
}
7198

@@ -80,6 +107,16 @@ pub struct Exporter<W: Write> {
80107
pretty_print: bool,
81108
}
82109

110+
impl<W: Write> Exporter<W> {
111+
/// Create a new stdout `Exporter`.
112+
pub fn new(writer: W, pretty_print: bool) -> Self {
113+
Self {
114+
writer: Mutex::new(writer),
115+
pretty_print,
116+
}
117+
}
118+
}
119+
83120
impl<W> trace::SpanExporter for Exporter<W>
84121
where
85122
W: Write + Debug + Send + 'static,
@@ -99,7 +136,7 @@ where
99136
}
100137
}
101138

102-
Ok(0)
139+
Ok(())
103140
});
104141

105142
if result.is_ok() {
@@ -109,7 +146,4 @@ where
109146
trace::ExportResult::FailedNotRetryable
110147
}
111148
}
112-
113-
/// Ignored for now.
114-
fn shutdown(&self) {}
115149
}

0 commit comments

Comments
 (0)