ddtrace 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -3
- data/Appraisals +1 -0
- data/ddtrace.gemspec +3 -0
- data/docs/GettingStarted.md +31 -8
- data/gemfiles/rails32_postgres_redis.gemfile +1 -0
- data/lib/ddtrace.rb +20 -34
- data/lib/ddtrace/buffer.rb +1 -7
- data/lib/ddtrace/configurable.rb +77 -0
- data/lib/ddtrace/configuration.rb +35 -0
- data/lib/ddtrace/configuration/proxy.rb +29 -0
- data/lib/ddtrace/configuration/resolver.rb +24 -0
- data/lib/ddtrace/context.rb +55 -7
- data/lib/ddtrace/contrib/active_record/patcher.rb +4 -1
- data/lib/ddtrace/contrib/aws/patcher.rb +3 -0
- data/lib/ddtrace/contrib/base.rb +14 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +3 -0
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +3 -0
- data/lib/ddtrace/contrib/faraday/middleware.rb +5 -6
- data/lib/ddtrace/contrib/faraday/patcher.rb +3 -0
- data/lib/ddtrace/contrib/grape/patcher.rb +3 -0
- data/lib/ddtrace/contrib/http/patcher.rb +22 -7
- data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +21 -35
- data/lib/ddtrace/contrib/rails/action_controller.rb +2 -2
- data/lib/ddtrace/contrib/rails/action_view.rb +2 -2
- data/lib/ddtrace/contrib/rails/active_record.rb +2 -2
- data/lib/ddtrace/contrib/rails/active_support.rb +2 -2
- data/lib/ddtrace/contrib/rails/framework.rb +36 -58
- data/lib/ddtrace/contrib/rails/middlewares.rb +1 -1
- data/lib/ddtrace/contrib/rails/patcher.rb +56 -0
- data/lib/ddtrace/contrib/rails/railtie.rb +18 -0
- data/lib/ddtrace/contrib/rails/utils.rb +1 -1
- data/lib/ddtrace/contrib/redis/patcher.rb +4 -0
- data/lib/ddtrace/contrib/redis/quantize.rb +1 -1
- data/lib/ddtrace/contrib/redis/tags.rb +1 -0
- data/lib/ddtrace/contrib/resque/patcher.rb +9 -0
- data/lib/ddtrace/contrib/resque/resque_job.rb +6 -6
- data/lib/ddtrace/contrib/sidekiq/tracer.rb +11 -11
- data/lib/ddtrace/contrib/sinatra/tracer.rb +23 -63
- data/lib/ddtrace/contrib/sucker_punch/patcher.rb +3 -0
- data/lib/ddtrace/ext/distributed.rb +2 -0
- data/lib/ddtrace/ext/redis.rb +6 -0
- data/lib/ddtrace/monkey.rb +20 -37
- data/lib/ddtrace/propagation/distributed_headers.rb +48 -0
- data/lib/ddtrace/propagation/http_propagator.rb +28 -0
- data/lib/ddtrace/registry.rb +42 -0
- data/lib/ddtrace/registry/registerable.rb +20 -0
- data/lib/ddtrace/sampler.rb +61 -1
- data/lib/ddtrace/sync_writer.rb +36 -0
- data/lib/ddtrace/tracer.rb +23 -21
- data/lib/ddtrace/transport.rb +52 -15
- data/lib/ddtrace/version.rb +2 -2
- data/lib/ddtrace/workers.rb +33 -31
- data/lib/ddtrace/writer.rb +20 -1
- metadata +42 -3
- data/lib/ddtrace/distributed.rb +0 -38
@@ -21,7 +21,7 @@ module Datadog
|
|
21
21
|
# It's not a problem since we re-raise it afterwards so for example a
|
22
22
|
# SignalException::Interrupt would still bubble up.
|
23
23
|
rescue Exception => e
|
24
|
-
tracer =
|
24
|
+
tracer = Datadog.configuration[:rails][:tracer]
|
25
25
|
span = tracer.active_span()
|
26
26
|
span.set_error(e) unless span.nil?
|
27
27
|
raise e
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Datadog
|
2
|
+
module Contrib
|
3
|
+
module Rails
|
4
|
+
# Patcher
|
5
|
+
module Patcher
|
6
|
+
include Base
|
7
|
+
register_as :rails, auto_patch: true
|
8
|
+
|
9
|
+
option :enabled, default: true
|
10
|
+
option :auto_instrument, default: false
|
11
|
+
option :auto_instrument_redis, default: false
|
12
|
+
option :auto_instrument_grape, default: false
|
13
|
+
option :default_service, default: 'rails-app'
|
14
|
+
option :default_controller_service, default: 'rails-controller'
|
15
|
+
option :default_cache_service, default: 'rails-cache'
|
16
|
+
option :default_grape_service, default: 'grape'
|
17
|
+
option :default_database_service
|
18
|
+
option :distributed_tracing_enabled, default: false
|
19
|
+
option :priority_sampling, default: false
|
20
|
+
option :template_base_path, default: 'views/'
|
21
|
+
option :tracer, default: Datadog.tracer
|
22
|
+
option :debug, default: false
|
23
|
+
option :trace_agent_hostname, default: Datadog::Writer::HOSTNAME
|
24
|
+
option :trace_agent_port, default: Datadog::Writer::PORT
|
25
|
+
option :env, default: nil
|
26
|
+
option :tags, default: {}
|
27
|
+
option :sidekiq_service, default: 'sidekiq'
|
28
|
+
|
29
|
+
@patched = false
|
30
|
+
|
31
|
+
class << self
|
32
|
+
def patch
|
33
|
+
return @patched if patched? || !compatible?
|
34
|
+
require_relative 'framework'
|
35
|
+
@patched = true
|
36
|
+
rescue => e
|
37
|
+
Datadog::Tracer.log.error("Unable to apply Rails integration: #{e}")
|
38
|
+
@patched
|
39
|
+
end
|
40
|
+
|
41
|
+
def patched?
|
42
|
+
@patched
|
43
|
+
end
|
44
|
+
|
45
|
+
def compatible?
|
46
|
+
return if ENV['DISABLE_DATADOG_RAILS']
|
47
|
+
|
48
|
+
defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR.to_i >= 3
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
require 'ddtrace/contrib/rails/railtie' if Datadog.registry[:rails].compatible?
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'ddtrace/contrib/rails/framework'
|
2
|
+
require 'ddtrace/contrib/rails/middlewares'
|
3
|
+
require 'ddtrace/contrib/rack/middlewares'
|
4
|
+
|
5
|
+
module Datadog
|
6
|
+
# Railtie class initializes
|
7
|
+
class Railtie < Rails::Railtie
|
8
|
+
config.app_middleware.insert_before(0, Datadog::Contrib::Rack::TraceMiddleware)
|
9
|
+
config.app_middleware.use(Datadog::Contrib::Rails::ExceptionMiddleware)
|
10
|
+
|
11
|
+
config.after_initialize do |app|
|
12
|
+
Datadog::Contrib::Rails::Framework.configure(config: app.config)
|
13
|
+
Datadog::Contrib::Rails::Framework.auto_instrument
|
14
|
+
Datadog::Contrib::Rails::Framework.auto_instrument_redis
|
15
|
+
Datadog::Contrib::Rails::Framework.auto_instrument_grape
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -11,7 +11,7 @@ module Datadog
|
|
11
11
|
def self.normalize_template_name(name)
|
12
12
|
return if name.nil?
|
13
13
|
|
14
|
-
base_path =
|
14
|
+
base_path = Datadog.configuration[:rails][:template_base_path]
|
15
15
|
sections_view = name.split(base_path)
|
16
16
|
|
17
17
|
if sections_view.length == 1
|
@@ -9,6 +9,9 @@ module Datadog
|
|
9
9
|
# Patcher enables patching of 'redis' module.
|
10
10
|
# This is used in monkey.rb to automatically apply patches
|
11
11
|
module Patcher
|
12
|
+
include Base
|
13
|
+
register_as :redis, auto_patch: true
|
14
|
+
|
12
15
|
@patched = false
|
13
16
|
|
14
17
|
module_function
|
@@ -99,6 +102,7 @@ module Datadog
|
|
99
102
|
commands = args[0].commands.map { |c| Datadog::Contrib::Redis::Quantize.format_command_args(c) }
|
100
103
|
span.resource = commands.join("\n")
|
101
104
|
Datadog::Contrib::Redis::Tags.set_common_tags(self, span)
|
105
|
+
span.set_metric Datadog::Ext::Redis::PIPELINE_LEN, commands.length
|
102
106
|
|
103
107
|
response = call_pipeline_without_datadog(*args, &block)
|
104
108
|
end
|
@@ -11,7 +11,7 @@ module Datadog
|
|
11
11
|
module_function
|
12
12
|
|
13
13
|
def format_arg(arg)
|
14
|
-
str = arg.to_s
|
14
|
+
str = arg.is_a?(Symbol) ? arg.to_s.upcase : arg.to_s
|
15
15
|
Utils.truncate(str, VALUE_MAX_LEN, TOO_LONG_MARK)
|
16
16
|
rescue StandardError => e
|
17
17
|
Datadog::Tracer.log.debug("non formattable Redis arg #{str}: #{e}")
|
@@ -12,6 +12,7 @@ module Datadog
|
|
12
12
|
span.set_tag Datadog::Ext::NET::TARGET_HOST, client.host
|
13
13
|
span.set_tag Datadog::Ext::NET::TARGET_PORT, client.port
|
14
14
|
span.set_tag Datadog::Ext::Redis::DB, client.db
|
15
|
+
span.set_tag Datadog::Ext::Redis::RAW_COMMAND, span.resource
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
@@ -1,10 +1,19 @@
|
|
1
1
|
module Datadog
|
2
2
|
module Contrib
|
3
|
+
# Namespace for `resque` integration
|
3
4
|
module Resque
|
4
5
|
SERVICE = 'resque'.freeze
|
5
6
|
|
7
|
+
class << self
|
8
|
+
# Globally-acccesible reference for pre-forking optimization
|
9
|
+
attr_accessor :sync_writer
|
10
|
+
end
|
11
|
+
|
6
12
|
# Patcher for Resque integration - sets up the pin for the integration
|
7
13
|
module Patcher
|
14
|
+
include Base
|
15
|
+
register_as :resque, auto_patch: true
|
16
|
+
|
8
17
|
@patched = false
|
9
18
|
|
10
19
|
class << self
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ddtrace/ext/app_types'
|
2
|
+
require 'ddtrace/sync_writer'
|
2
3
|
require 'resque'
|
3
4
|
|
4
5
|
module Datadog
|
@@ -16,11 +17,6 @@ module Datadog
|
|
16
17
|
span.service = pin.service
|
17
18
|
end
|
18
19
|
end
|
19
|
-
|
20
|
-
def after_perform(*args)
|
21
|
-
pin = Pin.get_from(::Resque)
|
22
|
-
pin.tracer.shutdown! if pin && pin.tracer
|
23
|
-
end
|
24
20
|
end
|
25
21
|
end
|
26
22
|
end
|
@@ -30,6 +26,10 @@ Resque.before_first_fork do
|
|
30
26
|
pin = Datadog::Pin.get_from(Resque)
|
31
27
|
next unless pin && pin.tracer
|
32
28
|
pin.tracer.set_service_info(pin.service, 'resque', Datadog::Ext::AppTypes::WORKER)
|
29
|
+
|
30
|
+
# Create SyncWriter instance before forking
|
31
|
+
sync_writer = Datadog::SyncWriter.new(transport: pin.tracer.writer.transport)
|
32
|
+
Datadog::Contrib::Resque.sync_writer = sync_writer
|
33
33
|
end
|
34
34
|
|
35
35
|
Resque.after_fork do
|
@@ -38,5 +38,5 @@ Resque.after_fork do
|
|
38
38
|
next unless pin && pin.tracer
|
39
39
|
# clean the state so no CoW happens
|
40
40
|
pin.tracer.provider.context = nil
|
41
|
-
pin.tracer.writer.
|
41
|
+
pin.tracer.writer = Datadog::Contrib::Resque.sync_writer
|
42
42
|
end
|
@@ -14,22 +14,22 @@ Datadog::Tracer.log.debug("Activating instrumentation for Sidekiq '#{sidekiq_vs}
|
|
14
14
|
module Datadog
|
15
15
|
module Contrib
|
16
16
|
module Sidekiq
|
17
|
-
DEFAULT_CONFIG = {
|
18
|
-
enabled: true,
|
19
|
-
sidekiq_service: 'sidekiq',
|
20
|
-
tracer: Datadog.tracer,
|
21
|
-
debug: false,
|
22
|
-
trace_agent_hostname: Datadog::Writer::HOSTNAME,
|
23
|
-
trace_agent_port: Datadog::Writer::PORT
|
24
|
-
}.freeze
|
25
|
-
|
26
17
|
# Middleware is a Sidekiq server-side middleware which traces executed jobs
|
27
18
|
class Tracer
|
19
|
+
include Base
|
20
|
+
register_as :sidekiq
|
21
|
+
|
22
|
+
option :enabled, default: true
|
23
|
+
option :sidekiq_service, default: 'sidekiq'
|
24
|
+
option :tracer, default: Datadog.tracer
|
25
|
+
option :debug, default: false
|
26
|
+
option :trace_agent_hostname, default: Writer::HOSTNAME
|
27
|
+
option :trace_agent_port, default: Writer::PORT
|
28
|
+
|
28
29
|
def initialize(options = {})
|
29
30
|
# check if Rails configuration is available and use it to override
|
30
31
|
# Sidekiq defaults
|
31
|
-
|
32
|
-
base_config = DEFAULT_CONFIG.merge(rails_config)
|
32
|
+
base_config = Datadog.configuration[:sidekiq].merge(Datadog.configuration[:rails])
|
33
33
|
user_config = base_config.merge(options)
|
34
34
|
@tracer = user_config[:tracer]
|
35
35
|
@sidekiq_service = user_config[:sidekiq_service]
|
@@ -17,63 +17,33 @@ Datadog::Tracer.log.info("activating instrumentation for sinatra #{sinatra_vs}")
|
|
17
17
|
module Datadog
|
18
18
|
module Contrib
|
19
19
|
module Sinatra
|
20
|
-
#
|
21
|
-
#
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
default_service: 'sinatra',
|
26
|
-
tracer: Datadog.tracer,
|
27
|
-
debug: false,
|
28
|
-
trace_agent_hostname: Datadog::Writer::HOSTNAME,
|
29
|
-
trace_agent_port: Datadog::Writer::PORT
|
30
|
-
}.freeze()
|
31
|
-
|
32
|
-
attr_accessor :cfg
|
33
|
-
|
34
|
-
def initialize
|
35
|
-
@cfg = DEFAULT_CFG.dup()
|
36
|
-
end
|
37
|
-
|
38
|
-
def configure(args = {})
|
39
|
-
args.each do |name, value|
|
40
|
-
self[name] = value
|
41
|
-
end
|
20
|
+
# Datadog::Contrib::Sinatra::Tracer is a Sinatra extension which traces
|
21
|
+
# requests.
|
22
|
+
module Tracer
|
23
|
+
include Base
|
24
|
+
register_as :sinatra
|
42
25
|
|
43
|
-
|
26
|
+
option :enabled, default: true, depends_on: [:tracer] do |value|
|
27
|
+
get_option(:tracer).enabled = value
|
44
28
|
end
|
45
29
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
tracer = @cfg[:tracer]
|
50
|
-
|
51
|
-
tracer.enabled = @cfg[:enabled]
|
52
|
-
tracer.configure(hostname: @cfg[:trace_agent_hostname],
|
53
|
-
port: @cfg[:trace_agent_port])
|
54
|
-
|
55
|
-
tracer.set_service_info(@cfg[:default_service], 'sinatra',
|
56
|
-
Datadog::Ext::AppTypes::WEB)
|
30
|
+
option :service_name, default: 'sinatra', depends_on: [:tracer] do |value|
|
31
|
+
get_option(:tracer).set_service_info(value, 'sinatra', Ext::AppTypes::WEB)
|
32
|
+
value
|
57
33
|
end
|
58
34
|
|
59
|
-
|
60
|
-
raise ArgumentError, "unknown setting '#{key}'" unless @cfg.key? key
|
61
|
-
@cfg[key]
|
62
|
-
end
|
35
|
+
option :tracer, default: Datadog.tracer
|
63
36
|
|
64
|
-
|
65
|
-
|
66
|
-
|
37
|
+
option(:debug, default: false) { |value| Tracer.debug_logging = value }
|
38
|
+
|
39
|
+
option :trace_agent_hostname, default: Writer::HOSTNAME, depends_on: [:tracer] do |value|
|
40
|
+
get_option(:tracer).configure(hostname: value)
|
67
41
|
end
|
68
42
|
|
69
|
-
|
70
|
-
|
43
|
+
option :trace_agent_port, default: Writer::PORT, depends_on: [:tracer] do |value|
|
44
|
+
get_option(:tracer).configure(port: value)
|
71
45
|
end
|
72
|
-
end
|
73
46
|
|
74
|
-
# Datadog::Contrib::Sinatra::Tracer is a Sinatra extension which traces
|
75
|
-
# requests.
|
76
|
-
module Tracer
|
77
47
|
def route(verb, action, *)
|
78
48
|
# Keep track of the route name when the app is instantiated for an
|
79
49
|
# incoming request.
|
@@ -89,11 +59,9 @@ module Datadog
|
|
89
59
|
def self.registered(app)
|
90
60
|
::Sinatra::Base.module_eval do
|
91
61
|
def render(engine, data, *)
|
92
|
-
cfg = settings.datadog_tracer
|
93
|
-
|
94
62
|
output = ''
|
95
|
-
|
96
|
-
|
63
|
+
tracer = Datadog.configuration[:sinatra][:tracer]
|
64
|
+
if tracer.enabled
|
97
65
|
tracer.trace('sinatra.render_template') do |span|
|
98
66
|
# If data is a string, it is a literal template and we don't
|
99
67
|
# want to record it.
|
@@ -108,15 +76,8 @@ module Datadog
|
|
108
76
|
end
|
109
77
|
end
|
110
78
|
|
111
|
-
app.set :datadog_tracer, TracerCfg.new()
|
112
|
-
|
113
|
-
app.configure do
|
114
|
-
app.settings.datadog_tracer.apply()
|
115
|
-
end
|
116
|
-
|
117
79
|
app.before do
|
118
|
-
|
119
|
-
return unless cfg.enabled?
|
80
|
+
return unless Datadog.configuration[:sinatra][:tracer].enabled
|
120
81
|
|
121
82
|
if instance_variable_defined? :@datadog_request_span
|
122
83
|
if @datadog_request_span
|
@@ -126,10 +87,10 @@ module Datadog
|
|
126
87
|
end
|
127
88
|
end
|
128
89
|
|
129
|
-
tracer =
|
90
|
+
tracer = Datadog.configuration[:sinatra][:tracer]
|
130
91
|
|
131
92
|
span = tracer.trace('sinatra.request',
|
132
|
-
service:
|
93
|
+
service: Datadog.configuration[:sinatra][:service_name],
|
133
94
|
span_type: Datadog::Ext::HTTP::TYPE)
|
134
95
|
span.set_tag(Datadog::Ext::HTTP::URL, request.path)
|
135
96
|
span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
|
@@ -138,8 +99,7 @@ module Datadog
|
|
138
99
|
end
|
139
100
|
|
140
101
|
app.after do
|
141
|
-
|
142
|
-
return unless cfg.enabled?
|
102
|
+
return unless Datadog.configuration[:sinatra][:tracer].enabled
|
143
103
|
|
144
104
|
span = @datadog_request_span
|
145
105
|
begin
|
@@ -5,6 +5,8 @@ module Datadog
|
|
5
5
|
# These are cross-language (eg: Python, Go and other implementations should honor these)
|
6
6
|
HTTP_HEADER_TRACE_ID = 'x-datadog-trace-id'.freeze
|
7
7
|
HTTP_HEADER_PARENT_ID = 'x-datadog-parent-id'.freeze
|
8
|
+
HTTP_HEADER_SAMPLING_PRIORITY = 'x-datadog-sampling-priority'.freeze
|
9
|
+
SAMPLING_PRIORITY_KEY = '_sampling_priority_v1'.freeze
|
8
10
|
end
|
9
11
|
end
|
10
12
|
end
|
data/lib/ddtrace/ext/redis.rb
CHANGED
data/lib/ddtrace/monkey.rb
CHANGED
@@ -3,6 +3,8 @@ require 'thread'
|
|
3
3
|
# We import all patchers for every module we support, but this is fine
|
4
4
|
# because patchers do not include any 3rd party module nor even our
|
5
5
|
# patching code, which is required on demand, when patching.
|
6
|
+
require 'ddtrace/contrib/base'
|
7
|
+
require 'ddtrace/contrib/rails/patcher'
|
6
8
|
require 'ddtrace/contrib/active_record/patcher'
|
7
9
|
require 'ddtrace/contrib/elasticsearch/patcher'
|
8
10
|
require 'ddtrace/contrib/faraday/patcher'
|
@@ -18,53 +20,32 @@ require 'ddtrace/contrib/resque/patcher'
|
|
18
20
|
module Datadog
|
19
21
|
# Monkey is used for monkey-patching 3rd party libs.
|
20
22
|
module Monkey
|
21
|
-
@patched = []
|
22
|
-
@autopatch_modules = {
|
23
|
-
elasticsearch: true,
|
24
|
-
http: true,
|
25
|
-
redis: true,
|
26
|
-
grape: true,
|
27
|
-
faraday: true,
|
28
|
-
aws: true,
|
29
|
-
sucker_punch: true,
|
30
|
-
mongo: true,
|
31
|
-
dalli: true,
|
32
|
-
resque: true,
|
33
|
-
active_record: false
|
34
|
-
}
|
35
23
|
# Patchers should expose 2 methods:
|
36
24
|
# - patch, which applies our patch if needed. Should be idempotent,
|
37
25
|
# can be call twice but should just do nothing the second time.
|
38
26
|
# - patched?, which returns true if the module has been succesfully
|
39
27
|
# patched (patching might have failed if requirements were not here)
|
40
|
-
|
41
|
-
http: Datadog::Contrib::HTTP::Patcher,
|
42
|
-
redis: Datadog::Contrib::Redis::Patcher,
|
43
|
-
grape: Datadog::Contrib::Grape::Patcher,
|
44
|
-
faraday: Datadog::Contrib::Faraday::Patcher,
|
45
|
-
aws: Datadog::Contrib::Aws::Patcher,
|
46
|
-
sucker_punch: Datadog::Contrib::SuckerPunch::Patcher,
|
47
|
-
mongo: Datadog::Contrib::MongoDB::Patcher,
|
48
|
-
dalli: Datadog::Contrib::Dalli::Patcher,
|
49
|
-
resque: Datadog::Contrib::Resque::Patcher,
|
50
|
-
active_record: Datadog::Contrib::ActiveRecord::Patcher }
|
28
|
+
|
51
29
|
@mutex = Mutex.new
|
30
|
+
@registry = Datadog.registry
|
52
31
|
|
53
32
|
module_function
|
54
33
|
|
34
|
+
attr_accessor :registry
|
35
|
+
|
55
36
|
def autopatch_modules
|
56
|
-
|
37
|
+
registry.to_h
|
57
38
|
end
|
58
39
|
|
59
40
|
def patch_all
|
60
|
-
patch
|
41
|
+
patch(autopatch_modules)
|
61
42
|
end
|
62
43
|
|
63
44
|
def patch_module(m)
|
64
45
|
@mutex.synchronize do
|
65
|
-
patcher =
|
46
|
+
patcher = registry[m]
|
66
47
|
raise "Unsupported module #{m}" unless patcher
|
67
|
-
patcher.patch
|
48
|
+
patcher.patch if patcher.respond_to?(:patch)
|
68
49
|
end
|
69
50
|
end
|
70
51
|
|
@@ -75,16 +56,12 @@ module Datadog
|
|
75
56
|
end
|
76
57
|
|
77
58
|
def get_patched_modules
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
patcher = @patchers[k]
|
83
|
-
patched[k] = patcher.patched? if patcher
|
84
|
-
end
|
59
|
+
@mutex.synchronize do
|
60
|
+
registry.each_with_object({}) do |entry, patched|
|
61
|
+
next unless entry.klass.respond_to?(:patched?)
|
62
|
+
patched[entry.name] = entry.klass.patched?
|
85
63
|
end
|
86
64
|
end
|
87
|
-
patched
|
88
65
|
end
|
89
66
|
|
90
67
|
def without_warnings
|
@@ -98,5 +75,11 @@ module Datadog
|
|
98
75
|
$VERBOSE = v
|
99
76
|
end
|
100
77
|
end
|
78
|
+
|
79
|
+
class << self
|
80
|
+
attr_accessor :registry
|
81
|
+
end
|
101
82
|
end
|
102
83
|
end
|
84
|
+
|
85
|
+
Datadog::Monkey.patch_module(:rails)
|