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 'sidekiq/api'
2
2
 
3
3
  require 'ddtrace/ext/app_types'
4
+ require 'ddtrace/contrib/sidekiq/ext'
4
5
 
5
6
  module Datadog
6
7
  module Contrib
@@ -8,9 +9,8 @@ module Datadog
8
9
  # Tracer is a Sidekiq server-side middleware which traces executed jobs
9
10
  class Tracer
10
11
  def initialize(options = {})
11
- config = Datadog.configuration[:sidekiq].merge(options)
12
- @tracer = config[:tracer]
13
- @sidekiq_service = config[:service_name]
12
+ @tracer = options[:tracer] || Datadog.configuration[:sidekiq][:tracer]
13
+ @sidekiq_service = options[:service_name] || Datadog.configuration[:sidekiq][:service_name]
14
14
  end
15
15
 
16
16
  def call(worker, job, queue)
@@ -26,13 +26,13 @@ module Datadog
26
26
  service = sidekiq_service(resource_worker(resource))
27
27
  set_service_info(service)
28
28
 
29
- @tracer.trace('sidekiq.job', service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
29
+ @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
30
30
  span.resource = resource
31
- span.set_tag('sidekiq.job.id', job['jid'])
32
- span.set_tag('sidekiq.job.retry', job['retry'])
33
- span.set_tag('sidekiq.job.queue', job['queue'])
34
- span.set_tag('sidekiq.job.wrapper', job['class']) if job['wrapped']
35
- span.set_tag('sidekiq.job.delay', 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
31
+ span.set_tag(Ext::TAG_JOB_ID, job['jid'])
32
+ span.set_tag(Ext::TAG_JOB_RETRY, job['retry'])
33
+ span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
34
+ span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
35
+ span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
36
36
 
37
37
  yield
38
38
  end
@@ -62,7 +62,7 @@ module Datadog
62
62
  return if @tracer.services[service]
63
63
  @tracer.set_service_info(
64
64
  service,
65
- 'sidekiq',
65
+ Ext::APP,
66
66
  Datadog::Ext::AppTypes::WORKER
67
67
  )
68
68
  end
@@ -0,0 +1,27 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/ext/app_types'
3
+ require 'ddtrace/contrib/sinatra/ext'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Sinatra
8
+ module Configuration
9
+ # Custom settings for the Sinatra integration
10
+ class Settings < Contrib::Configuration::Settings
11
+ DEFAULT_HEADERS = {
12
+ response: %w[Content-Type X-Request-ID]
13
+ }.freeze
14
+
15
+ option :distributed_tracing, default: false
16
+ option :headers, default: DEFAULT_HEADERS
17
+ option :resource_script_names, default: false
18
+
19
+ option :service_name, default: Ext::SERVICE_NAME, depends_on: [:tracer] do |value|
20
+ get_option(:tracer).set_service_info(value, Ext::APP, Datadog::Ext::AppTypes::WEB)
21
+ value
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,20 +1,19 @@
1
1
  require 'ddtrace/ext/http'
2
+ require 'ddtrace/contrib/sinatra/ext'
2
3
 
3
4
  module Datadog
4
5
  module Contrib
5
6
  module Sinatra
6
7
  # Gets and sets trace information from a Rack Env
7
8
  module Env
8
- ENV_SPAN = 'datadog.sinatra_request_span'.freeze
9
-
10
9
  module_function
11
10
 
12
11
  def datadog_span(env)
13
- env[ENV_SPAN]
12
+ env[Ext::RACK_ENV_REQUEST_SPAN]
14
13
  end
15
14
 
16
15
  def set_datadog_span(env, span)
17
- env[ENV_SPAN] = span
16
+ env[Ext::RACK_ENV_REQUEST_SPAN] = span
18
17
  end
19
18
 
20
19
  def request_header_tags(env, headers)
@@ -0,0 +1,19 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Sinatra
4
+ # Sinatra integration constants
5
+ module Ext
6
+ APP = 'sinatra'.freeze
7
+ SERVICE_NAME = 'sinatra'.freeze
8
+
9
+ RACK_ENV_REQUEST_SPAN = 'datadog.sinatra_request_span'.freeze
10
+
11
+ SPAN_RENDER_TEMPLATE = 'sinatra.render_template'.freeze
12
+ SPAN_REQUEST = 'sinatra.request'.freeze
13
+
14
+ TAG_ROUTE_PATH = 'sinatra.route.path'.freeze
15
+ TAG_TEMPLATE_NAME = 'sinatra.template_name'.freeze
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/sinatra/configuration/settings'
3
+ require 'ddtrace/contrib/sinatra/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Sinatra
8
+ # Description of Sinatra integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :sinatra
13
+
14
+ def self.version
15
+ Gem.loaded_specs['sinatra'] && Gem.loaded_specs['sinatra'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::Sinatra)
20
+ end
21
+
22
+ def self.compatible?
23
+ super && version >= Gem::Version.new('1.4.0')
24
+ end
25
+
26
+ def default_configuration
27
+ Configuration::Settings.new
28
+ end
29
+
30
+ def patcher
31
+ Patcher
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ require 'ddtrace/contrib/patcher'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Sinatra
6
+ # Patcher enables patching of 'sinatra' module.
7
+ module Patcher
8
+ include Contrib::Patcher
9
+
10
+ module_function
11
+
12
+ def patched?
13
+ done?(:sinatra)
14
+ end
15
+
16
+ def patch
17
+ do_once(:sinatra) do
18
+ begin
19
+ require 'ddtrace/contrib/sinatra/tracer'
20
+ register_tracer
21
+ rescue StandardError => e
22
+ Datadog::Tracer.log.error("Unable to apply Sinatra integration: #{e}")
23
+ end
24
+ end
25
+ end
26
+
27
+ def register_tracer
28
+ ::Sinatra.send(:register, Datadog::Contrib::Sinatra::Tracer)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -5,41 +5,16 @@ require 'ddtrace/ext/errors'
5
5
  require 'ddtrace/ext/http'
6
6
  require 'ddtrace/propagation/http_propagator'
7
7
 
8
+ require 'ddtrace/contrib/sinatra/ext'
8
9
  require 'ddtrace/contrib/sinatra/tracer_middleware'
9
10
  require 'ddtrace/contrib/sinatra/env'
10
11
 
11
- sinatra_vs = Gem::Version.new(Sinatra::VERSION)
12
- sinatra_min_vs = Gem::Version.new('1.4.0')
13
- if sinatra_vs < sinatra_min_vs
14
- raise "sinatra version #{sinatra_vs} is not supported yet " \
15
- + "(supporting versions >=#{sinatra_min_vs})"
16
- end
17
-
18
- Datadog::Tracer.log.info("activating instrumentation for sinatra #{sinatra_vs}")
19
-
20
12
  module Datadog
21
13
  module Contrib
22
14
  module Sinatra
23
15
  # Datadog::Contrib::Sinatra::Tracer is a Sinatra extension which traces
24
16
  # requests.
25
17
  module Tracer
26
- DEFAULT_HEADERS = {
27
- response: %w[Content-Type X-Request-ID]
28
- }.freeze
29
-
30
- include Base
31
- register_as :sinatra
32
-
33
- option :service_name, default: 'sinatra', depends_on: [:tracer] do |value|
34
- get_option(:tracer).set_service_info(value, 'sinatra', Ext::AppTypes::WEB)
35
- value
36
- end
37
-
38
- option :tracer, default: Datadog.tracer
39
- option :resource_script_names, default: false
40
- option :distributed_tracing, default: false
41
- option :headers, default: DEFAULT_HEADERS
42
-
43
18
  def route(verb, action, *)
44
19
  # Keep track of the route name when the app is instantiated for an
45
20
  # incoming request.
@@ -62,10 +37,10 @@ module Datadog
62
37
  output = ''
63
38
  tracer = Datadog.configuration[:sinatra][:tracer]
64
39
  if tracer.enabled
65
- tracer.trace('sinatra.render_template', span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
40
+ tracer.trace(Ext::SPAN_RENDER_TEMPLATE, span_type: Datadog::Ext::HTTP::TEMPLATE) do |span|
66
41
  # If data is a string, it is a literal template and we don't
67
42
  # want to record it.
68
- span.set_tag('sinatra.template_name', data) if data.is_a? Symbol
43
+ span.set_tag(Ext::TAG_TEMPLATE_NAME, data) if data.is_a? Symbol
69
44
  output = super
70
45
  end
71
46
  else
@@ -97,7 +72,7 @@ module Datadog
97
72
  end
98
73
 
99
74
  span.resource = "#{request.request_method} #{@datadog_route}"
100
- span.set_tag('sinatra.route.path', @datadog_route)
75
+ span.set_tag(Ext::TAG_ROUTE_PATH, @datadog_route)
101
76
  span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.status)
102
77
  span.set_error(env['sinatra.error']) if response.server_error?
103
78
  end
@@ -106,8 +81,3 @@ module Datadog
106
81
  end
107
82
  end
108
83
  end
109
-
110
- # rubocop:disable Style/Documentation
111
- module Sinatra
112
- register Datadog::Contrib::Sinatra::Tracer
113
- end
@@ -1,3 +1,4 @@
1
+ require 'ddtrace/contrib/sinatra/ext'
1
2
  require 'ddtrace/contrib/sinatra/env'
2
3
  require 'ddtrace/contrib/sinatra/headers'
3
4
 
@@ -6,8 +7,6 @@ module Datadog
6
7
  module Sinatra
7
8
  # Middleware used for automatically tagging configured headers and handle request span
8
9
  class TracerMiddleware
9
- REQUEST_TRACE_NAME = 'sinatra.request'.freeze
10
-
11
10
  def initialize(app)
12
11
  @app = app
13
12
  end
@@ -21,7 +20,7 @@ module Datadog
21
20
 
22
21
  # Begin the trace
23
22
  tracer.trace(
24
- REQUEST_TRACE_NAME,
23
+ Ext::SPAN_REQUEST,
25
24
  service: configuration[:service_name],
26
25
  span_type: Datadog::Ext::HTTP::TYPE
27
26
  ) do |span|
@@ -0,0 +1,15 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/sucker_punch/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module SuckerPunch
7
+ module Configuration
8
+ # Custom settings for the SuckerPunch integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :service_name, default: Ext::SERVICE_NAME
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ module Datadog
2
+ module Contrib
3
+ module SuckerPunch
4
+ # SuckerPunch integration constants
5
+ module Ext
6
+ APP = 'sucker_punch'.freeze
7
+ SERVICE_NAME = 'sucker_punch'.freeze
8
+
9
+ SPAN_PERFORM = 'sucker_punch.perform'.freeze
10
+ SPAN_PERFORM_ASYNC = 'sucker_punch.perform_async'.freeze
11
+ SPAN_PERFORM_IN = 'sucker_punch.perform_in'.freeze
12
+
13
+ TAG_PERFORM_IN = 'sucker_punch.perform_in'.freeze
14
+ TAG_QUEUE = 'sucker_punch.queue'.freeze
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,4 +1,5 @@
1
1
  require 'sucker_punch'
2
+ require 'ddtrace/contrib/sucker_punch/ext'
2
3
 
3
4
  module Datadog
4
5
  module Contrib
@@ -15,7 +16,7 @@ module Datadog
15
16
  pin = Datadog::Pin.get_from(::SuckerPunch)
16
17
  pin.tracer.provider.context = Datadog::Context.new
17
18
 
18
- __with_instrumentation('sucker_punch.perform') do |span|
19
+ __with_instrumentation(Ext::SPAN_PERFORM) do |span|
19
20
  span.resource = "PROCESS #{self}"
20
21
  __run_perform_without_datadog(*args)
21
22
  end
@@ -25,7 +26,7 @@ module Datadog
25
26
 
26
27
  alias_method :__perform_async, :perform_async
27
28
  def perform_async(*args)
28
- __with_instrumentation('sucker_punch.perform_async') do |span|
29
+ __with_instrumentation(Ext::SPAN_PERFORM_ASYNC) do |span|
29
30
  span.resource = "ENQUEUE #{self}"
30
31
  __perform_async(*args)
31
32
  end
@@ -33,9 +34,9 @@ module Datadog
33
34
 
34
35
  alias_method :__perform_in, :perform_in
35
36
  def perform_in(interval, *args)
36
- __with_instrumentation('sucker_punch.perform_in') do |span|
37
+ __with_instrumentation(Ext::SPAN_PERFORM_IN) do |span|
37
38
  span.resource = "ENQUEUE #{self}"
38
- span.set_tag('sucker_punch.perform_in', interval)
39
+ span.set_tag(Ext::TAG_PERFORM_IN, interval)
39
40
  __perform_in(interval, *args)
40
41
  end
41
42
  end
@@ -48,7 +49,7 @@ module Datadog
48
49
  pin.tracer.trace(name) do |span|
49
50
  span.service = pin.service
50
51
  span.span_type = pin.app_type
51
- span.set_tag('sucker_punch.queue', to_s)
52
+ span.set_tag(Ext::TAG_QUEUE, to_s)
52
53
  yield span
53
54
  end
54
55
  end
@@ -0,0 +1,36 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/sucker_punch/configuration/settings'
3
+ require 'ddtrace/contrib/sucker_punch/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module SuckerPunch
8
+ # Description of SuckerPunch integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :sucker_punch, auto_patch: true
13
+
14
+ def self.version
15
+ Gem.loaded_specs['sucker_punch'] && Gem.loaded_specs['sucker_punch'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::SuckerPunch)
20
+ end
21
+
22
+ def self.compatible?
23
+ super && Gem::Version.new(::SuckerPunch::VERSION) >= Gem::Version.new('2.0.0')
24
+ end
25
+
26
+ def default_configuration
27
+ Configuration::Settings.new
28
+ end
29
+
30
+ def patcher
31
+ Patcher
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,53 +1,47 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/ext/app_types'
3
+ require 'ddtrace/contrib/sucker_punch/ext'
4
+
1
5
  module Datadog
2
6
  module Contrib
3
7
  module SuckerPunch
4
- SERVICE = 'sucker_punch'.freeze
5
- COMPATIBLE_WITH = Gem::Version.new('2.0.0')
6
-
7
- # Responsible for hooking the instrumentation into `sucker_punch`
8
+ # Patcher enables patching of 'sucker_punch' module.
8
9
  module Patcher
9
- include Base
10
- register_as :sucker_punch, auto_patch: true
11
- option :service_name, default: SERVICE
12
-
13
- @patched = false
10
+ include Contrib::Patcher
14
11
 
15
12
  module_function
16
13
 
17
- def patch
18
- return @patched if patched? || !compatible?
19
-
20
- require 'ddtrace/ext/app_types'
21
- require_relative 'exception_handler'
22
- require_relative 'instrumentation'
23
-
24
- add_pin!
25
- ExceptionHandler.patch!
26
- Instrumentation.patch!
27
-
28
- @patched = true
29
- rescue => e
30
- Datadog::Tracer.log.error("Unable to apply SuckerPunch integration: #{e}")
31
- @patched
32
- end
33
-
34
14
  def patched?
35
- @patched
15
+ done?(:sucker_punch)
36
16
  end
37
17
 
38
- def compatible?
39
- return unless defined?(::SuckerPunch::VERSION)
40
-
41
- Gem::Version.new(::SuckerPunch::VERSION) >= COMPATIBLE_WITH
18
+ def patch
19
+ do_once(:sucker_punch) do
20
+ begin
21
+ require 'ddtrace/contrib/sucker_punch/exception_handler'
22
+ require 'ddtrace/contrib/sucker_punch/instrumentation'
23
+
24
+ add_pin!
25
+ ExceptionHandler.patch!
26
+ Instrumentation.patch!
27
+ rescue StandardError => e
28
+ Datadog::Tracer.log.error("Unable to apply SuckerPunch integration: #{e}")
29
+ end
30
+ end
42
31
  end
43
32
 
44
33
  def add_pin!
45
- Pin.new(get_option(:service_name), app: 'sucker_punch', app_type: Ext::AppTypes::WORKER).tap do |pin|
46
- pin.onto(::SuckerPunch)
47
- end
34
+ Pin.new(
35
+ get_option(:service_name),
36
+ app: Ext::APP,
37
+ app_type: Datadog::Ext::AppTypes::WORKER,
38
+ tracer: get_option(:tracer)
39
+ ).onto(::SuckerPunch)
48
40
  end
49
41
 
50
- private_class_method :compatible?, :add_pin!
42
+ def get_option(option)
43
+ Datadog.configuration[:sucker_punch].get_option(option)
44
+ end
51
45
  end
52
46
  end
53
47
  end