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 } ;
2528use std:: fmt:: Debug ;
2629use std:: io:: { self , stdout, Stdout , Write } ;
2730use 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+
83120impl < W > trace:: SpanExporter for Exporter < W >
84121where
85122 W : Write + Debug + Send + ' static ,
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