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.
- checksums.yaml +4 -4
- data/Appraisals +3 -3
- data/CHANGELOG.md +24 -2
- data/Rakefile +14 -28
- data/docker-compose.yml +1 -0
- data/docs/GettingStarted.md +302 -263
- data/lib/ddtrace.rb +22 -21
- data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +23 -0
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +4 -2
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +2 -2
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +2 -2
- data/lib/ddtrace/contrib/active_model_serializers/ext.rb +17 -0
- data/lib/ddtrace/contrib/active_model_serializers/integration.rb +39 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +24 -43
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +3 -2
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +6 -7
- data/lib/ddtrace/contrib/active_record/events/sql.rb +10 -8
- data/lib/ddtrace/contrib/active_record/ext.rb +22 -0
- data/lib/ddtrace/contrib/aws/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/aws/ext.rb +21 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +11 -9
- data/lib/ddtrace/contrib/aws/integration.rb +32 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +42 -41
- data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +3 -1
- data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +11 -0
- data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +7 -3
- data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -0
- data/lib/ddtrace/contrib/dalli/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/dalli/ext.rb +15 -0
- data/lib/ddtrace/contrib/dalli/instrumentation.rb +3 -3
- data/lib/ddtrace/contrib/dalli/integration.rb +36 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +31 -38
- data/lib/ddtrace/contrib/dalli/quantize.rb +3 -3
- data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/delayed_job/ext.rb +18 -0
- data/lib/ddtrace/contrib/delayed_job/integration.rb +32 -0
- data/lib/ddtrace/contrib/delayed_job/patcher.rb +20 -27
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +7 -6
- data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +16 -0
- data/lib/ddtrace/contrib/elasticsearch/ext.rb +18 -0
- data/lib/ddtrace/contrib/elasticsearch/integration.rb +37 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +30 -39
- data/lib/ddtrace/contrib/excon/configuration/settings.rb +18 -0
- data/lib/ddtrace/contrib/excon/ext.rb +13 -0
- data/lib/ddtrace/contrib/excon/integration.rb +32 -0
- data/lib/ddtrace/contrib/excon/middleware.rb +10 -10
- data/lib/ddtrace/contrib/excon/patcher.rb +14 -30
- data/lib/ddtrace/contrib/faraday/configuration/settings.rb +23 -0
- data/lib/ddtrace/contrib/faraday/ext.rb +13 -0
- data/lib/ddtrace/contrib/faraday/integration.rb +36 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +10 -9
- data/lib/ddtrace/contrib/faraday/patcher.rb +39 -54
- data/lib/ddtrace/contrib/grape/configuration/settings.rb +16 -0
- data/lib/ddtrace/contrib/grape/endpoint.rb +10 -13
- data/lib/ddtrace/contrib/grape/ext.rb +19 -0
- data/lib/ddtrace/contrib/grape/integration.rb +36 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +24 -24
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +20 -0
- data/lib/ddtrace/contrib/graphql/ext.rb +11 -0
- data/lib/ddtrace/contrib/graphql/integration.rb +38 -0
- data/lib/ddtrace/contrib/graphql/patcher.rb +33 -41
- data/lib/ddtrace/contrib/grpc/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +5 -2
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +5 -2
- data/lib/ddtrace/contrib/grpc/ext.rb +14 -0
- data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +25 -35
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +39 -0
- data/lib/ddtrace/contrib/http/configuration/settings.rb +16 -0
- data/lib/ddtrace/contrib/http/ext.rb +13 -0
- data/lib/ddtrace/contrib/http/integration.rb +32 -0
- data/lib/ddtrace/contrib/http/patcher.rb +10 -58
- data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +18 -0
- data/lib/ddtrace/contrib/mongodb/ext.rb +20 -0
- data/lib/ddtrace/contrib/mongodb/integration.rb +36 -0
- data/lib/ddtrace/contrib/mongodb/patcher.rb +17 -27
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +12 -11
- data/lib/ddtrace/contrib/mysql2/client.rb +8 -6
- data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/mysql2/ext.rb +15 -0
- data/lib/ddtrace/contrib/mysql2/integration.rb +32 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +12 -22
- data/lib/ddtrace/contrib/racecar/configuration/settings.rb +23 -0
- data/lib/ddtrace/contrib/racecar/event.rb +7 -6
- data/lib/ddtrace/contrib/racecar/events/batch.rb +2 -2
- data/lib/ddtrace/contrib/racecar/events/message.rb +2 -2
- data/lib/ddtrace/contrib/racecar/ext.rb +21 -0
- data/lib/ddtrace/contrib/racecar/integration.rb +36 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +24 -41
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +39 -0
- data/lib/ddtrace/contrib/rack/ext.rb +18 -0
- data/lib/ddtrace/contrib/rack/integration.rb +32 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +5 -2
- data/lib/ddtrace/contrib/rack/patcher.rb +22 -40
- data/lib/ddtrace/contrib/rails/action_controller.rb +10 -7
- data/lib/ddtrace/contrib/rails/action_controller_patch.rb +1 -0
- data/lib/ddtrace/contrib/rails/active_support.rb +9 -9
- data/lib/ddtrace/contrib/rails/configuration/settings.rb +26 -0
- data/lib/ddtrace/contrib/rails/core_extensions.rb +12 -15
- data/lib/ddtrace/contrib/rails/ext.rb +30 -0
- data/lib/ddtrace/contrib/rails/framework.rb +3 -2
- data/lib/ddtrace/contrib/rails/integration.rb +37 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +56 -63
- data/lib/ddtrace/contrib/rails/railtie.rb +3 -10
- data/lib/ddtrace/contrib/rake/configuration/settings.rb +17 -0
- data/lib/ddtrace/contrib/rake/ext.rb +18 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +7 -8
- data/lib/ddtrace/contrib/rake/integration.rb +36 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +23 -33
- data/lib/ddtrace/contrib/redis/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/redis/ext.rb +19 -0
- data/lib/ddtrace/contrib/redis/integration.rb +36 -0
- data/lib/ddtrace/contrib/redis/patcher.rb +21 -29
- data/lib/ddtrace/contrib/redis/tags.rb +3 -3
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +16 -0
- data/lib/ddtrace/contrib/resque/ext.rb +13 -0
- data/lib/ddtrace/contrib/resque/integration.rb +37 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +30 -36
- data/lib/ddtrace/contrib/resque/resque_job.rb +2 -1
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +5 -8
- data/lib/ddtrace/contrib/rest_client/ext.rb +13 -0
- data/lib/ddtrace/contrib/rest_client/integration.rb +9 -1
- data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +9 -10
- data/lib/ddtrace/contrib/sequel/configuration/settings.rb +2 -0
- data/lib/ddtrace/contrib/sequel/database.rb +4 -3
- data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
- data/lib/ddtrace/contrib/sequel/ext.rb +15 -0
- data/lib/ddtrace/contrib/sequel/integration.rb +1 -3
- data/lib/ddtrace/contrib/sequel/patcher.rb +0 -1
- data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/sidekiq/ext.rb +19 -0
- data/lib/ddtrace/contrib/sidekiq/integration.rb +36 -0
- data/lib/ddtrace/contrib/sidekiq/patcher.rb +18 -18
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +10 -10
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +27 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +3 -4
- data/lib/ddtrace/contrib/sinatra/ext.rb +19 -0
- data/lib/ddtrace/contrib/sinatra/integration.rb +36 -0
- data/lib/ddtrace/contrib/sinatra/patcher.rb +33 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +4 -34
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +2 -3
- data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +15 -0
- data/lib/ddtrace/contrib/sucker_punch/ext.rb +18 -0
- data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +6 -5
- data/lib/ddtrace/contrib/sucker_punch/integration.rb +36 -0
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +29 -35
- data/lib/ddtrace/encoding.rb +21 -16
- data/lib/ddtrace/span.rb +29 -0
- data/lib/ddtrace/transport.rb +2 -2
- data/lib/ddtrace/version.rb +2 -2
- metadata +74 -6
- data/lib/ddtrace/ext/cache.rb +0 -8
- data/lib/ddtrace/ext/grpc.rb +0 -7
- data/lib/ddtrace/ext/mongo.rb +0 -12
- 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,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
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
14
|
+
done?(:mongo)
|
|
23
15
|
end
|
|
24
16
|
|
|
25
17
|
def patch
|
|
26
|
-
|
|
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(
|
|
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(
|
|
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 =
|
|
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(
|
|
28
|
-
span.set_tag(
|
|
29
|
-
span.set_tag(
|
|
30
|
-
span.set_tag(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
42
|
-
span.set_tag(
|
|
43
|
-
span.set_tag(
|
|
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:
|
|
53
|
+
app: Ext::APP,
|
|
52
54
|
app_type: Datadog::Ext::AppTypes::DB,
|
|
53
55
|
tracer: Datadog.configuration[:mysql2][:tracer]
|
|
54
56
|
)
|