ddtrace 0.40.0 → 0.45.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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +148 -130
  3. data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
  4. data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
  5. data/.github/workflows/create-next-milestone.yml +20 -0
  6. data/.simplecov +3 -0
  7. data/Appraisals +414 -135
  8. data/CHANGELOG.md +1112 -342
  9. data/CONTRIBUTING.md +2 -2
  10. data/Gemfile +4 -2
  11. data/README.md +1 -0
  12. data/Rakefile +231 -29
  13. data/ddtrace.gemspec +8 -8
  14. data/docker-compose.yml +30 -0
  15. data/docs/DevelopmentGuide.md +12 -2
  16. data/docs/GettingStarted.md +187 -16
  17. data/lib/ddtrace.rb +10 -0
  18. data/lib/ddtrace/auto_instrument.rb +3 -0
  19. data/lib/ddtrace/auto_instrument_base.rb +6 -0
  20. data/lib/ddtrace/buffer.rb +259 -52
  21. data/lib/ddtrace/configuration.rb +19 -0
  22. data/lib/ddtrace/configuration/options.rb +3 -1
  23. data/lib/ddtrace/configuration/settings.rb +9 -3
  24. data/lib/ddtrace/context.rb +18 -0
  25. data/lib/ddtrace/context_provider.rb +17 -5
  26. data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
  27. data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
  28. data/lib/ddtrace/contrib/action_view/event.rb +0 -4
  29. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
  30. data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
  31. data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
  32. data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
  33. data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
  34. data/lib/ddtrace/contrib/active_record/utils.rb +67 -21
  35. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
  36. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
  37. data/lib/ddtrace/contrib/active_support/ext.rb +3 -0
  38. data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
  39. data/lib/ddtrace/contrib/active_support/notifications/event.rb +10 -0
  40. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +2 -2
  41. data/lib/ddtrace/contrib/auto_instrument.rb +48 -0
  42. data/lib/ddtrace/contrib/aws/instrumentation.rb +6 -1
  43. data/lib/ddtrace/contrib/aws/patcher.rb +0 -1
  44. data/lib/ddtrace/contrib/aws/services.rb +1 -0
  45. data/lib/ddtrace/contrib/configurable.rb +2 -0
  46. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +6 -5
  47. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +38 -0
  48. data/lib/ddtrace/contrib/cucumber/ext.rb +19 -0
  49. data/lib/ddtrace/contrib/cucumber/formatter.rb +104 -0
  50. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
  51. data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
  52. data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
  53. data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
  54. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +2 -0
  55. data/lib/ddtrace/contrib/delayed_job/ext.rb +2 -0
  56. data/lib/ddtrace/contrib/delayed_job/plugin.rb +39 -15
  57. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +4 -0
  58. data/lib/ddtrace/contrib/ethon/easy_patch.rb +10 -7
  59. data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
  60. data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
  61. data/lib/ddtrace/contrib/excon/middleware.rb +11 -1
  62. data/lib/ddtrace/contrib/extensions.rb +27 -1
  63. data/lib/ddtrace/contrib/faraday/middleware.rb +4 -0
  64. data/lib/ddtrace/contrib/faraday/patcher.rb +1 -1
  65. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -0
  66. data/lib/ddtrace/contrib/grape/endpoint.rb +53 -18
  67. data/lib/ddtrace/contrib/grape/ext.rb +1 -0
  68. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +5 -1
  69. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  70. data/lib/ddtrace/contrib/http/instrumentation.rb +6 -2
  71. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
  72. data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
  73. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +152 -0
  74. data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
  75. data/lib/ddtrace/contrib/httpclient/patcher.rb +35 -0
  76. data/lib/ddtrace/contrib/httprb/instrumentation.rb +6 -3
  77. data/lib/ddtrace/contrib/kafka/event.rb +1 -1
  78. data/lib/ddtrace/contrib/mongodb/subscribers.rb +4 -0
  79. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +4 -0
  80. data/lib/ddtrace/contrib/patchable.rb +18 -7
  81. data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
  82. data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
  83. data/lib/ddtrace/contrib/qless/ext.rb +20 -0
  84. data/lib/ddtrace/contrib/qless/integration.rb +38 -0
  85. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  86. data/lib/ddtrace/contrib/qless/qless_job.rb +72 -0
  87. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +32 -0
  88. data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
  89. data/lib/ddtrace/contrib/que/tracer.rb +2 -1
  90. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  91. data/lib/ddtrace/contrib/rack/integration.rb +7 -0
  92. data/lib/ddtrace/contrib/rack/middlewares.rb +1 -1
  93. data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
  94. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  95. data/lib/ddtrace/contrib/rails/patcher.rb +19 -5
  96. data/lib/ddtrace/contrib/rails/utils.rb +4 -0
  97. data/lib/ddtrace/contrib/rake/integration.rb +1 -1
  98. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +3 -1
  99. data/lib/ddtrace/contrib/redis/configuration/settings.rb +5 -0
  100. data/lib/ddtrace/contrib/redis/ext.rb +1 -0
  101. data/lib/ddtrace/contrib/redis/patcher.rb +20 -3
  102. data/lib/ddtrace/contrib/redis/quantize.rb +27 -0
  103. data/lib/ddtrace/contrib/redis/tags.rb +9 -1
  104. data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -0
  105. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  106. data/lib/ddtrace/contrib/resque/resque_job.rb +1 -1
  107. data/lib/ddtrace/contrib/rest_client/request_patch.rb +4 -0
  108. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +38 -0
  109. data/lib/ddtrace/contrib/rspec/example.rb +61 -0
  110. data/lib/ddtrace/contrib/rspec/example_group.rb +61 -0
  111. data/lib/ddtrace/contrib/rspec/ext.rb +19 -0
  112. data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
  113. data/lib/ddtrace/contrib/rspec/patcher.rb +25 -0
  114. data/lib/ddtrace/contrib/sequel/database.rb +3 -1
  115. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  116. data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
  117. data/lib/ddtrace/contrib/sequel/utils.rb +16 -5
  118. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  119. data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -1
  120. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  121. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +4 -1
  122. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +2 -2
  123. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
  124. data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -20
  125. data/lib/ddtrace/contrib/status_code_matcher.rb +67 -0
  126. data/lib/ddtrace/ext/app_types.rb +1 -0
  127. data/lib/ddtrace/ext/ci.rb +297 -0
  128. data/lib/ddtrace/ext/distributed.rb +8 -2
  129. data/lib/ddtrace/ext/git.rb +11 -0
  130. data/lib/ddtrace/ext/integration.rb +8 -0
  131. data/lib/ddtrace/ext/runtime.rb +2 -0
  132. data/lib/ddtrace/ext/test.rb +24 -0
  133. data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
  134. data/lib/ddtrace/propagation/grpc_propagator.rb +18 -6
  135. data/lib/ddtrace/propagation/http_propagator.rb +17 -2
  136. data/lib/ddtrace/runtime/identity.rb +4 -5
  137. data/lib/ddtrace/runtime/metrics.rb +6 -2
  138. data/lib/ddtrace/sampler.rb +2 -2
  139. data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
  140. data/lib/ddtrace/span.rb +152 -27
  141. data/lib/ddtrace/tracer.rb +25 -13
  142. data/lib/ddtrace/transport/http/adapters/net.rb +8 -2
  143. data/lib/ddtrace/transport/http/statistics.rb +14 -1
  144. data/lib/ddtrace/transport/traces.rb +7 -2
  145. data/lib/ddtrace/utils.rb +16 -13
  146. data/lib/ddtrace/utils/forking.rb +52 -0
  147. data/lib/ddtrace/version.rb +1 -1
  148. data/lib/ddtrace/workers/runtime_metrics.rb +7 -3
  149. data/lib/ddtrace/writer.rb +19 -1
  150. metadata +111 -19
@@ -42,16 +42,27 @@ module Datadog
42
42
 
43
43
  def patch
44
44
  if !self.class.patchable? || patcher.nil?
45
- desc = "Available?: #{self.class.available?}"
46
- desc += ", Loaded? #{self.class.loaded?}"
47
- desc += ", Compatible? #{self.class.compatible?}"
48
- desc += ", Patchable? #{self.class.patchable?}"
49
-
50
- Datadog.logger.warn("Unable to patch #{self.class.name} (#{desc})")
51
- return
45
+ return {
46
+ name: self.class.name,
47
+ available: self.class.available?,
48
+ loaded: self.class.loaded?,
49
+ compatible: self.class.compatible?,
50
+ patchable: self.class.patchable?
51
+ }
52
52
  end
53
53
 
54
54
  patcher.patch
55
+ true
56
+ end
57
+
58
+ # Can the patch for this integration be applied automatically?
59
+ # For example: test integrations should only be applied
60
+ # by the user explicitly setting `c.use :rspec`
61
+ # and rails sub-modules are auto-instrumented by enabling rails
62
+ # so auto-instrumenting them on their own will cause changes in
63
+ # service naming behavior
64
+ def auto_instrument?
65
+ true
55
66
  end
56
67
  end
57
68
  end
@@ -90,6 +90,9 @@ module Datadog
90
90
  set_nilable_tag!(span, :http_proxy, Ext::TAG_PROXY)
91
91
  set_nilable_tag!(span, :model_version, Ext::TAG_MODEL_VERSION)
92
92
 
93
+ # Tag as an external peer service
94
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
95
+
93
96
  # Set analytics sample rate
94
97
  if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
95
98
  Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate])
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/qless/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Qless
7
+ module Configuration
8
+ # Custom settings for the Qless integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
12
+ o.lazy
13
+ end
14
+
15
+ option :analytics_sample_rate do |o|
16
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
17
+ o.lazy
18
+ end
19
+
20
+ option :tag_job_data do |o|
21
+ o.default { env_to_bool(Ext::ENV_TAG_JOB_DATA, false) }
22
+ o.lazy
23
+ end
24
+
25
+ option :tag_job_tags do |o|
26
+ o.default { env_to_bool(Ext::ENV_TAG_JOB_TAGS, false) }
27
+ o.lazy
28
+ end
29
+
30
+ option :service_name, default: Ext::SERVICE_NAME
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Qless
4
+ # Qless integration constants
5
+ module Ext
6
+ APP = 'qless'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_QLESS_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_QLESS_ANALYTICS_SAMPLE_RATE'.freeze
9
+ ENV_TAG_JOB_DATA = 'DD_QLESS_TAG_JOB_DATA'.freeze
10
+ ENV_TAG_JOB_TAGS = 'DD_QLESS_TAG_JOB_TAGS'.freeze
11
+ SERVICE_NAME = 'qless'.freeze
12
+ SPAN_JOB = 'qless.job'.freeze
13
+ TAG_JOB_ID = 'qless.job.id'.freeze
14
+ TAG_JOB_DATA = 'qless.job.data'.freeze
15
+ TAG_JOB_QUEUE = 'qless.job.queue'.freeze
16
+ TAG_JOB_TAGS = 'qless.job.tags'.freeze
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,38 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/qless/configuration/settings'
3
+ require 'ddtrace/contrib/qless/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Qless
8
+ # Description of Qless integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ MINIMUM_VERSION = Gem::Version.new('0.10.0')
13
+
14
+ register_as :qless, auto_patch: true
15
+
16
+ def self.version
17
+ Gem.loaded_specs['qless'] && Gem.loaded_specs['qless'].version
18
+ end
19
+
20
+ def self.loaded?
21
+ !defined?(::Qless).nil?
22
+ end
23
+
24
+ def self.compatible?
25
+ super && version >= MINIMUM_VERSION
26
+ end
27
+
28
+ def default_configuration
29
+ Configuration::Settings.new
30
+ end
31
+
32
+ def patcher
33
+ Patcher
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/ext/app_types'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Qless
7
+ # Patcher enables patching of 'qless' module.
8
+ module Patcher
9
+ include Contrib::Patcher
10
+
11
+ module_function
12
+
13
+ def target_version
14
+ Integration.version
15
+ end
16
+
17
+ def patch
18
+ require_relative 'qless_job'
19
+ require_relative 'tracer_cleaner'
20
+
21
+ # Instrument all Qless Workers
22
+ ::Qless::Workers::BaseWorker.class_eval do
23
+ # These are executed in inverse order of listing here
24
+ include QlessJob
25
+ include TracerCleaner
26
+ end
27
+ end
28
+
29
+ def get_option(option)
30
+ Datadog.configuration[:qless].get_option(option)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,72 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/contrib/analytics'
3
+ require 'qless'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Qless
8
+ # Uses Qless job hooks to create traces
9
+ module QlessJob
10
+ def around_perform(job)
11
+ return super unless datadog_configuration && tracer
12
+ tracer.trace(Ext::SPAN_JOB, span_options) do |span|
13
+ span.resource = job.klass_name
14
+ span.span_type = Datadog::Ext::AppTypes::WORKER
15
+ span.set_tag(Ext::TAG_JOB_ID, job.jid)
16
+ span.set_tag(Ext::TAG_JOB_QUEUE, job.queue_name)
17
+
18
+ tag_job_tags = datadog_configuration[:tag_job_tags]
19
+ span.set_tag(Ext::TAG_JOB_TAGS, job.tags) if tag_job_tags
20
+
21
+ tag_job_data = datadog_configuration[:tag_job_data]
22
+ if tag_job_data && !job.data.empty?
23
+ job_data = job.data.with_indifferent_access
24
+ formatted_data = job_data.except(:tags).map do |key, value|
25
+ "#{key}:#{value}".underscore
26
+ end
27
+
28
+ span.set_tag(Ext::TAG_JOB_DATA, formatted_data)
29
+ end
30
+
31
+ # Set analytics sample rate
32
+ if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
33
+ Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate])
34
+ end
35
+
36
+ # Measure service stats
37
+ Contrib::Analytics.set_measured(span)
38
+
39
+ super
40
+ end
41
+ end
42
+
43
+ def after_fork
44
+ configuration = Datadog.configuration[:qless]
45
+ return if configuration.nil?
46
+
47
+ # Add a pin, marking the job as forked.
48
+ # Used to trigger shutdown in forks for performance reasons.
49
+ # Cleanup happens in the TracerCleaner class
50
+ Datadog::Pin.new(
51
+ configuration[:service_name],
52
+ config: { forked: true }
53
+ ).onto(::Qless)
54
+ end
55
+
56
+ private
57
+
58
+ def span_options
59
+ { service: datadog_configuration[:service_name] }
60
+ end
61
+
62
+ def tracer
63
+ datadog_configuration.tracer
64
+ end
65
+
66
+ def datadog_configuration
67
+ Datadog.configuration[:qless]
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,32 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Qless
4
+ # Shutdown Tracer in forks for performance reasons
5
+ module TracerCleaner
6
+ def around_perform(job)
7
+ return super unless datadog_configuration && tracer
8
+
9
+ super.tap do
10
+ tracer.shutdown! if forked?
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def forked?
17
+ pin = Datadog::Pin.get_from(::Qless)
18
+ return false unless pin
19
+ pin.config[:forked] == true
20
+ end
21
+
22
+ def tracer
23
+ datadog_configuration.tracer
24
+ end
25
+
26
+ def datadog_configuration
27
+ Datadog.configuration[:qless]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -35,6 +35,7 @@ module Datadog
35
35
  o.default { env_to_bool(Ext::ENV_TAG_DATA_ENABLED, false) }
36
36
  o.lazy
37
37
  end
38
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
38
39
  end
39
40
  end
40
41
  end
@@ -10,7 +10,8 @@ module Datadog
10
10
  def call(job)
11
11
  trace_options = {
12
12
  service: configuration[:service_name],
13
- span_type: Datadog::Ext::AppTypes::WORKER
13
+ span_type: Datadog::Ext::AppTypes::WORKER,
14
+ on_error: configuration[:error_handler]
14
15
  }
15
16
 
16
17
  tracer.trace(Ext::SPAN_JOB, trace_options) do |request_span|
@@ -1,6 +1,7 @@
1
1
  require 'ddtrace/contrib/analytics'
2
2
  require 'ddtrace/contrib/active_support/notifications/event'
3
3
  require 'ddtrace/contrib/racecar/ext'
4
+ require 'ddtrace/ext/integration'
4
5
 
5
6
  module Datadog
6
7
  module Contrib
@@ -37,6 +38,9 @@ module Datadog
37
38
  span.service = configuration[:service_name]
38
39
  span.resource = payload[:consumer_class]
39
40
 
41
+ # Tag as an external peer service
42
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
43
+
40
44
  # Set analytics sample rate
41
45
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
42
46
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -1,6 +1,7 @@
1
1
  require 'ddtrace/contrib/integration'
2
2
  require 'ddtrace/contrib/rack/configuration/settings'
3
3
  require 'ddtrace/contrib/rack/patcher'
4
+ require 'ddtrace/contrib/rails/utils'
4
5
 
5
6
  module Datadog
6
7
  module Contrib
@@ -25,6 +26,12 @@ module Datadog
25
26
  super && version >= MINIMUM_VERSION
26
27
  end
27
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
+
28
35
  def default_configuration
29
36
  Configuration::Settings.new
30
37
  end
@@ -53,7 +53,7 @@ module Datadog
53
53
  tracer.provider.context = context if context.trace_id
54
54
  end
55
55
 
56
- # [experimental] create a root Span to keep track of frontend web servers
56
+ # Create a root Span to keep track of frontend web servers
57
57
  # (i.e. Apache, nginx) if the header is properly set
58
58
  frontend_span = compute_queue_time(env, tracer)
59
59
 
@@ -1,7 +1,12 @@
1
1
  module Datadog
2
2
  module Contrib
3
3
  module Rack
4
- # QueueTime simply...
4
+ # Retrieves the time spent in an upstream proxy
5
+ # for the current Rack request.
6
+ #
7
+ # This time captures the request delay introduced but
8
+ # such proxy before the request made it to the Ruby
9
+ # process.
5
10
  module QueueTime
6
11
  REQUEST_START = 'HTTP_X_REQUEST_START'.freeze
7
12
  QUEUE_START = 'HTTP_X_QUEUE_START'.freeze
@@ -0,0 +1,10 @@
1
+ require 'ddtrace'
2
+
3
+ # Railtie to include AutoInstrumentation in rails loading
4
+ class DatadogAutoInstrumentRailtie < Rails::Railtie
5
+ # we want to load before config initializers so that any user supplied config
6
+ # in config/initializers/datadog.rb will take precedence
7
+ initializer 'datadog.start_tracer', before: :load_config_initializers do
8
+ Datadog::Contrib::AutoInstrument.patch_all
9
+ end
10
+ end
@@ -53,16 +53,30 @@ module Datadog
53
53
  end
54
54
 
55
55
  def add_logger(app)
56
+ should_warn = true
56
57
  # check if lograge key exists
57
- if app.config.respond_to?(:lograge) && app.config.lograge.enabled
58
+ # Note: Rails executes initializers sequentially based on alphabetical order,
59
+ # and lograge config could occur after dd config.
60
+ # Checking for `app.config.lograge.enabled` may yield a false negative.
61
+ # Instead we should naively add custom options if `config.lograge` exists from the lograge Railtie,
62
+ # since the custom options get ignored without lograge explicitly being enabled.
63
+ # See: https://github.com/roidrage/lograge/blob/1729eab7956bb95c5992e4adab251e4f93ff9280/lib/lograge/railtie.rb#L7-L12
64
+ if app.config.respond_to?(:lograge)
58
65
  Datadog::Contrib::Rails::LogInjection.add_lograge_logger(app)
59
- # if lograge isn't set, check if tagged logged is enabed.
66
+ should_warn = false
67
+ end
68
+
69
+ # if lograge isn't set, check if tagged logged is enabled.
60
70
  # if so, add proc that injects trace identifiers for tagged logging.
61
- elsif (logger = app.config.logger) && logger.is_a?(::ActiveSupport::TaggedLogging)
71
+ if (logger = app.config.logger) &&
72
+ defined?(::ActiveSupport::TaggedLogging) &&
73
+ logger.is_a?(::ActiveSupport::TaggedLogging)
74
+
62
75
  Datadog::Contrib::Rails::LogInjection.add_as_tagged_logging_logger(app)
63
- else
64
- Datadog.logger.warn("Unabe to enable Datadog Trace context, Logger #{logger} is not supported")
76
+ should_warn = false
65
77
  end
78
+
79
+ Datadog.logger.warn("Unable to enable Datadog Trace context, Logger #{logger} is not supported") if should_warn
66
80
  end
67
81
 
68
82
  def patch_after_intialize
@@ -14,6 +14,10 @@ module Datadog
14
14
  ::Rails.application.class.to_s.underscore
15
15
  end
16
16
  end
17
+
18
+ def self.railtie_supported?
19
+ !(defined?(::Rails::VERSION::MAJOR) && ::Rails::VERSION::MAJOR >= 3 && defined?(::Rails::Railtie)).nil?
20
+ end
17
21
  end
18
22
  end
19
23
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  end
19
19
 
20
20
  def self.loaded?
21
- !defined?(::Rake).nil?
21
+ !defined?(::Rake::Task).nil?
22
22
  end
23
23
 
24
24
  def self.compatible?
@@ -4,6 +4,8 @@ module Datadog
4
4
  module Contrib
5
5
  module Redis
6
6
  module Configuration
7
+ UNIX_SCHEME = 'unix'.freeze
8
+
7
9
  # Converts Symbols, Strings, and Hashes to a normalized connection settings Hash.
8
10
  class Resolver < Contrib::Configuration::Resolver
9
11
  def resolve(key_or_hash)
@@ -13,7 +15,7 @@ module Datadog
13
15
  end
14
16
 
15
17
  def normalize(hash)
16
- return { url: hash[:url] } if hash[:scheme] == 'unix'
18
+ return { url: hash[:url] } if hash[:scheme] == UNIX_SCHEME
17
19
 
18
20
  # Connexion strings are always converted to host, port, db and scheme
19
21
  # but the host, port, db and scheme will generate the :url only after