77#ifdef HAVE_CONFIG_H
88#include " config.h"
99#endif
10- #include " lightstep/envoy .h"
10+ #include " lightstep/carrier .h"
1111#include " lightstep/impl.h"
1212#include " lightstep/options.h"
1313#include " lightstep/tracer.h"
@@ -134,15 +134,15 @@ bool TracerImpl::inject(SpanContext sc, CarrierFormat format, const CarrierWrite
134134 switch (format.type ()) {
135135 case CarrierFormat::HTTPHeaders:
136136 case CarrierFormat::TextMap:
137- case CarrierFormat::EnvoyProto:
138- return inject_basic_carrier (sc, opaque);
139- case CarrierFormat::Binary:
140- break ;
137+ return inject_text_carrier (sc, opaque);
138+ case CarrierFormat::LightStepBinary:
139+ return inject_lightstep_carrier (sc, opaque);
140+ default :
141+ return false ;
141142 }
142- return false ;
143143}
144144
145- bool TracerImpl::inject_basic_carrier (SpanContext sc, const CarrierWriter& opaque) {
145+ bool TracerImpl::inject_text_carrier (SpanContext sc, const CarrierWriter& opaque) {
146146 const BasicCarrierWriter* carrier = dynamic_cast <const BasicCarrierWriter*>(&opaque);
147147 if (carrier == nullptr ) {
148148 return false ;
@@ -159,18 +159,44 @@ bool TracerImpl::inject_basic_carrier(SpanContext sc, const CarrierWriter& opaqu
159159 return true ;
160160}
161161
162+ bool TracerImpl::inject_lightstep_carrier (SpanContext sc, const CarrierWriter& opaque) {
163+ const ProtoWriter* carrier = dynamic_cast <const ProtoWriter*>(&opaque);
164+ if (carrier == nullptr ) {
165+ return false ;
166+ }
167+ BinaryCarrier *const output = carrier->output_ ;
168+ BasicTracerCarrier *const basic = output->mutable_basic_ctx ();
169+ basic->set_span_id (sc.span_id ());
170+ basic->set_trace_id (sc.trace_id ());
171+ basic->set_sampled (true );
172+
173+ auto baggage = basic->mutable_baggage_items ();
174+
175+ sc.ForeachBaggageItem ([baggage](const std::string& key,
176+ const std::string& value) {
177+ (*baggage)[key] = value;
178+ return true ;
179+ });
180+
181+ // TODO Remove the text encoding after [...] has upgraded globally.
182+ TextProtoWriter legacy_writer (output);
183+ inject_text_carrier (sc, legacy_writer);
184+ return true ;
185+ }
186+
162187SpanContext TracerImpl::extract (CarrierFormat format, const CarrierReader& opaque) {
163188 switch (format.type ()) {
164189 case CarrierFormat::HTTPHeaders:
165190 case CarrierFormat::TextMap:
166- case CarrierFormat::EnvoyProto:
167- return extract_basic_carrier (opaque);
191+ return extract_text_carrier (opaque);
192+ case CarrierFormat::LightStepBinary:
193+ return extract_lightstep_carrier (opaque);
168194 default :
169195 return SpanContext ();
170196 }
171197}
172198
173- SpanContext TracerImpl::extract_basic_carrier (const CarrierReader& opaque) {
199+ SpanContext TracerImpl::extract_text_carrier (const CarrierReader& opaque) {
174200 const BasicCarrierReader* carrier = dynamic_cast <const BasicCarrierReader*>(&opaque);
175201 if (carrier == nullptr ) {
176202 return SpanContext ();
@@ -200,6 +226,29 @@ SpanContext TracerImpl::extract_basic_carrier(const CarrierReader& opaque) {
200226 return SpanContext (ctx);
201227}
202228
229+ SpanContext TracerImpl::extract_lightstep_carrier (const CarrierReader& opaque) {
230+ const ProtoReader* carrier = dynamic_cast <const ProtoReader*>(&opaque);
231+ if (carrier == nullptr ) {
232+ return SpanContext ();
233+ }
234+
235+ const BinaryCarrier& proto = carrier->data_ ;
236+ const BasicTracerCarrier& basic = proto.basic_ctx ();
237+ if (basic.trace_id () == 0 && basic.span_id () == 0 ) {
238+ return extract_text_carrier (TextProtoReader (proto));
239+ }
240+
241+ std::shared_ptr<ContextImpl> ctx (new ContextImpl);
242+ ctx->trace_id = basic.trace_id ();
243+ ctx->span_id = basic.span_id ();
244+
245+ for (const auto & entry : basic.baggage_items ()) {
246+ ctx->setBaggageItem (entry);
247+ }
248+
249+ return SpanContext (ctx);
250+ }
251+
203252void StartTimestamp::Apply (SpanImpl *span) const {
204253 // Note: no locking, only called from StartSpan
205254 span->start_timestamp_ = when_;
0 commit comments