ddtrace 0.37.0 → 0.42.0

Sign up to get free protection for your applications and to get access to all the features.
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)