ddtrace 0.38.0 → 0.43.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 (194) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +56 -0
  3. data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
  4. data/.github/workflows/create-next-milestone.yml +20 -0
  5. data/.gitlab-ci.yml +1 -0
  6. data/.simplecov +38 -0
  7. data/Appraisals +293 -105
  8. data/CHANGELOG.md +192 -1
  9. data/CONTRIBUTING.md +2 -2
  10. data/Rakefile +554 -480
  11. data/ddtrace.gemspec +3 -0
  12. data/docs/DevelopmentGuide.md +28 -2
  13. data/docs/GettingStarted.md +207 -82
  14. data/lib/ddtrace.rb +4 -0
  15. data/lib/ddtrace/buffer.rb +259 -52
  16. data/lib/ddtrace/configuration.rb +55 -5
  17. data/lib/ddtrace/configuration/components.rb +4 -7
  18. data/lib/ddtrace/configuration/options.rb +3 -1
  19. data/lib/ddtrace/configuration/settings.rb +18 -6
  20. data/lib/ddtrace/context.rb +18 -0
  21. data/lib/ddtrace/context_provider.rb +17 -5
  22. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  23. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  24. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  25. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  26. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  27. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  28. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  29. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  30. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  31. data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
  32. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  33. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
  34. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
  35. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  36. data/lib/ddtrace/contrib/active_support/ext.rb +8 -2
  37. data/lib/ddtrace/contrib/active_support/notifications/event.rb +10 -0
  38. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +2 -2
  39. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  40. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  41. data/lib/ddtrace/contrib/aws/instrumentation.rb +6 -1
  42. data/lib/ddtrace/contrib/aws/patcher.rb +0 -1
  43. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  44. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  45. data/lib/ddtrace/contrib/configurable.rb +2 -0
  46. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +4 -5
  47. data/lib/ddtrace/contrib/configuration/settings.rb +1 -0
  48. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +38 -0
  49. data/lib/ddtrace/contrib/cucumber/ext.rb +19 -0
  50. data/lib/ddtrace/contrib/cucumber/formatter.rb +104 -0
  51. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
  52. data/lib/ddtrace/contrib/cucumber/integration.rb +40 -0
  53. data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
  54. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  55. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  56. data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
  57. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +9 -2
  58. data/lib/ddtrace/contrib/delayed_job/ext.rb +7 -2
  59. data/lib/ddtrace/contrib/delayed_job/plugin.rb +39 -15
  60. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  61. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  62. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +4 -0
  63. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  64. data/lib/ddtrace/contrib/ethon/easy_patch.rb +4 -2
  65. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  66. data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
  67. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  68. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  69. data/lib/ddtrace/contrib/excon/middleware.rb +11 -1
  70. data/lib/ddtrace/contrib/extensions.rb +1 -1
  71. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  72. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  73. data/lib/ddtrace/contrib/faraday/middleware.rb +4 -0
  74. data/lib/ddtrace/contrib/faraday/patcher.rb +13 -4
  75. data/lib/ddtrace/contrib/grape/configuration/settings.rb +14 -3
  76. data/lib/ddtrace/contrib/grape/endpoint.rb +24 -7
  77. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  78. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  79. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  80. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  81. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +5 -1
  82. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  83. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  84. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  85. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  86. data/lib/ddtrace/contrib/http/instrumentation.rb +6 -2
  87. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +7 -2
  88. data/lib/ddtrace/contrib/httprb/ext.rb +5 -2
  89. data/lib/ddtrace/contrib/httprb/instrumentation.rb +8 -8
  90. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +7 -2
  91. data/lib/ddtrace/contrib/kafka/event.rb +1 -1
  92. data/lib/ddtrace/contrib/kafka/ext.rb +5 -2
  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/subscribers.rb +4 -0
  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 +4 -0
  99. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  100. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  101. data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
  102. data/lib/ddtrace/contrib/que/configuration/settings.rb +43 -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 +57 -0
  107. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  108. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  109. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  110. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  111. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  112. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  113. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  114. data/lib/ddtrace/contrib/rack/middlewares.rb +2 -0
  115. data/lib/ddtrace/contrib/rails/configuration/settings.rb +12 -2
  116. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  117. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  118. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  119. data/lib/ddtrace/contrib/rails/patcher.rb +29 -0
  120. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  121. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  122. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  123. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  124. data/lib/ddtrace/contrib/redis/tags.rb +4 -0
  125. data/lib/ddtrace/contrib/resque/configuration/settings.rb +8 -2
  126. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  127. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  128. data/lib/ddtrace/contrib/resque/resque_job.rb +1 -1
  129. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  130. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  131. data/lib/ddtrace/contrib/rest_client/request_patch.rb +4 -0
  132. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +38 -0
  133. data/lib/ddtrace/contrib/rspec/example.rb +61 -0
  134. data/lib/ddtrace/contrib/rspec/example_group.rb +61 -0
  135. data/lib/ddtrace/contrib/rspec/ext.rb +19 -0
  136. data/lib/ddtrace/contrib/rspec/integration.rb +41 -0
  137. data/lib/ddtrace/contrib/rspec/patcher.rb +25 -0
  138. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  139. data/lib/ddtrace/contrib/sequel/database.rb +3 -1
  140. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  141. data/lib/ddtrace/contrib/sequel/ext.rb +6 -2
  142. data/lib/ddtrace/contrib/sequel/utils.rb +35 -6
  143. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +8 -2
  144. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  145. data/lib/ddtrace/contrib/shoryuken/tracer.rb +4 -1
  146. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +8 -2
  147. data/lib/ddtrace/contrib/sidekiq/ext.rb +5 -2
  148. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +4 -1
  149. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  150. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  151. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  152. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  153. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  154. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +33 -0
  155. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  156. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  157. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  158. data/lib/ddtrace/contrib/sneakers/tracer.rb +55 -0
  159. data/lib/ddtrace/contrib/status_code_matcher.rb +67 -0
  160. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  161. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  162. data/lib/ddtrace/diagnostics/environment_logger.rb +1 -1
  163. data/lib/ddtrace/environment.rb +14 -4
  164. data/lib/ddtrace/ext/app_types.rb +1 -0
  165. data/lib/ddtrace/ext/ci.rb +265 -0
  166. data/lib/ddtrace/ext/diagnostics.rb +2 -1
  167. data/lib/ddtrace/ext/distributed.rb +8 -2
  168. data/lib/ddtrace/ext/git.rb +12 -0
  169. data/lib/ddtrace/ext/integration.rb +8 -0
  170. data/lib/ddtrace/ext/runtime.rb +2 -0
  171. data/lib/ddtrace/ext/test.rb +24 -0
  172. data/lib/ddtrace/ext/transport.rb +1 -0
  173. data/lib/ddtrace/logger.rb +1 -1
  174. data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
  175. data/lib/ddtrace/propagation/grpc_propagator.rb +18 -6
  176. data/lib/ddtrace/runtime/identity.rb +4 -5
  177. data/lib/ddtrace/runtime/metrics.rb +24 -6
  178. data/lib/ddtrace/sampler.rb +2 -2
  179. data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
  180. data/lib/ddtrace/span.rb +152 -27
  181. data/lib/ddtrace/tracer.rb +25 -13
  182. data/lib/ddtrace/transport/http.rb +15 -0
  183. data/lib/ddtrace/transport/http/adapters/net.rb +8 -2
  184. data/lib/ddtrace/transport/http/adapters/test.rb +2 -0
  185. data/lib/ddtrace/transport/http/statistics.rb +14 -1
  186. data/lib/ddtrace/transport/traces.rb +7 -2
  187. data/lib/ddtrace/utils.rb +16 -13
  188. data/lib/ddtrace/utils/forking.rb +52 -0
  189. data/lib/ddtrace/version.rb +1 -1
  190. data/lib/ddtrace/workers/async.rb +2 -2
  191. data/lib/ddtrace/workers/loop.rb +1 -1
  192. data/lib/ddtrace/workers/polling.rb +1 -1
  193. data/lib/ddtrace/writer.rb +19 -1
  194. metadata +53 -6
@@ -1,5 +1,6 @@
1
1
  require 'ddtrace/ext/net'
2
2
  require 'ddtrace/ext/distributed'
3
+ require 'ddtrace/ext/integration'
3
4
  require 'ddtrace/propagation/http_propagator'
4
5
  require 'ddtrace/contrib/rest_client/ext'
5
6
 
@@ -31,6 +32,9 @@ module Datadog
31
32
  def datadog_tag_request(uri, span)
32
33
  span.resource = method.to_s.upcase
33
34
 
35
+ # Tag as an external peer service
36
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
37
+
34
38
  # Set analytics sample rate
35
39
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
36
40
 
@@ -0,0 +1,38 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/rspec/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module RSpec
7
+ module Configuration
8
+ # Custom settings for the RSpec integration
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
+
15
+ option :analytics_enabled do |o|
16
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, true) }
17
+ o.lazy
18
+ end
19
+
20
+ option :analytics_sample_rate do |o|
21
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
22
+ o.lazy
23
+ end
24
+
25
+ option :service_name do |o|
26
+ o.default { Datadog.configuration.service || Ext::SERVICE_NAME }
27
+ o.lazy
28
+ end
29
+
30
+ option :operation_name do |o|
31
+ o.default { ENV.key?(Ext::ENV_OPERATION_NAME) ? ENV[Ext::ENV_OPERATION_NAME] : Ext::OPERATION_NAME }
32
+ o.lazy
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,61 @@
1
+ module Datadog
2
+ module Contrib
3
+ module RSpec
4
+ # Instrument RSpec::Core::Example
5
+ module Example
6
+ def self.included(base)
7
+ base.send(:prepend, InstanceMethods)
8
+ end
9
+
10
+ # Instance methods for configuration
11
+ module InstanceMethods
12
+ def run(example_group_instance, reporter)
13
+ configuration = Datadog.configuration[:rspec]
14
+ return super unless configuration[:enabled]
15
+
16
+ test_name = "#{example_group.description}::#{description}"
17
+ trace_options = {
18
+ app: Ext::APP,
19
+ resource: test_name,
20
+ service: configuration[:service_name],
21
+ span_type: Datadog::Ext::AppTypes::TEST,
22
+ tags: example_group.instance_variable_get(:@tags).merge(Datadog.configuration.tags)
23
+ }
24
+
25
+ configuration[:tracer].trace(configuration[:operation_name], trace_options) do |span|
26
+ span.set_tag(Datadog::Ext::Test::TAG_FRAMEWORK, Ext::FRAMEWORK)
27
+ span.set_tag(Datadog::Ext::Test::TAG_NAME, test_name)
28
+ span.set_tag(Datadog::Ext::Test::TAG_SUITE, example_group.file_path)
29
+ span.set_tag(Datadog::Ext::Test::TAG_TYPE, Ext::TEST_TYPE)
30
+ span.set_tag(Datadog::Ext::Test::TAG_SPAN_KIND, Datadog::Ext::AppTypes::TEST)
31
+
32
+ # Set analytics sample rate
33
+ if Datadog::Contrib::Analytics.enabled?(configuration[:analytics_enabled])
34
+ Datadog::Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
35
+ end
36
+
37
+ # Measure service stats
38
+ Contrib::Analytics.set_measured(span)
39
+
40
+ result = super
41
+
42
+ case execution_result.status
43
+ when :passed
44
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::PASS)
45
+ when :failed
46
+ span.status = 1
47
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::FAIL)
48
+ span.set_error(execution_result.exception)
49
+ else
50
+ if execution_result.example_skipped?
51
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::SKIP)
52
+ end
53
+ end
54
+ result
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,61 @@
1
+ module Datadog
2
+ module Contrib
3
+ module RSpec
4
+ # Instrument RSpec::Core::ExampleGroup
5
+ module ExampleGroup
6
+ def self.included(base)
7
+ base.singleton_class.send(:prepend, ClassMethods)
8
+ end
9
+
10
+ # Class methods for configuration
11
+ module ClassMethods
12
+ def run(reporter = ::RSpec::Core::NullReporter)
13
+ configuration = Datadog.configuration[:rspec]
14
+ return super unless configuration[:enabled]
15
+
16
+ trace_options = {
17
+ app: Ext::APP,
18
+ resource: description,
19
+ service: configuration[:service_name],
20
+ span_type: Datadog::Ext::AppTypes::TEST,
21
+ tags: tags.merge(Datadog.configuration.tags)
22
+ }
23
+
24
+ configuration[:tracer].trace(Ext::EXAMPLE_GROUP_OPERATION_NAME, trace_options) do |span|
25
+ span.set_tag(Datadog::Ext::Test::TAG_FRAMEWORK, Ext::FRAMEWORK)
26
+ span.set_tag(Datadog::Ext::Test::TAG_NAME, description)
27
+ span.set_tag(Datadog::Ext::Test::TAG_SUITE, file_path)
28
+ span.set_tag(Datadog::Ext::Test::TAG_TYPE, Ext::TEST_TYPE)
29
+ span.set_tag(Datadog::Ext::Test::TAG_SPAN_KIND, Datadog::Ext::AppTypes::TEST)
30
+
31
+ # Set analytics sample rate
32
+ if Datadog::Contrib::Analytics.enabled?(configuration[:analytics_enabled])
33
+ Datadog::Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
34
+ end
35
+
36
+ # Measure service stats
37
+ Contrib::Analytics.set_measured(span)
38
+
39
+ result = super
40
+
41
+ if ::RSpec.world.wants_to_quit
42
+ span.status = 1
43
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::FAIL)
44
+ else
45
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::PASS)
46
+ end
47
+
48
+ result
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def tags
55
+ @tags ||= Datadog::Ext::CI.tags(ENV)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,19 @@
1
+ module Datadog
2
+ module Contrib
3
+ module RSpec
4
+ # RSpec integration constants
5
+ module Ext
6
+ APP = 'rspec'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_RSPEC_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_RSPEC_ANALYTICS_SAMPLE_RATE'.freeze
9
+ ENV_ENABLED = 'DD_TRACE_RSPEC_ENABLED'.freeze
10
+ ENV_OPERATION_NAME = 'DD_TRACE_RSPEC_OPERATION_NAME'.freeze
11
+ FRAMEWORK = 'rspec'.freeze
12
+ OPERATION_NAME = 'rspec.example'.freeze
13
+ EXAMPLE_GROUP_OPERATION_NAME = 'rspec.example_group'.freeze
14
+ SERVICE_NAME = 'rspec'.freeze
15
+ TEST_TYPE = 'test'.freeze
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,41 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/rspec/configuration/settings'
3
+ require 'ddtrace/contrib/rspec/patcher'
4
+ require 'ddtrace/contrib/integration'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module RSpec
9
+ # Description of RSpec integration
10
+ class Integration
11
+ include Contrib::Integration
12
+
13
+ MINIMUM_VERSION = Gem::Version.new('3.0.0')
14
+
15
+ register_as :rspec, auto_patch: true
16
+
17
+ def self.version
18
+ Gem.loaded_specs['rspec'] \
19
+ && Gem.loaded_specs['rspec'].version
20
+ end
21
+
22
+ def self.loaded?
23
+ !defined?(::RSpec).nil? && !defined?(::RSpec::Core).nil? && \
24
+ !defined?(::RSpec::Core::Example).nil? && !defined?(::RSpec::Core::ExampleGroup).nil?
25
+ end
26
+
27
+ def self.compatible?
28
+ super && version >= MINIMUM_VERSION
29
+ end
30
+
31
+ def default_configuration
32
+ Configuration::Settings.new
33
+ end
34
+
35
+ def patcher
36
+ Patcher
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/rspec/example'
3
+ require 'ddtrace/contrib/rspec/example_group'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module RSpec
8
+ # Patcher enables patching of 'rspec' module.
9
+ module Patcher
10
+ include Contrib::Patcher
11
+
12
+ module_function
13
+
14
+ def target_version
15
+ Integration.version
16
+ end
17
+
18
+ def patch
19
+ ::RSpec::Core::Example.send(:include, Example)
20
+ ::RSpec::Core::ExampleGroup.send(:include, ExampleGroup)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the Sequel 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
  end
@@ -24,7 +24,7 @@ module Datadog
24
24
  span.service = datadog_pin.service
25
25
  span.resource = opts[:query]
26
26
  span.span_type = Datadog::Ext::SQL::TYPE
27
- Utils.set_analytics_sample_rate(span)
27
+ Utils.set_common_tags(span)
28
28
  span.set_tag(Ext::TAG_DB_VENDOR, adapter_name)
29
29
  response = super(sql, options)
30
30
  end
@@ -52,6 +52,8 @@ module Datadog
52
52
  elsif instance_variable_defined?(:@pool) && @pool
53
53
  @pool.db.opts
54
54
  end
55
+ sql = sql.is_a?(::Sequel::SQL::Expression) ? literal(sql) : sql.to_s
56
+
55
57
  Utils.parse_opts(sql, opts, db_opts)
56
58
  end
57
59
  end
@@ -38,15 +38,16 @@ module Datadog
38
38
  private
39
39
 
40
40
  def trace_execute(super_method, sql, options, &block)
41
- opts = Utils.parse_opts(sql, options, db.opts)
41
+ opts = Utils.parse_opts(sql, options, db.opts, self)
42
42
  response = nil
43
43
 
44
44
  datadog_pin.tracer.trace(Ext::SPAN_QUERY) do |span|
45
45
  span.service = datadog_pin.service
46
46
  span.resource = opts[:query]
47
47
  span.span_type = Datadog::Ext::SQL::TYPE
48
- Utils.set_analytics_sample_rate(span)
48
+ Utils.set_common_tags(span)
49
49
  span.set_tag(Ext::TAG_DB_VENDOR, adapter_name)
50
+ span.set_tag(Ext::TAG_PREPARED_NAME, opts[:prepared_name]) if opts[:prepared_name]
50
51
  response = super_method.call(sql, options, &block)
51
52
  end
52
53
  response
@@ -4,11 +4,15 @@ module Datadog
4
4
  # Sequel integration constants
5
5
  module Ext
6
6
  APP = 'sequel'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_SEQUEL_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_SEQUEL_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_SEQUEL_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_SEQUEL_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_SEQUEL_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SEQUEL_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SEQUEL_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'sequel'.freeze
10
13
  SPAN_QUERY = 'sequel.query'.freeze
11
14
  TAG_DB_VENDOR = 'sequel.db.vendor'.freeze
15
+ TAG_PREPARED_NAME = 'sequel.prepared.name'.freeze
12
16
  end
13
17
  end
14
18
  end
@@ -1,28 +1,57 @@
1
+ require 'ddtrace/ext/integration'
2
+
1
3
  module Datadog
2
4
  module Contrib
3
5
  module Sequel
4
6
  # General purpose functions for Sequel
5
7
  module Utils
6
8
  class << self
9
+ # Ruby database connector library
10
+ #
11
+ # e.g. adapter:mysql2 (database:mysql), adapter:jdbc (database:postgres)
7
12
  def adapter_name(database)
8
- Datadog::Utils::Database.normalize_vendor(database.adapter_scheme.to_s)
13
+ scheme = database.adapter_scheme.to_s
14
+
15
+ if scheme == 'jdbc'.freeze
16
+ # The subtype is more important in this case,
17
+ # otherwise all database adapters will be 'jdbc'.
18
+ database_type(database)
19
+ else
20
+ Datadog::Utils::Database.normalize_vendor(scheme)
21
+ end
9
22
  end
10
23
 
11
- def parse_opts(sql, opts, db_opts)
12
- if ::Sequel::VERSION >= '4.37.0' && !sql.is_a?(String)
13
- # In 4.37.0, sql was converted to a prepared statement object
14
- sql = sql.prepared_sql unless sql.is_a?(Symbol)
24
+ # Database engine
25
+ #
26
+ # e.g. database:mysql (adapter:mysql2), database:postgres (adapter:jdbc)
27
+ def database_type(database)
28
+ Datadog::Utils::Database.normalize_vendor(database.database_type.to_s)
29
+ end
30
+
31
+ def parse_opts(sql, opts, db_opts, dataset = nil)
32
+ # Prepared statements don't provide their sql query in the +sql+ parameter.
33
+ unless sql.is_a?(String)
34
+ if dataset && dataset.respond_to?(:prepared_sql) && (resolved_sql = dataset.prepared_sql)
35
+ # The dataset contains the resolved SQL query and prepared statement name.
36
+ prepared_name = dataset.prepared_statement_name
37
+ sql = resolved_sql
38
+ end
15
39
  end
16
40
 
17
41
  {
18
42
  name: opts[:type],
19
43
  query: sql,
44
+ prepared_name: prepared_name,
20
45
  database: db_opts[:database],
21
46
  host: db_opts[:host]
22
47
  }
23
48
  end
24
49
 
25
- def set_analytics_sample_rate(span)
50
+ def set_common_tags(span)
51
+ # Tag as an external peer service
52
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
53
+
54
+ # Set analytics sample rate
26
55
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
27
56
  end
28
57
 
@@ -6,17 +6,23 @@ module Datadog
6
6
  module Configuration
7
7
  # Default settings for the Shoryuken integration
8
8
  class Settings < Contrib::Configuration::Settings
9
+ option :enabled do |o|
10
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
11
+ o.lazy
12
+ end
13
+
9
14
  option :analytics_enabled do |o|
10
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
15
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
11
16
  o.lazy
12
17
  end
13
18
 
14
19
  option :analytics_sample_rate do |o|
15
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
20
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
16
21
  o.lazy
17
22
  end
18
23
 
19
24
  option :service_name, default: Ext::SERVICE_NAME
25
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
20
26
  end
21
27
  end
22
28
  end
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Shoryuken integration constants
5
5
  module Ext
6
6
  APP = 'shoryuken'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_SHORYUKEN_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_SHORYUKEN_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_SHORYUKEN_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_SHORYUKEN_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_SHORYUKEN_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SHORYUKEN_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SHORYUKEN_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'shoryuken'.freeze
10
13
  SPAN_JOB = 'shoryuken.job'.freeze
11
14
  TAG_JOB_ID = 'shoryuken.id'.freeze