class Atatus::TraceContext

@api private

Attributes

traceparent[RW]
tracestate[RW]

Public Class Methods

new( traceparent: nil, tracestate: nil, **legacy_traceparent_attrs ) click to toggle source
# File lib/atatus/trace_context.rb, line 30
def initialize(
  traceparent: nil,
  tracestate: nil,
  **legacy_traceparent_attrs
)
  @traceparent = traceparent || Traceparent.new(**legacy_traceparent_attrs)
  @tracestate = tracestate || Tracestate.new
end
parse(legacy_header = nil, env: nil, metadata: nil) click to toggle source

rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

# File lib/atatus/trace_context.rb, line 46
def parse(legacy_header = nil, env: nil, metadata: nil)
  unless legacy_header || env || metadata
    raise ArgumentError, 'TraceContext expects env:, metadata: ' \
      'or single argument header string'
  end

  if legacy_header
    legacy_parse_from_header(legacy_header)
  elsif env
    trace_context_from_env(env)
  elsif metadata
    trace_context_from_metadata(metadata)
  end
end

Private Class Methods

legacy_parse_from_header(header) click to toggle source
# File lib/atatus/trace_context.rb, line 94
def legacy_parse_from_header(header)
  parent = Traceparent.parse(header)
  new(traceparent: parent)
end
trace_context_from_env(env) click to toggle source

rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

# File lib/atatus/trace_context.rb, line 64
def trace_context_from_env(env)
  return unless (
    header =
      env['HTTP_ATATUS_TRACEPARENT'] || env['HTTP_TRACEPARENT']
  )

  parent = TraceContext::Traceparent.parse(header)

  state =
    if (header = env['HTTP_TRACESTATE'])
      TraceContext::Tracestate.parse(header)
    end

  new(traceparent: parent, tracestate: state)
end
trace_context_from_metadata(metadata) click to toggle source
# File lib/atatus/trace_context.rb, line 80
def trace_context_from_metadata(metadata)
  return unless (header = metadata['atatus-traceparent'] ||
    metadata['traceparent'])

  parent = TraceContext::Traceparent.parse(header)

  state =
    if (header = metadata['tracestate'])
      TraceContext::Tracestate.parse(header)
    end

  new(traceparent: parent, tracestate: state)
end

Public Instance Methods

apply_headers() { |'Traceparent', to_header| ... } click to toggle source
# File lib/atatus/trace_context.rb, line 106
def apply_headers
  yield 'Traceparent', traceparent.to_header

  if tracestate
    yield 'Tracestate', tracestate.to_header
  end

  return unless Atatus.agent.config.use_atatus_traceparent_header

  yield 'Atatus-Traceparent', traceparent.to_header
end
child() click to toggle source
# File lib/atatus/trace_context.rb, line 100
def child
  dup.tap do |tc|
    tc.traceparent = tc.traceparent.child
  end
end