Class: OpenTelemetry::Instrumentation::FactoryBot::RunFactorySubscriber

Inherits:
Object
  • Object
show all
Defined in:
lib/opentelemetry/instrumentation/factory_bot/run_factory_subscriber.rb

Overview

Subscriber for factory_bot.run_factory ActiveSupport::Notifications

Instance Method Summary collapse

Instance Method Details

#finish(_name, _id, payload) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/opentelemetry/instrumentation/factory_bot/run_factory_subscriber.rb', line 44

def finish(_name, _id, payload)
  span = payload.delete(:__opentelemetry_span)
  token = payload.delete(:__opentelemetry_ctx_token)
  return unless span && token

  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



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/opentelemetry/instrumentation/factory_bot/run_factory_subscriber.rb', line 16

def start(_name, _id, payload)
  factory_name = payload[:name]
  strategy_symbol = payload[:strategy].to_sym
  traits = payload[:traits] || []

  # Map user-facing strategy names to internal strategy names
  internal_strategy = case strategy_symbol
                      when :build_stubbed then 'stub'
                      else strategy_symbol.to_s
                      end

  span_name = "FactoryBot.#{strategy_symbol}(#{factory_name})"

  attrs = {
    'factory_bot.strategy' => internal_strategy,
    'factory_bot.factory_name' => factory_name.to_s,
    'factory_bot.traits' => traits.map(&:to_s)
  }

  span = tracer.start_span(span_name, kind: :internal, attributes: attrs)
  token = OpenTelemetry::Context.attach(OpenTelemetry::Trace.context_with_span(span))

  payload.merge!(
    __opentelemetry_span: span,
    __opentelemetry_ctx_token: token
  )
end

#tracerObject



12
13
14
# File 'lib/opentelemetry/instrumentation/factory_bot/run_factory_subscriber.rb', line 12

def tracer
  FactoryBot::Instrumentation.instance.tracer
end