|
| 1 | +from __future__ import absolute_import |
| 2 | + |
| 3 | +import opentracing as ot |
| 4 | +from basictracer.context import SpanContext |
| 5 | +from instana import util, log |
| 6 | + |
| 7 | +prefix_tracer_state = 'X-INSTANA-' |
| 8 | +prefix_baggage = 'X-INSTANA-BAGGAGE-' |
| 9 | +field_name_trace_id = prefix_tracer_state + 'T' |
| 10 | +field_name_span_id = prefix_tracer_state + 'S' |
| 11 | + |
| 12 | + |
| 13 | +class TextPropagator(): |
| 14 | + """ |
| 15 | + A Propagator for Format.TEXT_MAP. |
| 16 | + Does not support Baggage and Sampling |
| 17 | + """ |
| 18 | + |
| 19 | + def inject(self, span_context, carrier): |
| 20 | + carrier[field_name_trace_id] = '{0:x}'.format(span_context.trace_id) |
| 21 | + carrier[field_name_span_id] = '{0:x}'.format(span_context.span_id) |
| 22 | + if span_context.baggage is not None: |
| 23 | + for k in span_context.baggage: |
| 24 | + carrier[prefix_baggage+k] = span_context.baggage[k] |
| 25 | + |
| 26 | + def extract(self, carrier): # noqa |
| 27 | + try: |
| 28 | + if type(carrier) is dict or hasattr(carrier, "__dict__"): |
| 29 | + dc = carrier |
| 30 | + elif type(carrier) is list: |
| 31 | + dc = dict(carrier) |
| 32 | + else: |
| 33 | + raise ot.SpanContextCorruptedException() |
| 34 | + |
| 35 | + if field_name_trace_id in dc and field_name_span_id in dc: |
| 36 | + trace_id = util.header_to_id(dc[field_name_trace_id]) |
| 37 | + span_id = util.header_to_id(dc[field_name_span_id]) |
| 38 | + |
| 39 | + return SpanContext(span_id=span_id, |
| 40 | + trace_id=trace_id, |
| 41 | + baggage={}, |
| 42 | + sampled=True) |
| 43 | + |
| 44 | + except Exception as e: |
| 45 | + log.debug("extract error: ", str(e)) |
0 commit comments