ddtrace 0.35.1 → 0.39.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -1
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +26 -0
  5. data/.rubocop.yml +4 -0
  6. data/Appraisals +52 -11
  7. data/CHANGELOG.md +135 -1
  8. data/Rakefile +109 -75
  9. data/ddtrace.gemspec +5 -0
  10. data/docker-compose.yml +37 -2
  11. data/docs/GettingStarted.md +146 -82
  12. data/lib/ddtrace.rb +3 -0
  13. data/lib/ddtrace/configuration/base.rb +1 -1
  14. data/lib/ddtrace/configuration/options.rb +1 -1
  15. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  16. data/lib/ddtrace/configuration/settings.rb +27 -3
  17. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  18. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  19. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +7 -0
  20. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  21. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  22. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  23. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  24. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  25. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  26. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  27. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  28. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  29. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  30. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  31. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  32. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +1 -1
  33. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  34. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  35. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  36. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  37. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  38. data/lib/ddtrace/contrib/configuration/settings.rb +20 -1
  39. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  40. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  41. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -5
  42. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  43. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  44. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  45. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  46. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -2
  47. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  48. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  49. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  50. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  51. data/lib/ddtrace/contrib/extensions.rb +39 -5
  52. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  53. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  54. data/lib/ddtrace/contrib/faraday/middleware.rb +5 -3
  55. data/lib/ddtrace/contrib/faraday/patcher.rb +13 -5
  56. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  57. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  58. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  59. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  60. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  61. data/lib/ddtrace/contrib/graphql/patcher.rb +6 -3
  62. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  63. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  64. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -3
  65. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  66. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -5
  67. data/lib/ddtrace/contrib/http/circuit_breaker.rb +8 -32
  68. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  69. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  70. data/lib/ddtrace/contrib/http/instrumentation.rb +13 -8
  71. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  72. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  73. data/lib/ddtrace/contrib/httprb/instrumentation.rb +160 -0
  74. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  75. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  76. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  77. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  78. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  79. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  80. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  81. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  82. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  83. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  84. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  85. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  86. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  87. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  88. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  89. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  90. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  91. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  92. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  93. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  94. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  95. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
  96. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  97. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  98. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  99. data/lib/ddtrace/contrib/patcher.rb +14 -8
  100. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  101. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  102. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  103. data/lib/ddtrace/contrib/racecar/ext.rb +5 -2
  104. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  105. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  106. data/lib/ddtrace/contrib/rack/middlewares.rb +15 -12
  107. data/lib/ddtrace/contrib/rails/configuration/settings.rb +20 -13
  108. data/lib/ddtrace/contrib/rails/ext.rb +5 -2
  109. data/lib/ddtrace/contrib/rails/framework.rb +52 -46
  110. data/lib/ddtrace/contrib/rails/integration.rb +1 -1
  111. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  112. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  113. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  114. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  115. data/lib/ddtrace/contrib/redis/patcher.rb +1 -1
  116. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  117. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  118. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  119. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  120. data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
  121. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  122. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  123. data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
  124. data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
  125. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  126. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  127. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  128. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  129. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  130. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  131. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  132. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  133. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  134. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  135. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  136. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  137. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  138. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  139. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  140. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -1
  141. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  142. data/lib/ddtrace/environment.rb +17 -3
  143. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  144. data/lib/ddtrace/ext/environment.rb +2 -0
  145. data/lib/ddtrace/ext/transport.rb +1 -0
  146. data/lib/ddtrace/logger.rb +1 -1
  147. data/lib/ddtrace/pin.rb +39 -15
  148. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  149. data/lib/ddtrace/runtime/metrics.rb +18 -4
  150. data/lib/ddtrace/sampler.rb +2 -0
  151. data/lib/ddtrace/span.rb +10 -0
  152. data/lib/ddtrace/tracer.rb +15 -8
  153. data/lib/ddtrace/transport/http.rb +15 -0
  154. data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
  155. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  156. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  157. data/lib/ddtrace/transport/response.rb +11 -0
  158. data/lib/ddtrace/version.rb +2 -2
  159. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  160. data/lib/ddtrace/writer.rb +33 -12
  161. metadata +114 -29
@@ -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,14 +9,18 @@ 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 }
16
+ o.on_set do |_value|
17
+ log_deprecation_warning(:tracer)
18
+ end
15
19
  end
16
20
 
17
21
  def configure(options = {})
18
22
  self.class.options.dependency_order.each do |name|
19
- self[name] = options.fetch(name, self[name])
23
+ self[name] = options[name] if options.key?(name)
20
24
  end
21
25
 
22
26
  yield(self) if block_given?
@@ -29,6 +33,21 @@ module Datadog
29
33
  def []=(name, value)
30
34
  respond_to?("#{name}=") ? send("#{name}=", value) : set_option(name, value)
31
35
  end
36
+
37
+ DEPRECATION_WARNING = %(
38
+ Explicitly providing a tracer instance is DEPRECATED.
39
+ It's recommended to not provide an explicit tracer instance
40
+ and let Datadog::Contrib::Configuration::Settings resolve
41
+ the correct tracer internally.
42
+ ).freeze
43
+
44
+ include Datadog::Patcher # DEV includes #do_once here. We should move that logic to a generic component.
45
+
46
+ def log_deprecation_warning(method_name)
47
+ do_once(method_name) do
48
+ Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}:#{caller.join("\n")}")
49
+ end
50
+ end
32
51
  end
33
52
  end
34
53
  end
@@ -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
@@ -29,7 +29,7 @@ module Datadog
29
29
  get_option(:service_name),
30
30
  app: Ext::APP,
31
31
  app_type: Datadog::Ext::AppTypes::CACHE,
32
- tracer: get_option(:tracer)
32
+ tracer: -> { get_option(:tracer) }
33
33
  ).onto(::Dalli)
34
34
  end
35
35
 
@@ -47,10 +47,6 @@ module Datadog
47
47
  Upgrade to the configuration API using the migration guide here:
48
48
  https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
49
49
 
50
- def tracer=(tracer)
51
- Datadog.configuration[:dalli][:tracer] = tracer
52
- end
53
-
54
50
  def service_name=(service_name)
55
51
  Datadog.configuration[:dalli][:service_name] = service_name
56
52
  end
@@ -7,13 +7,18 @@ 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
 
@@ -4,8 +4,11 @@ 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
10
13
  SPAN_JOB = 'delayed_job'.freeze
11
14
  TAG_ATTEMPTS = 'delayed_job.attempts'.freeze
@@ -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
@@ -37,14 +37,13 @@ module Datadog
37
37
  end
38
38
 
39
39
  def initialize(*args, &block)
40
- tracer = Datadog.configuration[:elasticsearch][:tracer]
41
40
  service = Datadog.configuration[:elasticsearch][:service_name]
42
41
 
43
42
  pin = Datadog::Pin.new(
44
43
  service,
45
44
  app: Datadog::Contrib::Elasticsearch::Ext::APP,
46
45
  app_type: Datadog::Ext::AppTypes::DB,
47
- tracer: tracer
46
+ tracer: -> { Datadog.configuration[:elasticsearch][:tracer] }
48
47
  )
49
48
  pin.onto(self)
50
49
  initialize_without_datadog(*args, &block)
@@ -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
 
@@ -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
@@ -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,3 +1,4 @@
1
+ require 'set'
1
2
  require 'ddtrace/contrib/registry'
2
3
 
3
4
  module Datadog
@@ -7,6 +8,7 @@ module Datadog
7
8
  module Extensions
8
9
  def self.extended(base)
9
10
  Datadog.send(:extend, Helpers)
11
+ Datadog.send(:extend, Configuration)
10
12
  Datadog::Configuration::Settings.send(:include, Configuration::Settings)
11
13
  end
12
14
 
@@ -17,7 +19,24 @@ module Datadog
17
19
  end
18
20
  end
19
21
 
22
+ # Configuration methods for Datadog module.
20
23
  module Configuration
24
+ def configure(target = configuration, opts = {})
25
+ # Reconfigure core settings
26
+ super
27
+
28
+ # Activate integrations
29
+ if target.respond_to?(:integrations_pending_activation)
30
+ target.integrations_pending_activation.each do |integration|
31
+ integration.patch if integration.respond_to?(:patch)
32
+ end
33
+
34
+ target.integrations_pending_activation.clear
35
+ end
36
+
37
+ target
38
+ end
39
+
21
40
  # Extensions for Datadog::Configuration::Settings
22
41
  module Settings
23
42
  InvalidIntegrationError = Class.new(StandardError)
@@ -34,22 +53,37 @@ module Datadog
34
53
  integration.configuration(configuration_name) unless integration.nil?
35
54
  end
36
55
 
37
- def use(integration_name, options = {}, &block)
56
+ def instrument(integration_name, options = {}, &block)
38
57
  integration = fetch_integration(integration_name)
39
58
 
40
- unless integration.nil?
59
+ unless integration.nil? || !integration.default_configuration.enabled
41
60
  configuration_name = options[:describes] || :default
42
61
  filtered_options = options.reject { |k, _v| k == :describes }
43
62
  integration.configure(configuration_name, filtered_options, &block)
63
+ instrumented_integrations[integration_name] = integration
64
+
65
+ # Add to activation list
66
+ integrations_pending_activation << integration
44
67
  end
68
+ end
69
+
70
+ alias_method :use, :instrument
45
71
 
46
- integration.patch if integration.respond_to?(:patch)
72
+ def integrations_pending_activation
73
+ @integrations_pending_activation ||= Set.new
47
74
  end
48
75
 
49
- private
76
+ def instrumented_integrations
77
+ @instrumented_integrations ||= {}
78
+ end
79
+
80
+ def reset!
81
+ instrumented_integrations.clear
82
+ super
83
+ end
50
84
 
51
85
  def fetch_integration(name)
52
- get_option(:registry)[name] ||
86
+ registry[name] ||
53
87
  raise(InvalidIntegrationError, "'#{name}' is not a valid integration.")
54
88
  end
55
89
  end
@@ -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
@@ -16,7 +16,7 @@ module Datadog
16
16
 
17
17
  def initialize(app, options = {})
18
18
  super(app)
19
- @options = datadog_configuration.options_hash.merge(options)
19
+ @options = options
20
20
  end
21
21
 
22
22
  def call(env)
@@ -33,7 +33,7 @@ module Datadog
33
33
 
34
34
  private
35
35
 
36
- attr_reader :app, :options
36
+ attr_reader :app
37
37
 
38
38
  def annotate!(span, env, options)
39
39
  span.resource = resource_name(env)
@@ -69,7 +69,9 @@ module Datadog
69
69
  end
70
70
 
71
71
  def build_request_options!(env)
72
- datadog_configuration(env[:url].host).options_hash.merge(options)
72
+ datadog_configuration.options_hash # integration level settings
73
+ .merge(datadog_configuration(env[:url].host).options_hash) # per-host override
74
+ .merge(@options) # middleware instance override
73
75
  end
74
76
 
75
77
  def datadog_configuration(host = :default)
@@ -31,7 +31,7 @@ module Datadog
31
31
  get_option(:service_name),
32
32
  app: Ext::APP,
33
33
  app_type: Datadog::Ext::AppTypes::WEB,
34
- tracer: get_option(:tracer)
34
+ tracer: -> { get_option(:tracer) }
35
35
  ).onto(::Faraday)
36
36
  end
37
37
 
@@ -41,8 +41,20 @@ module Datadog
41
41
 
42
42
  def add_default_middleware!
43
43
  if target_version >= Gem::Version.new('1.0.0')
44
+ # Patch the default connection (e.g. +Faraday.get+)
45
+ ::Faraday.default_connection.use(:ddtrace)
46
+
47
+ # Patch new connection instances (e.g. +Faraday.new+)
44
48
  ::Faraday::Connection.send(:prepend, Connection)
45
49
  else
50
+ # Patch the default connection (e.g. +Faraday.get+)
51
+ #
52
+ # We insert our middleware before the 'adapter', which is
53
+ # always the last handler.
54
+ idx = ::Faraday.default_connection.builder.handlers.size - 1
55
+ ::Faraday.default_connection.builder.insert(idx, Middleware)
56
+
57
+ # Patch new connection instances (e.g. +Faraday.new+)
46
58
  ::Faraday::RackBuilder.send(:prepend, RackBuilder)
47
59
  end
48
60
  end
@@ -61,10 +73,6 @@ module Datadog
61
73
  Upgrade to the configuration API using the migration guide here:
62
74
  https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
63
75
 
64
- def tracer=(tracer)
65
- Datadog.configuration[:faraday][:tracer] = tracer
66
- end
67
-
68
76
  def service_name=(service_name)
69
77
  Datadog.configuration[:faraday][:service_name] = service_name
70
78
  end