Sha256: bae4ff8536c11a48ca710df85a045b222d346c095c59270a1dd3025a706b7f0c

Contents?: true

Size: 1.83 KB

Versions: 63

Compression:

Stored size: 1.83 KB

Contents

require 'ddtrace/propagation/http_propagator'

module Datadog
  module OpenTracer
    # OpenTracing propagator for Datadog::OpenTracer::Tracer
    module RackPropagator
      extend Propagator
      extend Datadog::Ext::DistributedTracing
      include Datadog::Ext::DistributedTracing

      BAGGAGE_PREFIX = 'ot-baggage-'.freeze
      BAGGAGE_PREFIX_FORMATTED = 'HTTP_OT_BAGGAGE_'.freeze

      class << self
        # Inject a SpanContext into the given carrier
        #
        # @param span_context [SpanContext]
        # @param carrier [Carrier] A carrier object of Rack type
        def inject(span_context, carrier)
          # Inject Datadog trace properties
          Datadog::HTTPPropagator.inject!(span_context.datadog_context, carrier)

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

          nil
        end

        # Extract a SpanContext in Rack format from the given carrier.
        #
        # @param carrier [Carrier] A carrier object of Rack type
        # @return [SpanContext, nil] the extracted SpanContext or nil if none could be found
        def extract(carrier)
          # First extract & build a Datadog context
          datadog_context = Datadog::HTTPPropagator.extract(carrier)

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

          SpanContextFactory.build(datadog_context: datadog_context, baggage: baggage)
        end

        private

        def baggage_header?(header)
          header.to_s.start_with?(BAGGAGE_PREFIX_FORMATTED)
        end

        def header_to_baggage(key)
          key[BAGGAGE_PREFIX_FORMATTED.length, key.length].downcase
        end
      end
    end
  end
end

Version data entries

63 entries across 63 versions & 2 rubygems

Version Path
ddtrace-0.51.1 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.51.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.50.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.49.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.48.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.47.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.46.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.45.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.44.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.43.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.42.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.41.0 lib/ddtrace/opentracer/rack_propagator.rb
ls-trace-0.2.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.40.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.39.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.38.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.37.0 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.36.0 lib/ddtrace/opentracer/rack_propagator.rb
ls-trace-0.1.2 lib/ddtrace/opentracer/rack_propagator.rb
ddtrace-0.35.2 lib/ddtrace/opentracer/rack_propagator.rb