ddtrace 0.35.2 → 0.40.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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +59 -1
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +27 -0
  5. data/.rubocop.yml +4 -0
  6. data/.simplecov +38 -0
  7. data/Appraisals +139 -12
  8. data/CHANGELOG.md +185 -1
  9. data/Rakefile +524 -464
  10. data/ddtrace.gemspec +6 -0
  11. data/docker-compose.yml +37 -2
  12. data/docs/DevelopmentGuide.md +16 -0
  13. data/docs/GettingStarted.md +192 -111
  14. data/lib/ddtrace.rb +4 -0
  15. data/lib/ddtrace/configuration.rb +36 -5
  16. data/lib/ddtrace/configuration/components.rb +4 -7
  17. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  18. data/lib/ddtrace/configuration/settings.rb +27 -3
  19. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  20. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  21. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  22. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  23. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  24. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  25. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  26. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  27. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  28. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  29. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  30. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  31. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  32. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  33. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +1 -1
  34. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  35. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  36. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  37. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  38. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  39. data/lib/ddtrace/contrib/configuration/settings.rb +19 -0
  40. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  41. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  42. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -5
  43. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  44. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  45. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  46. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  47. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -2
  48. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  49. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  50. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  51. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  52. data/lib/ddtrace/contrib/extensions.rb +39 -5
  53. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  54. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  55. data/lib/ddtrace/contrib/faraday/middleware.rb +5 -3
  56. data/lib/ddtrace/contrib/faraday/patcher.rb +13 -5
  57. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  58. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  59. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  60. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  61. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  62. data/lib/ddtrace/contrib/graphql/patcher.rb +6 -3
  63. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  64. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  65. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -3
  66. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  67. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -5
  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 +12 -7
  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/que/configuration/settings.rb +42 -0
  103. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  104. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  105. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  106. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  107. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  108. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  109. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  110. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  111. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  112. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  113. data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
  114. data/lib/ddtrace/contrib/rails/configuration/settings.rb +10 -11
  115. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  116. data/lib/ddtrace/contrib/rails/framework.rb +52 -46
  117. data/lib/ddtrace/contrib/rails/integration.rb +1 -1
  118. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  119. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  120. data/lib/ddtrace/contrib/rails/patcher.rb +15 -0
  121. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  122. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  123. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  124. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  125. data/lib/ddtrace/contrib/redis/patcher.rb +1 -1
  126. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  127. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  128. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  129. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  130. data/lib/ddtrace/contrib/rest_client/request_patch.rb +2 -2
  131. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  132. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  133. data/lib/ddtrace/contrib/sequel/ext.rb +5 -2
  134. data/lib/ddtrace/contrib/sequel/utils.rb +19 -1
  135. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  136. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  137. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  138. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  139. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  140. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  141. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  142. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  143. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  144. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  145. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  146. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  147. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  148. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  149. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  150. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  151. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  152. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  153. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -1
  154. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  155. data/lib/ddtrace/environment.rb +17 -3
  156. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  157. data/lib/ddtrace/ext/environment.rb +2 -0
  158. data/lib/ddtrace/ext/transport.rb +1 -0
  159. data/lib/ddtrace/logger.rb +1 -1
  160. data/lib/ddtrace/pin.rb +39 -15
  161. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  162. data/lib/ddtrace/runtime/metrics.rb +18 -4
  163. data/lib/ddtrace/sampler.rb +2 -0
  164. data/lib/ddtrace/span.rb +10 -0
  165. data/lib/ddtrace/tracer.rb +15 -8
  166. data/lib/ddtrace/transport/http.rb +15 -0
  167. data/lib/ddtrace/transport/http/adapters/net.rb +8 -0
  168. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  169. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  170. data/lib/ddtrace/transport/response.rb +11 -0
  171. data/lib/ddtrace/version.rb +2 -2
  172. data/lib/ddtrace/workers/async.rb +2 -2
  173. data/lib/ddtrace/workers/loop.rb +1 -1
  174. data/lib/ddtrace/workers/polling.rb +1 -1
  175. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  176. data/lib/ddtrace/writer.rb +33 -12
  177. metadata +124 -4
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ddtrace/contrib/integration'
4
+ require 'ddtrace/contrib/que/ext'
5
+ require 'ddtrace/contrib/que/configuration/settings'
6
+ require 'ddtrace/contrib/que/patcher'
7
+
8
+ module Datadog
9
+ module Contrib
10
+ module Que
11
+ # Description of Que integration
12
+ class Integration
13
+ include Datadog::Contrib::Integration
14
+
15
+ MINIMUM_VERSION = Gem::Version.new('1.0.0.beta2')
16
+
17
+ register_as :que, auto_patch: true
18
+
19
+ def self.version
20
+ Gem.loaded_specs[Datadog::Contrib::Que::Ext::APP] &&
21
+ Gem.loaded_specs[Datadog::Contrib::Que::Ext::APP].version
22
+ end
23
+
24
+ def self.loaded?
25
+ !defined?(::Que).nil?
26
+ end
27
+
28
+ def self.compatible?
29
+ super && version >= MINIMUM_VERSION
30
+ end
31
+
32
+ def default_configuration
33
+ Configuration::Settings.new
34
+ end
35
+
36
+ def patcher
37
+ Patcher
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ddtrace/contrib/que/tracer'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Que
8
+ # Patcher enables patching of 'que' module.
9
+ module Patcher
10
+ include Datadog::Contrib::Patcher
11
+
12
+ module_function
13
+
14
+ def target_version
15
+ Integration.version
16
+ end
17
+
18
+ def patch
19
+ ::Que.job_middleware.push(Que::Tracer.new)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ddtrace/contrib/analytics'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Que
8
+ # Tracer is a Que's server-side middleware which traces executed jobs
9
+ class Tracer
10
+ def call(job)
11
+ trace_options = {
12
+ service: configuration[:service_name],
13
+ span_type: Datadog::Ext::AppTypes::WORKER
14
+ }
15
+
16
+ tracer.trace(Ext::SPAN_JOB, trace_options) do |request_span|
17
+ request_span.resource = job.class.name.to_s
18
+ request_span.set_tag(Ext::TAG_JOB_QUEUE, job.que_attrs[:queue])
19
+ request_span.set_tag(Ext::TAG_JOB_ID, job.que_attrs[:id])
20
+ request_span.set_tag(Ext::TAG_JOB_PRIORITY, job.que_attrs[:priority])
21
+ request_span.set_tag(Ext::TAG_JOB_ERROR_COUNT, job.que_attrs[:error_count])
22
+ request_span.set_tag(Ext::TAG_JOB_RUN_AT, job.que_attrs[:run_at])
23
+ request_span.set_tag(Ext::TAG_JOB_EXPIRED_AT, job.que_attrs[:expired_at])
24
+ request_span.set_tag(Ext::TAG_JOB_FINISHED_AT, job.que_attrs[:finished_at])
25
+ request_span.set_tag(Ext::TAG_JOB_ARGS, job.que_attrs[:args]) if configuration[:tag_args]
26
+ request_span.set_tag(Ext::TAG_JOB_DATA, job.que_attrs[:data]) if configuration[:tag_data]
27
+
28
+ set_sample_rate(request_span)
29
+ Contrib::Analytics.set_measured(request_span)
30
+
31
+ yield
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def set_sample_rate(request_span)
38
+ if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
39
+ Contrib::Analytics.set_sample_rate(
40
+ request_span,
41
+ configuration[:analytics_sample_rate]
42
+ )
43
+ end
44
+ end
45
+
46
+ def tracer
47
+ configuration[:tracer]
48
+ end
49
+
50
+ def configuration
51
+ Datadog.configuration[Datadog::Contrib::Que::Ext::APP.to_sym]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Racecar 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/contrib/racecar/events/batch'
2
2
  require 'ddtrace/contrib/racecar/events/message'
3
+ require 'ddtrace/contrib/racecar/events/consume'
3
4
 
4
5
  module Datadog
5
6
  module Contrib
@@ -7,6 +8,7 @@ module Datadog
7
8
  # Defines collection of instrumented Racecar events
8
9
  module Events
9
10
  ALL = [
11
+ Events::Consume,
10
12
  Events::Batch,
11
13
  Events::Message
12
14
  ].freeze
@@ -0,0 +1,27 @@
1
+ require 'ddtrace/contrib/racecar/ext'
2
+ require 'ddtrace/contrib/racecar/event'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Racecar
7
+ module Events
8
+ # Defines instrumentation for main_loop.racecar event
9
+ module Consume
10
+ include Racecar::Event
11
+
12
+ EVENT_NAME = 'main_loop.racecar'.freeze
13
+
14
+ module_function
15
+
16
+ def event_name
17
+ self::EVENT_NAME
18
+ end
19
+
20
+ def span_name
21
+ Ext::SPAN_CONSUME
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -4,9 +4,13 @@ module Datadog
4
4
  # Racecar integration constants
5
5
  module Ext
6
6
  APP = 'racecar'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_RACECAR_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_RACECAR_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_RACECAR_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_RACECAR_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_RACECAR_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RACECAR_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RACECAR_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'racecar'.freeze
13
+ SPAN_CONSUME = 'racecar.consume'.freeze
10
14
  SPAN_BATCH = 'racecar.batch'.freeze
11
15
  SPAN_MESSAGE = 'racecar.message'.freeze
12
16
  TAG_CONSUMER = 'kafka.consumer'.freeze
@@ -14,13 +14,18 @@ module Datadog
14
14
  ]
15
15
  }.freeze
16
16
 
17
+ option :enabled do |o|
18
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
19
+ o.lazy
20
+ end
21
+
17
22
  option :analytics_enabled do |o|
18
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
23
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
19
24
  o.lazy
20
25
  end
21
26
 
22
27
  option :analytics_sample_rate do |o|
23
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
28
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
24
29
  o.lazy
25
30
  end
26
31
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Rack integration constants
5
5
  module Ext
6
6
  APP = 'rack'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_RACK_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_RACK_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_RACK_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_RACK_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_RACK_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RACK_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RACK_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  RACK_ENV_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
10
13
  SERVICE_NAME = 'rack'.freeze
11
14
  SPAN_HTTP_SERVER_QUEUE = 'http_server.queue'.freeze
@@ -4,6 +4,8 @@ require 'ddtrace/propagation/http_propagator'
4
4
  require 'ddtrace/contrib/analytics'
5
5
  require 'ddtrace/contrib/rack/ext'
6
6
  require 'ddtrace/contrib/rack/request_queue'
7
+ require 'ddtrace/environment'
8
+ require 'date'
7
9
 
8
10
  module Datadog
9
11
  module Contrib
@@ -98,23 +100,26 @@ module Datadog
98
100
  request_span.set_error(e) unless request_span.nil?
99
101
  raise e
100
102
  ensure
101
- # Rack is a really low level interface and it doesn't provide any
102
- # advanced functionality like routers. Because of that, we assume that
103
- # the underlying framework or application has more knowledge about
104
- # the result for this request; `resource` and `tags` are expected to
105
- # be set in another level but if they're missing, reasonable defaults
106
- # are used.
107
- set_request_tags!(request_span, env, status, headers, response, original_env)
108
-
109
- # ensure the request_span is finished and the context reset;
110
- # this assumes that the Rack middleware creates a root span
111
- request_span.finish
103
+ if request_span
104
+ # Rack is a really low level interface and it doesn't provide any
105
+ # advanced functionality like routers. Because of that, we assume that
106
+ # the underlying framework or application has more knowledge about
107
+ # the result for this request; `resource` and `tags` are expected to
108
+ # be set in another level but if they're missing, reasonable defaults
109
+ # are used.
110
+ set_request_tags!(request_span, env, status, headers, response, original_env || env)
111
+
112
+ # ensure the request_span is finished and the context reset;
113
+ # this assumes that the Rack middleware creates a root span
114
+ request_span.finish
115
+ end
116
+
112
117
  frontend_span.finish unless frontend_span.nil?
113
118
 
114
119
  # TODO: Remove this once we change how context propagation works. This
115
120
  # ensures we clean thread-local variables on each HTTP request avoiding
116
121
  # memory leaks.
117
- tracer.provider.context = Datadog::Context.new
122
+ tracer.provider.context = Datadog::Context.new if tracer
118
123
  end
119
124
 
120
125
  def resource_name_for(env, status)
@@ -19,8 +19,13 @@ module Datadog
19
19
  analytics_sample_rate
20
20
  end
21
21
 
22
+ option :enabled do |o|
23
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
24
+ o.lazy
25
+ end
26
+
22
27
  option :analytics_enabled do |o|
23
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
28
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
24
29
  o.lazy
25
30
  o.on_set do |value|
26
31
  # Update ActionPack analytics too
@@ -29,7 +34,7 @@ module Datadog
29
34
  end
30
35
 
31
36
  option :analytics_sample_rate do |o|
32
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
37
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
33
38
  o.lazy
34
39
  o.on_set do |value|
35
40
  # Update ActionPack analytics too
@@ -77,15 +82,9 @@ module Datadog
77
82
  end
78
83
  end
79
84
 
80
- option :tracer do |o|
81
- o.delegate_to { Datadog.tracer }
82
- o.on_set do |value|
83
- Datadog.configuration[:action_cable][:tracer] = value
84
- Datadog.configuration[:active_record][:tracer] = value
85
- Datadog.configuration[:active_support][:tracer] = value
86
- Datadog.configuration[:action_pack][:tracer] = value
87
- Datadog.configuration[:action_view][:tracer] = value
88
- end
85
+ option :log_injection do |o|
86
+ o.default { env_to_bool(Ext::ENV_LOGS_INJECTION_ENABLED, false) }
87
+ o.lazy
89
88
  end
90
89
  end
91
90
  end
@@ -4,9 +4,13 @@ module Datadog
4
4
  # Rails integration constants
5
5
  module Ext
6
6
  APP = 'rails'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_RAILS_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_RAILS_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_RAILS_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_RAILS_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_RAILS_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  ENV_DISABLE = 'DISABLE_DATADOG_RAILS'.freeze
13
+ ENV_LOGS_INJECTION_ENABLED = 'DD_LOGS_INJECTION'.freeze
10
14
  end
11
15
  end
12
16
  end
@@ -19,32 +19,40 @@ module Datadog
19
19
  # - handle configuration entries which are specific to Datadog tracing
20
20
  # - instrument parts of the framework when needed
21
21
  module Framework
22
- # configure Datadog settings
22
+ # After the Rails application finishes initializing, we configure the Rails
23
+ # integration and all its sub-components with the application information
24
+ # available.
25
+ # We do this after the initialization because not all the information we
26
+ # require is available before then.
23
27
  def self.setup
24
- config = config_with_defaults
25
-
26
- activate_rack!(config)
27
- activate_action_cable!(config)
28
- activate_active_support!(config)
29
- activate_action_pack!(config)
30
- activate_action_view!(config)
31
- activate_active_record!(config)
32
-
33
- # By default, default service would be guessed from the script
34
- # being executed, but here we know better, get it from Rails config.
35
- # Don't set this if service has been explicitly provided by the user.
36
- Datadog.configuration.service ||= config[:service_name]
37
-
38
- # Update the tracer if its not the default tracer.
39
- if config[:tracer] != Datadog.configuration.tracer
40
- config[:tracer].default_service = config[:service_name]
28
+ # NOTE: #configure has the side effect of rebuilding trace components.
29
+ # During a typical Rails application lifecycle, we will see trace
30
+ # components initialized twice because of this. This is necessary
31
+ # because key configuration is not available until after the Rails
32
+ # application has fully loaded, and some of this configuration is
33
+ # used to reconfigure tracer components with Rails-sourced defaults.
34
+ # This is a trade-off we take to get nice defaults.
35
+ Datadog.configure do |datadog_config|
36
+ rails_config = config_with_defaults(datadog_config)
37
+
38
+ # By default, default service would be guessed from the script
39
+ # being executed, but here we know better, get it from Rails config.
40
+ # Don't set this if service has been explicitly provided by the user.
41
+ datadog_config.service ||= rails_config[:service_name]
42
+
43
+ activate_rack!(datadog_config, rails_config)
44
+ activate_action_cable!(datadog_config, rails_config)
45
+ activate_active_support!(datadog_config, rails_config)
46
+ activate_action_pack!(datadog_config, rails_config)
47
+ activate_action_view!(datadog_config, rails_config)
48
+ activate_active_record!(datadog_config, rails_config)
41
49
  end
42
50
  end
43
51
 
44
- def self.config_with_defaults
52
+ def self.config_with_defaults(datadog_config)
45
53
  # We set defaults here instead of in the patcher because we need to wait
46
54
  # for the Rails application to be fully initialized.
47
- Datadog.configuration[:rails].tap do |config|
55
+ datadog_config[:rails].tap do |config|
48
56
  config[:service_name] ||= (Datadog.configuration.service || Utils.app_name)
49
57
  config[:database_service] ||= "#{config[:service_name]}-#{Contrib::ActiveRecord::Utils.adapter_name}"
50
58
  config[:controller_service] ||= config[:service_name]
@@ -52,64 +60,62 @@ module Datadog
52
60
  end
53
61
  end
54
62
 
55
- def self.activate_rack!(config)
56
- Datadog.configuration.use(
63
+ def self.activate_rack!(datadog_config, rails_config)
64
+ datadog_config.use(
57
65
  :rack,
58
- tracer: config[:tracer],
59
66
  application: ::Rails.application,
60
- service_name: config[:service_name],
61
- middleware_names: config[:middleware_names],
62
- distributed_tracing: config[:distributed_tracing]
67
+ service_name: rails_config[:service_name],
68
+ middleware_names: rails_config[:middleware_names],
69
+ distributed_tracing: rails_config[:distributed_tracing]
63
70
  )
64
71
  end
65
72
 
66
- def self.activate_active_support!(config)
73
+ def self.activate_active_support!(datadog_config, rails_config)
67
74
  return unless defined?(::ActiveSupport)
68
75
 
69
- Datadog.configuration.use(
76
+ datadog_config.use(
70
77
  :active_support,
71
- cache_service: config[:cache_service],
72
- tracer: config[:tracer]
78
+ cache_service: rails_config[:cache_service]
73
79
  )
74
80
  end
75
81
 
76
- def self.activate_action_cable!(config)
82
+ def self.activate_action_cable!(datadog_config, rails_config)
77
83
  return unless defined?(::ActionCable)
78
84
 
79
- Datadog.configuration.use(
85
+ datadog_config.use(
80
86
  :action_cable,
81
- service_name: "#{config[:service_name]}-#{Contrib::ActionCable::Ext::SERVICE_NAME}",
82
- tracer: config[:tracer]
87
+ service_name: "#{rails_config[:service_name]}-#{Contrib::ActionCable::Ext::SERVICE_NAME}"
83
88
  )
84
89
  end
85
90
 
86
- def self.activate_action_pack!(config)
91
+ def self.activate_action_pack!(datadog_config, rails_config)
87
92
  return unless defined?(::ActionPack)
88
93
 
89
- Datadog.configuration.use(
94
+ # TODO: This is configuring ActionPack but not patching. It will queue ActionPack
95
+ # for patching, but patching won't take place until Datadog.configure completes.
96
+ # Should we manually patch here?
97
+
98
+ datadog_config.use(
90
99
  :action_pack,
91
- service_name: config[:service_name],
92
- tracer: config[:tracer]
100
+ service_name: rails_config[:service_name]
93
101
  )
94
102
  end
95
103
 
96
- def self.activate_action_view!(config)
104
+ def self.activate_action_view!(datadog_config, rails_config)
97
105
  return unless defined?(::ActionView)
98
106
 
99
- Datadog.configuration.use(
107
+ datadog_config.use(
100
108
  :action_view,
101
- service_name: config[:service_name],
102
- tracer: config[:tracer]
109
+ service_name: rails_config[:service_name]
103
110
  )
104
111
  end
105
112
 
106
- def self.activate_active_record!(config)
113
+ def self.activate_active_record!(datadog_config, rails_config)
107
114
  return unless defined?(::ActiveRecord)
108
115
 
109
- Datadog.configuration.use(
116
+ datadog_config.use(
110
117
  :active_record,
111
- service_name: config[:database_service],
112
- tracer: config[:tracer]
118
+ service_name: rails_config[:database_service]
113
119
  )
114
120
  end
115
121
  end