ddtrace 0.52.0 → 0.54.2

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.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +174 -11
  3. data/ddtrace.gemspec +6 -3
  4. data/docs/DevelopmentGuide.md +1 -6
  5. data/docs/GettingStarted.md +109 -18
  6. data/docs/ProfilingDevelopment.md +2 -2
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +86 -0
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +52 -0
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
  11. data/ext/ddtrace_profiling_native_extension/extconf.rb +177 -8
  12. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +35 -0
  13. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
  14. data/ext/ddtrace_profiling_native_extension/profiling.c +6 -1
  15. data/lib/datadog/ci/contrib/cucumber/formatter.rb +1 -0
  16. data/lib/datadog/ci/contrib/rspec/example.rb +1 -0
  17. data/lib/datadog/ci/contrib/rspec/integration.rb +2 -2
  18. data/lib/datadog/ci/ext/environment.rb +64 -22
  19. data/lib/datadog/ci/ext/test.rb +1 -0
  20. data/lib/datadog/ci/test.rb +5 -1
  21. data/lib/datadog/contrib.rb +2 -0
  22. data/lib/datadog/core/environment/vm_cache.rb +46 -0
  23. data/lib/ddtrace/buffer.rb +28 -16
  24. data/lib/ddtrace/configuration/agent_settings_resolver.rb +131 -53
  25. data/lib/ddtrace/configuration/components.rb +1 -1
  26. data/lib/ddtrace/configuration/settings.rb +13 -3
  27. data/lib/ddtrace/context.rb +10 -2
  28. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +46 -0
  29. data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -0
  30. data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
  31. data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
  32. data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
  33. data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
  34. data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
  35. data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
  36. data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
  37. data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
  38. data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
  39. data/lib/ddtrace/contrib/active_job/event.rb +54 -0
  40. data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
  41. data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
  42. data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
  43. data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
  44. data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
  45. data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
  46. data/lib/ddtrace/contrib/active_job/events.rb +39 -0
  47. data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
  48. data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
  49. data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
  50. data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
  51. data/lib/ddtrace/contrib/auto_instrument.rb +0 -1
  52. data/lib/ddtrace/contrib/delayed_job/plugin.rb +2 -2
  53. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -1
  54. data/lib/ddtrace/contrib/mongodb/integration.rb +5 -0
  55. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +0 -1
  56. data/lib/ddtrace/contrib/rails/configuration/settings.rb +7 -0
  57. data/lib/ddtrace/contrib/rails/framework.rb +24 -1
  58. data/lib/ddtrace/contrib/rails/patcher.rb +19 -10
  59. data/lib/ddtrace/contrib/redis/instrumentation.rb +90 -0
  60. data/lib/ddtrace/contrib/redis/patcher.rb +2 -84
  61. data/lib/ddtrace/contrib/registerable.rb +0 -1
  62. data/lib/ddtrace/contrib/resque/integration.rb +1 -5
  63. data/lib/ddtrace/contrib/sidekiq/ext.rb +3 -0
  64. data/lib/ddtrace/contrib/sidekiq/integration.rb +10 -0
  65. data/lib/ddtrace/contrib/sidekiq/patcher.rb +26 -0
  66. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
  67. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
  68. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
  69. data/lib/ddtrace/contrib/sinatra/env.rb +2 -1
  70. data/lib/ddtrace/contrib/sinatra/tracer.rb +15 -2
  71. data/lib/ddtrace/ext/git.rb +12 -0
  72. data/lib/ddtrace/ext/priority.rb +6 -4
  73. data/lib/ddtrace/ext/profiling.rb +8 -11
  74. data/lib/ddtrace/ext/runtime.rb +3 -0
  75. data/lib/ddtrace/ext/transport.rb +11 -0
  76. data/lib/ddtrace/metrics.rb +2 -2
  77. data/lib/ddtrace/profiling/collectors/stack.rb +112 -72
  78. data/lib/ddtrace/profiling/encoding/profile.rb +10 -2
  79. data/lib/ddtrace/profiling/events/stack.rb +13 -13
  80. data/lib/ddtrace/profiling/native_extension.rb +23 -1
  81. data/lib/ddtrace/profiling/pprof/builder.rb +8 -2
  82. data/lib/ddtrace/profiling/pprof/converter.rb +22 -9
  83. data/lib/ddtrace/profiling/pprof/stack_sample.rb +32 -9
  84. data/lib/ddtrace/profiling/pprof/template.rb +2 -2
  85. data/lib/ddtrace/profiling/scheduler.rb +20 -4
  86. data/lib/ddtrace/profiling/tasks/setup.rb +21 -13
  87. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +10 -9
  88. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +5 -5
  89. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +8 -15
  90. data/lib/ddtrace/profiling/transport/http.rb +8 -17
  91. data/lib/ddtrace/profiling.rb +0 -2
  92. data/lib/ddtrace/runtime/metrics.rb +14 -0
  93. data/lib/ddtrace/sampler.rb +18 -8
  94. data/lib/ddtrace/sampling/rule_sampler.rb +13 -1
  95. data/lib/ddtrace/span.rb +7 -19
  96. data/lib/ddtrace/tracer.rb +1 -1
  97. data/lib/ddtrace/transport/http/adapters/net.rb +13 -3
  98. data/lib/ddtrace/transport/http/adapters/test.rb +4 -2
  99. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +23 -12
  100. data/lib/ddtrace/transport/http/builder.rb +13 -6
  101. data/lib/ddtrace/transport/http.rb +5 -11
  102. data/lib/ddtrace/utils/time.rb +11 -6
  103. data/lib/ddtrace/version.rb +2 -2
  104. data/lib/ddtrace/workers/{loop.rb → interval_loop.rb} +0 -16
  105. data/lib/ddtrace/workers/polling.rb +1 -1
  106. metadata +40 -10
  107. data/lib/ddtrace/profiling/ext/cpu.rb +0 -67
  108. data/lib/ddtrace/profiling/ext/cthread.rb +0 -156
@@ -0,0 +1,41 @@
1
+ # typed: false
2
+ require 'ddtrace/contrib/action_mailer/ext'
3
+ require 'ddtrace/contrib/action_mailer/event'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module ActionMailer
8
+ module Events
9
+ # Defines instrumentation for process.action_mailer event
10
+ module Process
11
+ include ActionMailer::Event
12
+
13
+ EVENT_NAME = 'process.action_mailer'.freeze
14
+
15
+ module_function
16
+
17
+ def event_name
18
+ self::EVENT_NAME
19
+ end
20
+
21
+ def span_name
22
+ Ext::SPAN_PROCESS
23
+ end
24
+
25
+ def span_type
26
+ # process.action_mailer processes email and renders partial templates
27
+ Datadog::Ext::HTTP::TEMPLATE
28
+ end
29
+
30
+ def process(span, event, _id, payload)
31
+ super
32
+
33
+ span.span_type = span_type
34
+ span.set_tag(Ext::TAG_ACTION, payload[:action])
35
+ span.set_tag(Ext::TAG_MAILER, payload[:mailer])
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,31 @@
1
+ # typed: false
2
+ require 'ddtrace/contrib/action_mailer/events/process'
3
+ require 'ddtrace/contrib/action_mailer/events/deliver'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module ActionMailer
8
+ # Defines collection of instrumented ActionMailer events
9
+ module Events
10
+ ALL = [
11
+ Events::Process,
12
+ Events::Deliver
13
+ ].freeze
14
+
15
+ module_function
16
+
17
+ def all
18
+ self::ALL
19
+ end
20
+
21
+ def subscriptions
22
+ all.collect(&:subscriptions).collect(&:to_a).flatten
23
+ end
24
+
25
+ def subscribe!
26
+ all.each(&:subscribe!)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,32 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Contrib
4
+ module ActionMailer
5
+ # ActionMailer integration constants
6
+ module Ext
7
+ APP = 'action_mailer'.freeze
8
+ ENV_ENABLED = 'DD_TRACE_ACTION_MAILER_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_ACTION_MAILER_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_ACTION_MAILER_ANALYTICS_SAMPLE_RATE'.freeze
11
+
12
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_ACTION_MAILER_ANALYTICS_ENABLED'.freeze
13
+
14
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_ACTION_MAILER_ANALYTICS_SAMPLE_RATE'.freeze
15
+ SERVICE_NAME = 'action_mailer'.freeze
16
+ SPAN_PROCESS = 'action_mailer.process'.freeze
17
+ SPAN_DELIVER = 'action_mailer.deliver'.freeze
18
+ TAG_ACTION = 'action_mailer.action'.freeze
19
+ TAG_MAILER = 'action_mailer.mailer'.freeze
20
+ TAG_MSG_ID = 'action_mailer.message_id'.freeze
21
+
22
+ TAG_SUBJECT = 'action_mailer.subject'.freeze
23
+ TAG_TO = 'action_mailer.to'.freeze
24
+ TAG_FROM = 'action_mailer.from'.freeze
25
+ TAG_BCC = 'action_mailer.bcc'.freeze
26
+ TAG_CC = 'action_mailer.cc'.freeze
27
+ TAG_DATE = 'action_mailer.date'.freeze
28
+ TAG_PERFORM_DELIVERIES = 'action_mailer.perform_deliveries'.freeze
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,45 @@
1
+ # typed: false
2
+ require 'ddtrace/contrib/integration'
3
+ require 'ddtrace/contrib/action_mailer/configuration/settings'
4
+ require 'ddtrace/contrib/action_mailer/patcher'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module ActionMailer
9
+ # Description of ActionMailer integration
10
+ class Integration
11
+ include Contrib::Integration
12
+
13
+ MINIMUM_VERSION = Gem::Version.new('5.0.0')
14
+
15
+ register_as :action_mailer, auto_patch: false
16
+
17
+ def self.version
18
+ Gem.loaded_specs['actionmailer'] && Gem.loaded_specs['actionmailer'].version
19
+ end
20
+
21
+ def self.loaded?
22
+ !defined?(::ActionMailer).nil?
23
+ end
24
+
25
+ def self.compatible?
26
+ super && version >= MINIMUM_VERSION && !defined?(::ActiveSupport::Notifications).nil?
27
+ end
28
+
29
+ # enabled by rails integration so should only auto instrument
30
+ # if detected that it is being used without rails
31
+ def auto_instrument?
32
+ !Datadog::Contrib::Rails::Utils.railtie_supported?
33
+ end
34
+
35
+ def default_configuration
36
+ Configuration::Settings.new
37
+ end
38
+
39
+ def patcher
40
+ ActionMailer::Patcher
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ # typed: true
2
+ require 'ddtrace/contrib/patcher'
3
+ require 'ddtrace/ext/app_types'
4
+ require 'ddtrace/contrib/action_mailer/ext'
5
+ require 'ddtrace/contrib/action_mailer/events'
6
+
7
+ module Datadog
8
+ module Contrib
9
+ module ActionMailer
10
+ # Patcher enables patching of 'action_mailer' 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
+ # Subscribe to ActionMailer events
22
+ Events.subscribe!
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # typed: false
2
+ require 'ddtrace/contrib/configuration/settings'
3
+ require 'ddtrace/contrib/active_job/ext'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module ActiveJob
8
+ module Configuration
9
+ # Custom settings for the DelayedJob integration
10
+ class Settings < Contrib::Configuration::Settings
11
+ option :enabled do |o|
12
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
13
+ o.lazy
14
+ end
15
+
16
+ option :analytics_enabled do |o|
17
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
18
+ o.lazy
19
+ end
20
+
21
+ option :analytics_sample_rate do |o|
22
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
23
+ o.lazy
24
+ end
25
+
26
+ option :service_name, default: Ext::SERVICE_NAME
27
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
28
+ option :log_injection, default: false
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -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