Class: OpenTelemetry::Instrumentation::ActionView::SpanSubscriber

Inherits:
Object
  • Object
show all
Defined in:
lib/opentelemetry/instrumentation/action_view/span_subscriber.rb

Overview

The SpanSubscriber is a special ActiveSupport::Notification subscription handler which turns notifications into generic spans, taking care to handle context appropriately.

Constant Summary collapse

ALWAYS_VALID_PAYLOAD_TYPES =
[TrueClass, FalseClass, String, Numeric, Symbol].freeze

Instance Method Summary collapse

Constructor Details

#initialize(name:, tracer:) ⇒ SpanSubscriber

Returns a new instance of SpanSubscriber.



16
17
18
19
# File 'lib/opentelemetry/instrumentation/action_view/span_subscriber.rb', line 16

def initialize(name:, tracer:)
  @span_name = name.split('.')[0..1].reverse.join(' ').freeze
  @tracer = tracer
end

Instance Method Details

#finish(_name, _id, payload) ⇒ Object

rubocop:disable Metrics/AbcSize



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/opentelemetry/instrumentation/action_view/span_subscriber.rb', line 30

def finish(_name, _id, payload) # rubocop:disable Metrics/AbcSize
  span = payload.delete(:__opentelemetry_span)
  token = payload.delete(:__opentelemetry_ctx_token)
  return unless span && token

  payload = transform_payload(payload)
  attrs = payload.map do |k, v|
    [k.to_s, sanitized_value(v)] if valid_payload_key?(k) && valid_payload_value?(v)
  end
  span.add_attributes(attrs.compact.to_h)

  if (e = payload[:exception_object])
    span.record_exception(e)
    span.status = OpenTelemetry::Trace::Status.error("Unhandled exception of type: #{e.class}")
  end

  span.finish
  OpenTelemetry::Context.detach(token)
end

#start(_name, _id, payload) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/opentelemetry/instrumentation/action_view/span_subscriber.rb', line 21

def start(_name, _id, payload)
  span = @tracer.start_span(@span_name, kind: :internal)
  token = OpenTelemetry::Context.attach(
    OpenTelemetry::Trace.context_with_span(span)
  )

  [span, token]
end