Class: OpenTelemetry::Instrumentation::ActiveJob::Handlers::Perform
- Inherits:
-
Default
- Object
- Default
- OpenTelemetry::Instrumentation::ActiveJob::Handlers::Perform
- Defined in:
- lib/opentelemetry/instrumentation/active_job/handlers/perform.rb
Overview
Handles perform.active_job to generate ingress spans
Instance Method Summary collapse
-
#attach_consumer_context(span) ⇒ Array
This method attaches a span to multiple contexts: 1.
-
#initialize ⇒ Perform
constructor
A new instance of Perform.
-
#start_span(name, _id, payload) ⇒ Hash
Overrides the
Default#start_span
method to create an ingress span and registers it with the current context.
Methods inherited from Default
#finish, #finish_span, #on_exception, #start, #tracer
Constructor Details
#initialize ⇒ Perform
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:
- 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 - Registers the ingress span as the "active" span, which is the default behavior of the SDK.
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
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 |