Class: OpenTelemetry::Instrumentation::ActiveJob::Handlers::Perform

Inherits:
Default
  • Object
show all
Defined in:
lib/opentelemetry/instrumentation/active_job/handlers/perform.rb

Overview

Handles perform.active_job to generate ingress spans

Instance Method Summary collapse

Methods inherited from Default

#finish, #finish_span, #on_exception, #start, #tracer

Constructor Details

#initializePerform

Returns a new instance of Perform.



13
14
15
16
17
18
19
20
# File 'lib/opentelemetry/instrumentation/active_job/handlers/perform.rb', line 13

def initialize(...)
  super
  @span_name_formatter = if @config[:span_naming] == :job_class
                           ->(job) { "#{job.class.name} process" }
                         else
                           ->(job) { "#{job.queue_name} process" }
                         end
end

Instance Method Details

#attach_consumer_context(span) ⇒ Array

This method attaches a span to multiple contexts:

  1. Registers the ingress span as the top level ActiveJob span. This is used later to enrich the ingress span in children, e.g. setting span status to error when a child event like discard terminates due to an error
  2. Registers the ingress span as the "active" span, which is the default behavior of the SDK.

Parameters:

  • span (OpenTelemetry::Trace::Span)

    the currently active span used to record the exception and set the status

Returns:

  • (Array)

    Context tokens that must be detached when finished



58
59
60
61
62
63
# File 'lib/opentelemetry/instrumentation/active_job/handlers/perform.rb', line 58

def attach_consumer_context(span)
  consumer_context = OpenTelemetry::Trace.context_with_span(span)
  internal_context = OpenTelemetry::Instrumentation::ActiveJob.context_with_span(span, parent_context: consumer_context)

  [consumer_context, internal_context].map { |context| OpenTelemetry::Context.attach(context) }
end

#start_span(name, _id, payload) ⇒ Hash

Overrides the Default#start_span method to create an ingress span and registers it with the current context

Parameters:

  • name (String)

    of the Event

  • id (String)

    of the event

  • payload (Hash)

    containing job run information

Returns:

  • (Hash)

    with the span and generated context tokens



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/opentelemetry/instrumentation/active_job/handlers/perform.rb', line 29

def start_span(name, _id, payload)
  tokens = []
  job = payload.fetch(:job)
  parent_context = OpenTelemetry.propagation.extract(job.__otel_headers)

  span_name = @span_name_formatter.call(job)

  # TODO: Refactor into a propagation strategy
  propagation_style = @config[:propagation_style]
  if propagation_style == :child
    tokens << OpenTelemetry::Context.attach(parent_context)
    span = tracer.start_span(span_name, kind: :consumer, attributes: @mapper.call(payload))
  else
    span_context = OpenTelemetry::Trace.current_span(parent_context).context
    links = [OpenTelemetry::Trace::Link.new(span_context)] if span_context.valid? && propagation_style == :link
    span = tracer.start_root_span(span_name, kind: :consumer, attributes: @mapper.call(payload), links: links)
  end

  tokens.concat(attach_consumer_context(span))

  { span: span, ctx_tokens: tokens }
end