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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/ext/app_types'
|
|
2
2
|
require 'ddtrace/ext/http'
|
|
3
3
|
require 'ddtrace/propagation/http_propagator'
|
|
4
|
+
require 'ddtrace/contrib/rack/ext'
|
|
4
5
|
require 'ddtrace/contrib/rack/request_queue'
|
|
5
6
|
|
|
6
7
|
module Datadog
|
|
@@ -15,6 +16,8 @@ module Datadog
|
|
|
15
16
|
# information available at the Rack level.
|
|
16
17
|
# rubocop:disable Metrics/ClassLength
|
|
17
18
|
class TraceMiddleware
|
|
19
|
+
# DEPRECATED: Remove in 1.0 in favor of Datadog::Contrib::Rack::Ext::RACK_ENV_REQUEST_SPAN
|
|
20
|
+
# This constant will remain here until then, for backwards compatibility.
|
|
18
21
|
RACK_REQUEST_SPAN = 'datadog.rack_request_span'.freeze
|
|
19
22
|
|
|
20
23
|
def initialize(app)
|
|
@@ -29,7 +32,7 @@ module Datadog
|
|
|
29
32
|
return if request_start.nil?
|
|
30
33
|
|
|
31
34
|
tracer.trace(
|
|
32
|
-
|
|
35
|
+
Ext::SPAN_HTTP_SERVER_QUEUE,
|
|
33
36
|
start_time: request_start,
|
|
34
37
|
service: Datadog.configuration[:rack][:web_service_name]
|
|
35
38
|
)
|
|
@@ -56,7 +59,7 @@ module Datadog
|
|
|
56
59
|
|
|
57
60
|
# start a new request span and attach it to the current Rack environment;
|
|
58
61
|
# we must ensure that the span `resource` is set later
|
|
59
|
-
request_span = tracer.trace(
|
|
62
|
+
request_span = tracer.trace(Ext::SPAN_REQUEST, trace_options)
|
|
60
63
|
env[RACK_REQUEST_SPAN] = request_span
|
|
61
64
|
|
|
62
65
|
# Add deprecation warnings
|
|
@@ -3,47 +3,26 @@ module Datadog
|
|
|
3
3
|
module Rack
|
|
4
4
|
# Provides instrumentation for `rack`
|
|
5
5
|
module Patcher
|
|
6
|
-
include
|
|
6
|
+
include Contrib::Patcher
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
response: [
|
|
10
|
-
'Content-Type',
|
|
11
|
-
'X-Request-ID'
|
|
12
|
-
]
|
|
13
|
-
}.freeze
|
|
8
|
+
module_function
|
|
14
9
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
option :distributed_tracing, default: false
|
|
18
|
-
option :middleware_names, default: false
|
|
19
|
-
option :quantize, default: {}
|
|
20
|
-
option :application
|
|
21
|
-
option :service_name, default: 'rack', depends_on: [:tracer] do |value|
|
|
22
|
-
get_option(:tracer).set_service_info(value, 'rack', Ext::AppTypes::WEB)
|
|
23
|
-
value
|
|
24
|
-
end
|
|
25
|
-
option :request_queuing, default: false
|
|
26
|
-
option :web_service_name, default: 'web-server', depends_on: [:tracer, :request_queuing] do |value|
|
|
27
|
-
if get_option(:request_queuing)
|
|
28
|
-
get_option(:tracer).set_service_info(value, 'webserver', Ext::AppTypes::WEB)
|
|
29
|
-
end
|
|
30
|
-
value
|
|
10
|
+
def patched?
|
|
11
|
+
done?(:rack)
|
|
31
12
|
end
|
|
32
|
-
option :headers, default: DEFAULT_HEADERS
|
|
33
|
-
|
|
34
|
-
module_function
|
|
35
13
|
|
|
36
14
|
def patch
|
|
37
|
-
|
|
15
|
+
# Patch middleware
|
|
16
|
+
do_once(:rack) do
|
|
38
17
|
require_relative 'middlewares'
|
|
39
|
-
@patched = true
|
|
40
18
|
end
|
|
41
19
|
|
|
42
|
-
|
|
43
|
-
|
|
20
|
+
# Patch middleware names
|
|
21
|
+
if !done?(:rack_middleware_names) && get_option(:middleware_names)
|
|
44
22
|
if get_option(:application)
|
|
45
|
-
|
|
46
|
-
|
|
23
|
+
do_once(:rack_middleware_names) do
|
|
24
|
+
patch_middleware_names
|
|
25
|
+
end
|
|
47
26
|
else
|
|
48
27
|
Datadog::Tracer.log.warn(%(
|
|
49
28
|
Rack :middleware_names requires you to also pass :application.
|
|
@@ -51,15 +30,11 @@ module Datadog
|
|
|
51
30
|
e.g. use: :rack, middleware_names: true, application: my_rack_app).freeze)
|
|
52
31
|
end
|
|
53
32
|
end
|
|
54
|
-
|
|
55
|
-
|
|
33
|
+
rescue StandardError => e
|
|
34
|
+
Datadog::Tracer.log.error("Unable to apply Rack integration: #{e}")
|
|
56
35
|
end
|
|
57
36
|
|
|
58
|
-
def
|
|
59
|
-
@patched ||= false
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def enable_middleware_names
|
|
37
|
+
def patch_middleware_names
|
|
63
38
|
retain_middleware_name(get_option(:application))
|
|
64
39
|
rescue => e
|
|
65
40
|
# We can safely ignore these exceptions since they happen only in the
|
|
@@ -81,9 +56,16 @@ module Datadog
|
|
|
81
56
|
end
|
|
82
57
|
end
|
|
83
58
|
|
|
84
|
-
following = middleware.
|
|
59
|
+
following = if middleware.instance_variable_defined?('@app')
|
|
60
|
+
middleware.instance_variable_get('@app')
|
|
61
|
+
end
|
|
62
|
+
|
|
85
63
|
retain_middleware_name(following)
|
|
86
64
|
end
|
|
65
|
+
|
|
66
|
+
def get_option(option)
|
|
67
|
+
Datadog.configuration[:rack].get_option(option)
|
|
68
|
+
end
|
|
87
69
|
end
|
|
88
70
|
end
|
|
89
71
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
require 'ddtrace/ext/http'
|
|
2
2
|
require 'ddtrace/ext/errors'
|
|
3
|
+
require 'ddtrace/contrib/rack/ext'
|
|
4
|
+
require 'ddtrace/contrib/rails/ext'
|
|
3
5
|
|
|
4
6
|
module Datadog
|
|
5
7
|
module Contrib
|
|
@@ -20,7 +22,7 @@ module Datadog
|
|
|
20
22
|
tracer = Datadog.configuration[:rails][:tracer]
|
|
21
23
|
service = Datadog.configuration[:rails][:controller_service]
|
|
22
24
|
type = Datadog::Ext::HTTP::TYPE
|
|
23
|
-
span = tracer.trace(
|
|
25
|
+
span = tracer.trace(Ext::SPAN_ACTION_CONTROLLER, service: service, span_type: type)
|
|
24
26
|
|
|
25
27
|
# attach the current span to the tracing context
|
|
26
28
|
tracing_context = payload.fetch(:tracing_context)
|
|
@@ -32,6 +34,7 @@ module Datadog
|
|
|
32
34
|
def self.finish_processing(payload)
|
|
33
35
|
# retrieve the tracing context and the latest active span
|
|
34
36
|
tracing_context = payload.fetch(:tracing_context)
|
|
37
|
+
env = payload.fetch(:env)
|
|
35
38
|
span = tracing_context[:dd_request_span]
|
|
36
39
|
return unless span && !span.finished?
|
|
37
40
|
|
|
@@ -41,14 +44,14 @@ module Datadog
|
|
|
41
44
|
span.resource = "#{payload.fetch(:controller)}##{payload.fetch(:action)}"
|
|
42
45
|
end
|
|
43
46
|
|
|
44
|
-
# Set the
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
# Set the resource name of the Rack request span unless this is an exception controller.
|
|
48
|
+
unless exception_controller?(payload)
|
|
49
|
+
rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
|
|
50
|
+
rack_request_span.resource = span.resource if rack_request_span
|
|
48
51
|
end
|
|
49
52
|
|
|
50
|
-
span.set_tag(
|
|
51
|
-
span.set_tag(
|
|
53
|
+
span.set_tag(Ext::TAG_ROUTE_ACTION, payload.fetch(:action))
|
|
54
|
+
span.set_tag(Ext::TAG_ROUTE_CONTROLLER, payload.fetch(:controller))
|
|
52
55
|
|
|
53
56
|
exception = payload[:exception_object]
|
|
54
57
|
if exception.nil?
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require 'thread'
|
|
2
|
-
require 'ddtrace/ext
|
|
2
|
+
require 'ddtrace/contrib/rails/ext'
|
|
3
3
|
|
|
4
4
|
module Datadog
|
|
5
5
|
module Contrib
|
|
@@ -24,16 +24,16 @@ module Datadog
|
|
|
24
24
|
# NOTE: the ``finish_trace_cache()`` is fired but it already has a safe-guard
|
|
25
25
|
# to avoid any kind of issue.
|
|
26
26
|
current_span = tracer.active_span
|
|
27
|
-
return if payload[:action] ==
|
|
28
|
-
current_span.try(:name) ==
|
|
29
|
-
current_span.try(:resource) ==
|
|
27
|
+
return if payload[:action] == Ext::RESOURCE_CACHE_GET &&
|
|
28
|
+
current_span.try(:name) == Ext::SPAN_CACHE &&
|
|
29
|
+
current_span.try(:resource) == Ext::RESOURCE_CACHE_GET
|
|
30
30
|
|
|
31
31
|
tracing_context = payload.fetch(:tracing_context)
|
|
32
32
|
|
|
33
33
|
# create a new ``Span`` and add it to the tracing context
|
|
34
34
|
service = Datadog.configuration[:rails][:cache_service]
|
|
35
|
-
type =
|
|
36
|
-
span = tracer.trace(
|
|
35
|
+
type = Ext::SPAN_TYPE_CACHE
|
|
36
|
+
span = tracer.trace(Ext::SPAN_CACHE, service: service, span_type: type)
|
|
37
37
|
span.resource = payload.fetch(:action)
|
|
38
38
|
tracing_context[:dd_cache_span] = span
|
|
39
39
|
rescue StandardError => e
|
|
@@ -49,9 +49,9 @@ module Datadog
|
|
|
49
49
|
begin
|
|
50
50
|
# discard parameters from the cache_store configuration
|
|
51
51
|
store, = *Array.wrap(::Rails.configuration.cache_store).flatten
|
|
52
|
-
span.set_tag(
|
|
53
|
-
cache_key = Datadog::Utils.truncate(payload.fetch(:key), Ext::
|
|
54
|
-
span.set_tag(
|
|
52
|
+
span.set_tag(Ext::TAG_CACHE_BACKEND, store)
|
|
53
|
+
cache_key = Datadog::Utils.truncate(payload.fetch(:key), Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
|
|
54
|
+
span.set_tag(Ext::TAG_CACHE_KEY, cache_key)
|
|
55
55
|
span.set_error(payload[:exception]) if payload[:exception]
|
|
56
56
|
ensure
|
|
57
57
|
span.finish
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'ddtrace/contrib/configuration/settings'
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Contrib
|
|
5
|
+
module Rails
|
|
6
|
+
module Configuration
|
|
7
|
+
# Custom settings for the Rails integration
|
|
8
|
+
class Settings < Contrib::Configuration::Settings
|
|
9
|
+
option :cache_service
|
|
10
|
+
option :controller_service
|
|
11
|
+
option :database_service, depends_on: [:service_name] do |value|
|
|
12
|
+
value.tap do
|
|
13
|
+
# Update ActiveRecord service name too
|
|
14
|
+
Datadog.configuration[:active_record][:service_name] = value
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
option :distributed_tracing, default: false
|
|
18
|
+
option :exception_controller, default: nil
|
|
19
|
+
option :middleware, default: true
|
|
20
|
+
option :middleware_names, default: false
|
|
21
|
+
option :template_base_path, default: 'views/'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'ddtrace/contrib/rails/ext'
|
|
2
|
+
|
|
1
3
|
module Datadog
|
|
2
4
|
# RailsRendererPatcher contains function to patch Rails rendering libraries.
|
|
3
5
|
# rubocop:disable Lint/RescueException
|
|
@@ -6,11 +8,6 @@ module Datadog
|
|
|
6
8
|
module RailsRendererPatcher
|
|
7
9
|
include Datadog::Patcher
|
|
8
10
|
|
|
9
|
-
SPAN_NAME_RENDER_PARTIAL = 'rails.render_partial'.freeze
|
|
10
|
-
SPAN_NAME_RENDER_TEMPLATE = 'rails.render_template'.freeze
|
|
11
|
-
TAG_LAYOUT = 'rails.layout'.freeze
|
|
12
|
-
TAG_TEMPLATE_NAME = 'rails.template_name'.freeze
|
|
13
|
-
|
|
14
11
|
module_function
|
|
15
12
|
|
|
16
13
|
def patch_renderer
|
|
@@ -39,7 +36,7 @@ module Datadog
|
|
|
39
36
|
render_without_datadog(*args, &block)
|
|
40
37
|
else
|
|
41
38
|
datadog_tracer.trace(
|
|
42
|
-
Datadog::
|
|
39
|
+
Datadog::Contrib::Rails::Ext::SPAN_RENDER_TEMPLATE,
|
|
43
40
|
span_type: Datadog::Ext::HTTP::TEMPLATE
|
|
44
41
|
) do |span|
|
|
45
42
|
with_datadog_span(span) { render_without_datadog(*args, &block) }
|
|
@@ -64,14 +61,14 @@ module Datadog
|
|
|
64
61
|
end
|
|
65
62
|
if template_name
|
|
66
63
|
active_datadog_span.set_tag(
|
|
67
|
-
Datadog::
|
|
64
|
+
Datadog::Contrib::Rails::Ext::TAG_TEMPLATE_NAME,
|
|
68
65
|
template_name
|
|
69
66
|
)
|
|
70
67
|
end
|
|
71
68
|
|
|
72
69
|
if layout
|
|
73
70
|
active_datadog_span.set_tag(
|
|
74
|
-
Datadog::
|
|
71
|
+
Datadog::Contrib::Rails::Ext::TAG_LAYOUT,
|
|
75
72
|
layout
|
|
76
73
|
)
|
|
77
74
|
end
|
|
@@ -119,7 +116,7 @@ module Datadog
|
|
|
119
116
|
klass.class_eval do
|
|
120
117
|
def render_with_datadog(*args, &block)
|
|
121
118
|
datadog_tracer.trace(
|
|
122
|
-
Datadog::
|
|
119
|
+
Datadog::Contrib::Rails::Ext::SPAN_RENDER_PARTIAL,
|
|
123
120
|
span_type: Datadog::Ext::HTTP::TEMPLATE
|
|
124
121
|
) do |span|
|
|
125
122
|
with_datadog_span(span) { render_without_datadog(*args) }
|
|
@@ -131,7 +128,7 @@ module Datadog
|
|
|
131
128
|
template_name = Datadog::Contrib::Rails::Utils.normalize_template_name(@template.try('identifier'))
|
|
132
129
|
if template_name
|
|
133
130
|
active_datadog_span.set_tag(
|
|
134
|
-
Datadog::
|
|
131
|
+
Datadog::Contrib::Rails::Ext::TAG_TEMPLATE_NAME,
|
|
135
132
|
template_name
|
|
136
133
|
)
|
|
137
134
|
end
|
|
@@ -228,7 +225,7 @@ module Datadog
|
|
|
228
225
|
|
|
229
226
|
def read(*args, &block)
|
|
230
227
|
payload = {
|
|
231
|
-
action:
|
|
228
|
+
action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_GET,
|
|
232
229
|
key: args[0],
|
|
233
230
|
tracing_context: {}
|
|
234
231
|
}
|
|
@@ -256,7 +253,7 @@ module Datadog
|
|
|
256
253
|
|
|
257
254
|
def fetch(*args, &block)
|
|
258
255
|
payload = {
|
|
259
|
-
action:
|
|
256
|
+
action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_GET,
|
|
260
257
|
key: args[0],
|
|
261
258
|
tracing_context: {}
|
|
262
259
|
}
|
|
@@ -284,7 +281,7 @@ module Datadog
|
|
|
284
281
|
|
|
285
282
|
def write(*args, &block)
|
|
286
283
|
payload = {
|
|
287
|
-
action:
|
|
284
|
+
action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_SET,
|
|
288
285
|
key: args[0],
|
|
289
286
|
tracing_context: {}
|
|
290
287
|
}
|
|
@@ -312,7 +309,7 @@ module Datadog
|
|
|
312
309
|
|
|
313
310
|
def delete(*args, &block)
|
|
314
311
|
payload = {
|
|
315
|
-
action:
|
|
312
|
+
action: Datadog::Contrib::Rails::Ext::RESOURCE_CACHE_DELETE,
|
|
316
313
|
key: args[0],
|
|
317
314
|
tracing_context: {}
|
|
318
315
|
}
|
|
@@ -335,7 +332,7 @@ module Datadog
|
|
|
335
332
|
|
|
336
333
|
def self.reload_cache_store
|
|
337
334
|
redis = Datadog.registry[:redis]
|
|
338
|
-
return unless redis && redis.patched?
|
|
335
|
+
return unless redis && redis.patcher.patched?
|
|
339
336
|
|
|
340
337
|
return unless defined?(::ActiveSupport::Cache::RedisStore) &&
|
|
341
338
|
defined?(::Rails.cache) &&
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Datadog
|
|
2
|
+
module Contrib
|
|
3
|
+
module Rails
|
|
4
|
+
# Rails integration constants
|
|
5
|
+
module Ext
|
|
6
|
+
APP = 'rails'.freeze
|
|
7
|
+
|
|
8
|
+
QUANTIZE_CACHE_MAX_KEY_SIZE = 300
|
|
9
|
+
|
|
10
|
+
RESOURCE_CACHE_DELETE = 'DELETE'.freeze
|
|
11
|
+
RESOURCE_CACHE_GET = 'GET'.freeze
|
|
12
|
+
RESOURCE_CACHE_SET = 'SET'.freeze
|
|
13
|
+
|
|
14
|
+
SPAN_ACTION_CONTROLLER = 'rails.action_controller'.freeze
|
|
15
|
+
SPAN_CACHE = 'rails.cache'.freeze
|
|
16
|
+
SPAN_RENDER_PARTIAL = 'rails.render_partial'.freeze
|
|
17
|
+
SPAN_RENDER_TEMPLATE = 'rails.render_template'.freeze
|
|
18
|
+
|
|
19
|
+
SPAN_TYPE_CACHE = 'cache'.freeze
|
|
20
|
+
|
|
21
|
+
TAG_CACHE_BACKEND = 'rails.cache.backend'.freeze
|
|
22
|
+
TAG_CACHE_KEY = 'rails.cache.key'.freeze
|
|
23
|
+
TAG_LAYOUT = 'rails.layout'.freeze
|
|
24
|
+
TAG_ROUTE_ACTION = 'rails.route.action'.freeze
|
|
25
|
+
TAG_ROUTE_CONTROLLER = 'rails.route.controller'.freeze
|
|
26
|
+
TAG_TEMPLATE_NAME = 'rails.template_name'.freeze
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -5,6 +5,7 @@ require 'ddtrace/contrib/active_record/patcher'
|
|
|
5
5
|
require 'ddtrace/contrib/grape/endpoint'
|
|
6
6
|
require 'ddtrace/contrib/rack/middlewares'
|
|
7
7
|
|
|
8
|
+
require 'ddtrace/contrib/rails/ext'
|
|
8
9
|
require 'ddtrace/contrib/rails/core_extensions'
|
|
9
10
|
require 'ddtrace/contrib/rails/action_controller'
|
|
10
11
|
require 'ddtrace/contrib/rails/action_view'
|
|
@@ -66,8 +67,8 @@ module Datadog
|
|
|
66
67
|
|
|
67
68
|
def self.set_service_info!(config)
|
|
68
69
|
tracer = config[:tracer]
|
|
69
|
-
tracer.set_service_info(config[:controller_service],
|
|
70
|
-
tracer.set_service_info(config[:cache_service],
|
|
70
|
+
tracer.set_service_info(config[:controller_service], Ext::APP, Datadog::Ext::AppTypes::WEB)
|
|
71
|
+
tracer.set_service_info(config[:cache_service], Ext::APP, Datadog::Ext::AppTypes::CACHE)
|
|
71
72
|
end
|
|
72
73
|
end
|
|
73
74
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'ddtrace/contrib/integration'
|
|
2
|
+
require 'ddtrace/contrib/rails/configuration/settings'
|
|
3
|
+
require 'ddtrace/contrib/rails/patcher'
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Contrib
|
|
7
|
+
module Rails
|
|
8
|
+
# Description of Rails integration
|
|
9
|
+
class Integration
|
|
10
|
+
include Contrib::Integration
|
|
11
|
+
|
|
12
|
+
register_as :rails, auto_patch: false
|
|
13
|
+
|
|
14
|
+
def self.version
|
|
15
|
+
Gem.loaded_specs['rails'] && Gem.loaded_specs['rails'].version
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.present?
|
|
19
|
+
defined?(::Rails)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.compatible?
|
|
23
|
+
return false if ENV['DISABLE_DATADOG_RAILS']
|
|
24
|
+
super && defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR.to_i >= 3
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def default_configuration
|
|
28
|
+
Configuration::Settings.new
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def patcher
|
|
32
|
+
Patcher
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -6,82 +6,75 @@ require 'ddtrace/contrib/rack/middlewares'
|
|
|
6
6
|
module Datadog
|
|
7
7
|
module Contrib
|
|
8
8
|
module Rails
|
|
9
|
-
# Patcher
|
|
9
|
+
# Patcher enables patching of 'rails' module.
|
|
10
10
|
module Patcher
|
|
11
|
-
include
|
|
12
|
-
register_as :rails, auto_patch: true
|
|
11
|
+
include Contrib::Patcher
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
option :controller_service
|
|
16
|
-
option :cache_service
|
|
17
|
-
option :database_service, depends_on: [:service_name] do |value|
|
|
18
|
-
value.tap do
|
|
19
|
-
# Update ActiveRecord service name too
|
|
20
|
-
Datadog.configuration[:active_record][:service_name] = value
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
option :middleware, default: true
|
|
24
|
-
option :middleware_names, default: false
|
|
25
|
-
option :distributed_tracing, default: false
|
|
26
|
-
option :template_base_path, default: 'views/'
|
|
27
|
-
option :exception_controller, default: nil
|
|
28
|
-
option :tracer, default: Datadog.tracer
|
|
13
|
+
module_function
|
|
29
14
|
|
|
30
|
-
|
|
15
|
+
def patched?
|
|
16
|
+
done?(:rails)
|
|
17
|
+
end
|
|
31
18
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
def patch
|
|
20
|
+
do_once(:rails) do
|
|
21
|
+
patch_before_intialize
|
|
22
|
+
patch_after_intialize
|
|
23
|
+
end
|
|
24
|
+
rescue => e
|
|
25
|
+
Datadog::Tracer.log.error("Unable to apply Rails integration: #{e}")
|
|
26
|
+
end
|
|
35
27
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if Datadog.configuration[:rails][:middleware]
|
|
42
|
-
# Add trace middleware
|
|
43
|
-
config.middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
|
|
28
|
+
def patch_before_intialize
|
|
29
|
+
::ActiveSupport.on_load(:before_initialize) do
|
|
30
|
+
Datadog::Contrib::Rails::Patcher.before_intialize(self)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
44
33
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
Datadog::Contrib::Rails::ExceptionMiddleware
|
|
52
|
-
)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
34
|
+
def before_intialize(app)
|
|
35
|
+
# Middleware must be added before the application is initialized.
|
|
36
|
+
# Otherwise the middleware stack will be frozen.
|
|
37
|
+
# Sometimes we don't want to activate middleware e.g. OpenTracing, etc.
|
|
38
|
+
add_middleware(app) if Datadog.configuration[:rails][:middleware]
|
|
39
|
+
end
|
|
56
40
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
::ActiveSupport.on_load(:after_initialize) do
|
|
61
|
-
Datadog::Contrib::Rails::Framework.setup
|
|
41
|
+
def add_middleware(app)
|
|
42
|
+
# Add trace middleware
|
|
43
|
+
app.middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
|
|
62
44
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
45
|
+
# Insert right after Rails exception handling middleware, because if it's before,
|
|
46
|
+
# it catches and swallows the error. If it's too far after, custom middleware can find itself
|
|
47
|
+
# between, and raise exceptions that don't end up getting tagged on the request properly.
|
|
48
|
+
# e.g lost stack trace.
|
|
49
|
+
app.middleware.insert_after(
|
|
50
|
+
ActionDispatch::ShowExceptions,
|
|
51
|
+
Datadog::Contrib::Rails::ExceptionMiddleware
|
|
52
|
+
)
|
|
53
|
+
end
|
|
69
54
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Datadog::
|
|
73
|
-
@patched
|
|
55
|
+
def patch_after_intialize
|
|
56
|
+
::ActiveSupport.on_load(:after_initialize) do
|
|
57
|
+
Datadog::Contrib::Rails::Patcher.after_intialize(self)
|
|
74
58
|
end
|
|
59
|
+
end
|
|
75
60
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
61
|
+
def after_intialize(app)
|
|
62
|
+
# Finish configuring the tracer after the application is initialized.
|
|
63
|
+
# We need to wait for some things, like application name, middleware stack, etc.
|
|
64
|
+
setup_tracer
|
|
65
|
+
instrument_rails
|
|
66
|
+
end
|
|
79
67
|
|
|
80
|
-
|
|
81
|
-
|
|
68
|
+
# Configure Rails tracing with settings
|
|
69
|
+
def setup_tracer
|
|
70
|
+
Datadog::Contrib::Rails::Framework.setup
|
|
71
|
+
end
|
|
82
72
|
|
|
83
|
-
|
|
84
|
-
|
|
73
|
+
# Add instrumentation to Rails components
|
|
74
|
+
def instrument_rails
|
|
75
|
+
Datadog::Contrib::Rails::ActionController.instrument
|
|
76
|
+
Datadog::Contrib::Rails::ActionView.instrument
|
|
77
|
+
Datadog::Contrib::Rails::ActiveSupport.instrument
|
|
85
78
|
end
|
|
86
79
|
end
|
|
87
80
|
end
|