@@ -2,59 +2,54 @@ mod env;
22mod model;
33mod uploader;
44
5- use async_trait:: async_trait;
65use futures_core:: future:: BoxFuture ;
76use http:: Uri ;
87use model:: endpoint:: Endpoint ;
9- use opentelemetry:: { global , trace:: TraceError , InstrumentationScope , KeyValue } ;
8+ use opentelemetry:: trace:: TraceError ;
109use opentelemetry_http:: HttpClient ;
1110use opentelemetry_sdk:: {
1211 resource:: { ResourceDetector , SdkProvidedResourceDetector } ,
13- trace,
14- trace:: { Config , Tracer , TracerProvider } ,
15- ExportError , Resource ,
12+ trace, ExportError ,
1613} ;
1714use opentelemetry_semantic_conventions as semcov;
18- use std:: borrow:: Cow ;
19- use std:: net:: SocketAddr ;
15+ use std:: net:: { AddrParseError , SocketAddr } ;
2016use std:: sync:: Arc ;
2117
2218/// Zipkin span exporter
2319#[ derive( Debug ) ]
24- pub struct Exporter {
20+ pub struct ZipkinExporter {
2521 local_endpoint : Endpoint ,
2622 uploader : uploader:: Uploader ,
2723}
2824
29- impl Exporter {
25+ impl ZipkinExporter {
26+ /// Get a builder to configure a [ZipkinExporter].
27+ pub fn builder ( ) -> ZipkinExporterBuilder {
28+ ZipkinExporterBuilder :: default ( )
29+ }
30+
3031 fn new ( local_endpoint : Endpoint , client : Arc < dyn HttpClient > , collector_endpoint : Uri ) -> Self {
31- Exporter {
32+ ZipkinExporter {
3233 local_endpoint,
3334 uploader : uploader:: Uploader :: new ( client, collector_endpoint) ,
3435 }
3536 }
3637}
3738
38- /// Create a new Zipkin exporter pipeline builder.
39- pub fn new_pipeline ( ) -> ZipkinPipelineBuilder {
40- ZipkinPipelineBuilder :: default ( )
41- }
42-
43- /// Builder for `ExporterConfig` struct.
39+ /// Builder for `ZipkinExporter` struct.
4440#[ derive( Debug ) ]
45- pub struct ZipkinPipelineBuilder {
41+ pub struct ZipkinExporterBuilder {
4642 service_name : Option < String > ,
4743 service_addr : Option < SocketAddr > ,
4844 collector_endpoint : String ,
49- trace_config : Option < Config > ,
5045 client : Option < Arc < dyn HttpClient > > ,
5146}
5247
53- impl Default for ZipkinPipelineBuilder {
48+ impl Default for ZipkinExporterBuilder {
5449 fn default ( ) -> Self {
5550 let timeout = env:: get_timeout ( ) ;
5651
57- ZipkinPipelineBuilder {
52+ ZipkinExporterBuilder {
5853 #[ cfg( feature = "reqwest-blocking-client" ) ]
5954 client : Some ( Arc :: new (
6055 reqwest:: blocking:: Client :: builder ( )
@@ -78,58 +73,29 @@ impl Default for ZipkinPipelineBuilder {
7873 service_name : None ,
7974 service_addr : None ,
8075 collector_endpoint : env:: get_endpoint ( ) ,
81- trace_config : None ,
8276 }
8377 }
8478}
8579
86- impl ZipkinPipelineBuilder {
87- /// Initial a Zipkin span exporter .
80+ impl ZipkinExporterBuilder {
81+ /// Creates a new [ZipkinExporter] from this configuration .
8882 ///
8983 /// Returns error if the endpoint is not valid or if no http client is provided.
90- pub fn init_exporter ( mut self ) -> Result < Exporter , TraceError > {
91- let ( _, endpoint) = self . init_config_and_endpoint ( ) ;
92- self . init_exporter_with_endpoint ( endpoint)
93- }
94-
95- fn init_config_and_endpoint ( & mut self ) -> ( Config , Endpoint ) {
96- let service_name = self . service_name . take ( ) ;
97- if let Some ( service_name) = service_name {
98- let config = if let Some ( mut cfg) = self . trace_config . take ( ) {
99- cfg. resource = Cow :: Owned (
100- Resource :: builder_empty ( )
101- . with_attributes (
102- cfg. resource
103- . iter ( )
104- . filter ( |( k, _v) | k. as_str ( ) != semcov:: resource:: SERVICE_NAME )
105- . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) )
106- . collect :: < Vec < KeyValue > > ( ) ,
107- )
108- . build ( ) ,
109- ) ;
110- cfg
111- } else {
112- #[ allow( deprecated) ]
113- Config :: default ( ) . with_resource ( Resource :: builder_empty ( ) . build ( ) )
114- } ;
115- ( config, Endpoint :: new ( service_name, self . service_addr ) )
84+ pub fn build ( self ) -> Result < ZipkinExporter , TraceError > {
85+ let service_name = if let Some ( service_name) = self . service_name {
86+ service_name
11687 } else {
117- let service_name = SdkProvidedResourceDetector
88+ SdkProvidedResourceDetector
11889 . detect ( )
11990 . get ( & semcov:: resource:: SERVICE_NAME . into ( ) )
12091 . unwrap ( )
121- . to_string ( ) ;
122- (
123- #[ allow( deprecated) ]
124- Config :: default ( ) . with_resource ( Resource :: builder_empty ( ) . build ( ) ) ,
125- Endpoint :: new ( service_name, self . service_addr ) ,
126- )
127- }
128- }
92+ . to_string ( )
93+ } ;
94+
95+ let endpoint = Endpoint :: new ( service_name, self . service_addr ) ;
12996
130- fn init_exporter_with_endpoint ( self , endpoint : Endpoint ) -> Result < Exporter , TraceError > {
13197 if let Some ( client) = self . client {
132- let exporter = Exporter :: new (
98+ let exporter = ZipkinExporter :: new (
13399 endpoint,
134100 client,
135101 self . collector_endpoint
@@ -142,45 +108,6 @@ impl ZipkinPipelineBuilder {
142108 }
143109 }
144110
145- /// Install the Zipkin trace exporter pipeline with a simple span processor.
146- #[ allow( deprecated) ]
147- pub fn install_simple (
148- mut self ,
149- ) -> Result < ( Tracer , opentelemetry_sdk:: trace:: TracerProvider ) , TraceError > {
150- let ( config, endpoint) = self . init_config_and_endpoint ( ) ;
151- let exporter = self . init_exporter_with_endpoint ( endpoint) ?;
152- let mut provider_builder = TracerProvider :: builder ( ) . with_simple_exporter ( exporter) ;
153- provider_builder = provider_builder. with_config ( config) ;
154- let provider = provider_builder. build ( ) ;
155- let scope = InstrumentationScope :: builder ( "opentelemetry-zipkin" )
156- . with_version ( env ! ( "CARGO_PKG_VERSION" ) )
157- . with_schema_url ( semcov:: SCHEMA_URL )
158- . build ( ) ;
159- let tracer = opentelemetry:: trace:: TracerProvider :: tracer_with_scope ( & provider, scope) ;
160- let _ = global:: set_tracer_provider ( provider. clone ( ) ) ;
161- Ok ( ( tracer, provider) )
162- }
163-
164- /// Install the Zipkin trace exporter pipeline with a batch span processor using the specified
165- /// runtime.
166- #[ allow( deprecated) ]
167- pub fn install_batch (
168- mut self ,
169- ) -> Result < ( Tracer , opentelemetry_sdk:: trace:: TracerProvider ) , TraceError > {
170- let ( config, endpoint) = self . init_config_and_endpoint ( ) ;
171- let exporter = self . init_exporter_with_endpoint ( endpoint) ?;
172- let mut provider_builder = TracerProvider :: builder ( ) . with_batch_exporter ( exporter) ;
173- provider_builder = provider_builder. with_config ( config) ;
174- let provider = provider_builder. build ( ) ;
175- let scope = InstrumentationScope :: builder ( "opentelemetry-zipkin" )
176- . with_version ( env ! ( "CARGO_PKG_VERSION" ) )
177- . with_schema_url ( semcov:: SCHEMA_URL )
178- . build ( ) ;
179- let tracer = opentelemetry:: trace:: TracerProvider :: tracer_with_scope ( & provider, scope) ;
180- let _ = global:: set_tracer_provider ( provider. clone ( ) ) ;
181- Ok ( ( tracer, provider) )
182- }
183-
184111 /// Assign the service name under which to group traces.
185112 pub fn with_service_name < T : Into < String > > ( mut self , name : T ) -> Self {
186113 self . service_name = Some ( name. into ( ) ) ;
@@ -193,7 +120,7 @@ impl ZipkinPipelineBuilder {
193120 self
194121 }
195122
196- /// Assign the service name under which to group traces .
123+ /// Assign the service address .
197124 pub fn with_service_address ( mut self , addr : SocketAddr ) -> Self {
198125 self . service_addr = Some ( addr) ;
199126 self
@@ -204,12 +131,6 @@ impl ZipkinPipelineBuilder {
204131 self . collector_endpoint = endpoint. into ( ) ;
205132 self
206133 }
207-
208- /// Assign the SDK trace configuration.
209- pub fn with_trace_config ( mut self , config : Config ) -> Self {
210- self . trace_config = Some ( config) ;
211- self
212- }
213134}
214135
215136async fn zipkin_export (
@@ -225,8 +146,7 @@ async fn zipkin_export(
225146 uploader. upload ( zipkin_spans) . await
226147}
227148
228- #[ async_trait]
229- impl trace:: SpanExporter for Exporter {
149+ impl trace:: SpanExporter for ZipkinExporter {
230150 /// Export spans to Zipkin collector.
231151 fn export ( & mut self , batch : Vec < trace:: SpanData > ) -> BoxFuture < ' static , trace:: ExportResult > {
232152 Box :: pin ( zipkin_export (
@@ -253,6 +173,10 @@ pub enum Error {
253173 #[ error( "invalid uri" ) ]
254174 InvalidUri ( #[ from] http:: uri:: InvalidUri ) ,
255175
176+ /// The IP/socket address provided is invalid
177+ #[ error( "invalid address" ) ]
178+ InvalidAddress ( #[ from] AddrParseError ) ,
179+
256180 /// Other errors
257181 #[ error( "export error: {0}" ) ]
258182 Other ( String ) ,
0 commit comments