Sha256: 206785bcc9aa8ee5a74fef9ba21bd85ddf0cabae038b627fcc4ecb098f53f7cb

Contents?: true

Size: 1.98 KB

Versions: 28

Compression:

Stored size: 1.98 KB

Contents

require 'ddtrace/configuration'
require 'ddtrace/span'
require 'ddtrace/ext/distributed'

module Datadog
  module DistributedTracing
    module Headers
      # Headers provides easy access and validation methods for Rack headers
      class Headers
        include Ext::DistributedTracing

        def initialize(env)
          @env = env
        end

        # TODO: Don't assume Rack format.
        #       Make distributed tracing headers apathetic.
        def header(name)
          rack_header = "http-#{name}".upcase!.tr('-', '_')

          hdr = @env[rack_header]

          # Only return the value if it is not an empty string
          hdr if hdr != ''
        end

        def id(hdr, base = 10)
          value_to_id(header(hdr), base)
        end

        def value_to_id(value, base = 10)
          id = value_to_number(value, base)

          # Return early if we could not parse a number
          return if id.nil?

          # Zero or greater than max allowed value of 2**64
          return if id.zero? || id > Span::EXTERNAL_MAX_ID
          id < 0 ? id + (2**64) : id
        end

        def number(hdr, base = 10)
          value_to_number(header(hdr), base)
        end

        def value_to_number(value, base = 10)
          # It's important to make a difference between no header,
          # and a header defined to zero.
          return if value.nil?

          # Be sure we have a string
          value = value.to_s

          # If we are parsing base16 number then truncate to 64-bit
          value = DistributedTracing::Headers::Helpers.truncate_base16_number(value) if base == 16

          # Convert header to an integer
          # DEV: Ruby `.to_i` will return `0` if a number could not be parsed
          num = value.to_i(base)

          # Ensure the parsed number is the same as the original string value
          # e.g. We want to make sure to throw away `'nan'.to_i == 0`
          return unless num.to_s(base) == value

          num
        end
      end
    end
  end
end

Version data entries

28 entries across 28 versions & 2 rubygems

Version Path
ddtrace-0.45.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.44.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.43.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.42.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.41.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ls-trace-0.2.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.40.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.39.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.38.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.37.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.36.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ls-trace-0.1.2 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.35.2 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.35.1 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.35.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.34.2 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.34.1 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.34.0 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.33.1 lib/ddtrace/distributed_tracing/headers/headers.rb
ddtrace-0.33.0 lib/ddtrace/distributed_tracing/headers/headers.rb