Skip to content

Commit 3ce6f3a

Browse files
authored
Merge pull request #602 from dirk/sidekiq-client-tracer
Sidekiq client-side tracing
2 parents 1ec81df + d84dfd2 commit 3ce6f3a

File tree

19 files changed

+217
-97
lines changed

19 files changed

+217
-97
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require 'ddtrace/contrib/sidekiq/tracing'
2+
3+
module Datadog
4+
module Contrib
5+
module Sidekiq
6+
# Tracer is a Sidekiq client-side middleware which traces job enqueues/pushes
7+
class ClientTracer
8+
include Tracing
9+
10+
def initialize(options = {})
11+
super
12+
@sidekiq_service = options[:client_service_name] || Datadog.configuration[:sidekiq][:client_service_name]
13+
end
14+
15+
# Client middleware arguments are documented here:
16+
# https://github.com/mperham/sidekiq/wiki/Middleware#client-middleware
17+
def call(worker_class, job, queue, redis_pool)
18+
service = @sidekiq_service
19+
set_service_info(service)
20+
21+
resource = job_resource(job)
22+
23+
@tracer.trace(Ext::SPAN_PUSH, service: service) do |span|
24+
span.resource = resource
25+
span.set_tag(Ext::TAG_JOB_ID, job['jid'])
26+
span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
27+
span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
28+
29+
yield
30+
end
31+
end
32+
end
33+
end
34+
end
35+
end

lib/ddtrace/contrib/sidekiq/configuration/settings.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ module Configuration
88
# Custom settings for the Sidekiq integration
99
class Settings < Contrib::Configuration::Settings
1010
option :service_name, default: Ext::SERVICE_NAME
11+
option :client_service_name, default: Ext::CLIENT_SERVICE_NAME
1112
end
1213
end
1314
end

lib/ddtrace/contrib/sidekiq/ext.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ module Sidekiq
55
module Ext
66
APP = 'sidekiq'.freeze
77
SERVICE_NAME = 'sidekiq'.freeze
8+
CLIENT_SERVICE_NAME = 'sidekiq-client'.freeze
89

10+
SPAN_PUSH = 'sidekiq.push'.freeze
911
SPAN_JOB = 'sidekiq.job'.freeze
1012

1113
TAG_JOB_DELAY = 'sidekiq.job.delay'.freeze

lib/ddtrace/contrib/sidekiq/patcher.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@ def patched?
1616
def patch
1717
do_once(:sidekiq) do
1818
begin
19-
require 'ddtrace/contrib/sidekiq/tracer'
19+
require 'ddtrace/contrib/sidekiq/client_tracer'
20+
::Sidekiq.configure_client do |config|
21+
config.client_middleware do |chain|
22+
chain.add(Sidekiq::ClientTracer)
23+
end
24+
end
25+
26+
require 'ddtrace/contrib/sidekiq/server_tracer'
2027
::Sidekiq.configure_server do |config|
2128
config.server_middleware do |chain|
22-
chain.add(Sidekiq::Tracer)
29+
chain.add(Sidekiq::ServerTracer)
2330
end
2431
end
2532
rescue StandardError => e
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
require 'ddtrace/contrib/sidekiq/tracing'
2+
3+
module Datadog
4+
module Contrib
5+
module Sidekiq
6+
# Tracer is a Sidekiq server-side middleware which traces executed jobs
7+
class ServerTracer
8+
include Tracing
9+
10+
def initialize(options = {})
11+
super
12+
@sidekiq_service = options[:service_name] || Datadog.configuration[:sidekiq][:service_name]
13+
end
14+
15+
def call(worker, job, queue)
16+
resource = job_resource(job)
17+
18+
service = service_from_worker_config(resource) || @sidekiq_service
19+
set_service_info(service)
20+
21+
@tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
22+
span.resource = resource
23+
span.set_tag(Ext::TAG_JOB_ID, job['jid'])
24+
span.set_tag(Ext::TAG_JOB_RETRY, job['retry'])
25+
span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
26+
span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
27+
span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
28+
29+
yield
30+
end
31+
end
32+
33+
private
34+
35+
def service_from_worker_config(resource)
36+
# Try to get the Ruby class from the resource name.
37+
worker_klass = begin
38+
Object.const_get(resource)
39+
rescue NameError
40+
nil
41+
end
42+
43+
if worker_klass.respond_to?(:datadog_tracer_config)
44+
worker_klass.datadog_tracer_config[:service_name]
45+
end
46+
end
47+
end
48+
end
49+
end
50+
end

lib/ddtrace/contrib/sidekiq/tracer.rb

Lines changed: 0 additions & 72 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
require 'ddtrace/ext/app_types'
2+
require 'ddtrace/contrib/sidekiq/ext'
3+
4+
module Datadog
5+
module Contrib
6+
module Sidekiq
7+
# Common functionality used by both client-side and server-side tracers.
8+
module Tracing
9+
def initialize(options = {})
10+
@tracer = options[:tracer] || Datadog.configuration[:sidekiq][:tracer]
11+
end
12+
13+
protected
14+
15+
# If class is wrapping something else, the interesting resource info
16+
# is the underlying, wrapped class, and not the wrapper. This is
17+
# primarily to support `ActiveJob`.
18+
def job_resource(job)
19+
if job['wrapped']
20+
job['wrapped']
21+
else
22+
job['class']
23+
end
24+
end
25+
26+
def set_service_info(service)
27+
# Ensure the tracer knows about this service.
28+
return if @tracer.services[service]
29+
@tracer.set_service_info(
30+
service,
31+
Ext::APP,
32+
Datadog::Ext::AppTypes::WORKER
33+
)
34+
end
35+
end
36+
end
37+
end
38+
end

spec/ddtrace/contrib/rails/support/base.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
if ENV['USE_SIDEKIQ']
55
require 'sidekiq/testing'
6-
require 'ddtrace/contrib/sidekiq/tracer'
6+
require 'ddtrace/contrib/sidekiq/server_tracer'
77
end
88

99
RSpec.shared_context 'Rails base application' do

spec/ddtrace/contrib/rails/support/rails3.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
if ENV['USE_SIDEKIQ']
55
require 'sidekiq/testing'
6-
require 'ddtrace/contrib/sidekiq/tracer'
6+
require 'ddtrace/contrib/sidekiq/server_tracer'
77
end
88

99
require 'ddtrace/contrib/rails/support/controllers'

spec/ddtrace/contrib/rails/support/rails4.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
if ENV['USE_SIDEKIQ']
55
require 'sidekiq/testing'
6-
require 'ddtrace/contrib/sidekiq/tracer'
6+
require 'ddtrace/contrib/sidekiq/server_tracer'
77
end
88

99
require 'ddtrace/contrib/rails/support/controllers'
@@ -43,7 +43,7 @@ def config.database_configuration
4343
# add Sidekiq middleware
4444
Sidekiq::Testing.server_middleware do |chain|
4545
chain.add(
46-
Datadog::Contrib::Sidekiq::Tracer
46+
Datadog::Contrib::Sidekiq::ServerTracer
4747
)
4848
end
4949
end

0 commit comments

Comments
 (0)