22#![ forbid( unsafe_code) ]
33
44pub mod metrics;
5+ pub mod propagation;
56
67use self :: metrics:: Registry ;
8+ use crate :: propagation:: OrderedPropagator ;
79use futures:: stream:: { Stream , StreamExt } ;
810use http_body:: Body ;
911use linkerd_error:: Error ;
1012use linkerd_trace_context:: { self as trace_context, export:: ExportSpan } ;
1113pub use opentelemetry as otel;
1214use opentelemetry:: {
13- trace:: { SpanContext , SpanId , SpanKind , Status , TraceFlags , TraceId , TraceState } ,
15+ trace:: { SpanContext , SpanKind , Status , TraceFlags , TraceState } ,
1416 KeyValue ,
1517} ;
1618pub use opentelemetry_proto as proto;
5658 )
5759 . build ( ) ;
5860
61+ opentelemetry:: global:: set_text_map_propagator ( OrderedPropagator :: new ( ) ) ;
62+
5963 SpanExportTask :: new ( spans, processor) . run ( ) . await ;
6064}
6165
@@ -151,12 +155,12 @@ fn convert_span(span: ExportSpan) -> Result<SpanData, Error> {
151155 for ( k, v) in labels. iter ( ) {
152156 attributes. push ( KeyValue :: new ( k. clone ( ) , v. clone ( ) ) ) ;
153157 }
154- for ( k , v ) in span. labels . into_iter ( ) {
155- attributes. push ( KeyValue :: new ( k , v ) ) ;
158+ for kv in span. labels . into_iter ( ) {
159+ attributes. push ( kv ) ;
156160 }
157161 let is_remote = kind != trace_context:: export:: SpanKind :: Client ;
158162 Ok ( SpanData {
159- parent_span_id : SpanId :: from_bytes ( span. parent_id . into_bytes ( ) ? ) ,
163+ parent_span_id : span. parent_id ,
160164 parent_span_is_remote : true , // we do not originate any spans locally
161165 span_kind : match kind {
162166 trace_context:: export:: SpanKind :: Server => SpanKind :: Server ,
@@ -170,8 +174,8 @@ fn convert_span(span: ExportSpan) -> Result<SpanData, Error> {
170174 links : SpanLinks :: default ( ) ,
171175 status : Status :: Unset , // TODO: this is gRPC status; we must read response trailers to populate this
172176 span_context : SpanContext :: new (
173- TraceId :: from_bytes ( span. trace_id . into_bytes ( ) ? ) ,
174- SpanId :: from_bytes ( span. span_id . into_bytes ( ) ? ) ,
177+ span. trace_id ,
178+ span. span_id ,
175179 TraceFlags :: default ( ) ,
176180 is_remote,
177181 TraceState :: NONE ,
@@ -184,40 +188,33 @@ fn convert_span(span: ExportSpan) -> Result<SpanData, Error> {
184188#[ cfg( test) ]
185189mod tests {
186190 use super :: * ;
187- use linkerd_trace_context:: { export:: SpanKind , Id , Span } ;
188- use opentelemetry_proto:: tonic:: common:: v1:: any_value:: Value :: StringValue ;
189- use opentelemetry_proto:: tonic:: common:: v1:: AnyValue ;
191+ use linkerd_trace_context:: { export:: SpanKind , Span } ;
192+ use opentelemetry:: { SpanId , TraceId } ;
190193 use opentelemetry_proto:: tonic:: common:: v1:: InstrumentationScope ;
191- use std:: { collections :: HashMap , sync:: Arc , time:: SystemTime } ;
194+ use std:: { sync:: Arc , time:: SystemTime } ;
192195 use tokio:: sync:: mpsc;
193- use tonic:: codegen:: { tokio_stream:: wrappers:: ReceiverStream , tokio_stream:: StreamExt , Bytes } ;
196+ use tonic:: codegen:: { tokio_stream:: wrappers:: ReceiverStream , tokio_stream:: StreamExt } ;
194197 use tonic_prost:: ProstDecoder ;
195198
196199 #[ tokio:: test( flavor = "current_thread" ) ]
197200 async fn send_span ( ) {
198- let trace_id = Id :: from ( Bytes :: from (
199- hex:: decode ( "0123456789abcedffedcba9876543210" ) . expect ( "decode" ) ,
200- ) ) ;
201- let span_id = Id :: from ( Bytes :: from (
202- hex:: decode ( "fedcba9876543210" ) . expect ( "decode" ) ,
203- ) ) ;
204- let parent_id = Id :: from ( Bytes :: from (
205- hex:: decode ( "0123456789abcedf" ) . expect ( "decode" ) ,
206- ) ) ;
201+ let trace_id = TraceId :: from_hex ( "0123456789abcedffedcba9876543210" ) . expect ( "trace id" ) ;
202+ let parent_id = SpanId :: from_hex ( "fedcba9876543210" ) . expect ( "parent id" ) ;
203+ let span_id = SpanId :: from_hex ( "0123456789abcedf" ) . expect ( "span id" ) ;
207204 let span_name = "test" . to_string ( ) ;
208205
209206 let start = SystemTime :: now ( ) ;
210207 let end = SystemTime :: now ( ) ;
211208
212209 let span = ExportSpan {
213210 span : Span {
214- trace_id : trace_id . clone ( ) ,
215- span_id : span_id . clone ( ) ,
216- parent_id : parent_id . clone ( ) ,
211+ trace_id,
212+ span_id,
213+ parent_id,
217214 span_name : span_name. clone ( ) ,
218215 start,
219216 end,
220- labels : HashMap :: new ( ) ,
217+ labels : Vec :: new ( ) ,
221218 } ,
222219 kind : SpanKind :: Server ,
223220 labels : Arc :: new ( Default :: default ( ) ) ,
@@ -263,18 +260,9 @@ mod tests {
263260 assert_eq ! ( scope_span. spans. len( ) , 1 ) ;
264261
265262 let span = scope_span. spans . remove ( 0 ) ;
266- assert_eq ! (
267- span. span_id,
268- span_id. into_bytes:: <8 >( ) . expect( "into_bytes" ) . to_vec( )
269- ) ;
270- assert_eq ! (
271- span. parent_span_id,
272- parent_id. into_bytes:: <8 >( ) . expect( "into_bytes" ) . to_vec( )
273- ) ;
274- assert_eq ! (
275- span. trace_id,
276- trace_id. into_bytes:: <16 >( ) . expect( "into_bytes" ) . to_vec( )
277- ) ;
263+ assert_eq ! ( span. span_id, span_id. to_bytes( ) . to_vec( ) , ) ;
264+ assert_eq ! ( span. parent_span_id, parent_id. to_bytes( ) . to_vec( ) , ) ;
265+ assert_eq ! ( span. trace_id, trace_id. to_bytes( ) . to_vec( ) , ) ;
278266 assert_eq ! ( span. name, span_name) ;
279267 assert_eq ! (
280268 span. start_time_unix_nano,
@@ -308,7 +296,7 @@ mod tests {
308296 tokio:: spawn ( export_spans (
309297 inner,
310298 ReceiverStream :: new ( span_rx) ,
311- opentelemetry_sdk :: Resource :: builder ( ) . build ( ) ,
299+ Resource :: builder ( ) . build ( ) ,
312300 metrics,
313301 ) ) ;
314302
0 commit comments