class ElasticAPM::TraceContext

@api private

Attributes

traceparent[RW]
tracestate[RW]

Public Class Methods

new( traceparent: nil, tracestate: nil ) click to toggle source
# File lib/elastic_apm/trace_context.rb, line 30
def initialize(
  traceparent: nil,
  tracestate: nil
)
  @traceparent = traceparent || Traceparent.new
  @tracestate = tracestate || Tracestate.new
end
parse(env: nil, metadata: nil) click to toggle source
# File lib/elastic_apm/trace_context.rb, line 44
def parse(env: nil, metadata: nil)
  unless env || metadata
    raise ArgumentError, 'TraceContext expects env:, metadata: ' \
      'or single argument header string'
  end

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

Private Class Methods

trace_context_from_env(env) click to toggle source
# File lib/elastic_apm/trace_context.rb, line 59
def trace_context_from_env(env)
  return unless (
    header =
      env['HTTP_ELASTIC_APM_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/elastic_apm/trace_context.rb, line 75
def trace_context_from_metadata(metadata)
  return unless (header = metadata['elastic-apm-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/elastic_apm/trace_context.rb, line 96
def apply_headers
  yield 'Traceparent', traceparent.to_header

  if tracestate && !tracestate.to_header.empty?
    yield 'Tracestate', tracestate.to_header
  end

  return unless ElasticAPM.agent.config.use_elastic_traceparent_header

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