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
@@ -0,0 +1,39 @@
1
+
2
+ module Datadog
3
+ module Contrib
4
+ module HTTP
5
+ # HTTP integration circuit breaker behavior
6
+ # For avoiding recursive traces.
7
+ module CircuitBreaker
8
+ def should_skip_tracing?(req, address, port, transport, pin)
9
+ # we don't want to trace our own call to the API (they use net/http)
10
+ # when we know the host & port (from the URI) we use it, else (most-likely
11
+ # called with a block) rely on the URL at the end.
12
+ if req.respond_to?(:uri) && req.uri
13
+ if req.uri.host.to_s == transport.hostname.to_s &&
14
+ req.uri.port.to_i == transport.port.to_i
15
+ return true
16
+ end
17
+ elsif address && port &&
18
+ address.to_s == transport.hostname.to_s &&
19
+ port.to_i == transport.port.to_i
20
+ return true
21
+ end
22
+ # we don't want a "shotgun" effect with two nested traces for one
23
+ # logical get, and request is likely to call itself recursively
24
+ active = pin.tracer.active_span
25
+ return true if active && (active.name == Ext::SPAN_REQUEST)
26
+ false
27
+ end
28
+
29
+ def should_skip_distributed_tracing?(pin)
30
+ if pin.config && pin.config.key?(:distributed_tracing)
31
+ return !pin.config[:distributed_tracing]
32
+ end
33
+
34
+ !Datadog.configuration[:http][:distributed_tracing]
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/http/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module HTTP
7
+ module Configuration
8
+ # Custom settings for the HTTP integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :distributed_tracing, default: false
11
+ option :service_name, default: Ext::SERVICE_NAME
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,13 @@
1
+ module Datadog
2
+ module Contrib
3
+ module HTTP
4
+ # HTTP integration constants
5
+ module Ext
6
+ APP = 'net/http'.freeze
7
+ SERVICE_NAME = 'net/http'.freeze
8
+
9
+ SPAN_REQUEST = 'http.request'.freeze
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/http/configuration/settings'
3
+ require 'ddtrace/contrib/http/patcher'
4
+ require 'ddtrace/contrib/http/circuit_breaker'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ # HTTP integration
9
+ module HTTP
10
+ extend CircuitBreaker
11
+
12
+ # Description of HTTP integration
13
+ class Integration
14
+ include Contrib::Integration
15
+
16
+ register_as :http, auto_patch: true
17
+
18
+ def self.version
19
+ Gem::Version.new(RUBY_VERSION)
20
+ end
21
+
22
+ def default_configuration
23
+ Configuration::Settings.new
24
+ end
25
+
26
+ def patcher
27
+ Patcher
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,63 +1,23 @@
1
- # requirements should be kept minimal as Patcher is a shared requirement.
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/http/ext'
2
3
 
3
4
  module Datadog
4
5
  module Contrib
5
6
  # Datadog Net/HTTP integration.
6
7
  module HTTP
7
- URL = 'http.url'.freeze
8
- METHOD = 'http.method'.freeze
9
- BODY = 'http.body'.freeze
10
-
11
- NAME = 'http.request'.freeze
12
- APP = 'net/http'.freeze
13
- SERVICE = 'net/http'.freeze
14
-
15
- module_function
16
-
17
- def should_skip_tracing?(req, address, port, transport, pin)
18
- # we don't want to trace our own call to the API (they use net/http)
19
- # when we know the host & port (from the URI) we use it, else (most-likely
20
- # called with a block) rely on the URL at the end.
21
- if req.respond_to?(:uri) && req.uri
22
- if req.uri.host.to_s == transport.hostname.to_s &&
23
- req.uri.port.to_i == transport.port.to_i
24
- return true
25
- end
26
- elsif address && port &&
27
- address.to_s == transport.hostname.to_s &&
28
- port.to_i == transport.port.to_i
29
- return true
30
- end
31
- # we don't want a "shotgun" effect with two nested traces for one
32
- # logical get, and request is likely to call itself recursively
33
- active = pin.tracer.active_span()
34
- return true if active && (active.name == NAME)
35
- false
36
- end
37
-
38
- def should_skip_distributed_tracing?(pin)
39
- if pin.config && pin.config.key?(:distributed_tracing)
40
- return !pin.config[:distributed_tracing]
41
- end
42
-
43
- !Datadog.configuration[:http][:distributed_tracing]
44
- end
45
-
46
8
  # Patcher enables patching of 'net/http' module.
47
9
  module Patcher
48
- include Base
49
- register_as :http, auto_patch: true
50
- option :distributed_tracing, default: false
51
- option :service_name, default: SERVICE
52
- option :tracer, default: Datadog.tracer
53
-
54
- @patched = false
10
+ include Contrib::Patcher
55
11
 
56
12
  module_function
57
13
 
14
+ def patched?
15
+ done?(:http)
16
+ end
17
+
58
18
  # patch applies our patch if needed
59
19
  def patch
60
- unless @patched
20
+ do_once(:http) do
61
21
  begin
62
22
  require 'uri'
63
23
  require 'ddtrace/pin'
@@ -67,18 +27,10 @@ module Datadog
67
27
  require 'ddtrace/ext/distributed'
68
28
 
69
29
  patch_http
70
-
71
- @patched = true
72
30
  rescue StandardError => e
73
31
  Datadog::Tracer.log.error("Unable to apply net/http integration: #{e}")
74
32
  end
75
33
  end
76
- @patched
77
- end
78
-
79
- # patched? tells whether patch has been successfully applied
80
- def patched?
81
- @patched
82
34
  end
83
35
 
84
36
  # rubocop:disable Metrics/MethodLength
@@ -94,7 +46,7 @@ module Datadog
94
46
  service = Datadog.configuration[:http][:service_name]
95
47
  tracer = Datadog.configuration[:http][:tracer]
96
48
 
97
- Datadog::Pin.new(service, app: APP, app_type: Datadog::Ext::AppTypes::WEB, tracer: tracer)
49
+ Datadog::Pin.new(service, app: Ext::APP, app_type: Datadog::Ext::AppTypes::WEB, tracer: tracer)
98
50
  end
99
51
  end
100
52
 
@@ -108,7 +60,7 @@ module Datadog
108
60
  return request_without_datadog(req, body, &block)
109
61
  end
110
62
 
111
- pin.tracer.trace(NAME) do |span|
63
+ pin.tracer.trace(Ext::SPAN_REQUEST) do |span|
112
64
  begin
113
65
  span.service = pin.service
114
66
  span.span_type = Datadog::Ext::HTTP::TYPE
@@ -0,0 +1,18 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/mongodb/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module MongoDB
7
+ module Configuration
8
+ # Custom settings for the MongoDB integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ DEFAULT_QUANTIZE = { show: [:collection, :database, :operation] }.freeze
11
+
12
+ option :quantize, default: DEFAULT_QUANTIZE
13
+ option :service_name, default: Ext::SERVICE_NAME
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module Contrib
3
+ module MongoDB
4
+ # MongoDB integration constants
5
+ module Ext
6
+ APP = 'mongodb'.freeze
7
+ SERVICE_NAME = 'mongodb'.freeze
8
+
9
+ SPAN_COMMAND = 'mongo.cmd'.freeze
10
+ SPAN_TYPE_COMMAND = 'mongodb'.freeze
11
+
12
+ TAG_COLLECTION = 'mongodb.collection'.freeze
13
+ TAG_DB = 'mongodb.db'.freeze
14
+ TAG_OPERATION = 'mongodb.operation'.freeze
15
+ TAG_QUERY = 'mongodb.query'.freeze
16
+ TAG_ROWS = 'mongodb.rows'.freeze
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/mongodb/configuration/settings'
3
+ require 'ddtrace/contrib/mongodb/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module MongoDB
8
+ # Description of MongoDB integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ register_as :mongo, auto_patch: true
13
+
14
+ def self.version
15
+ Gem.loaded_specs['mongo'] && Gem.loaded_specs['mongo'].version
16
+ end
17
+
18
+ def self.present?
19
+ super && defined?(::Mongo::Monitoring::Global)
20
+ end
21
+
22
+ def self.compatible?
23
+ super && version >= Gem::Version.new('2.1.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,56 +1,40 @@
1
- # requirements should be kept minimal as Patcher is a shared requirement.
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/mongodb/ext'
2
3
 
3
4
  module Datadog
4
5
  module Contrib
5
- # MongoDB module includes classes and functions to instrument MongoDB clients
6
6
  module MongoDB
7
- APP = 'mongodb'.freeze
8
- SERVICE = 'mongodb'.freeze
9
-
10
- # Patcher adds subscribers to the MongoDB driver so that each command is traced.
7
+ # Patcher enables patching of 'mongo' module.
11
8
  module Patcher
12
- include Base
13
- register_as :mongo, auto_patch: true
14
- option :service_name, default: SERVICE
15
- option :quantize, default: { show: [:collection, :database, :operation] }
16
-
17
- @patched = false
9
+ include Contrib::Patcher
18
10
 
19
11
  module_function
20
12
 
21
13
  def patched?
22
- @patched
14
+ done?(:mongo)
23
15
  end
24
16
 
25
17
  def patch
26
- # versions prior to 2.1.0 don't support the Monitoring API
27
- if !@patched && (defined?(::Mongo::Monitoring::Global) && \
28
- Gem::Version.new(::Mongo::VERSION) >= Gem::Version.new('2.1.0'))
18
+ do_once(:mongo) do
29
19
  begin
30
20
  require 'ddtrace/pin'
31
21
  require 'ddtrace/ext/net'
32
- require 'ddtrace/ext/mongo'
33
22
  require 'ddtrace/ext/app_types'
23
+ require 'ddtrace/contrib/mongodb/ext'
34
24
  require 'ddtrace/contrib/mongodb/parsers'
35
25
  require 'ddtrace/contrib/mongodb/subscribers'
36
26
 
37
- patch_mongo_client()
38
- add_mongo_monitoring()
39
-
40
- @patched = true
27
+ patch_mongo_client
28
+ add_mongo_monitoring
41
29
  rescue StandardError => e
42
30
  Datadog::Tracer.log.error("Unable to apply MongoDB integration: #{e}")
43
31
  end
44
32
  end
45
- @patched
46
33
  end
47
34
 
48
35
  def add_mongo_monitoring
49
36
  # Subscribe to all COMMAND queries with our subscriber class
50
- ::Mongo::Monitoring::Global.subscribe(
51
- ::Mongo::Monitoring::COMMAND,
52
- Datadog::Contrib::MongoDB::MongoCommandSubscriber.new
53
- )
37
+ ::Mongo::Monitoring::Global.subscribe(::Mongo::Monitoring::COMMAND, MongoCommandSubscriber.new)
54
38
  end
55
39
 
56
40
  def patch_mongo_client
@@ -63,8 +47,14 @@ module Datadog
63
47
  def initialize(*args, &blk)
64
48
  # attach the Pin instance
65
49
  initialize_without_datadog(*args, &blk)
50
+ tracer = Datadog.configuration[:mongo][:tracer]
66
51
  service = Datadog.configuration[:mongo][:service_name]
67
- pin = Datadog::Pin.new(service, app: APP, app_type: Datadog::Ext::AppTypes::DB)
52
+ pin = Datadog::Pin.new(
53
+ service,
54
+ app: Datadog::Contrib::MongoDB::Ext::APP,
55
+ app_type: Datadog::Ext::AppTypes::DB,
56
+ tracer: tracer
57
+ )
68
58
  pin.onto(self)
69
59
  end
70
60
 
@@ -1,6 +1,8 @@
1
+ require 'ddtrace/contrib/mongodb/ext'
2
+ require 'ddtrace/contrib/mongodb/parsers'
3
+
1
4
  module Datadog
2
5
  module Contrib
3
- # MongoDB module includes classes and functions to instrument MongoDB clients
4
6
  module MongoDB
5
7
  # `MongoCommandSubscriber` listens to all events from the `Monitoring`
6
8
  # system available in the Mongo driver.
@@ -14,20 +16,19 @@ module Datadog
14
16
  # thread is involved in this execution so thread-local storage should be safe. Reference:
15
17
  # https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/monitoring.rb#L70
16
18
  # https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/monitoring/publishable.rb#L38-L56
17
- span = pin.tracer.trace('mongo.cmd', service: pin.service, span_type: Datadog::Ext::Mongo::TYPE)
19
+ span = pin.tracer.trace(Ext::SPAN_COMMAND, service: pin.service, span_type: Ext::SPAN_TYPE_COMMAND)
18
20
  Thread.current[:datadog_mongo_span] = span
19
21
 
20
22
  # build a quantized Query using the Parser module
21
- query = Datadog::Contrib::MongoDB
22
- .query_builder(event.command_name, event.database_name, event.command)
23
+ query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
23
24
  serialized_query = query.to_s
24
25
 
25
26
  # add operation tags; the full query is stored and used as a resource,
26
27
  # since it has been quantized and reduced
27
- span.set_tag(Datadog::Ext::Mongo::DB, query['database'])
28
- span.set_tag(Datadog::Ext::Mongo::COLLECTION, query['collection'])
29
- span.set_tag(Datadog::Ext::Mongo::OPERATION, query['operation'])
30
- span.set_tag(Datadog::Ext::Mongo::QUERY, serialized_query)
28
+ span.set_tag(Ext::TAG_DB, query['database'])
29
+ span.set_tag(Ext::TAG_COLLECTION, query['collection'])
30
+ span.set_tag(Ext::TAG_OPERATION, query['operation'])
31
+ span.set_tag(Ext::TAG_QUERY, serialized_query)
31
32
  span.set_tag(Datadog::Ext::NET::TARGET_HOST, event.address.host)
32
33
  span.set_tag(Datadog::Ext::NET::TARGET_PORT, event.address.port)
33
34
 
@@ -47,7 +48,7 @@ module Datadog
47
48
  ensure
48
49
  # whatever happens, the Span must be removed from the local storage and
49
50
  # it must be finished to prevent any leak
50
- span.finish() unless span.nil?
51
+ span.finish unless span.nil?
51
52
  Thread.current[:datadog_mongo_span] = nil
52
53
  end
53
54
 
@@ -57,13 +58,13 @@ module Datadog
57
58
 
58
59
  # add fields that are available only after executing the query
59
60
  rows = event.reply.fetch('n', nil)
60
- span.set_tag(Datadog::Ext::Mongo::ROWS, rows) unless rows.nil?
61
+ span.set_tag(Ext::TAG_ROWS, rows) unless rows.nil?
61
62
  rescue StandardError => e
62
63
  Datadog::Tracer.log.debug("error when handling MongoDB 'succeeded' event: #{e}")
63
64
  ensure
64
65
  # whatever happens, the Span must be removed from the local storage and
65
66
  # it must be finished to prevent any leak
66
- span.finish() unless span.nil?
67
+ span.finish unless span.nil?
67
68
  Thread.current[:datadog_mongo_span] = nil
68
69
  end
69
70
  end
@@ -1,5 +1,7 @@
1
- require 'ddtrace/ext/sql'
2
1
  require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/ext/net'
3
+ require 'ddtrace/ext/sql'
4
+ require 'ddtrace/contrib/mysql2/ext'
3
5
 
4
6
  module Datadog
5
7
  module Contrib
@@ -34,13 +36,13 @@ module Datadog
34
36
  end
35
37
 
36
38
  def query(sql, options = {})
37
- datadog_pin.tracer.trace('mysql2.query') do |span|
39
+ datadog_pin.tracer.trace(Ext::SPAN_QUERY) do |span|
38
40
  span.resource = sql
39
41
  span.service = datadog_pin.service
40
42
  span.span_type = Datadog::Ext::SQL::TYPE
41
- span.set_tag('mysql2.db.name', query_options[:database])
42
- span.set_tag('out.host', query_options[:host])
43
- span.set_tag('out.port', query_options[:port])
43
+ span.set_tag(Ext::TAG_DB_NAME, query_options[:database])
44
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, query_options[:host])
45
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, query_options[:port])
44
46
  super(sql, options)
45
47
  end
46
48
  end
@@ -48,7 +50,7 @@ module Datadog
48
50
  def datadog_pin
49
51
  @datadog_pin ||= Datadog::Pin.new(
50
52
  Datadog.configuration[:mysql2][:service_name],
51
- app: 'mysql2',
53
+ app: Ext::APP,
52
54
  app_type: Datadog::Ext::AppTypes::DB,
53
55
  tracer: Datadog.configuration[:mysql2][:tracer]
54
56
  )