ddtrace 0.52.0 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +65 -1
- data/ddtrace.gemspec +1 -1
- data/docs/DevelopmentGuide.md +1 -6
- data/docs/GettingStarted.md +66 -16
- data/lib/datadog/ci/contrib/rspec/integration.rb +2 -2
- data/lib/datadog/ci/ext/environment.rb +41 -4
- data/lib/datadog/contrib.rb +2 -0
- data/lib/datadog/core/environment/vm_cache.rb +46 -0
- data/lib/ddtrace/configuration/agent_settings_resolver.rb +107 -40
- data/lib/ddtrace/configuration/components.rb +1 -1
- data/lib/ddtrace/configuration/settings.rb +13 -3
- data/lib/ddtrace/contrib/action_cable/instrumentation.rb +46 -0
- data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -0
- data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
- data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
- data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
- data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
- data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
- data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
- data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
- data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
- data/lib/ddtrace/contrib/active_job/event.rb +54 -0
- data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
- data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
- data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
- data/lib/ddtrace/contrib/active_job/events.rb +39 -0
- data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
- data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
- data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
- data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
- data/lib/ddtrace/contrib/auto_instrument.rb +0 -1
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +0 -1
- data/lib/ddtrace/contrib/rails/framework.rb +22 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +19 -10
- data/lib/ddtrace/contrib/registerable.rb +0 -1
- data/lib/ddtrace/contrib/sidekiq/ext.rb +3 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +10 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +26 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
- data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +2 -1
- data/lib/ddtrace/contrib/sinatra/tracer.rb +15 -2
- data/lib/ddtrace/ext/git.rb +12 -0
- data/lib/ddtrace/ext/profiling.rb +1 -0
- data/lib/ddtrace/ext/runtime.rb +3 -0
- data/lib/ddtrace/ext/transport.rb +11 -0
- data/lib/ddtrace/profiling/collectors/stack.rb +71 -27
- data/lib/ddtrace/profiling/encoding/profile.rb +9 -1
- data/lib/ddtrace/profiling/events/stack.rb +7 -7
- data/lib/ddtrace/profiling/pprof/converter.rb +22 -9
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +28 -2
- data/lib/ddtrace/profiling/tasks/setup.rb +0 -1
- data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +1 -1
- data/lib/ddtrace/profiling/trace_identifiers/helper.rb +3 -3
- data/lib/ddtrace/profiling/transport/http.rb +8 -17
- data/lib/ddtrace/runtime/metrics.rb +14 -0
- data/lib/ddtrace/span.rb +7 -19
- data/lib/ddtrace/tracer.rb +1 -1
- data/lib/ddtrace/transport/http/adapters/net.rb +13 -3
- data/lib/ddtrace/transport/http/adapters/test.rb +4 -2
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +23 -12
- data/lib/ddtrace/transport/http/builder.rb +13 -6
- data/lib/ddtrace/transport/http.rb +5 -11
- data/lib/ddtrace/utils/time.rb +5 -6
- data/lib/ddtrace/version.rb +1 -1
- metadata +27 -2
@@ -0,0 +1,54 @@
|
|
1
|
+
# typed: true
|
2
|
+
require 'ddtrace/contrib/active_support/notifications/event'
|
3
|
+
require 'ddtrace/contrib/active_job/ext'
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
module Contrib
|
7
|
+
module ActiveJob
|
8
|
+
# Defines basic behaviors for an ActiveJob event.
|
9
|
+
module Event
|
10
|
+
def self.included(base)
|
11
|
+
base.include(ActiveSupport::Notifications::Event)
|
12
|
+
base.extend(ClassMethods)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Class methods for ActiveJob events.
|
16
|
+
module ClassMethods
|
17
|
+
def span_options
|
18
|
+
{ service: configuration[:service_name] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def tracer
|
22
|
+
-> { configuration[:tracer] }
|
23
|
+
end
|
24
|
+
|
25
|
+
def configuration
|
26
|
+
Datadog.configuration[:active_job]
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_common_tags(span, payload)
|
30
|
+
adapter_name = if payload[:adapter].is_a?(Class)
|
31
|
+
payload[:adapter].name
|
32
|
+
else
|
33
|
+
payload[:adapter].class.name
|
34
|
+
end
|
35
|
+
span.set_tag(Ext::TAG_ADAPTER, adapter_name)
|
36
|
+
|
37
|
+
job = payload[:job]
|
38
|
+
span.set_tag(Ext::TAG_JOB_ID, job.job_id)
|
39
|
+
span.set_tag(Ext::TAG_JOB_QUEUE, job.queue_name)
|
40
|
+
span.set_tag(Ext::TAG_JOB_PRIORITY, job.priority) if job.respond_to?(:priority)
|
41
|
+
span.set_tag(Ext::TAG_JOB_EXECUTIONS, job.executions) if job.respond_to?(:executions)
|
42
|
+
|
43
|
+
job_scheduled_at = if job.respond_to?(:scheduled_at)
|
44
|
+
job.scheduled_at
|
45
|
+
elsif job.respond_to?(:enqueued_at)
|
46
|
+
job.enqueued_at
|
47
|
+
end
|
48
|
+
span.set_tag(Ext::TAG_JOB_SCHEDULED_AT, Time.at(job_scheduled_at)) if job_scheduled_at
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/ext/integration'
|
3
|
+
require 'ddtrace/contrib/analytics'
|
4
|
+
require 'ddtrace/contrib/active_job/ext'
|
5
|
+
require 'ddtrace/contrib/active_job/event'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
module Events
|
11
|
+
# Defines instrumentation for enqueue.active_job event
|
12
|
+
module Discard
|
13
|
+
include ActiveJob::Event
|
14
|
+
|
15
|
+
EVENT_NAME = 'discard.active_job'.freeze
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
def event_name
|
20
|
+
self::EVENT_NAME
|
21
|
+
end
|
22
|
+
|
23
|
+
def span_name
|
24
|
+
Ext::SPAN_DISCARD
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(span, event, _id, payload)
|
28
|
+
span.name = span_name
|
29
|
+
span.service = configuration[:service_name]
|
30
|
+
span.resource = payload[:job].class.name
|
31
|
+
|
32
|
+
# Set analytics sample rate
|
33
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
34
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
35
|
+
end
|
36
|
+
|
37
|
+
set_common_tags(span, payload)
|
38
|
+
span.set_tag(Ext::TAG_JOB_ERROR, payload[:error])
|
39
|
+
rescue StandardError => e
|
40
|
+
Datadog.logger.debug(e.message)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/ext/integration'
|
3
|
+
require 'ddtrace/contrib/analytics'
|
4
|
+
require 'ddtrace/contrib/active_job/ext'
|
5
|
+
require 'ddtrace/contrib/active_job/event'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
module Events
|
11
|
+
# Defines instrumentation for enqueue.active_job event
|
12
|
+
module Enqueue
|
13
|
+
include ActiveJob::Event
|
14
|
+
|
15
|
+
EVENT_NAME = 'enqueue.active_job'.freeze
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
def event_name
|
20
|
+
self::EVENT_NAME
|
21
|
+
end
|
22
|
+
|
23
|
+
def span_name
|
24
|
+
Ext::SPAN_ENQUEUE
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(span, event, _id, payload)
|
28
|
+
span.name = span_name
|
29
|
+
span.service = configuration[:service_name]
|
30
|
+
span.resource = payload[:job].class.name
|
31
|
+
|
32
|
+
# Set analytics sample rate
|
33
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
34
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
35
|
+
end
|
36
|
+
|
37
|
+
set_common_tags(span, payload)
|
38
|
+
rescue StandardError => e
|
39
|
+
Datadog.logger.debug(e.message)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/ext/integration'
|
3
|
+
require 'ddtrace/contrib/analytics'
|
4
|
+
require 'ddtrace/contrib/active_job/ext'
|
5
|
+
require 'ddtrace/contrib/active_job/event'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
module Events
|
11
|
+
# Defines instrumentation for enqueue.active_job event
|
12
|
+
module EnqueueAt
|
13
|
+
include ActiveJob::Event
|
14
|
+
|
15
|
+
EVENT_NAME = 'enqueue_at.active_job'.freeze
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
def event_name
|
20
|
+
self::EVENT_NAME
|
21
|
+
end
|
22
|
+
|
23
|
+
def span_name
|
24
|
+
Ext::SPAN_ENQUEUE
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(span, event, _id, payload)
|
28
|
+
span.name = span_name
|
29
|
+
span.service = configuration[:service_name]
|
30
|
+
span.resource = payload[:job].class.name
|
31
|
+
|
32
|
+
# Set analytics sample rate
|
33
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
34
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
35
|
+
end
|
36
|
+
|
37
|
+
set_common_tags(span, payload)
|
38
|
+
rescue StandardError => e
|
39
|
+
Datadog.logger.debug(e.message)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/ext/integration'
|
3
|
+
require 'ddtrace/contrib/analytics'
|
4
|
+
require 'ddtrace/contrib/active_job/ext'
|
5
|
+
require 'ddtrace/contrib/active_job/event'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
module Events
|
11
|
+
# Defines instrumentation for enqueue.active_job event
|
12
|
+
module EnqueueRetry
|
13
|
+
include ActiveJob::Event
|
14
|
+
|
15
|
+
EVENT_NAME = 'enqueue_retry.active_job'.freeze
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
def event_name
|
20
|
+
self::EVENT_NAME
|
21
|
+
end
|
22
|
+
|
23
|
+
def span_name
|
24
|
+
Ext::SPAN_ENQUEUE_RETRY
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(span, event, _id, payload)
|
28
|
+
span.name = span_name
|
29
|
+
span.service = configuration[:service_name]
|
30
|
+
span.resource = payload[:job].class.name
|
31
|
+
|
32
|
+
# Set analytics sample rate
|
33
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
34
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
35
|
+
end
|
36
|
+
|
37
|
+
set_common_tags(span, payload)
|
38
|
+
span.set_tag(Ext::TAG_JOB_ERROR, payload[:error])
|
39
|
+
span.set_tag(Ext::TAG_JOB_RETRY_WAIT, payload[:wait])
|
40
|
+
rescue StandardError => e
|
41
|
+
Datadog.logger.debug(e.message)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/ext/integration'
|
3
|
+
require 'ddtrace/contrib/analytics'
|
4
|
+
require 'ddtrace/contrib/active_job/ext'
|
5
|
+
require 'ddtrace/contrib/active_job/event'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
module Events
|
11
|
+
# Defines instrumentation for perform.active_job event
|
12
|
+
module Perform
|
13
|
+
include ActiveJob::Event
|
14
|
+
|
15
|
+
EVENT_NAME = 'perform.active_job'.freeze
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
def event_name
|
20
|
+
self::EVENT_NAME
|
21
|
+
end
|
22
|
+
|
23
|
+
def span_name
|
24
|
+
Ext::SPAN_PERFORM
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(span, event, _id, payload)
|
28
|
+
span.name = span_name
|
29
|
+
span.service = configuration[:service_name]
|
30
|
+
span.resource = payload[:job].class.name
|
31
|
+
|
32
|
+
# Set analytics sample rate
|
33
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
34
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
35
|
+
end
|
36
|
+
|
37
|
+
set_common_tags(span, payload)
|
38
|
+
rescue StandardError => e
|
39
|
+
Datadog.logger.debug(e.message)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/ext/integration'
|
3
|
+
require 'ddtrace/contrib/analytics'
|
4
|
+
require 'ddtrace/contrib/active_job/ext'
|
5
|
+
require 'ddtrace/contrib/active_job/event'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
module Events
|
11
|
+
# Defines instrumentation for enqueue.active_job event
|
12
|
+
module RetryStopped
|
13
|
+
include ActiveJob::Event
|
14
|
+
|
15
|
+
EVENT_NAME = 'retry_stopped.active_job'.freeze
|
16
|
+
|
17
|
+
module_function
|
18
|
+
|
19
|
+
def event_name
|
20
|
+
self::EVENT_NAME
|
21
|
+
end
|
22
|
+
|
23
|
+
def span_name
|
24
|
+
Ext::SPAN_RETRY_STOPPED
|
25
|
+
end
|
26
|
+
|
27
|
+
def process(span, event, _id, payload)
|
28
|
+
span.name = span_name
|
29
|
+
span.service = configuration[:service_name]
|
30
|
+
span.resource = payload[:job].class.name
|
31
|
+
|
32
|
+
# Set analytics sample rate
|
33
|
+
if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
|
34
|
+
Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
|
35
|
+
end
|
36
|
+
|
37
|
+
set_common_tags(span, payload)
|
38
|
+
span.set_tag(Ext::TAG_JOB_ERROR, payload[:error])
|
39
|
+
rescue StandardError => e
|
40
|
+
Datadog.logger.debug(e.message)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/contrib/active_job/events/discard'
|
3
|
+
require 'ddtrace/contrib/active_job/events/enqueue'
|
4
|
+
require 'ddtrace/contrib/active_job/events/enqueue_at'
|
5
|
+
require 'ddtrace/contrib/active_job/events/enqueue_retry'
|
6
|
+
require 'ddtrace/contrib/active_job/events/perform'
|
7
|
+
require 'ddtrace/contrib/active_job/events/retry_stopped'
|
8
|
+
|
9
|
+
module Datadog
|
10
|
+
module Contrib
|
11
|
+
module ActiveJob
|
12
|
+
# Defines collection of instrumented ActiveJob events
|
13
|
+
module Events
|
14
|
+
ALL = [
|
15
|
+
Events::Discard,
|
16
|
+
Events::Enqueue,
|
17
|
+
Events::EnqueueAt,
|
18
|
+
Events::EnqueueRetry,
|
19
|
+
Events::Perform,
|
20
|
+
Events::RetryStopped,
|
21
|
+
].freeze
|
22
|
+
|
23
|
+
module_function
|
24
|
+
|
25
|
+
def all
|
26
|
+
self::ALL
|
27
|
+
end
|
28
|
+
|
29
|
+
def subscriptions
|
30
|
+
all.collect(&:subscriptions).collect(&:to_a).flatten
|
31
|
+
end
|
32
|
+
|
33
|
+
def subscribe!
|
34
|
+
all.each(&:subscribe!)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# typed: true
|
2
|
+
module Datadog
|
3
|
+
module Contrib
|
4
|
+
module ActiveJob
|
5
|
+
module Ext
|
6
|
+
APP = 'active_job'.freeze
|
7
|
+
SERVICE_NAME = 'active_job'.freeze
|
8
|
+
|
9
|
+
ENV_ENABLED = 'DD_TRACE_ACTIVE_JOB_ENABLED'.freeze
|
10
|
+
ENV_ANALYTICS_ENABLED = 'DD_TRACE_ACTIVE_JOB_ANALYTICS_ENABLED'.freeze
|
11
|
+
ENV_ANALYTICS_ENABLED_OLD = 'DD_ACTIVE_JOB_ANALYTICS_ENABLED'.freeze
|
12
|
+
ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_ACTIVE_JOB_ANALYTICS_SAMPLE_RATE'.freeze
|
13
|
+
ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_ACTIVE_JOB_ANALYTICS_SAMPLE_RATE'.freeze
|
14
|
+
|
15
|
+
SPAN_DISCARD = 'active_job.discard'.freeze
|
16
|
+
SPAN_ENQUEUE = 'active_job.enqueue'.freeze
|
17
|
+
SPAN_ENQUEUE_RETRY = 'active_job.enqueue_retry'.freeze
|
18
|
+
SPAN_PERFORM = 'active_job.perform'.freeze
|
19
|
+
SPAN_RETRY_STOPPED = 'active_job.retry_stopped'.freeze
|
20
|
+
|
21
|
+
TAG_ADAPTER = 'active_job.adapter'.freeze
|
22
|
+
TAG_JOB_ERROR = 'active_job.job.error'.freeze
|
23
|
+
TAG_JOB_EXECUTIONS = 'active_job.job.executions'.freeze
|
24
|
+
TAG_JOB_ID = 'active_job.job.id'.freeze
|
25
|
+
TAG_JOB_PRIORITY = 'active_job.job.priority'.freeze
|
26
|
+
TAG_JOB_QUEUE = 'active_job.job.queue'.freeze
|
27
|
+
TAG_JOB_RETRY_WAIT = 'active_job.job.retry_wait'.freeze
|
28
|
+
TAG_JOB_SCHEDULED_AT = 'active_job.job.scheduled_at'.freeze
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/contrib/integration'
|
3
|
+
require 'ddtrace/contrib/active_job/configuration/settings'
|
4
|
+
require 'ddtrace/contrib/active_job/patcher'
|
5
|
+
require 'ddtrace/contrib/rails/utils'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
# Describes the ActiveJob integration
|
11
|
+
class Integration
|
12
|
+
include Contrib::Integration
|
13
|
+
|
14
|
+
MINIMUM_VERSION = Gem::Version.new('4.2')
|
15
|
+
|
16
|
+
register_as :active_job, auto_patch: false
|
17
|
+
|
18
|
+
def self.version
|
19
|
+
Gem.loaded_specs['activejob'] && Gem.loaded_specs['activejob'].version
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.loaded?
|
23
|
+
!defined?(::ActiveJob).nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.compatible?
|
27
|
+
super && version >= MINIMUM_VERSION
|
28
|
+
end
|
29
|
+
|
30
|
+
# enabled by rails integration so should only auto instrument
|
31
|
+
# if detected that it is being used without rails
|
32
|
+
def auto_instrument?
|
33
|
+
!Datadog::Contrib::Rails::Utils.railtie_supported?
|
34
|
+
end
|
35
|
+
|
36
|
+
def default_configuration
|
37
|
+
Configuration::Settings.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def patcher
|
41
|
+
ActiveJob::Patcher
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# typed: false
|
2
|
+
module Datadog
|
3
|
+
module Contrib
|
4
|
+
module ActiveJob
|
5
|
+
# Active Job log injection wrapped around job execution
|
6
|
+
module LogInjection
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
around_perform do |_, block|
|
10
|
+
if logger.respond_to?(:tagged)
|
11
|
+
logger.tagged(Datadog.tracer.active_correlation.to_s, &block)
|
12
|
+
else
|
13
|
+
block.call
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# typed: false
|
2
|
+
require 'ddtrace/contrib/patcher'
|
3
|
+
require 'ddtrace/contrib/active_job/ext'
|
4
|
+
require 'ddtrace/contrib/active_job/events'
|
5
|
+
require 'ddtrace/contrib/active_job/log_injection'
|
6
|
+
|
7
|
+
module Datadog
|
8
|
+
module Contrib
|
9
|
+
module ActiveJob
|
10
|
+
# Patcher enables patching of 'active_job' module.
|
11
|
+
module Patcher
|
12
|
+
include Contrib::Patcher
|
13
|
+
|
14
|
+
module_function
|
15
|
+
|
16
|
+
def target_version
|
17
|
+
Integration.version
|
18
|
+
end
|
19
|
+
|
20
|
+
def patch
|
21
|
+
Events.subscribe!
|
22
|
+
inject_log_correlation if Datadog.configuration[:active_job][:log_injection]
|
23
|
+
end
|
24
|
+
|
25
|
+
def inject_log_correlation
|
26
|
+
::ActiveSupport.on_load(:active_job) do
|
27
|
+
include LogInjection
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -5,6 +5,7 @@ require 'ddtrace/ext/app_types'
|
|
5
5
|
require 'ddtrace/contrib/active_record/integration'
|
6
6
|
require 'ddtrace/contrib/active_support/integration'
|
7
7
|
require 'ddtrace/contrib/action_cable/integration'
|
8
|
+
require 'ddtrace/contrib/action_mailer/integration'
|
8
9
|
require 'ddtrace/contrib/action_pack/integration'
|
9
10
|
require 'ddtrace/contrib/action_view/integration'
|
10
11
|
require 'ddtrace/contrib/grape/endpoint'
|
@@ -45,9 +46,11 @@ module Datadog
|
|
45
46
|
|
46
47
|
activate_rack!(datadog_config, rails_config)
|
47
48
|
activate_action_cable!(datadog_config, rails_config)
|
49
|
+
activate_action_mailer!(datadog_config, rails_config)
|
48
50
|
activate_active_support!(datadog_config, rails_config)
|
49
51
|
activate_action_pack!(datadog_config, rails_config)
|
50
52
|
activate_action_view!(datadog_config, rails_config)
|
53
|
+
activate_active_job!(datadog_config, rails_config)
|
51
54
|
activate_active_record!(datadog_config, rails_config)
|
52
55
|
activate_lograge!(datadog_config, rails_config)
|
53
56
|
activate_semantic_logger!(datadog_config, rails_config)
|
@@ -93,6 +96,15 @@ module Datadog
|
|
93
96
|
)
|
94
97
|
end
|
95
98
|
|
99
|
+
def self.activate_action_mailer!(datadog_config, rails_config)
|
100
|
+
return unless defined?(::ActionMailer)
|
101
|
+
|
102
|
+
datadog_config.use(
|
103
|
+
:action_mailer,
|
104
|
+
service_name: "#{rails_config[:service_name]}-#{Contrib::ActionMailer::Ext::SERVICE_NAME}"
|
105
|
+
)
|
106
|
+
end
|
107
|
+
|
96
108
|
def self.activate_action_pack!(datadog_config, rails_config)
|
97
109
|
return unless defined?(::ActionPack)
|
98
110
|
|
@@ -115,6 +127,16 @@ module Datadog
|
|
115
127
|
)
|
116
128
|
end
|
117
129
|
|
130
|
+
def self.activate_active_job!(datadog_config, rails_config)
|
131
|
+
return unless defined?(::ActiveJob)
|
132
|
+
|
133
|
+
datadog_config.use(
|
134
|
+
:active_job,
|
135
|
+
service_name: "#{rails_config[:service_name]}-#{Contrib::ActiveJob::Ext::SERVICE_NAME}",
|
136
|
+
log_injection: rails_config[:log_injection]
|
137
|
+
)
|
138
|
+
end
|
139
|
+
|
118
140
|
def self.activate_active_record!(datadog_config, rails_config)
|
119
141
|
return unless defined?(::ActiveRecord)
|
120
142
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: ignore
|
2
2
|
require 'ddtrace/contrib/rails/utils'
|
3
3
|
require 'ddtrace/contrib/rails/framework'
|
4
4
|
require 'ddtrace/contrib/rails/middlewares'
|
@@ -45,17 +45,26 @@ module Datadog
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def add_middleware(app)
|
48
|
-
# Add trace middleware
|
48
|
+
# Add trace middleware at the top of the middleware stack,
|
49
|
+
# to ensure we capture the complete execution time.
|
49
50
|
app.middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
|
50
51
|
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
52
|
+
# Some Rails middleware can swallow an application error, preventing
|
53
|
+
# the error propagation to the encompassing Rack span.
|
54
|
+
#
|
55
|
+
# We insert our own middleware right before these Rails middleware
|
56
|
+
# have a chance to swallow the error.
|
57
|
+
#
|
58
|
+
# Note: because the middleware stack is push/pop, "before" and "after" are reversed
|
59
|
+
# for our use case: we insert ourselves with "after" a middleware to ensure we are
|
60
|
+
# able to pop the request "before" it.
|
61
|
+
if defined?(::ActionDispatch::DebugExceptions)
|
62
|
+
# Rails >= 3.2
|
63
|
+
app.middleware.insert_after(::ActionDispatch::DebugExceptions, Datadog::Contrib::Rails::ExceptionMiddleware)
|
64
|
+
else
|
65
|
+
# Rails < 3.2
|
66
|
+
app.middleware.insert_after(::ActionDispatch::ShowExceptions, Datadog::Contrib::Rails::ExceptionMiddleware)
|
67
|
+
end
|
59
68
|
end
|
60
69
|
|
61
70
|
def add_logger(app)
|
@@ -15,6 +15,9 @@ module Datadog
|
|
15
15
|
SERVICE_NAME = 'sidekiq'.freeze
|
16
16
|
SPAN_PUSH = 'sidekiq.push'.freeze
|
17
17
|
SPAN_JOB = 'sidekiq.job'.freeze
|
18
|
+
SPAN_JOB_FETCH = 'sidekiq.job_fetch'.freeze
|
19
|
+
SPAN_HEARTBEAT = 'sidekiq.heartbeat'.freeze
|
20
|
+
SPAN_SCHEDULED_PUSH = 'sidekiq.scheduled_push'.freeze
|
18
21
|
TAG_JOB_DELAY = 'sidekiq.job.delay'.freeze
|
19
22
|
TAG_JOB_ID = 'sidekiq.job.id'.freeze
|
20
23
|
TAG_JOB_QUEUE = 'sidekiq.job.queue'.freeze
|
@@ -11,6 +11,7 @@ module Datadog
|
|
11
11
|
include Contrib::Integration
|
12
12
|
|
13
13
|
MINIMUM_VERSION = Gem::Version.new('3.5.4')
|
14
|
+
MINIMUM_SERVER_INTERNAL_TRACING_VERSION = Gem::Version.new('5.2.4')
|
14
15
|
|
15
16
|
register_as :sidekiq
|
16
17
|
|
@@ -26,6 +27,15 @@ module Datadog
|
|
26
27
|
super && version >= MINIMUM_VERSION
|
27
28
|
end
|
28
29
|
|
30
|
+
# Only patch server internals on v5.2.4+ because that's when loading of
|
31
|
+
# `Sidekiq::Launcher` stabilized. Sidekiq 4+ technically can support our
|
32
|
+
# patches (with minor adjustments), but in order to avoid explicitly
|
33
|
+
# requiring `sidekiq/launcher` ourselves (which could affect gem
|
34
|
+
# initialization order), we are limiting this tracing to v5.2.4+.
|
35
|
+
def self.compatible_with_server_internal_tracing?
|
36
|
+
version >= MINIMUM_SERVER_INTERNAL_TRACING_VERSION
|
37
|
+
end
|
38
|
+
|
29
39
|
def default_configuration
|
30
40
|
Configuration::Settings.new
|
31
41
|
end
|