class ElasticAPM::TraceContext
@api private
def apply_headers
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
def child
def child dup.tap do |tc| tc.traceparent = tc.traceparent.child end end
def initialize(
def initialize( traceparent: nil, tracestate: nil ) @traceparent = traceparent || Traceparent.new @tracestate = tracestate || Tracestate.new end
def parse(env: nil, metadata: nil)
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
def trace_context_from_env(env)
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
def trace_context_from_metadata(metadata)
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