ddtrace 0.37.0 → 0.42.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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +56 -0
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +1 -0
  5. data/.simplecov +38 -0
  6. data/Appraisals +186 -11
  7. data/CHANGELOG.md +188 -1
  8. data/CONTRIBUTING.md +1 -1
  9. data/Rakefile +518 -482
  10. data/ddtrace.gemspec +3 -0
  11. data/docker-compose.yml +2 -2
  12. data/docs/DevelopmentGuide.md +26 -0
  13. data/docs/GettingStarted.md +188 -78
  14. data/lib/ddtrace.rb +4 -0
  15. data/lib/ddtrace/buffer.rb +259 -52
  16. data/lib/ddtrace/configuration.rb +39 -5
  17. data/lib/ddtrace/configuration/components.rb +4 -7
  18. data/lib/ddtrace/configuration/options.rb +3 -1
  19. data/lib/ddtrace/configuration/settings.rb +32 -4
  20. data/lib/ddtrace/context_provider.rb +6 -5
  21. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  22. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  23. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  24. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  25. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  26. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  27. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  28. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  29. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  30. data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
  31. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  32. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  33. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  34. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
  35. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  36. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  37. data/lib/ddtrace/contrib/aws/instrumentation.rb +4 -0
  38. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  39. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  40. data/lib/ddtrace/contrib/configuration/settings.rb +1 -0
  41. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  42. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  43. data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
  44. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +8 -2
  45. data/lib/ddtrace/contrib/delayed_job/ext.rb +7 -2
  46. data/lib/ddtrace/contrib/delayed_job/plugin.rb +37 -15
  47. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  48. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  49. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +4 -0
  50. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  51. data/lib/ddtrace/contrib/ethon/easy_patch.rb +4 -2
  52. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  53. data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
  54. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  55. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  56. data/lib/ddtrace/contrib/excon/middleware.rb +4 -0
  57. data/lib/ddtrace/contrib/extensions.rb +11 -1
  58. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  59. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  60. data/lib/ddtrace/contrib/faraday/middleware.rb +9 -3
  61. data/lib/ddtrace/contrib/faraday/patcher.rb +12 -0
  62. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  63. data/lib/ddtrace/contrib/grape/endpoint.rb +6 -4
  64. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  65. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  66. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  67. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  68. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +6 -4
  69. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  70. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  71. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  72. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  73. data/lib/ddtrace/contrib/http/instrumentation.rb +4 -0
  74. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  75. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  76. data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
  77. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  78. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  79. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  80. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  81. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  82. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  83. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  84. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  85. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  86. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  87. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  88. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  89. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  90. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  91. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  92. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  93. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  94. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  95. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  96. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  97. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  98. data/lib/ddtrace/contrib/mongodb/subscribers.rb +4 -0
  99. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  100. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  101. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +4 -0
  102. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  103. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  104. data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
  105. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  106. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  107. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  108. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  109. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  110. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  111. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  112. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  113. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  114. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  115. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  116. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  117. data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
  118. data/lib/ddtrace/contrib/rails/configuration/settings.rb +12 -2
  119. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  120. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  121. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  122. data/lib/ddtrace/contrib/rails/patcher.rb +26 -0
  123. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  124. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  125. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  126. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  127. data/lib/ddtrace/contrib/redis/tags.rb +4 -0
  128. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  129. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  130. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  131. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  132. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  133. data/lib/ddtrace/contrib/rest_client/request_patch.rb +6 -2
  134. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  135. data/lib/ddtrace/contrib/sequel/database.rb +3 -1
  136. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  137. data/lib/ddtrace/contrib/sequel/ext.rb +6 -2
  138. data/lib/ddtrace/contrib/sequel/utils.rb +35 -6
  139. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  140. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  141. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  142. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  143. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  144. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  145. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  146. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  147. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  148. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  149. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  150. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  151. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  152. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  153. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  154. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  155. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  156. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  157. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  158. data/lib/ddtrace/environment.rb +17 -3
  159. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  160. data/lib/ddtrace/ext/environment.rb +2 -0
  161. data/lib/ddtrace/ext/integration.rb +8 -0
  162. data/lib/ddtrace/ext/runtime.rb +1 -0
  163. data/lib/ddtrace/ext/transport.rb +1 -0
  164. data/lib/ddtrace/logger.rb +1 -1
  165. data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
  166. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  167. data/lib/ddtrace/propagation/grpc_propagator.rb +18 -6
  168. data/lib/ddtrace/runtime/metrics.rb +24 -6
  169. data/lib/ddtrace/sampler.rb +4 -2
  170. data/lib/ddtrace/span.rb +162 -27
  171. data/lib/ddtrace/tracer.rb +24 -18
  172. data/lib/ddtrace/transport/http.rb +15 -0
  173. data/lib/ddtrace/transport/http/adapters/net.rb +16 -2
  174. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  175. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  176. data/lib/ddtrace/transport/http/statistics.rb +14 -1
  177. data/lib/ddtrace/transport/response.rb +11 -0
  178. data/lib/ddtrace/transport/traces.rb +7 -2
  179. data/lib/ddtrace/utils.rb +7 -3
  180. data/lib/ddtrace/version.rb +1 -1
  181. data/lib/ddtrace/workers/async.rb +2 -2
  182. data/lib/ddtrace/workers/loop.rb +1 -1
  183. data/lib/ddtrace/workers/polling.rb +1 -1
  184. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  185. data/lib/ddtrace/writer.rb +33 -12
  186. metadata +81 -2
@@ -5,6 +5,7 @@ module Datadog
5
5
  module Ext
6
6
  APP = 'concurrent-ruby'.freeze
7
7
  SERVICE_NAME = 'concurrent-ruby'.freeze
8
+ ENV_ENABLED = 'DD_TRACE_CONCURRENT_RUBY_ENABLED'.freeze
8
9
  end
9
10
  end
10
11
  end
@@ -9,6 +9,7 @@ module Datadog
9
9
 
10
10
  option :analytics_enabled, default: false
11
11
  option :analytics_sample_rate, default: 1.0
12
+ option :enabled, default: true
12
13
  option :service_name
13
14
  option :tracer do |o|
14
15
  o.delegate_to { Datadog.tracer }
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Dalli integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Dalli integration constants
5
5
  module Ext
6
6
  APP = 'dalli'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_DALLI_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_DALLI_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_DALLI_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_DALLI_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_DALLI_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_DALLI_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_DALLI_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  QUANTIZE_MAX_CMD_LENGTH = 100
10
13
  SERVICE_NAME = 'memcached'.freeze
11
14
  SPAN_COMMAND = 'memcached.command'.freeze
@@ -1,3 +1,4 @@
1
+ require 'ddtrace/ext/integration'
1
2
  require 'ddtrace/ext/net'
2
3
  require 'ddtrace/contrib/analytics'
3
4
  require 'ddtrace/contrib/dalli/ext'
@@ -20,6 +21,9 @@ module Datadog
20
21
  span.service = datadog_configuration[:service_name]
21
22
  span.span_type = Datadog::Contrib::Dalli::Ext::SPAN_TYPE_COMMAND
22
23
 
24
+ # Tag as an external peer service
25
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
26
+
23
27
  # Set analytics sample rate
24
28
  if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
25
29
  Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate])
@@ -7,17 +7,23 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the DelayedJob integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
20
25
  option :service_name, default: Ext::SERVICE_NAME
26
+ option :client_service_name, default: Ext::CLIENT_SERVICE_NAME
21
27
  end
22
28
  end
23
29
  end
@@ -4,10 +4,15 @@ module Datadog
4
4
  # DelayedJob integration constants
5
5
  module Ext
6
6
  APP = 'delayed_job'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_DELAYED_JOB_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_DELAYED_JOB_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_DELAYED_JOB_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_DELAYED_JOB_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_DELAYED_JOB_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_DELAYED_JOB_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_DELAYED_JOB_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'delayed_job'.freeze
13
+ CLIENT_SERVICE_NAME = 'delayed_job-client'.freeze
10
14
  SPAN_JOB = 'delayed_job'.freeze
15
+ SPAN_ENQUEUE = 'delayed_job.enqueue'.freeze
11
16
  TAG_ATTEMPTS = 'delayed_job.attempts'.freeze
12
17
  TAG_ID = 'delayed_job.id'.freeze
13
18
  TAG_PRIORITY = 'delayed_job.priority'.freeze
@@ -7,22 +7,11 @@ module Datadog
7
7
  module DelayedJob
8
8
  # DelayedJob plugin that instruments invoke_job hook
9
9
  class Plugin < Delayed::Plugin
10
- def self.instrument(job, &block)
10
+ def self.instrument_invoke(job, &block)
11
11
  return block.call(job) unless tracer && tracer.enabled
12
12
 
13
- # When DelayedJob is used through ActiveJob, we need to parse the payload differentely
14
- # to get the actual job name
15
- job_name = if job.payload_object.respond_to?(:job_data)
16
- job.payload_object.job_data['job_class']
17
- else
18
- job.name
19
- end
20
-
21
- tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name) do |span|
22
- # Set analytics sample rate
23
- if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
24
- Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
25
- end
13
+ tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name(job)) do |span|
14
+ set_sample_rate(span)
26
15
 
27
16
  # Measure service stats
28
17
  Contrib::Analytics.set_measured(span)
@@ -37,6 +26,23 @@ module Datadog
37
26
  end
38
27
  end
39
28
 
29
+ def self.instrument_enqueue(job, &block)
30
+ return block.call(job) unless tracer && tracer.enabled
31
+
32
+ tracer.trace(Ext::SPAN_ENQUEUE, service: configuration[:client_service_name], resource: job_name(job)) do |span|
33
+ set_sample_rate(span)
34
+
35
+ # Measure service stats
36
+ Contrib::Analytics.set_measured(span)
37
+
38
+ span.set_tag(Ext::TAG_QUEUE, job.queue) if job.queue
39
+ span.set_tag(Ext::TAG_PRIORITY, job.priority)
40
+ span.span_type = Datadog::Ext::AppTypes::WORKER
41
+
42
+ yield job
43
+ end
44
+ end
45
+
40
46
  def self.flush(worker, &block)
41
47
  yield worker
42
48
 
@@ -51,8 +57,24 @@ module Datadog
51
57
  configuration[:tracer]
52
58
  end
53
59
 
60
+ def self.job_name(job)
61
+ # When DelayedJob is used through ActiveJob, we need to parse the payload differentely
62
+ # to get the actual job name
63
+ return job.payload_object.job_data['job_class'] if job.payload_object.respond_to?(:job_data)
64
+
65
+ job.name
66
+ end
67
+
68
+ def self.set_sample_rate(span)
69
+ # Set analytics sample rate
70
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
71
+ Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
72
+ end
73
+ end
74
+
54
75
  callbacks do |lifecycle|
55
- lifecycle.around(:invoke_job, &method(:instrument))
76
+ lifecycle.around(:invoke_job, &method(:instrument_invoke))
77
+ lifecycle.around(:enqueue, &method(:instrument_enqueue))
56
78
  lifecycle.around(:execute, &method(:flush))
57
79
  end
58
80
  end
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Elasticsearch integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Elasticsearch integration constants
5
5
  module Ext
6
6
  APP = 'elasticsearch'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_ELASTICSEARCH_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_ELASTICSEARCH_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_ELASTICSEARCH_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_ELASTICSEARCH_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_ELASTICSEARCH_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'elasticsearch'.freeze
10
13
  SPAN_QUERY = 'elasticsearch.query'.freeze
11
14
  SPAN_TYPE_QUERY = 'elasticsearch'.freeze
@@ -1,5 +1,6 @@
1
1
  require 'ddtrace/contrib/patcher'
2
2
  require 'ddtrace/ext/app_types'
3
+ require 'ddtrace/ext/integration'
3
4
  require 'ddtrace/ext/net'
4
5
  require 'ddtrace/contrib/analytics'
5
6
  require 'ddtrace/contrib/elasticsearch/ext'
@@ -77,6 +78,9 @@ module Datadog
77
78
  params = JSON.generate(params) if params && !params.is_a?(String)
78
79
  body = JSON.generate(body) if body && !body.is_a?(String)
79
80
 
81
+ # Tag as an external peer service
82
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
83
+
80
84
  # Set analytics sample rate
81
85
  if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
82
86
  Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate])
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Ethon integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -1,5 +1,6 @@
1
1
  require 'ddtrace/ext/net'
2
2
  require 'ddtrace/ext/distributed'
3
+ require 'ddtrace/ext/integration'
3
4
  require 'ddtrace/propagation/http_propagator'
4
5
  require 'ddtrace/contrib/ethon/ext'
5
6
  require 'ddtrace/contrib/http_annotation_helper'
@@ -12,8 +13,8 @@ module Datadog
12
13
  def self.included(base)
13
14
  base.send(:prepend, InstanceMethods)
14
15
  end
15
-
16
16
  # InstanceMethods - implementing instrumentation
17
+ # rubocop:disable Metrics/ModuleLength
17
18
  module InstanceMethods
18
19
  include Datadog::Contrib::HttpAnnotationHelper
19
20
 
@@ -103,7 +104,8 @@ module Datadog
103
104
  method = @datadog_method.to_s
104
105
  end
105
106
  span.resource = method
106
-
107
+ # Tag as an external peer service
108
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
107
109
  # Set analytics sample rate
108
110
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
109
111
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Ethon integration constants
5
5
  module Ext
6
6
  APP = 'ethon'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_ETHON_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_ETHON_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_ETHON_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_ETHON_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_ETHON_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_ETHON_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_ETHON_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'ethon'.freeze
10
13
  SPAN_REQUEST = 'ethon.request'.freeze
11
14
  SPAN_MULTI_REQUEST = 'ethon.multi.request'.freeze
@@ -1,5 +1,6 @@
1
1
  require 'ddtrace/ext/net'
2
2
  require 'ddtrace/ext/distributed'
3
+ require 'ddtrace/ext/integration'
3
4
  require 'ddtrace/propagation/http_propagator'
4
5
  require 'ddtrace/contrib/ethon/ext'
5
6
 
@@ -52,6 +53,9 @@ module Datadog
52
53
  service: datadog_configuration[:service_name]
53
54
  )
54
55
 
56
+ # Tag as an external peer service
57
+ @datadog_multi_span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, @datadog_multi_span.service)
58
+
55
59
  # Set analytics sample rate
56
60
  Contrib::Analytics.set_sample_rate(@datadog_multi_span, analytics_sample_rate) if analytics_enabled?
57
61
 
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Excon integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Excon integration constants
5
5
  module Ext
6
6
  APP = 'excon'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_EXCON_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_EXCON_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_EXCON_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_EXCON_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_EXCON_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_EXCON_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_EXCON_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'excon'.freeze
10
13
  SPAN_REQUEST = 'excon.request'.freeze
11
14
  end
@@ -1,5 +1,6 @@
1
1
  require 'excon'
2
2
  require 'ddtrace/ext/http'
3
+ require 'ddtrace/ext/integration'
3
4
  require 'ddtrace/ext/net'
4
5
  require 'ddtrace/ext/distributed'
5
6
  require 'ddtrace/propagation/http_propagator'
@@ -108,6 +109,9 @@ module Datadog
108
109
  span.service = service_name(datum[:host], @options)
109
110
  span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
110
111
 
112
+ # Tag as an external peer service
113
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
114
+
111
115
  # Set analytics sample rate
112
116
  if analytics_enabled?
113
117
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
@@ -56,10 +56,11 @@ module Datadog
56
56
  def instrument(integration_name, options = {}, &block)
57
57
  integration = fetch_integration(integration_name)
58
58
 
59
- unless integration.nil?
59
+ unless integration.nil? || !integration.default_configuration.enabled
60
60
  configuration_name = options[:describes] || :default
61
61
  filtered_options = options.reject { |k, _v| k == :describes }
62
62
  integration.configure(configuration_name, filtered_options, &block)
63
+ instrumented_integrations[integration_name] = integration
63
64
 
64
65
  # Add to activation list
65
66
  integrations_pending_activation << integration
@@ -72,6 +73,15 @@ module Datadog
72
73
  @integrations_pending_activation ||= Set.new
73
74
  end
74
75
 
76
+ def instrumented_integrations
77
+ @instrumented_integrations ||= {}
78
+ end
79
+
80
+ def reset!
81
+ instrumented_integrations.clear
82
+ super
83
+ end
84
+
75
85
  def fetch_integration(name)
76
86
  registry[name] ||
77
87
  raise(InvalidIntegrationError, "'#{name}' is not a valid integration.")
@@ -12,13 +12,18 @@ module Datadog
12
12
  Datadog::Ext::HTTP::ERROR_RANGE.cover?(env[:status])
13
13
  end
14
14
 
15
+ option :enabled do |o|
16
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
17
+ o.lazy
18
+ end
19
+
15
20
  option :analytics_enabled do |o|
16
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
21
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
17
22
  o.lazy
18
23
  end
19
24
 
20
25
  option :analytics_sample_rate do |o|
21
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
26
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
22
27
  o.lazy
23
28
  end
24
29
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Faraday integration constants
5
5
  module Ext
6
6
  APP = 'faraday'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_FARADAY_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_FARADAY_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_FARADAY_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_FARADAY_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_FARADAY_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_FARADAY_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_FARADAY_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'faraday'.freeze
10
13
  SPAN_REQUEST = 'faraday.request'.freeze
11
14
  end
@@ -1,5 +1,6 @@
1
1
  require 'faraday'
2
2
  require 'ddtrace/ext/http'
3
+ require 'ddtrace/ext/integration'
3
4
  require 'ddtrace/ext/net'
4
5
  require 'ddtrace/propagation/http_propagator'
5
6
  require 'ddtrace/contrib/analytics'
@@ -16,7 +17,7 @@ module Datadog
16
17
 
17
18
  def initialize(app, options = {})
18
19
  super(app)
19
- @options = datadog_configuration.options_hash.merge(options)
20
+ @options = options
20
21
  end
21
22
 
22
23
  def call(env)
@@ -33,7 +34,7 @@ module Datadog
33
34
 
34
35
  private
35
36
 
36
- attr_reader :app, :options
37
+ attr_reader :app
37
38
 
38
39
  def annotate!(span, env, options)
39
40
  span.resource = resource_name(env)
@@ -41,6 +42,9 @@ module Datadog
41
42
  span.service = options[:split_by_domain] ? env[:url].host : options[:service_name]
42
43
  span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
43
44
 
45
+ # Tag as an external peer service
46
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
47
+
44
48
  # Set analytics sample rate
45
49
  if Contrib::Analytics.enabled?(options[:analytics_enabled])
46
50
  Contrib::Analytics.set_sample_rate(span, options[:analytics_sample_rate])
@@ -69,7 +73,9 @@ module Datadog
69
73
  end
70
74
 
71
75
  def build_request_options!(env)
72
- datadog_configuration(env[:url].host).options_hash.merge(options)
76
+ datadog_configuration.options_hash # integration level settings
77
+ .merge(datadog_configuration(env[:url].host).options_hash) # per-host override
78
+ .merge(@options) # middleware instance override
73
79
  end
74
80
 
75
81
  def datadog_configuration(host = :default)