module Datadog::OpenTracer::TextMapPropagator

OpenTracing propagator for Datadog::OpenTracer::Tracer

Constants

BAGGAGE_PREFIX

Public Class Methods

extract(carrier) click to toggle source

Extract a SpanContext in TextMap format from the given carrier.

@param carrier [Carrier] A carrier object of TextMap type @return [SpanContext, nil] the extracted SpanContext or nil if none could be found

# File lib/ddtrace/opentracer/text_map_propagator.rb, line 39
def extract(carrier)
  # First extract & build a Datadog context
  headers = DistributedHeaders.new(carrier)

  datadog_context = if headers.valid?
                      Datadog::Context.new(
                        trace_id: headers.trace_id,
                        span_id: headers.parent_id,
                        sampling_priority: headers.sampling_priority,
                        origin: headers.origin
                      )
                    else
                      Datadog::Context.new
                    end

  # Then extract any other baggage
  baggage = {}
  carrier.each do |key, value|
    baggage[item_to_baggage(key)] = value if baggage_item?(key)
  end

  SpanContextFactory.build(datadog_context: datadog_context, baggage: baggage)
end
inject(span_context, carrier) click to toggle source

Inject a SpanContext into the given carrier

@param span_context [SpanContext] @param carrier [Carrier] A carrier object of Rack type

# File lib/ddtrace/opentracer/text_map_propagator.rb, line 18
def inject(span_context, carrier)
  # Inject Datadog trace properties
  span_context.datadog_context.tap do |datadog_context|
    carrier[HTTP_HEADER_TRACE_ID] = datadog_context.trace_id
    carrier[HTTP_HEADER_PARENT_ID] = datadog_context.span_id
    carrier[HTTP_HEADER_SAMPLING_PRIORITY] = datadog_context.sampling_priority
    carrier[HTTP_HEADER_ORIGIN] = datadog_context.origin
  end

  # Inject baggage
  span_context.baggage.each do |key, value|
    carrier[BAGGAGE_PREFIX + key] = value
  end

  nil
end

Private Class Methods

baggage_item?(item) click to toggle source
# File lib/ddtrace/opentracer/text_map_propagator.rb, line 65
def baggage_item?(item)
  item.to_s.start_with?(BAGGAGE_PREFIX)
end
item_to_baggage(key) click to toggle source
# File lib/ddtrace/opentracer/text_map_propagator.rb, line 69
def item_to_baggage(key)
  key[BAGGAGE_PREFIX.length, key.length]
end