@@ -2,59 +2,54 @@ mod env;
2
2
mod model;
3
3
mod uploader;
4
4
5
- use async_trait:: async_trait;
6
5
use futures_core:: future:: BoxFuture ;
7
6
use http:: Uri ;
8
7
use model:: endpoint:: Endpoint ;
9
- use opentelemetry:: { global , trace:: TraceError , InstrumentationScope , KeyValue } ;
8
+ use opentelemetry:: trace:: TraceError ;
10
9
use opentelemetry_http:: HttpClient ;
11
10
use opentelemetry_sdk:: {
12
11
resource:: { ResourceDetector , SdkProvidedResourceDetector } ,
13
- trace,
14
- trace:: { Config , Tracer , TracerProvider } ,
15
- ExportError , Resource ,
12
+ trace, ExportError ,
16
13
} ;
17
14
use opentelemetry_semantic_conventions as semcov;
18
- use std:: borrow:: Cow ;
19
- use std:: net:: SocketAddr ;
15
+ use std:: net:: { AddrParseError , SocketAddr } ;
20
16
use std:: sync:: Arc ;
21
17
22
18
/// Zipkin span exporter
23
19
#[ derive( Debug ) ]
24
- pub struct Exporter {
20
+ pub struct ZipkinExporter {
25
21
local_endpoint : Endpoint ,
26
22
uploader : uploader:: Uploader ,
27
23
}
28
24
29
- impl Exporter {
25
+ impl ZipkinExporter {
26
+ /// Get a builder to configure a [ZipkinExporter].
27
+ pub fn builder ( ) -> ZipkinExporterBuilder {
28
+ ZipkinExporterBuilder :: default ( )
29
+ }
30
+
30
31
fn new ( local_endpoint : Endpoint , client : Arc < dyn HttpClient > , collector_endpoint : Uri ) -> Self {
31
- Exporter {
32
+ ZipkinExporter {
32
33
local_endpoint,
33
34
uploader : uploader:: Uploader :: new ( client, collector_endpoint) ,
34
35
}
35
36
}
36
37
}
37
38
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.
44
40
#[ derive( Debug ) ]
45
- pub struct ZipkinPipelineBuilder {
41
+ pub struct ZipkinExporterBuilder {
46
42
service_name : Option < String > ,
47
43
service_addr : Option < SocketAddr > ,
48
44
collector_endpoint : String ,
49
- trace_config : Option < Config > ,
50
45
client : Option < Arc < dyn HttpClient > > ,
51
46
}
52
47
53
- impl Default for ZipkinPipelineBuilder {
48
+ impl Default for ZipkinExporterBuilder {
54
49
fn default ( ) -> Self {
55
50
let timeout = env:: get_timeout ( ) ;
56
51
57
- ZipkinPipelineBuilder {
52
+ ZipkinExporterBuilder {
58
53
#[ cfg( feature = "reqwest-blocking-client" ) ]
59
54
client : Some ( Arc :: new (
60
55
reqwest:: blocking:: Client :: builder ( )
@@ -78,58 +73,29 @@ impl Default for ZipkinPipelineBuilder {
78
73
service_name : None ,
79
74
service_addr : None ,
80
75
collector_endpoint : env:: get_endpoint ( ) ,
81
- trace_config : None ,
82
76
}
83
77
}
84
78
}
85
79
86
- impl ZipkinPipelineBuilder {
87
- /// Initial a Zipkin span exporter .
80
+ impl ZipkinExporterBuilder {
81
+ /// Creates a new [ZipkinExporter] from this configuration .
88
82
///
89
83
/// 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
116
87
} else {
117
- let service_name = SdkProvidedResourceDetector
88
+ SdkProvidedResourceDetector
118
89
. detect ( )
119
90
. get ( & semcov:: resource:: SERVICE_NAME . into ( ) )
120
91
. 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 ) ;
129
96
130
- fn init_exporter_with_endpoint ( self , endpoint : Endpoint ) -> Result < Exporter , TraceError > {
131
97
if let Some ( client) = self . client {
132
- let exporter = Exporter :: new (
98
+ let exporter = ZipkinExporter :: new (
133
99
endpoint,
134
100
client,
135
101
self . collector_endpoint
@@ -142,45 +108,6 @@ impl ZipkinPipelineBuilder {
142
108
}
143
109
}
144
110
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
-
184
111
/// Assign the service name under which to group traces.
185
112
pub fn with_service_name < T : Into < String > > ( mut self , name : T ) -> Self {
186
113
self . service_name = Some ( name. into ( ) ) ;
@@ -193,7 +120,7 @@ impl ZipkinPipelineBuilder {
193
120
self
194
121
}
195
122
196
- /// Assign the service name under which to group traces .
123
+ /// Assign the service address .
197
124
pub fn with_service_address ( mut self , addr : SocketAddr ) -> Self {
198
125
self . service_addr = Some ( addr) ;
199
126
self
@@ -204,12 +131,6 @@ impl ZipkinPipelineBuilder {
204
131
self . collector_endpoint = endpoint. into ( ) ;
205
132
self
206
133
}
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
- }
213
134
}
214
135
215
136
async fn zipkin_export (
@@ -225,8 +146,7 @@ async fn zipkin_export(
225
146
uploader. upload ( zipkin_spans) . await
226
147
}
227
148
228
- #[ async_trait]
229
- impl trace:: SpanExporter for Exporter {
149
+ impl trace:: SpanExporter for ZipkinExporter {
230
150
/// Export spans to Zipkin collector.
231
151
fn export ( & mut self , batch : Vec < trace:: SpanData > ) -> BoxFuture < ' static , trace:: ExportResult > {
232
152
Box :: pin ( zipkin_export (
@@ -253,6 +173,10 @@ pub enum Error {
253
173
#[ error( "invalid uri" ) ]
254
174
InvalidUri ( #[ from] http:: uri:: InvalidUri ) ,
255
175
176
+ /// The IP/socket address provided is invalid
177
+ #[ error( "invalid address" ) ]
178
+ InvalidAddress ( #[ from] AddrParseError ) ,
179
+
256
180
/// Other errors
257
181
#[ error( "export error: {0}" ) ]
258
182
Other ( String ) ,
0 commit comments