Class: OpenTelemetry::Propagator::OTTrace::TextMapExtractor

Inherits:
Object
  • Object
show all
Defined in:
lib/opentelemetry/propagator/ottrace/text_map_extractor.rb

Overview

Extracts context from carriers using OTTrace header format

Constant Summary collapse

PADDING =
'0' * 16
VALID_TRACE_ID_REGEX =
/^[0-9a-f]{32}$/.freeze
VALID_SPAN_ID_REGEX =
/^[0-9a-f]{16}$/.freeze

Instance Method Summary collapse

Constructor Details

#initialize(default_getter: Context::Propagation.text_map_getter) ⇒ TextMapExtractor

Returns a new TextMapExtractor that extracts OTTrace context using the specified getter

Parameters:

  • default_getter (optional Getter) (defaults to: Context::Propagation.text_map_getter)

    The default getter used to read headers from a carrier during extract. Defaults to a Context:Propagation::TextMapGetter instance.



31
32
33
# File 'lib/opentelemetry/propagator/ottrace/text_map_extractor.rb', line 31

def initialize(default_getter: Context::Propagation.text_map_getter)
  @default_getter = default_getter
end

Instance Method Details

#extract(carrier, context, getter = nil) ⇒ Context

Extract OTTrace context from the supplied carrier and set the active span in the given context. The original context will be returned if OTTrace cannot be extracted from the carrier.

Parameters:

  • carrier (Carrier)

    The carrier to get the header from.

  • context (Context)

    The context to be updated with extracted context

  • getter (optional Getter) (defaults to: nil)

    If the optional getter is provided, it will be used to read the header from the carrier, otherwise the default getter will be used.

Returns:

  • (Context)

    Updated context with active span derived from the header, or the original context if parsing fails.



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/opentelemetry/propagator/ottrace/text_map_extractor.rb', line 46

def extract(carrier, context, getter = nil)
  getter ||= default_getter
  trace_id = optionally_pad_trace_id(getter.get(carrier, TRACE_ID_HEADER))
  span_id = getter.get(carrier, SPAN_ID_HEADER)
  sampled = getter.get(carrier, SAMPLED_HEADER)

  return context unless valid?(trace_id: trace_id, span_id: span_id)

  span_context = Trace::SpanContext.new(
    trace_id: Array(trace_id).pack('H*'),
    span_id: Array(span_id).pack('H*'),
    trace_flags: sampled == 'true' ? Trace::TraceFlags::SAMPLED : Trace::TraceFlags::DEFAULT,
    remote: true
  )

  span = Trace::Span.new(span_context: span_context)
  Trace.context_with_span(span, parent_context: set_baggage(carrier: carrier, context: context, getter: getter))
end