Skip to content

Commit

Permalink
Merge pull request #1613 from newrelic/refactor-sidekiq-instrumentation
Browse files Browse the repository at this point in the history
Move Sidekiq classes into their own files
  • Loading branch information
kaylareopelle authored Nov 10, 2022
2 parents c4a5aeb + cdc6730 commit 9471a2c
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 68 deletions.
74 changes: 6 additions & 68 deletions lib/new_relic/agent/instrumentation/sidekiq.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
# frozen_string_literal: true
require_relative 'sidekiq/client'
require_relative 'sidekiq/server'
require_relative 'sidekiq/extensions/delayed_class'

DependencyDetection.defer do
@name = :sidekiq
Expand All @@ -14,83 +17,18 @@
end

executes do
module NewRelic::SidekiqInstrumentation
class Server
include NewRelic::Agent::Instrumentation::ControllerInstrumentation

# Client middleware has additional parameters, and our tests use the
# middleware client-side to work inline.
def call(worker, msg, queue, *_)
trace_args = if worker.respond_to?(:newrelic_trace_args)
worker.newrelic_trace_args(msg, queue)
else
self.class.default_trace_args(msg)
end
trace_headers = msg.delete(NewRelic::NEWRELIC_KEY)

perform_action_with_newrelic_trace(trace_args) do
NewRelic::Agent::Transaction.merge_untrusted_agent_attributes(msg['args'], :'job.sidekiq.args',
NewRelic::Agent::AttributeFilter::DST_NONE)

::NewRelic::Agent::DistributedTracing::accept_distributed_trace_headers(trace_headers, "Other") if ::NewRelic::Agent.config[:'distributed_tracing.enabled']
yield
end
end

def self.default_trace_args(msg)
{
:name => 'perform',
:class_name => msg['class'],
:category => 'OtherTransaction/SidekiqJob'
}
end
end

class Client
def call(_worker_class, job, *_)
job[NewRelic::NEWRELIC_KEY] ||= distributed_tracing_headers if ::NewRelic::Agent.config[:'distributed_tracing.enabled']
yield
end

def distributed_tracing_headers
headers = {}
::NewRelic::Agent::DistributedTracing.insert_distributed_trace_headers(headers)
headers
end
end
end

class Sidekiq::Extensions::DelayedClass
def newrelic_trace_args(msg, queue)
(target, method_name, _args) = if YAML.respond_to?(:unsafe_load)
YAML.unsafe_load(msg['args'][0])
else
YAML.load(msg['args'][0])
end

{
:name => method_name,
:class_name => target.name,
:category => 'OtherTransaction/SidekiqJob'
}
rescue => e
NewRelic::Agent.logger.error("Failure during deserializing YAML for Sidekiq::Extensions::DelayedClass", e)
NewRelic::SidekiqInstrumentation::Server.default_trace_args(msg)
end
end

Sidekiq.configure_client do |config|
config.client_middleware do |chain|
chain.add(NewRelic::SidekiqInstrumentation::Client)
chain.add(NewRelic::Agent::Instrumentation::Sidekiq::Client)
end
end

Sidekiq.configure_server do |config|
config.client_middleware do |chain|
chain.add(NewRelic::SidekiqInstrumentation::Client)
chain.add(NewRelic::Agent::Instrumentation::Sidekiq::Client)
end
config.server_middleware do |chain|
chain.add(NewRelic::SidekiqInstrumentation::Server)
chain.add(NewRelic::Agent::Instrumentation::Sidekiq::Server)
end

if config.respond_to?(:error_handlers)
Expand Down
18 changes: 18 additions & 0 deletions lib/new_relic/agent/instrumentation/sidekiq/client.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
# frozen_string_literal: true

module NewRelic::Agent::Instrumentation::Sidekiq
class Client
def call(_worker_class, job, *_)
job[NewRelic::NEWRELIC_KEY] ||= distributed_tracing_headers if ::NewRelic::Agent.config[:'distributed_tracing.enabled']
yield
end

def distributed_tracing_headers
headers = {}
::NewRelic::Agent::DistributedTracing.insert_distributed_trace_headers(headers)
headers
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
# frozen_string_literal: true

class Sidekiq::Extensions::DelayedClass
def newrelic_trace_args(msg, queue)
(target, method_name, _args) = if YAML.respond_to?(:unsafe_load)
YAML.unsafe_load(msg['args'][0])
else
YAML.load(msg['args'][0])
end

{
:name => method_name,
:class_name => target.name,
:category => 'OtherTransaction/SidekiqJob'
}
rescue => e
NewRelic::Agent.logger.error("Failure during deserializing YAML for Sidekiq::Extensions::DelayedClass", e)
NewRelic::Agent::Instrumentation::Sidekiq::Server.default_trace_args(msg)
end
end
36 changes: 36 additions & 0 deletions lib/new_relic/agent/instrumentation/sidekiq/server.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# This file is distributed under New Relic's license terms.
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
# frozen_string_literal: true

module NewRelic::Agent::Instrumentation::Sidekiq
class Server
include NewRelic::Agent::Instrumentation::ControllerInstrumentation

# Client middleware has additional parameters, and our tests use the
# middleware client-side to work inline.
def call(worker, msg, queue, *_)
trace_args = if worker.respond_to?(:newrelic_trace_args)
worker.newrelic_trace_args(msg, queue)
else
self.class.default_trace_args(msg)
end
trace_headers = msg.delete(NewRelic::NEWRELIC_KEY)

perform_action_with_newrelic_trace(trace_args) do
NewRelic::Agent::Transaction.merge_untrusted_agent_attributes(msg['args'], :'job.sidekiq.args',
NewRelic::Agent::AttributeFilter::DST_NONE)

::NewRelic::Agent::DistributedTracing::accept_distributed_trace_headers(trace_headers, "Other") if ::NewRelic::Agent.config[:'distributed_tracing.enabled']
yield
end
end

def self.default_trace_args(msg)
{
:name => 'perform',
:class_name => msg['class'],
:category => 'OtherTransaction/SidekiqJob'
}
end
end
end

0 comments on commit 9471a2c

Please sign in to comment.