ddtrace 0.12.0 → 0.13.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/.circleci/config.yml +468 -0
- data/.circleci/images/primary/Dockerfile-1.9.3 +69 -0
- data/.circleci/images/primary/Dockerfile-2.0.0 +69 -0
- data/.circleci/images/primary/Dockerfile-2.1.10 +69 -0
- data/.circleci/images/primary/Dockerfile-2.2.10 +69 -0
- data/.circleci/images/primary/Dockerfile-2.3.7 +73 -0
- data/.circleci/images/primary/Dockerfile-2.4.4 +73 -0
- data/.dockerignore +1 -0
- data/.env +21 -11
- data/.gitignore +1 -1
- data/.rubocop.yml +4 -1
- data/Appraisals +471 -66
- data/CHANGELOG.md +80 -2
- data/Rakefile +304 -80
- data/ddtrace.gemspec +7 -7
- data/docker-compose.yml +240 -37
- data/docs/GettingStarted.md +273 -7
- data/lib/ddtrace/configuration.rb +2 -2
- data/lib/ddtrace/contrib/active_model_serializers/event.rb +57 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +32 -0
- data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +35 -0
- data/lib/ddtrace/contrib/active_model_serializers/events.rb +30 -0
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +62 -0
- data/lib/ddtrace/contrib/active_record/event.rb +30 -0
- data/lib/ddtrace/contrib/active_record/events/instantiation.rb +51 -0
- data/lib/ddtrace/contrib/active_record/events/sql.rb +48 -0
- data/lib/ddtrace/contrib/active_record/events.rb +30 -0
- data/lib/ddtrace/contrib/active_record/patcher.rb +3 -73
- data/lib/ddtrace/contrib/active_record/utils.rb +1 -15
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +62 -0
- data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -2
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -2
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +18 -49
- data/lib/ddtrace/contrib/excon/middleware.rb +139 -0
- data/lib/ddtrace/contrib/excon/patcher.rb +50 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +49 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +66 -0
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +65 -0
- data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +49 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +62 -0
- data/lib/ddtrace/contrib/http/patcher.rb +18 -16
- data/lib/ddtrace/contrib/mongodb/parsers.rb +24 -13
- data/lib/ddtrace/contrib/mongodb/patcher.rb +1 -0
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +5 -4
- data/lib/ddtrace/contrib/mysql2/client.rb +60 -0
- data/lib/ddtrace/contrib/mysql2/patcher.rb +43 -0
- data/lib/ddtrace/contrib/racecar/event.rb +61 -0
- data/lib/ddtrace/contrib/racecar/events/batch.rb +27 -0
- data/lib/ddtrace/contrib/racecar/events/message.rb +27 -0
- data/lib/ddtrace/contrib/racecar/events.rb +30 -0
- data/lib/ddtrace/contrib/racecar/patcher.rb +6 -52
- data/lib/ddtrace/contrib/rack/middlewares.rb +65 -11
- data/lib/ddtrace/contrib/rack/patcher.rb +16 -0
- data/lib/ddtrace/contrib/rack/request_queue.rb +34 -0
- data/lib/ddtrace/contrib/rails/action_controller_patch.rb +77 -0
- data/lib/ddtrace/contrib/rails/action_view.rb +0 -65
- data/lib/ddtrace/contrib/rails/active_support.rb +9 -8
- data/lib/ddtrace/contrib/rails/core_extensions.rb +74 -115
- data/lib/ddtrace/contrib/rake/instrumentation.rb +70 -0
- data/lib/ddtrace/contrib/rake/patcher.rb +53 -0
- data/lib/ddtrace/contrib/sequel/database.rb +58 -0
- data/lib/ddtrace/contrib/sequel/dataset.rb +59 -0
- data/lib/ddtrace/contrib/sequel/patcher.rb +56 -0
- data/lib/ddtrace/contrib/sequel/utils.rb +28 -0
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +1 -0
- data/lib/ddtrace/contrib/sinatra/env.rb +39 -0
- data/lib/ddtrace/contrib/sinatra/headers.rb +31 -0
- data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -38
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +61 -0
- data/lib/ddtrace/ext/distributed.rb +5 -0
- data/lib/ddtrace/ext/grpc.rb +7 -0
- data/lib/ddtrace/ext/http.rb +35 -5
- data/lib/ddtrace/propagation/grpc_propagator.rb +54 -0
- data/lib/ddtrace/quantization/hash.rb +103 -0
- data/lib/ddtrace/tracer.rb +4 -1
- data/lib/ddtrace/utils/database.rb +21 -0
- data/lib/ddtrace/utils.rb +12 -2
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace.rb +7 -0
- metadata +50 -21
- data/circle.yml +0 -69
- data/gemfiles/contrib.gemfile +0 -25
- data/gemfiles/contrib_old.gemfile +0 -23
- data/gemfiles/rails30_postgres.gemfile +0 -11
- data/gemfiles/rails30_postgres_sidekiq.gemfile +0 -12
- data/gemfiles/rails32_mysql2.gemfile +0 -12
- data/gemfiles/rails32_postgres.gemfile +0 -11
- data/gemfiles/rails32_postgres_redis.gemfile +0 -13
- data/gemfiles/rails32_postgres_sidekiq.gemfile +0 -12
- data/gemfiles/rails4_mysql2.gemfile +0 -10
- data/gemfiles/rails4_postgres.gemfile +0 -10
- data/gemfiles/rails4_postgres_redis.gemfile +0 -12
- data/gemfiles/rails4_postgres_sidekiq.gemfile +0 -12
- data/gemfiles/rails5_mysql2.gemfile +0 -9
- data/gemfiles/rails5_postgres.gemfile +0 -9
- data/gemfiles/rails5_postgres_redis.gemfile +0 -11
- data/gemfiles/rails5_postgres_sidekiq.gemfile +0 -11
|
@@ -9,11 +9,11 @@ module Datadog
|
|
|
9
9
|
|
|
10
10
|
def initialize(options = {})
|
|
11
11
|
@registry = options.fetch(:registry, Datadog.registry)
|
|
12
|
+
@wrapped_registry = {}
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def [](integration_name)
|
|
15
|
-
|
|
16
|
-
Proxy.new(integration)
|
|
16
|
+
@wrapped_registry[integration_name] ||= Proxy.new(fetch_integration(integration_name))
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def use(integration_name, options = {})
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_support/notifications/event'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveModelSerializers
|
|
6
|
+
# Defines basic behaviors for an ActiveModelSerializers event.
|
|
7
|
+
module Event
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.send(:include, ActiveSupport::Notifications::Event)
|
|
10
|
+
base.send(:extend, ClassMethods)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Class methods for ActiveModelSerializers events.
|
|
14
|
+
# Note, they share the same process method and before_trace method.
|
|
15
|
+
module ClassMethods
|
|
16
|
+
def span_options
|
|
17
|
+
{ service: configuration[:service_name] }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def tracer
|
|
21
|
+
configuration[:tracer]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def configuration
|
|
25
|
+
Datadog.configuration[:active_model_serializers]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def process(span, event, _id, payload)
|
|
29
|
+
span.service = configuration[:service_name]
|
|
30
|
+
|
|
31
|
+
# Set the resource name and serializer name
|
|
32
|
+
res = resource(payload[:serializer])
|
|
33
|
+
span.resource = res
|
|
34
|
+
span.set_tag('active_model_serializers.serializer', res)
|
|
35
|
+
|
|
36
|
+
span.span_type = Datadog::Ext::HTTP::TEMPLATE
|
|
37
|
+
|
|
38
|
+
# Will be nil in 0.9
|
|
39
|
+
span.set_tag('active_model_serializers.adapter', payload[:adapter].class) unless payload[:adapter].nil?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def resource(serializer)
|
|
45
|
+
# Depending on the version of ActiveModelSerializers
|
|
46
|
+
# serializer will be a string or an object.
|
|
47
|
+
if serializer.respond_to?(:name)
|
|
48
|
+
serializer.name
|
|
49
|
+
else
|
|
50
|
+
serializer
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_model_serializers/event'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveModelSerializers
|
|
6
|
+
module Events
|
|
7
|
+
# Defines instrumentation for render.active_model_serializers event
|
|
8
|
+
module Render
|
|
9
|
+
include ActiveModelSerializers::Event
|
|
10
|
+
|
|
11
|
+
EVENT_NAME = 'render.active_model_serializers'.freeze
|
|
12
|
+
SPAN_NAME = 'active_model_serializers.render'.freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def supported?
|
|
17
|
+
Gem.loaded_specs['active_model_serializers'] \
|
|
18
|
+
&& Gem.loaded_specs['active_model_serializers'].version >= Gem::Version.new('0.10')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def event_name
|
|
22
|
+
self::EVENT_NAME
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def span_name
|
|
26
|
+
self::SPAN_NAME
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_model_serializers/event'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveModelSerializers
|
|
6
|
+
module Events
|
|
7
|
+
# Defines instrumentation for !serialize.active_model_serializers event
|
|
8
|
+
module Serialize
|
|
9
|
+
include ActiveModelSerializers::Event
|
|
10
|
+
|
|
11
|
+
EVENT_NAME = '!serialize.active_model_serializers'.freeze
|
|
12
|
+
SPAN_NAME = 'active_model_serializers.serialize'.freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def supported?
|
|
17
|
+
Gem.loaded_specs['active_model_serializers'] \
|
|
18
|
+
&& ( \
|
|
19
|
+
Gem.loaded_specs['active_model_serializers'].version >= Gem::Version.new('0.9') \
|
|
20
|
+
&& Gem.loaded_specs['active_model_serializers'].version < Gem::Version.new('0.10') \
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def event_name
|
|
25
|
+
self::EVENT_NAME
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def span_name
|
|
29
|
+
self::SPAN_NAME
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_model_serializers/events/render'
|
|
2
|
+
require 'ddtrace/contrib/active_model_serializers/events/serialize'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module ActiveModelSerializers
|
|
7
|
+
# Defines collection of instrumented ActiveModelSerializers events
|
|
8
|
+
module Events
|
|
9
|
+
ALL = [
|
|
10
|
+
Events::Render,
|
|
11
|
+
Events::Serialize
|
|
12
|
+
].freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def all
|
|
17
|
+
self::ALL
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def subscriptions
|
|
21
|
+
all.collect(&:subscriptions).collect(&:to_a).flatten
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def subscribe!
|
|
25
|
+
all.each(&:subscribe!)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'ddtrace/ext/app_types'
|
|
2
|
+
require 'ddtrace/ext/http'
|
|
3
|
+
require 'ddtrace/contrib/active_model_serializers/events'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module ActiveModelSerializers
|
|
8
|
+
# Provides instrumentation for ActiveModelSerializers through ActiveSupport instrumentation signals
|
|
9
|
+
module Patcher
|
|
10
|
+
include Base
|
|
11
|
+
|
|
12
|
+
VERSION_REQUIRED = Gem::Version.new('0.9.0')
|
|
13
|
+
|
|
14
|
+
register_as :active_model_serializers
|
|
15
|
+
|
|
16
|
+
option :service_name, default: 'active_model_serializers'
|
|
17
|
+
option :tracer, default: Datadog.tracer do |value|
|
|
18
|
+
(value || Datadog.tracer).tap do |v|
|
|
19
|
+
# Make sure to update tracers of all subscriptions
|
|
20
|
+
Events.subscriptions.each do |subscription|
|
|
21
|
+
subscription.tracer = v
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class << self
|
|
27
|
+
def patch
|
|
28
|
+
return patched? if patched? || !compatible?
|
|
29
|
+
|
|
30
|
+
# Subscribe to ActiveModelSerializers events
|
|
31
|
+
Events.subscribe!
|
|
32
|
+
|
|
33
|
+
# Set service info
|
|
34
|
+
configuration[:tracer].set_service_info(
|
|
35
|
+
configuration[:service_name],
|
|
36
|
+
'active_model_serializers',
|
|
37
|
+
Ext::AppTypes::WEB
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
@patched = true
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def patched?
|
|
44
|
+
return @patched if defined?(@patched)
|
|
45
|
+
@patched = false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def configuration
|
|
51
|
+
Datadog.configuration[:active_model_serializers]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def compatible?
|
|
55
|
+
Gem.loaded_specs['active_model_serializers'] && Gem.loaded_specs['activesupport'] \
|
|
56
|
+
&& Gem.loaded_specs['active_model_serializers'].version >= VERSION_REQUIRED
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_support/notifications/event'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
# Defines basic behaviors for an ActiveRecord event.
|
|
7
|
+
module Event
|
|
8
|
+
def self.included(base)
|
|
9
|
+
base.send(:include, ActiveSupport::Notifications::Event)
|
|
10
|
+
base.send(:extend, ClassMethods)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Class methods for ActiveRecord events.
|
|
14
|
+
module ClassMethods
|
|
15
|
+
def span_options
|
|
16
|
+
{ service: configuration[:service_name] }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def tracer
|
|
20
|
+
configuration[:tracer]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def configuration
|
|
24
|
+
Datadog.configuration[:active_record]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_record/event'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Events
|
|
7
|
+
# Defines instrumentation for instantiation.active_record event
|
|
8
|
+
module Instantiation
|
|
9
|
+
include ActiveRecord::Event
|
|
10
|
+
|
|
11
|
+
EVENT_NAME = 'instantiation.active_record'.freeze
|
|
12
|
+
SPAN_NAME = 'active_record.instantiation'.freeze
|
|
13
|
+
DEFAULT_SERVICE_NAME = 'active_record'.freeze
|
|
14
|
+
|
|
15
|
+
module_function
|
|
16
|
+
|
|
17
|
+
def supported?
|
|
18
|
+
Gem.loaded_specs['activerecord'] \
|
|
19
|
+
&& Gem.loaded_specs['activerecord'].version >= Gem::Version.new('4.2')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def event_name
|
|
23
|
+
self::EVENT_NAME
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def span_name
|
|
27
|
+
self::SPAN_NAME
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def process(span, event, _id, payload)
|
|
31
|
+
# Inherit service name from parent, if available.
|
|
32
|
+
span.service = if configuration[:orm_service_name]
|
|
33
|
+
configuration[:orm_service_name]
|
|
34
|
+
elsif span.parent
|
|
35
|
+
span.parent.service
|
|
36
|
+
else
|
|
37
|
+
self::DEFAULT_SERVICE_NAME
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
span.resource = payload.fetch(:class_name)
|
|
41
|
+
span.span_type = 'custom'
|
|
42
|
+
span.set_tag('active_record.instantiation.class_name', payload.fetch(:class_name))
|
|
43
|
+
span.set_tag('active_record.instantiation.record_count', payload.fetch(:record_count))
|
|
44
|
+
rescue StandardError => e
|
|
45
|
+
Datadog::Tracer.log.debug(e.message)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_record/event'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveRecord
|
|
6
|
+
module Events
|
|
7
|
+
# Defines instrumentation for sql.active_record event
|
|
8
|
+
module SQL
|
|
9
|
+
include ActiveRecord::Event
|
|
10
|
+
|
|
11
|
+
EVENT_NAME = 'sql.active_record'.freeze
|
|
12
|
+
SPAN_NAME = 'active_record.sql'.freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def event_name
|
|
17
|
+
self::EVENT_NAME
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def span_name
|
|
21
|
+
self::SPAN_NAME
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def process(span, event, _id, payload)
|
|
25
|
+
connection_config = Utils.connection_config(payload[:connection_id])
|
|
26
|
+
span.name = "#{connection_config[:adapter_name]}.query"
|
|
27
|
+
span.service = configuration[:service_name]
|
|
28
|
+
span.resource = payload.fetch(:sql)
|
|
29
|
+
span.span_type = Datadog::Ext::SQL::TYPE
|
|
30
|
+
|
|
31
|
+
# Find out if the SQL query has been cached in this request. This meta is really
|
|
32
|
+
# helpful to users because some spans may have 0ns of duration because the query
|
|
33
|
+
# is simply cached from memory, so the notification is fired with start == finish.
|
|
34
|
+
cached = payload[:cached] || (payload[:name] == 'CACHE')
|
|
35
|
+
|
|
36
|
+
span.set_tag('active_record.db.vendor', connection_config[:adapter_name])
|
|
37
|
+
span.set_tag('active_record.db.name', connection_config[:database_name])
|
|
38
|
+
span.set_tag('active_record.db.cached', cached) if cached
|
|
39
|
+
span.set_tag('out.host', connection_config[:adapter_host])
|
|
40
|
+
span.set_tag('out.port', connection_config[:adapter_port])
|
|
41
|
+
rescue StandardError => e
|
|
42
|
+
Datadog::Tracer.log.debug(e.message)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_record/events/instantiation'
|
|
2
|
+
require 'ddtrace/contrib/active_record/events/sql'
|
|
3
|
+
|
|
4
|
+
module Datadog
|
|
5
|
+
module Contrib
|
|
6
|
+
module ActiveRecord
|
|
7
|
+
# Defines collection of instrumented ActiveRecord events
|
|
8
|
+
module Events
|
|
9
|
+
ALL = [
|
|
10
|
+
Events::Instantiation,
|
|
11
|
+
Events::SQL
|
|
12
|
+
].freeze
|
|
13
|
+
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
def all
|
|
17
|
+
self::ALL
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def subscriptions
|
|
21
|
+
all.collect(&:subscriptions).collect(&:to_a).flatten
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def subscribe!
|
|
25
|
+
all.each(&:subscribe!)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/ext/sql'
|
|
2
2
|
require 'ddtrace/ext/app_types'
|
|
3
3
|
require 'ddtrace/contrib/active_record/utils'
|
|
4
|
-
require 'ddtrace/contrib/
|
|
4
|
+
require 'ddtrace/contrib/active_record/events'
|
|
5
5
|
|
|
6
6
|
module Datadog
|
|
7
7
|
module Contrib
|
|
@@ -9,10 +9,6 @@ module Datadog
|
|
|
9
9
|
# Patcher enables patching of 'active_record' module.
|
|
10
10
|
module Patcher
|
|
11
11
|
include Base
|
|
12
|
-
include ActiveSupport::Notifications::Subscriber
|
|
13
|
-
|
|
14
|
-
NAME_SQL = 'sql.active_record'.freeze
|
|
15
|
-
NAME_INSTANTIATION = 'instantiation.active_record'.freeze
|
|
16
12
|
|
|
17
13
|
register_as :active_record, auto_patch: false
|
|
18
14
|
option :service_name, depends_on: [:tracer] do |value|
|
|
@@ -24,7 +20,7 @@ module Datadog
|
|
|
24
20
|
option :tracer, default: Datadog.tracer do |value|
|
|
25
21
|
(value || Datadog.tracer).tap do |v|
|
|
26
22
|
# Make sure to update tracers of all subscriptions
|
|
27
|
-
subscriptions.each do |subscription|
|
|
23
|
+
Events.subscriptions.each do |subscription|
|
|
28
24
|
subscription.tracer = v
|
|
29
25
|
end
|
|
30
26
|
end
|
|
@@ -32,28 +28,6 @@ module Datadog
|
|
|
32
28
|
|
|
33
29
|
@patched = false
|
|
34
30
|
|
|
35
|
-
on_subscribe do
|
|
36
|
-
# sql.active_record
|
|
37
|
-
subscribe(
|
|
38
|
-
self::NAME_SQL, # Event name
|
|
39
|
-
'active_record.sql', # Span name
|
|
40
|
-
{ service: get_option(:service_name) }, # Span options
|
|
41
|
-
get_option(:tracer), # Tracer
|
|
42
|
-
&method(:sql) # Handler
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
# instantiation.active_record
|
|
46
|
-
if instantiation_tracing_supported?
|
|
47
|
-
subscribe(
|
|
48
|
-
self::NAME_INSTANTIATION, # Event name
|
|
49
|
-
'active_record.instantiation', # Span name
|
|
50
|
-
{ service: get_option(:service_name) }, # Span options
|
|
51
|
-
get_option(:tracer), # Tracer
|
|
52
|
-
&method(:instantiation) # Handler
|
|
53
|
-
)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
31
|
module_function
|
|
58
32
|
|
|
59
33
|
# patched? tells whether patch has been successfully applied
|
|
@@ -64,7 +38,7 @@ module Datadog
|
|
|
64
38
|
def patch
|
|
65
39
|
if !@patched && defined?(::ActiveRecord)
|
|
66
40
|
begin
|
|
67
|
-
subscribe!
|
|
41
|
+
Events.subscribe!
|
|
68
42
|
@patched = true
|
|
69
43
|
rescue StandardError => e
|
|
70
44
|
Datadog::Tracer.log.error("Unable to apply Active Record integration: #{e}")
|
|
@@ -73,50 +47,6 @@ module Datadog
|
|
|
73
47
|
|
|
74
48
|
@patched
|
|
75
49
|
end
|
|
76
|
-
|
|
77
|
-
def instantiation_tracing_supported?
|
|
78
|
-
Gem.loaded_specs['activerecord'] \
|
|
79
|
-
&& Gem.loaded_specs['activerecord'].version >= Gem::Version.new('4.2')
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def sql(span, event, _id, payload)
|
|
83
|
-
connection_config = Utils.connection_config(payload[:connection_id])
|
|
84
|
-
span.name = "#{connection_config[:adapter_name]}.query"
|
|
85
|
-
span.service = get_option(:service_name)
|
|
86
|
-
span.resource = payload.fetch(:sql)
|
|
87
|
-
span.span_type = Datadog::Ext::SQL::TYPE
|
|
88
|
-
|
|
89
|
-
# Find out if the SQL query has been cached in this request. This meta is really
|
|
90
|
-
# helpful to users because some spans may have 0ns of duration because the query
|
|
91
|
-
# is simply cached from memory, so the notification is fired with start == finish.
|
|
92
|
-
cached = payload[:cached] || (payload[:name] == 'CACHE')
|
|
93
|
-
|
|
94
|
-
span.set_tag('active_record.db.vendor', connection_config[:adapter_name])
|
|
95
|
-
span.set_tag('active_record.db.name', connection_config[:database_name])
|
|
96
|
-
span.set_tag('active_record.db.cached', cached) if cached
|
|
97
|
-
span.set_tag('out.host', connection_config[:adapter_host])
|
|
98
|
-
span.set_tag('out.port', connection_config[:adapter_port])
|
|
99
|
-
rescue StandardError => e
|
|
100
|
-
Datadog::Tracer.log.debug(e.message)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def instantiation(span, event, _id, payload)
|
|
104
|
-
# Inherit service name from parent, if available.
|
|
105
|
-
span.service = if get_option(:orm_service_name)
|
|
106
|
-
get_option(:orm_service_name)
|
|
107
|
-
elsif span.parent
|
|
108
|
-
span.parent.service
|
|
109
|
-
else
|
|
110
|
-
'active_record'
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
span.resource = payload.fetch(:class_name)
|
|
114
|
-
span.span_type = 'custom'
|
|
115
|
-
span.set_tag('active_record.instantiation.class_name', payload.fetch(:class_name))
|
|
116
|
-
span.set_tag('active_record.instantiation.record_count', payload.fetch(:record_count))
|
|
117
|
-
rescue StandardError => e
|
|
118
|
-
Datadog::Tracer.log.debug(e.message)
|
|
119
|
-
end
|
|
120
50
|
end
|
|
121
51
|
end
|
|
122
52
|
end
|
|
@@ -3,20 +3,6 @@ module Datadog
|
|
|
3
3
|
module ActiveRecord
|
|
4
4
|
# Common utilities for Rails
|
|
5
5
|
module Utils
|
|
6
|
-
# Return a canonical name for a type of database
|
|
7
|
-
def self.normalize_vendor(vendor)
|
|
8
|
-
case vendor
|
|
9
|
-
when nil
|
|
10
|
-
'defaultdb'
|
|
11
|
-
when 'postgresql'
|
|
12
|
-
'postgres'
|
|
13
|
-
when 'sqlite3'
|
|
14
|
-
'sqlite'
|
|
15
|
-
else
|
|
16
|
-
vendor
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
6
|
def self.adapter_name
|
|
21
7
|
connection_config[:adapter_name]
|
|
22
8
|
end
|
|
@@ -36,7 +22,7 @@ module Datadog
|
|
|
36
22
|
def self.connection_config(object_id = nil)
|
|
37
23
|
config = object_id.nil? ? default_connection_config : connection_config_by_id(object_id)
|
|
38
24
|
{
|
|
39
|
-
adapter_name: normalize_vendor(config[:adapter]),
|
|
25
|
+
adapter_name: Datadog::Utils::Database.normalize_vendor(config[:adapter]),
|
|
40
26
|
adapter_host: config[:host],
|
|
41
27
|
adapter_port: config[:port],
|
|
42
28
|
database_name: config[:database]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'ddtrace/contrib/active_support/notifications/subscriber'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module ActiveSupport
|
|
6
|
+
module Notifications
|
|
7
|
+
# Defines behaviors for an ActiveSupport::Notifications event.
|
|
8
|
+
# Compose this into a module or class, then define
|
|
9
|
+
# #event_name, #span_name, and #process. You can then
|
|
10
|
+
# invoke Event.subscribe! to more easily subscribe to an event.
|
|
11
|
+
module Event
|
|
12
|
+
def self.included(base)
|
|
13
|
+
base.send(:include, Subscriber)
|
|
14
|
+
base.send(:extend, ClassMethods)
|
|
15
|
+
base.send(:on_subscribe) { base.subscribe }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Redefines some class behaviors for a Subscriber to make
|
|
19
|
+
# it a bit simpler for an Event.
|
|
20
|
+
module ClassMethods
|
|
21
|
+
def subscribe!
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def subscription(span_name = nil, options = nil, tracer = nil)
|
|
26
|
+
super(
|
|
27
|
+
span_name || self.span_name,
|
|
28
|
+
options || span_options,
|
|
29
|
+
tracer || self.tracer,
|
|
30
|
+
&method(:process)
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def subscribe(pattern = nil, span_name = nil, options = nil, tracer = nil)
|
|
35
|
+
if supported?
|
|
36
|
+
super(
|
|
37
|
+
pattern || event_name,
|
|
38
|
+
span_name || self.span_name,
|
|
39
|
+
options || span_options,
|
|
40
|
+
tracer || self.tracer,
|
|
41
|
+
&method(:process)
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def supported?
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def span_options
|
|
51
|
+
{}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def tracer
|
|
55
|
+
Datadog.tracer
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -27,8 +27,8 @@ module Datadog
|
|
|
27
27
|
def annotate!(span, pin, context)
|
|
28
28
|
span.service = pin.service
|
|
29
29
|
span.span_type = pin.app_type
|
|
30
|
-
span.name =
|
|
31
|
-
span.resource =
|
|
30
|
+
span.name = RESOURCE
|
|
31
|
+
span.resource = context.safely(:resource)
|
|
32
32
|
span.set_tag('aws.agent', AGENT)
|
|
33
33
|
span.set_tag('aws.operation', context.safely(:operation))
|
|
34
34
|
span.set_tag('aws.region', context.safely(:region))
|
|
@@ -52,11 +52,11 @@ module Datadog
|
|
|
52
52
|
remove_method :initialize
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
def initialize(*args)
|
|
55
|
+
def initialize(*args, &block)
|
|
56
56
|
service = Datadog.configuration[:elasticsearch][:service_name]
|
|
57
57
|
pin = Datadog::Pin.new(service, app: 'elasticsearch', app_type: Datadog::Ext::AppTypes::DB)
|
|
58
58
|
pin.onto(self)
|
|
59
|
-
initialize_without_datadog(*args)
|
|
59
|
+
initialize_without_datadog(*args, &block)
|
|
60
60
|
end
|
|
61
61
|
|
|
62
62
|
alias_method :perform_request_without_datadog, :perform_request
|