Class: Sentry::OpenTelemetry::Propagator

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

Constant Summary collapse

FIELDS =
[SENTRY_TRACE_HEADER_NAME, BAGGAGE_HEADER_NAME].freeze
SENTRY_TRACE_KEY =
::OpenTelemetry::Context.create_key("sentry-trace")
SENTRY_BAGGAGE_KEY =
::OpenTelemetry::Context.create_key("sentry-baggage")

Instance Method Summary collapse

Instance Method Details

#extract(carrier, context: ::OpenTelemetry::Context.current, getter: ::OpenTelemetry::Context::Propagation.text_map_getter) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/sentry/opentelemetry/propagator.rb', line 29

def extract(
  carrier,
  context: ::OpenTelemetry::Context.current,
  getter: ::OpenTelemetry::Context::Propagation.text_map_getter
)
  sentry_trace = getter.get(carrier, SENTRY_TRACE_HEADER_NAME)
  return context unless sentry_trace

  sentry_trace_data = Transaction.extract_sentry_trace(sentry_trace)
  return context unless sentry_trace_data

  context = context.set_value(SENTRY_TRACE_KEY, sentry_trace_data)
  trace_id, span_id, _parent_sampled = sentry_trace_data

  span_context = ::OpenTelemetry::Trace::SpanContext.new(
    trace_id: [trace_id].pack("H*"),
    span_id: [span_id].pack("H*"),
    # we simulate a sampled trace on the otel side and leave the sampling to sentry
    trace_flags: ::OpenTelemetry::Trace::TraceFlags::SAMPLED,
    remote: true
  )

  baggage_header = getter.get(carrier, BAGGAGE_HEADER_NAME)

  baggage =
    if baggage_header && !baggage_header.empty?
      Baggage.from_incoming_header(baggage_header)
    else
      # If there's an incoming sentry-trace but no incoming baggage header,
      # for instance in traces coming from older SDKs,
      # baggage will be empty and frozen and won't be populated as head SDK.
      Baggage.new({})
    end

  baggage.freeze!
  context = context.set_value(SENTRY_BAGGAGE_KEY, baggage)

  span = ::OpenTelemetry::Trace.non_recording_span(span_context)
  ::OpenTelemetry::Trace.context_with_span(span, parent_context: context)
end

#fieldsObject



70
71
72
# File 'lib/sentry/opentelemetry/propagator.rb', line 70

def fields
  FIELDS
end

#inject(carrier, context: ::OpenTelemetry::Context.current, setter: ::OpenTelemetry::Context::Propagation.text_map_setter) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/sentry/opentelemetry/propagator.rb', line 11

def inject(
  carrier,
  context: ::OpenTelemetry::Context.current,
  setter: ::OpenTelemetry::Context::Propagation.text_map_setter
)
  span_context = ::OpenTelemetry::Trace.current_span(context).context
  return unless span_context.valid?

  span_map = SpanProcessor.instance.span_map
  sentry_span = span_map[span_context.hex_span_id]
  return unless sentry_span

  setter.set(carrier, SENTRY_TRACE_HEADER_NAME, sentry_span.to_sentry_trace)

  baggage = sentry_span.to_baggage
  setter.set(carrier, BAGGAGE_HEADER_NAME, baggage) if baggage && !baggage.empty?
end