Sha256: 82abdf55b7d91984e96445205b3f82ac0a3e385e5deee7bfb7a7f5d433067122

Contents?: true

Size: 1.89 KB

Versions: 3

Compression:

Stored size: 1.89 KB

Contents

# frozen_string_literal: true
# typed: true

require_relative 'helpers'
require_relative '../trace_digest'

module Datadog
  module Tracing
    module Distributed
      # B3 single header-style trace propagation.
      #
      # DEV: Format:
      # DEV:   b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
      # DEV: https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
      # DEV: `{SamplingState}` and `{ParentSpanId}` are optional
      #
      # @see https://github.com/openzipkin/b3-propagation#single-header
      class B3Single
        B3_SINGLE_HEADER_KEY = 'b3'

        def initialize(fetcher:, key: B3_SINGLE_HEADER_KEY)
          @key = key
          @fetcher = fetcher
        end

        def inject!(digest, env)
          return if digest.nil?

          # DEV: We need these to be hex encoded
          value = "#{digest.trace_id.to_s(16)}-#{digest.span_id.to_s(16)}"

          if digest.trace_sampling_priority
            sampling_priority = Helpers.clamp_sampling_priority(
              digest.trace_sampling_priority
            )
            value += "-#{sampling_priority}"
          end

          env[@key] = value
          env
        end

        def extract(env)
          fetcher = @fetcher.new(env)
          value = fetcher[@key]

          return unless value

          parts = value.split('-')
          trace_id = Helpers.value_to_id(parts[0], 16) unless parts.empty?
          span_id = Helpers.value_to_id(parts[1], 16) if parts.length > 1
          sampling_priority = Helpers.value_to_number(parts[2]) if parts.length > 2

          # Return if this propagation is not valid
          return unless trace_id && span_id

          TraceDigest.new(
            span_id: span_id,
            trace_id: trace_id,
            trace_sampling_priority: sampling_priority
          )
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
ddtrace-1.9.0 lib/datadog/tracing/distributed/b3_single.rb
ddtrace-1.8.0 lib/datadog/tracing/distributed/b3_single.rb
ddtrace-1.7.0 lib/datadog/tracing/distributed/b3_single.rb