ddtrace 0.16.1 → 0.17.0

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