0

I was running Opentelemetry 0.18rc1 and my application was working perfectly.

I'm using the W3C Trace Context specification for context propagation. For injection and extraction i used TraceContextTextMapPropagator

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.context import get_current

prop = TraceContextTextMapPropagator()
carrier = {}
prop.inject(set_in_carrier=dict.__setitem__, carrier=carrier, context=get_current())

and for extraction in the next micro-service, i used:

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
from opentelemetry.propagators import textmap

prop = TraceContextTextMapPropagator()
carrier_getter = textmap.DictGetter()
context = prop.extract(carrier_getter, request.headers)

When I tried to upgrade to the latest opentelemetry 1.4.0 my injection and extraction methods stopped working. It seems the DictGetter() class was removed from the new version, so i don't know how to set the getter parameter in the extract method. Also, the set_in_carrier was replaced with a setter parameter in the inject method and I'm not sure how to to set this one either.

How do I implement the Inject and Extract methods in opentelemetry 1.4.0 for W3C Trace Context specification?

hashguard
  • 403
  • 4
  • 22

1 Answers1

0

set_in_carrier was replaced with something called Setter and DefaultSetter implements that to set value in dict-like carriers (ex. HTTP headers). You don't need to explicitly pass the current context because If you don't pass any context it takes the current context. And Inject into carrier would be simplified to

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

prop = TraceContextTextMapPropagator()
carrier = {}
prop.inject(carrier=carrier)

And when you extract it would be

from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

prop = TraceContextTextMapPropagator()
context = prop.extract(carrier=request.headers)

Here is a working example when injecting and extracting happens in the same file but it real world it is usually happens in different services.

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import (BatchSpanProcessor,
                                            ConsoleSpanExporter)
from opentelemetry.trace.propagation.tracecontext import \
    TraceContextTextMapPropagator

trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))

tracer = trace.get_tracer(__name__)

prop = TraceContextTextMapPropagator()
carrier = {}

# Injecting

with tracer.start_as_current_span("first-span") as span:
    prop.inject(carrier=carrier)
    print("Carrier after injecting span context", carrier)

# Extracting

ctx = prop.extract(carrier=carrier)
with tracer.start_as_current_span("next-span", context=ctx):
    pass
Srikanth Chekuri
  • 1,944
  • 1
  • 9
  • 19