ddtrace 0.16.1 → 0.17.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 (156) hide show
  1. checksums.yaml +4 -4
  2. data/Appraisals +3 -3
  3. data/CHANGELOG.md +24 -2
  4. data/Rakefile +14 -28
  5. data/docker-compose.yml +1 -0
  6. data/docs/GettingStarted.md +302 -263
  7. data/lib/ddtrace.rb +22 -21
  8. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +23 -0
  9. data/lib/ddtrace/contrib/active_model_serializers/event.rb +4 -2
  10. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +2 -2
  11. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +2 -2
  12. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
  13. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +39 -0
  14. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +24 -43
  15. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +3 -2
  16. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +6 -7
  17. data/lib/ddtrace/contrib/active_record/events/sql.rb +10 -8
  18. data/lib/ddtrace/contrib/active_record/ext.rb +22 -0
  19. data/lib/ddtrace/contrib/aws/configuration/settings.rb +15 -0
  20. data/lib/ddtrace/contrib/aws/ext.rb +21 -0
  21. data/lib/ddtrace/contrib/aws/instrumentation.rb +11 -9
  22. data/lib/ddtrace/contrib/aws/integration.rb +32 -0
  23. data/lib/ddtrace/contrib/aws/patcher.rb +42 -41
  24. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +3 -1
  25. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
  26. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +7 -3
  27. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -0
  28. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +15 -0
  29. data/lib/ddtrace/contrib/dalli/ext.rb +15 -0
  30. data/lib/ddtrace/contrib/dalli/instrumentation.rb +3 -3
  31. data/lib/ddtrace/contrib/dalli/integration.rb +36 -0
  32. data/lib/ddtrace/contrib/dalli/patcher.rb +31 -38
  33. data/lib/ddtrace/contrib/dalli/quantize.rb +3 -3
  34. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +15 -0
  35. data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
  36. data/lib/ddtrace/contrib/delayed_job/integration.rb +32 -0
  37. data/lib/ddtrace/contrib/delayed_job/patcher.rb +20 -27
  38. data/lib/ddtrace/contrib/delayed_job/plugin.rb +7 -6
  39. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +16 -0
  40. data/lib/ddtrace/contrib/elasticsearch/ext.rb +18 -0
  41. data/lib/ddtrace/contrib/elasticsearch/integration.rb +37 -0
  42. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +30 -39
  43. data/lib/ddtrace/contrib/excon/configuration/settings.rb +18 -0
  44. data/lib/ddtrace/contrib/excon/ext.rb +13 -0
  45. data/lib/ddtrace/contrib/excon/integration.rb +32 -0
  46. data/lib/ddtrace/contrib/excon/middleware.rb +10 -10
  47. data/lib/ddtrace/contrib/excon/patcher.rb +14 -30
  48. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +23 -0
  49. data/lib/ddtrace/contrib/faraday/ext.rb +13 -0
  50. data/lib/ddtrace/contrib/faraday/integration.rb +36 -0
  51. data/lib/ddtrace/contrib/faraday/middleware.rb +10 -9
  52. data/lib/ddtrace/contrib/faraday/patcher.rb +39 -54
  53. data/lib/ddtrace/contrib/grape/configuration/settings.rb +16 -0
  54. data/lib/ddtrace/contrib/grape/endpoint.rb +10 -13
  55. data/lib/ddtrace/contrib/grape/ext.rb +19 -0
  56. data/lib/ddtrace/contrib/grape/integration.rb +36 -0
  57. data/lib/ddtrace/contrib/grape/patcher.rb +24 -24
  58. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +20 -0
  59. data/lib/ddtrace/contrib/graphql/ext.rb +11 -0
  60. data/lib/ddtrace/contrib/graphql/integration.rb +38 -0
  61. data/lib/ddtrace/contrib/graphql/patcher.rb +33 -41
  62. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +15 -0
  63. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +5 -2
  64. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -2
  65. data/lib/ddtrace/contrib/grpc/ext.rb +14 -0
  66. data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
  67. data/lib/ddtrace/contrib/grpc/patcher.rb +25 -35
  68. data/lib/ddtrace/contrib/http/circuit_breaker.rb +39 -0
  69. data/lib/ddtrace/contrib/http/configuration/settings.rb +16 -0
  70. data/lib/ddtrace/contrib/http/ext.rb +13 -0
  71. data/lib/ddtrace/contrib/http/integration.rb +32 -0
  72. data/lib/ddtrace/contrib/http/patcher.rb +10 -58
  73. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +18 -0
  74. data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
  75. data/lib/ddtrace/contrib/mongodb/integration.rb +36 -0
  76. data/lib/ddtrace/contrib/mongodb/patcher.rb +17 -27
  77. data/lib/ddtrace/contrib/mongodb/subscribers.rb +12 -11
  78. data/lib/ddtrace/contrib/mysql2/client.rb +8 -6
  79. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +15 -0
  80. data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
  81. data/lib/ddtrace/contrib/mysql2/integration.rb +32 -0
  82. data/lib/ddtrace/contrib/mysql2/patcher.rb +12 -22
  83. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +23 -0
  84. data/lib/ddtrace/contrib/racecar/event.rb +7 -6
  85. data/lib/ddtrace/contrib/racecar/events/batch.rb +2 -2
  86. data/lib/ddtrace/contrib/racecar/events/message.rb +2 -2
  87. data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
  88. data/lib/ddtrace/contrib/racecar/integration.rb +36 -0
  89. data/lib/ddtrace/contrib/racecar/patcher.rb +24 -41
  90. data/lib/ddtrace/contrib/rack/configuration/settings.rb +39 -0
  91. data/lib/ddtrace/contrib/rack/ext.rb +18 -0
  92. data/lib/ddtrace/contrib/rack/integration.rb +32 -0
  93. data/lib/ddtrace/contrib/rack/middlewares.rb +5 -2
  94. data/lib/ddtrace/contrib/rack/patcher.rb +22 -40
  95. data/lib/ddtrace/contrib/rails/action_controller.rb +10 -7
  96. data/lib/ddtrace/contrib/rails/action_controller_patch.rb +1 -0
  97. data/lib/ddtrace/contrib/rails/active_support.rb +9 -9
  98. data/lib/ddtrace/contrib/rails/configuration/settings.rb +26 -0
  99. data/lib/ddtrace/contrib/rails/core_extensions.rb +12 -15
  100. data/lib/ddtrace/contrib/rails/ext.rb +30 -0
  101. data/lib/ddtrace/contrib/rails/framework.rb +3 -2
  102. data/lib/ddtrace/contrib/rails/integration.rb +37 -0
  103. data/lib/ddtrace/contrib/rails/patcher.rb +56 -63
  104. data/lib/ddtrace/contrib/rails/railtie.rb +3 -10
  105. data/lib/ddtrace/contrib/rake/configuration/settings.rb +17 -0
  106. data/lib/ddtrace/contrib/rake/ext.rb +18 -0
  107. data/lib/ddtrace/contrib/rake/instrumentation.rb +7 -8
  108. data/lib/ddtrace/contrib/rake/integration.rb +36 -0
  109. data/lib/ddtrace/contrib/rake/patcher.rb +23 -33
  110. data/lib/ddtrace/contrib/redis/configuration/settings.rb +15 -0
  111. data/lib/ddtrace/contrib/redis/ext.rb +19 -0
  112. data/lib/ddtrace/contrib/redis/integration.rb +36 -0
  113. data/lib/ddtrace/contrib/redis/patcher.rb +21 -29
  114. data/lib/ddtrace/contrib/redis/tags.rb +3 -3
  115. data/lib/ddtrace/contrib/resque/configuration/settings.rb +16 -0
  116. data/lib/ddtrace/contrib/resque/ext.rb +13 -0
  117. data/lib/ddtrace/contrib/resque/integration.rb +37 -0
  118. data/lib/ddtrace/contrib/resque/patcher.rb +30 -36
  119. data/lib/ddtrace/contrib/resque/resque_job.rb +2 -1
  120. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +5 -8
  121. data/lib/ddtrace/contrib/rest_client/ext.rb +13 -0
  122. data/lib/ddtrace/contrib/rest_client/integration.rb +9 -1
  123. data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
  124. data/lib/ddtrace/contrib/rest_client/request_patch.rb +9 -10
  125. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +2 -0
  126. data/lib/ddtrace/contrib/sequel/database.rb +4 -3
  127. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  128. data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
  129. data/lib/ddtrace/contrib/sequel/integration.rb +1 -3
  130. data/lib/ddtrace/contrib/sequel/patcher.rb +0 -1
  131. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +15 -0
  132. data/lib/ddtrace/contrib/sidekiq/ext.rb +19 -0
  133. data/lib/ddtrace/contrib/sidekiq/integration.rb +36 -0
  134. data/lib/ddtrace/contrib/sidekiq/patcher.rb +18 -18
  135. data/lib/ddtrace/contrib/sidekiq/tracer.rb +10 -10
  136. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +27 -0
  137. data/lib/ddtrace/contrib/sinatra/env.rb +3 -4
  138. data/lib/ddtrace/contrib/sinatra/ext.rb +19 -0
  139. data/lib/ddtrace/contrib/sinatra/integration.rb +36 -0
  140. data/lib/ddtrace/contrib/sinatra/patcher.rb +33 -0
  141. data/lib/ddtrace/contrib/sinatra/tracer.rb +4 -34
  142. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +2 -3
  143. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +15 -0
  144. data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
  145. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +6 -5
  146. data/lib/ddtrace/contrib/sucker_punch/integration.rb +36 -0
  147. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +29 -35
  148. data/lib/ddtrace/encoding.rb +21 -16
  149. data/lib/ddtrace/span.rb +29 -0
  150. data/lib/ddtrace/transport.rb +2 -2
  151. data/lib/ddtrace/version.rb +2 -2
  152. metadata +74 -6
  153. data/lib/ddtrace/ext/cache.rb +0 -8
  154. data/lib/ddtrace/ext/grpc.rb +0 -7
  155. data/lib/ddtrace/ext/mongo.rb +0 -12
  156. data/lib/ddtrace/ext/redis.rb +0 -17
@@ -1,6 +1,7 @@
1
1
  require 'ddtrace/ext/app_types'
2
2
  require 'ddtrace/ext/http'
3
3
  require 'ddtrace/propagation/http_propagator'
4
+ require 'ddtrace/contrib/rack/ext'
4
5
  require 'ddtrace/contrib/rack/request_queue'
5
6
 
6
7
  module Datadog
@@ -15,6 +16,8 @@ module Datadog
15
16
  # information available at the Rack level.
16
17
  # rubocop:disable Metrics/ClassLength
17
18
  class TraceMiddleware
19
+ # DEPRECATED: Remove in 1.0 in favor of Datadog::Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN
20
+ # This constant will remain here until then, for backwards compatibility.
18
21
  RACK_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
19
22
 
20
23
  def initialize(app)
@@ -29,7 +32,7 @@ module Datadog
29
32
  return if request_start.nil?
30
33
 
31
34
  tracer.trace(
32
- 'http_server.queue',
35
+ Ext::SPAN_HTTP_SERVER_QUEUE,
33
36
  start_time: request_start,
34
37
  service: Datadog.configuration[:rack][:web_service_name]
35
38
  )
@@ -56,7 +59,7 @@ module Datadog
56
59
 
57
60
  # start a new request span and attach it to the current Rack environment;
58
61
  # we must ensure that the span `resource` is set later
59
- request_span = tracer.trace('rack.request', trace_options)
62
+ request_span = tracer.trace(Ext::SPAN_REQUEST, trace_options)
60
63
  env[RACK_REQUEST_SPAN] = request_span
61
64
 
62
65
  # Add deprecation warnings
@@ -3,47 +3,26 @@ module Datadog
3
3
  module Rack
4
4
  # Provides instrumentation for `rack`
5
5
  module Patcher
6
- include Base
6
+ include Contrib::Patcher
7
7
 
8
- DEFAULT_HEADERS = {
9
- response: [
10
- 'Content-Type',
11
- 'X-Request-ID'
12
- ]
13
- }.freeze
8
+ module_function
14
9
 
15
- register_as :rack
16
- option :tracer, default: Datadog.tracer
17
- option :distributed_tracing, default: false
18
- option :middleware_names, default: false
19
- option :quantize, default: {}
20
- option :application
21
- option :service_name, default: 'rack', depends_on: [:tracer] do |value|
22
- get_option(:tracer).set_service_info(value, 'rack', Ext::AppTypes::WEB)
23
- value
24
- end
25
- option :request_queuing, default: false
26
- option :web_service_name, default: 'web-server', depends_on: [:tracer, :request_queuing] do |value|
27
- if get_option(:request_queuing)
28
- get_option(:tracer).set_service_info(value, 'webserver', Ext::AppTypes::WEB)
29
- end
30
- value
10
+ def patched?
11
+ done?(:rack)
31
12
  end
32
- option :headers, default: DEFAULT_HEADERS
33
-
34
- module_function
35
13
 
36
14
  def patch
37
- unless patched?
15
+ # Patch middleware
16
+ do_once(:rack) do
38
17
  require_relative 'middlewares'
39
- @patched = true
40
18
  end
41
19
 
42
- if (!instance_variable_defined?(:@middleware_patched) || !@middleware_patched) \
43
- && get_option(:middleware_names)
20
+ # Patch middleware names
21
+ if !done?(:rack_middleware_names) && get_option(:middleware_names)
44
22
  if get_option(:application)
45
- enable_middleware_names
46
- @middleware_patched = true
23
+ do_once(:rack_middleware_names) do
24
+ patch_middleware_names
25
+ end
47
26
  else
48
27
  Datadog::Tracer.log.warn(%(
49
28
  Rack :middleware_names requires you to also pass :application.
@@ -51,15 +30,11 @@ module Datadog
51
30
  e.g. use: :rack, middleware_names: true, application: my_rack_app).freeze)
52
31
  end
53
32
  end
54
-
55
- @patched || @middleware_patched
33
+ rescue StandardError => e
34
+ Datadog::Tracer.log.error("Unable to apply Rack integration: #{e}")
56
35
  end
57
36
 
58
- def patched?
59
- @patched ||= false
60
- end
61
-
62
- def enable_middleware_names
37
+ def patch_middleware_names
63
38
  retain_middleware_name(get_option(:application))
64
39
  rescue => e
65
40
  # We can safely ignore these exceptions since they happen only in the
@@ -81,9 +56,16 @@ module Datadog
81
56
  end
82
57
  end
83
58
 
84
- following = middleware.instance_variable_get('@app')
59
+ following = if middleware.instance_variable_defined?('@app')
60
+ middleware.instance_variable_get('@app')
61
+ end
62
+
85
63
  retain_middleware_name(following)
86
64
  end
65
+
66
+ def get_option(option)
67
+ Datadog.configuration[:rack].get_option(option)
68
+ end
87
69
  end
88
70
  end
89
71
  end
@@ -1,5 +1,7 @@
1
1
  require 'ddtrace/ext/http'
2
2
  require 'ddtrace/ext/errors'
3
+ require 'ddtrace/contrib/rack/ext'
4
+ require 'ddtrace/contrib/rails/ext'
3
5
 
4
6
  module Datadog
5
7
  module Contrib
@@ -20,7 +22,7 @@ module Datadog
20
22
  tracer = Datadog.configuration[:rails][:tracer]
21
23
  service = Datadog.configuration[:rails][:controller_service]
22
24
  type = Datadog::Ext::HTTP::TYPE
23
- span = tracer.trace('rails.action_controller', service: service, span_type: type)
25
+ span = tracer.trace(Ext::SPAN_ACTION_CONTROLLER, service: service, span_type: type)
24
26
 
25
27
  # attach the current span to the tracing context
26
28
  tracing_context = payload.fetch(:tracing_context)
@@ -32,6 +34,7 @@ module Datadog
32
34
  def self.finish_processing(payload)
33
35
  # retrieve the tracing context and the latest active span
34
36
  tracing_context = payload.fetch(:tracing_context)
37
+ env = payload.fetch(:env)
35
38
  span = tracing_context[:dd_request_span]
36
39
  return unless span && !span.finished?
37
40
 
@@ -41,14 +44,14 @@ module Datadog
41
44
  span.resource = "#{payload.fetch(:controller)}##{payload.fetch(:action)}"
42
45
  end
43
46
 
44
- # Set the parent resource if it's a `rack.request` span,
45
- # but not if its an exception contoller.
46
- if !span.parent.nil? && span.parent.name == 'rack.request' && !exception_controller?(payload)
47
- span.parent.resource = span.resource
47
+ # Set the resource name of the Rack request span unless this is an exception controller.
48
+ unless exception_controller?(payload)
49
+ rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
50
+ rack_request_span.resource = span.resource if rack_request_span
48
51
  end
49
52
 
50
- span.set_tag('rails.route.action', payload.fetch(:action))
51
- span.set_tag('rails.route.controller', payload.fetch(:controller))
53
+ span.set_tag(Ext::TAG_ROUTE_ACTION, payload.fetch(:action))
54
+ span.set_tag(Ext::TAG_ROUTE_CONTROLLER, payload.fetch(:controller))
52
55
 
53
56
  exception = payload[:exception_object]
54
57
  if exception.nil?
@@ -34,6 +34,7 @@ module Datadog
34
34
  payload = {
35
35
  controller: self.class,
36
36
  action: action_name,
37
+ env: request.env,
37
38
  headers: {
38
39
  # The exception this controller was given in the request,
39
40
  # which is typical if the controller is configured to handle exceptions.
@@ -1,5 +1,5 @@
1
1
  require 'thread'
2
- require 'ddtrace/ext/cache'
2
+ require 'ddtrace/contrib/rails/ext'
3
3
 
4
4
  module Datadog
5
5
  module Contrib
@@ -24,16 +24,16 @@ module Datadog
24
24
  # NOTE: the ``finish_trace_cache()`` is fired but it already has a safe-guard
25
25
  # to avoid any kind of issue.
26
26
  current_span = tracer.active_span
27
- return if payload[:action] == 'GET'.freeze &&
28
- current_span.try(:name) == 'rails.cache'.freeze &&
29
- current_span.try(:resource) == 'GET'.freeze
27
+ return if payload[:action] == Ext::RESOURCE_CACHE_GET &&
28
+ current_span.try(:name) == Ext::SPAN_CACHE &&
29
+ current_span.try(:resource) == Ext::RESOURCE_CACHE_GET
30
30
 
31
31
  tracing_context = payload.fetch(:tracing_context)
32
32
 
33
33
  # create a new ``Span`` and add it to the tracing context
34
34
  service = Datadog.configuration[:rails][:cache_service]
35
- type = Datadog::Ext::CACHE::TYPE
36
- span = tracer.trace('rails.cache'.freeze, service: service, span_type: type)
35
+ type = Ext::SPAN_TYPE_CACHE
36
+ span = tracer.trace(Ext::SPAN_CACHE, service: service, span_type: type)
37
37
  span.resource = payload.fetch(:action)
38
38
  tracing_context[:dd_cache_span] = span
39
39
  rescue StandardError => e
@@ -49,9 +49,9 @@ module Datadog
49
49
  begin
50
50
  # discard parameters from the cache_store configuration
51
51
  store, = *Array.wrap(::Rails.configuration.cache_store).flatten
52
- span.set_tag('rails.cache.backend'.freeze, store)
53
- cache_key = Datadog::Utils.truncate(payload.fetch(:key), Ext::CACHE::MAX_KEY_SIZE)
54
- span.set_tag('rails.cache.key'.freeze, cache_key)
52
+ span.set_tag(Ext::TAG_CACHE_BACKEND, store)
53
+ cache_key = Datadog::Utils.truncate(payload.fetch(:key), Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
54
+ span.set_tag(Ext::TAG_CACHE_KEY, cache_key)
55
55
  span.set_error(payload[:exception]) if payload[:exception]
56
56
  ensure
57
57
  span.finish
@@ -0,0 +1,26 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Rails
6
+ module Configuration
7
+ # Custom settings for the Rails integration
8
+ class Settings < Contrib::Configuration::Settings
9
+ option :cache_service
10
+ option :controller_service
11
+ option :database_service, depends_on: [:service_name] do |value|
12
+ value.tap do
13
+ # Update ActiveRecord service name too
14
+ Datadog.configuration[:active_record][:service_name] = value
15
+ end
16
+ end
17
+ option :distributed_tracing, default: false
18
+ option :exception_controller, default: nil
19
+ option :middleware, default: true
20
+ option :middleware_names, default: false
21
+ option :template_base_path, default: 'views/'
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,5 @@
1
+ require 'ddtrace/contrib/rails/ext'
2
+
1
3
  module Datadog
2
4
  # RailsRendererPatcher contains function to patch Rails rendering libraries.
3
5
  # rubocop:disable Lint/RescueException
@@ -6,11 +8,6 @@ module Datadog
6
8
  module RailsRendererPatcher
7
9
  include Datadog::Patcher
8
10
 
9
- SPAN_NAME_RENDER_PARTIAL = 'rails.render_partial'.freeze
10
- SPAN_NAME_RENDER_TEMPLATE = 'rails.render_template'.freeze
11
- TAG_LAYOUT = 'rails.layout'.freeze
12
- TAG_TEMPLATE_NAME = 'rails.template_name'.freeze
13
-
14
11
  module_function
15
12
 
16
13
  def patch_renderer
@@ -39,7 +36,7 @@ module Datadog
39
36
  render_without_datadog(*args, &block)
40
37
  else
41
38
  datadog_tracer.trace(
42
- Datadog::RailsRendererPatcher::SPAN_NAME_RENDER_TEMPLATE,
39
+ Datadog::Contrib::Rails::Ext::SPAN_RENDER_TEMPLATE,
43
40
  span_type: Datadog::Ext::HTTP::TEMPLATE
44
41
  ) do |span|
45
42
  with_datadog_span(span) { render_without_datadog(*args, &block) }
@@ -64,14 +61,14 @@ module Datadog
64
61
  end
65
62
  if template_name
66
63
  active_datadog_span.set_tag(
67
- Datadog::RailsRendererPatcher::TAG_TEMPLATE_NAME,
64
+ Datadog::Contrib::Rails::Ext::TAG_TEMPLATE_NAME,
68
65
  template_name
69
66
  )
70
67
  end
71
68
 
72
69
  if layout
73
70
  active_datadog_span.set_tag(
74
- Datadog::RailsRendererPatcher::TAG_LAYOUT,
71
+ Datadog::Contrib::Rails::Ext::TAG_LAYOUT,
75
72
  layout
76
73
  )
77
74
  end
@@ -119,7 +116,7 @@ module Datadog
119
116
  klass.class_eval do
120
117
  def render_with_datadog(*args, &block)
121
118
  datadog_tracer.trace(
122
- Datadog::RailsRendererPatcher::SPAN_NAME_RENDER_PARTIAL,
119
+ Datadog::Contrib::Rails::Ext::SPAN_RENDER_PARTIAL,
123
120
  span_type: Datadog::Ext::HTTP::TEMPLATE
124
121
  ) do |span|
125
122
  with_datadog_span(span) { render_without_datadog(*args) }
@@ -131,7 +128,7 @@ module Datadog
131
128
  template_name = Datadog::Contrib::Rails::Utils.normalize_template_name(@template.try('identifier'))
132
129
  if template_name
133
130
  active_datadog_span.set_tag(
134
- Datadog::RailsRendererPatcher::TAG_TEMPLATE_NAME,
131
+ Datadog::Contrib::Rails::Ext::TAG_TEMPLATE_NAME,
135
132
  template_name
136
133
  )
137
134
  end
@@ -228,7 +225,7 @@ module Datadog
228
225
 
229
226
  def read(*args, &block)
230
227
  payload = {
231
- action: 'GET',
228
+ action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_GET,
232
229
  key: args[0],
233
230
  tracing_context: {}
234
231
  }
@@ -256,7 +253,7 @@ module Datadog
256
253
 
257
254
  def fetch(*args, &block)
258
255
  payload = {
259
- action: 'GET',
256
+ action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_GET,
260
257
  key: args[0],
261
258
  tracing_context: {}
262
259
  }
@@ -284,7 +281,7 @@ module Datadog
284
281
 
285
282
  def write(*args, &block)
286
283
  payload = {
287
- action: 'SET',
284
+ action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_SET,
288
285
  key: args[0],
289
286
  tracing_context: {}
290
287
  }
@@ -312,7 +309,7 @@ module Datadog
312
309
 
313
310
  def delete(*args, &block)
314
311
  payload = {
315
- action: 'DELETE',
312
+ action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_DELETE,
316
313
  key: args[0],
317
314
  tracing_context: {}
318
315
  }
@@ -335,7 +332,7 @@ module Datadog
335
332
 
336
333
  def self.reload_cache_store
337
334
  redis = Datadog.registry[:redis]
338
- return unless redis && redis.patched?
335
+ return unless redis && redis.patcher.patched?
339
336
 
340
337
  return unless defined?(::ActiveSupport::Cache::RedisStore) &&
341
338
  defined?(::Rails.cache) &&
@@ -0,0 +1,30 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Rails
4
+ # Rails integration constants
5
+ module Ext
6
+ APP = 'rails'.freeze
7
+
8
+ QUANTIZE_CACHE_MAX_KEY_SIZE = 300
9
+
10
+ RESOURCE_CACHE_DELETE = 'DELETE'.freeze
11
+ RESOURCE_CACHE_GET = 'GET'.freeze
12
+ RESOURCE_CACHE_SET = 'SET'.freeze
13
+
14
+ SPAN_ACTION_CONTROLLER = 'rails.action_controller'.freeze
15
+ SPAN_CACHE = 'rails.cache'.freeze
16
+ SPAN_RENDER_PARTIAL = 'rails.render_partial'.freeze
17
+ SPAN_RENDER_TEMPLATE = 'rails.render_template'.freeze
18
+
19
+ SPAN_TYPE_CACHE = 'cache'.freeze
20
+
21
+ TAG_CACHE_BACKEND = 'rails.cache.backend'.freeze
22
+ TAG_CACHE_KEY = 'rails.cache.key'.freeze
23
+ TAG_LAYOUT = 'rails.layout'.freeze
24
+ TAG_ROUTE_ACTION = 'rails.route.action'.freeze
25
+ TAG_ROUTE_CONTROLLER = 'rails.route.controller'.freeze
26
+ TAG_TEMPLATE_NAME = 'rails.template_name'.freeze
27
+ end
28
+ end
29
+ end
30
+ end
@@ -5,6 +5,7 @@ require 'ddtrace/contrib/active_record/patcher'
5
5
  require 'ddtrace/contrib/grape/endpoint'
6
6
  require 'ddtrace/contrib/rack/middlewares'
7
7
 
8
+ require 'ddtrace/contrib/rails/ext'
8
9
  require 'ddtrace/contrib/rails/core_extensions'
9
10
  require 'ddtrace/contrib/rails/action_controller'
10
11
  require 'ddtrace/contrib/rails/action_view'
@@ -66,8 +67,8 @@ module Datadog
66
67
 
67
68
  def self.set_service_info!(config)
68
69
  tracer = config[:tracer]
69
- tracer.set_service_info(config[:controller_service], 'rails', Ext::AppTypes::WEB)
70
- tracer.set_service_info(config[:cache_service], 'rails', Ext::AppTypes::CACHE)
70
+ tracer.set_service_info(config[:controller_service], Ext::APP, Datadog::Ext::AppTypes::WEB)
71
+ tracer.set_service_info(config[:cache_service], Ext::APP, Datadog::Ext::AppTypes::CACHE)
71
72
  end
72
73
  end
73
74
  end
@@ -0,0 +1,37 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/rails/configuration/settings'
3
+ require 'ddtrace/contrib/rails/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Rails
8
+ # Description of Rails integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :rails, auto_patch: false
13
+
14
+ def self.version
15
+ Gem.loaded_specs['rails'] && Gem.loaded_specs['rails'].version
16
+ end
17
+
18
+ def self.present?
19
+ defined?(::Rails)
20
+ end
21
+
22
+ def self.compatible?
23
+ return false if ENV['DISABLE_DATADOG_RAILS']
24
+ super && defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR.to_i >= 3
25
+ end
26
+
27
+ def default_configuration
28
+ Configuration::Settings.new
29
+ end
30
+
31
+ def patcher
32
+ Patcher
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -6,82 +6,75 @@ require 'ddtrace/contrib/rack/middlewares'
6
6
  module Datadog
7
7
  module Contrib
8
8
  module Rails
9
- # Patcher
9
+ # Patcher enables patching of 'rails' module.
10
10
  module Patcher
11
- include Base
12
- register_as :rails, auto_patch: true
11
+ include Contrib::Patcher
13
12
 
14
- option :service_name
15
- option :controller_service
16
- option :cache_service
17
- option :database_service, depends_on: [:service_name] do |value|
18
- value.tap do
19
- # Update ActiveRecord service name too
20
- Datadog.configuration[:active_record][:service_name] = value
21
- end
22
- end
23
- option :middleware, default: true
24
- option :middleware_names, default: false
25
- option :distributed_tracing, default: false
26
- option :template_base_path, default: 'views/'
27
- option :exception_controller, default: nil
28
- option :tracer, default: Datadog.tracer
13
+ module_function
29
14
 
30
- @patched = false
15
+ def patched?
16
+ done?(:rails)
17
+ end
31
18
 
32
- class << self
33
- def patch
34
- return @patched if patched? || !compatible?
19
+ def patch
20
+ do_once(:rails) do
21
+ patch_before_intialize
22
+ patch_after_intialize
23
+ end
24
+ rescue => e
25
+ Datadog::Tracer.log.error("Unable to apply Rails integration: #{e}")
26
+ end
35
27
 
36
- # Add a callback hook to add the trace middleware before the application initializes.
37
- # Otherwise the middleware stack will be frozen.
38
- do_once(:rails_before_initialize_hook) do
39
- ::ActiveSupport.on_load(:before_initialize) do
40
- # Sometimes we don't want to activate middleware e.g. OpenTracing, etc.
41
- if Datadog.configuration[:rails][:middleware]
42
- # Add trace middleware
43
- config.middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
28
+ def patch_before_intialize
29
+ ::ActiveSupport.on_load(:before_initialize) do
30
+ Datadog::Contrib::Rails::Patcher.before_intialize(self)
31
+ end
32
+ end
44
33
 
45
- # Insert right after Rails exception handling middleware, because if it's before,
46
- # it catches and swallows the error. If it's too far after, custom middleware can find itself
47
- # between, and raise exceptions that don't end up getting tagged on the request properly.
48
- # e.g lost stack trace.
49
- config.middleware.insert_after(
50
- ActionDispatch::ShowExceptions,
51
- Datadog::Contrib::Rails::ExceptionMiddleware
52
- )
53
- end
54
- end
55
- end
34
+ def before_intialize(app)
35
+ # Middleware must be added before the application is initialized.
36
+ # Otherwise the middleware stack will be frozen.
37
+ # Sometimes we don't want to activate middleware e.g. OpenTracing, etc.
38
+ add_middleware(app) if Datadog.configuration[:rails][:middleware]
39
+ end
56
40
 
57
- # Add a callback hook to finish configuring the tracer after the application is initialized.
58
- # We need to wait for some things, like application name, middleware stack, etc.
59
- do_once(:rails_after_initialize_hook) do
60
- ::ActiveSupport.on_load(:after_initialize) do
61
- Datadog::Contrib::Rails::Framework.setup
41
+ def add_middleware(app)
42
+ # Add trace middleware
43
+ app.middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
62
44
 
63
- # Add instrumentation to Rails components
64
- Datadog::Contrib::Rails::ActionController.instrument
65
- Datadog::Contrib::Rails::ActionView.instrument
66
- Datadog::Contrib::Rails::ActiveSupport.instrument
67
- end
68
- end
45
+ # Insert right after Rails exception handling middleware, because if it's before,
46
+ # it catches and swallows the error. If it's too far after, custom middleware can find itself
47
+ # between, and raise exceptions that don't end up getting tagged on the request properly.
48
+ # e.g lost stack trace.
49
+ app.middleware.insert_after(
50
+ ActionDispatch::ShowExceptions,
51
+ Datadog::Contrib::Rails::ExceptionMiddleware
52
+ )
53
+ end
69
54
 
70
- @patched = true
71
- rescue => e
72
- Datadog::Tracer.log.error("Unable to apply Rails integration: #{e}")
73
- @patched
55
+ def patch_after_intialize
56
+ ::ActiveSupport.on_load(:after_initialize) do
57
+ Datadog::Contrib::Rails::Patcher.after_intialize(self)
74
58
  end
59
+ end
75
60
 
76
- def patched?
77
- @patched
78
- end
61
+ def after_intialize(app)
62
+ # Finish configuring the tracer after the application is initialized.
63
+ # We need to wait for some things, like application name, middleware stack, etc.
64
+ setup_tracer
65
+ instrument_rails
66
+ end
79
67
 
80
- def compatible?
81
- return if ENV['DISABLE_DATADOG_RAILS']
68
+ # Configure Rails tracing with settings
69
+ def setup_tracer
70
+ Datadog::Contrib::Rails::Framework.setup
71
+ end
82
72
 
83
- defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR.to_i >= 3
84
- end
73
+ # Add instrumentation to Rails components
74
+ def instrument_rails
75
+ Datadog::Contrib::Rails::ActionController.instrument
76
+ Datadog::Contrib::Rails::ActionView.instrument
77
+ Datadog::Contrib::Rails::ActiveSupport.instrument
85
78
  end
86
79
  end
87
80
  end