scout_apm 3.0.0.pre13 → 3.0.0.pre14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/scout_apm.rb +20 -10
- data/lib/scout_apm/agent.rb +114 -319
- data/lib/scout_apm/agent/exit_handler.rb +66 -0
- data/lib/scout_apm/agent/preconditions.rb +69 -0
- data/lib/scout_apm/agent_context.rb +234 -0
- data/lib/scout_apm/app_server_load.rb +24 -14
- data/lib/scout_apm/background_job_integrations/resque.rb +7 -8
- data/lib/scout_apm/background_job_integrations/sidekiq.rb +2 -2
- data/lib/scout_apm/background_recorder.rb +8 -3
- data/lib/scout_apm/background_worker.rb +14 -7
- data/lib/scout_apm/config.rb +35 -26
- data/lib/scout_apm/context.rb +11 -4
- data/lib/scout_apm/db_query_metric_set.rb +17 -5
- data/lib/scout_apm/debug.rb +1 -1
- data/lib/scout_apm/environment.rb +10 -14
- data/lib/scout_apm/framework_integrations/sinatra.rb +1 -1
- data/lib/scout_apm/git_revision.rb +13 -8
- data/lib/scout_apm/histogram.rb +1 -1
- data/lib/scout_apm/instant/middleware.rb +7 -7
- data/lib/scout_apm/instant_reporting.rb +7 -7
- data/lib/scout_apm/instrument_manager.rb +87 -0
- data/lib/scout_apm/instruments/action_controller_rails_2.rb +12 -7
- data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +17 -12
- data/lib/scout_apm/instruments/action_view.rb +11 -7
- data/lib/scout_apm/instruments/active_record.rb +25 -11
- data/lib/scout_apm/instruments/elasticsearch.rb +10 -6
- data/lib/scout_apm/instruments/grape.rb +12 -8
- data/lib/scout_apm/instruments/http_client.rb +10 -6
- data/lib/scout_apm/instruments/influxdb.rb +10 -6
- data/lib/scout_apm/instruments/middleware_detailed.rb +11 -5
- data/lib/scout_apm/instruments/middleware_summary.rb +11 -5
- data/lib/scout_apm/instruments/mongoid.rb +10 -5
- data/lib/scout_apm/instruments/moped.rb +11 -6
- data/lib/scout_apm/instruments/net_http.rb +10 -6
- data/lib/scout_apm/instruments/percentile_sampler.rb +8 -6
- data/lib/scout_apm/instruments/process/process_cpu.rb +8 -4
- data/lib/scout_apm/instruments/process/process_memory.rb +15 -10
- data/lib/scout_apm/instruments/rails_router.rb +12 -6
- data/lib/scout_apm/instruments/redis.rb +10 -6
- data/lib/scout_apm/instruments/samplers.rb +11 -0
- data/lib/scout_apm/instruments/sinatra.rb +5 -4
- data/lib/scout_apm/layaway.rb +21 -20
- data/lib/scout_apm/layaway_file.rb +8 -3
- data/lib/scout_apm/layer.rb +3 -3
- data/lib/scout_apm/layer_converters/converter_base.rb +6 -7
- data/lib/scout_apm/layer_converters/database_converter.rb +1 -1
- data/lib/scout_apm/layer_converters/histograms.rb +2 -2
- data/lib/scout_apm/layer_converters/slow_job_converter.rb +4 -3
- data/lib/scout_apm/layer_converters/slow_request_converter.rb +5 -4
- data/lib/scout_apm/logger.rb +143 -0
- data/lib/scout_apm/middleware.rb +7 -9
- data/lib/scout_apm/periodic_work.rb +28 -0
- data/lib/scout_apm/reporter.rb +14 -8
- data/lib/scout_apm/reporting.rb +135 -0
- data/lib/scout_apm/request_manager.rb +4 -6
- data/lib/scout_apm/serializers/payload_serializer.rb +1 -1
- data/lib/scout_apm/slow_job_policy.rb +6 -2
- data/lib/scout_apm/slow_job_record.rb +5 -5
- data/lib/scout_apm/slow_request_policy.rb +6 -2
- data/lib/scout_apm/slow_transaction.rb +5 -5
- data/lib/scout_apm/store.rb +22 -16
- data/lib/scout_apm/synchronous_recorder.rb +7 -3
- data/lib/scout_apm/tasks/doctor.rb +75 -0
- data/lib/scout_apm/tasks/support.rb +22 -0
- data/lib/scout_apm/tracer.rb +5 -5
- data/lib/scout_apm/tracked_request.rb +43 -19
- data/lib/scout_apm/utils/active_record_metric_name.rb +66 -8
- data/lib/scout_apm/utils/backtrace_parser.rb +1 -1
- data/lib/scout_apm/utils/installed_gems.rb +7 -3
- data/lib/scout_apm/utils/klass_helper.rb +8 -2
- data/lib/scout_apm/utils/scm.rb +1 -1
- data/lib/scout_apm/utils/sql_sanitizer.rb +3 -3
- data/lib/scout_apm/version.rb +1 -1
- data/lib/tasks/doctor.rake +11 -0
- data/scout_apm.gemspec +1 -0
- data/test/test_helper.rb +17 -2
- data/test/unit/agent_test.rb +1 -54
- data/test/unit/config_test.rb +9 -5
- data/test/unit/context_test.rb +4 -4
- data/test/unit/db_query_metric_set_test.rb +11 -4
- data/test/unit/fake_store_test.rb +1 -1
- data/test/unit/git_revision_test.rb +3 -3
- data/test/unit/instruments/net_http_test.rb +2 -1
- data/test/unit/instruments/percentile_sampler_test.rb +5 -9
- data/test/unit/layaway_test.rb +10 -5
- data/test/unit/layer_converters/metric_converter_test.rb +2 -2
- data/test/unit/slow_request_policy_test.rb +7 -3
- data/test/unit/sql_sanitizer_test.rb +0 -6
- data/test/unit/store_test.rb +11 -8
- data/test/unit/utils/active_record_metric_name_test.rb +45 -7
- metadata +27 -5
- data/lib/scout_apm/agent/logging.rb +0 -74
- data/lib/scout_apm/agent/reporting.rb +0 -129
- data/lib/scout_apm/utils/null_logger.rb +0 -13
data/lib/scout_apm/histogram.rb
CHANGED
@@ -171,7 +171,7 @@ module ScoutApm
|
|
171
171
|
bins.slice!(minDeltaIndex - 1, 2)
|
172
172
|
bins.insert(minDeltaIndex - 1, mergedBin)
|
173
173
|
rescue => e
|
174
|
-
ScoutApm::Agent.instance.logger.info("Error in NumericHistogram#trim_one. #{e.message}, #{e.backtrace}, #{self.inspect}")
|
174
|
+
ScoutApm::Agent.instance.context.logger.info("Error in NumericHistogram#trim_one. #{e.message}, #{e.backtrace}, #{self.inspect}")
|
175
175
|
raise
|
176
176
|
end
|
177
177
|
end
|
@@ -55,7 +55,7 @@ module ScoutApm
|
|
55
55
|
DevTraceResponseManipulator.new(env, rack_response).call
|
56
56
|
rescue Exception => e
|
57
57
|
# If anything went wrong at all, just bail out and return the unmodified response.
|
58
|
-
ScoutApm::Agent.instance.logger.debug("DevTrace: Raised an exception: #{e.message}, #{e.backtrace}")
|
58
|
+
ScoutApm::Agent.instance.context.logger.debug("DevTrace: Raised an exception: #{e.message}, #{e.backtrace}")
|
59
59
|
rack_response
|
60
60
|
end
|
61
61
|
end
|
@@ -79,7 +79,7 @@ module ScoutApm
|
|
79
79
|
return rack_response unless preconditions_met?
|
80
80
|
|
81
81
|
if ajax_request?
|
82
|
-
ScoutApm::Agent.instance.logger.debug("DevTrace: in middleware, dev_trace is active, and response has a body. This is either AJAX or JSON. Path=#{path}; ContentType=#{content_type}")
|
82
|
+
ScoutApm::Agent.instance.context.logger.debug("DevTrace: in middleware, dev_trace is active, and response has a body. This is either AJAX or JSON. Path=#{path}; ContentType=#{content_type}")
|
83
83
|
adjust_ajax_header
|
84
84
|
else
|
85
85
|
adjust_html_response
|
@@ -116,7 +116,7 @@ module ScoutApm
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def dev_trace_disabled?
|
119
|
-
! ScoutApm::Agent.instance.config.value('dev_trace')
|
119
|
+
! ScoutApm::Agent.instance.context.config.value('dev_trace')
|
120
120
|
end
|
121
121
|
|
122
122
|
########################
|
@@ -212,7 +212,7 @@ module ScoutApm
|
|
212
212
|
##############################
|
213
213
|
|
214
214
|
def logger
|
215
|
-
ScoutApm::Agent.instance.logger
|
215
|
+
ScoutApm::Agent.instance.context.logger
|
216
216
|
end
|
217
217
|
|
218
218
|
def tracked_request
|
@@ -220,14 +220,14 @@ module ScoutApm
|
|
220
220
|
end
|
221
221
|
|
222
222
|
def apm_host
|
223
|
-
ScoutApm::Agent.instance.config.value("direct_host")
|
223
|
+
ScoutApm::Agent.instance.context.config.value("direct_host")
|
224
224
|
end
|
225
225
|
|
226
226
|
def trace
|
227
227
|
@trace ||=
|
228
228
|
begin
|
229
229
|
layer_finder = LayerConverters::FindLayerByType.new(tracked_request)
|
230
|
-
converter = LayerConverters::SlowRequestConverter.new(tracked_request, layer_finder, ScoutApm::FakeStore.new)
|
230
|
+
converter = LayerConverters::SlowRequestConverter.new(ScoutApm::Agent.instance.context, tracked_request, layer_finder, ScoutApm::FakeStore.new)
|
231
231
|
converter.call
|
232
232
|
end
|
233
233
|
end
|
@@ -236,7 +236,7 @@ module ScoutApm
|
|
236
236
|
@payload ||=
|
237
237
|
begin
|
238
238
|
metadata = {
|
239
|
-
:app_root => ScoutApm::
|
239
|
+
:app_root => ScoutApm::Agent.instance.context.environment.root.to_s,
|
240
240
|
:unique_id => env['action_dispatch.request_id'], # note, this is a different unique_id than what "normal" payloads use
|
241
241
|
:agent_version => ScoutApm::VERSION,
|
242
242
|
:platform => "ruby",
|
@@ -15,12 +15,12 @@ module ScoutApm
|
|
15
15
|
# Serialize that trace. We reuse the PayloadSerializer, but only provide the metadata and traces.
|
16
16
|
# In this case, the traces array will always have just one element.
|
17
17
|
metadata = {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
:app_root => ScoutApm::Agent.instance.context.environment.root.to_s,
|
19
|
+
:unique_id => ScoutApm::Utils::UniqueId.simple,
|
20
|
+
:agent_version => ScoutApm::VERSION,
|
21
|
+
:agent_time => Time.now.iso8601,
|
22
|
+
:agent_pid => Process.pid,
|
23
|
+
:platform => "ruby",
|
24
24
|
}
|
25
25
|
|
26
26
|
metrics = []
|
@@ -31,7 +31,7 @@ module ScoutApm
|
|
31
31
|
payload = ScoutApm::Serializers::PayloadSerializer.serialize(metadata, metrics, traces, jobs, slow_jobs)
|
32
32
|
|
33
33
|
# Hand it off to the reporter for POST to our servers
|
34
|
-
reporter = Reporter.new(:instant_trace,
|
34
|
+
reporter = Reporter.new(context, :instant_trace, @instant_key)
|
35
35
|
reporter.report(payload, {'Content-Type' => 'application/json'} )
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
module ScoutApm
|
2
|
+
class InstrumentManager
|
3
|
+
attr_reader :context
|
4
|
+
|
5
|
+
attr_reader :installed_instruments
|
6
|
+
|
7
|
+
def initialize(context)
|
8
|
+
@context = context
|
9
|
+
@installed_instruments = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# Loads the instrumention logic.
|
13
|
+
def install!
|
14
|
+
case framework
|
15
|
+
when :rails then
|
16
|
+
install_instrument(ScoutApm::Instruments::ActionControllerRails2)
|
17
|
+
when :rails3_or_4 then
|
18
|
+
install_instrument(ScoutApm::Instruments::ActionControllerRails3Rails4)
|
19
|
+
install_instrument(ScoutApm::Instruments::RailsRouter)
|
20
|
+
|
21
|
+
if config.value("detailed_middleware")
|
22
|
+
install_instrument(ScoutApm::Instruments::MiddlewareDetailed)
|
23
|
+
else
|
24
|
+
install_instrument(ScoutApm::Instruments::MiddlewareSummary)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
install_instrument(ScoutApm::Instruments::ActionView)
|
29
|
+
install_instrument(ScoutApm::Instruments::ActiveRecord)
|
30
|
+
install_instrument(ScoutApm::Instruments::Moped)
|
31
|
+
install_instrument(ScoutApm::Instruments::Mongoid)
|
32
|
+
install_instrument(ScoutApm::Instruments::NetHttp)
|
33
|
+
install_instrument(ScoutApm::Instruments::HttpClient)
|
34
|
+
install_instrument(ScoutApm::Instruments::Redis)
|
35
|
+
install_instrument(ScoutApm::Instruments::InfluxDB)
|
36
|
+
install_instrument(ScoutApm::Instruments::Elasticsearch)
|
37
|
+
install_instrument(ScoutApm::Instruments::Grape)
|
38
|
+
rescue
|
39
|
+
logger.warn "Exception loading instruments:"
|
40
|
+
logger.warn $!.message
|
41
|
+
logger.warn $!.backtrace
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def install_instrument(instrument_klass)
|
47
|
+
return if already_installed?(instrument_klass)
|
48
|
+
|
49
|
+
if skip_instrument?(instrument_klass)
|
50
|
+
logger.info "Skipping Disabled Instrument: #{instrument_short_name} - To re-enable, change `disabled_instruments` key in scout_apm.yml"
|
51
|
+
return
|
52
|
+
end
|
53
|
+
|
54
|
+
instance = instrument_klass.new(context)
|
55
|
+
@installed_instruments << instance
|
56
|
+
instance.install
|
57
|
+
end
|
58
|
+
|
59
|
+
# Allows users to skip individual instruments via the config file
|
60
|
+
def skip_instrument?(instrument_klass)
|
61
|
+
instrument_short_name = instrument_klass.name.split("::").last
|
62
|
+
(config.value("disabled_instruments") || []).include?(instrument_short_name)
|
63
|
+
end
|
64
|
+
|
65
|
+
def already_installed?(instrument_klass)
|
66
|
+
@installed_instruments.any? do |already_installed_instrument|
|
67
|
+
instrument_klass === already_installed_instrument
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
###################
|
72
|
+
# Lookup Helpers #
|
73
|
+
###################
|
74
|
+
|
75
|
+
def logger
|
76
|
+
context.logger
|
77
|
+
end
|
78
|
+
|
79
|
+
def config
|
80
|
+
context.config
|
81
|
+
end
|
82
|
+
|
83
|
+
def framework
|
84
|
+
context.environment.framework
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -1,27 +1,31 @@
|
|
1
1
|
module ScoutApm
|
2
2
|
module Instruments
|
3
3
|
class ActionControllerRails2
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :context
|
5
5
|
|
6
|
-
def
|
7
|
-
@
|
6
|
+
def initialize(context)
|
7
|
+
@context = context
|
8
8
|
@installed = false
|
9
9
|
end
|
10
10
|
|
11
|
+
def logger
|
12
|
+
context.logger
|
13
|
+
end
|
14
|
+
|
11
15
|
def installed?
|
12
16
|
@installed
|
13
17
|
end
|
14
18
|
|
15
19
|
def install
|
16
|
-
@installed = true
|
17
|
-
|
18
20
|
if defined?(::ActionController) && defined?(::ActionController::Base)
|
21
|
+
@installed = true
|
22
|
+
|
19
23
|
::ActionController::Base.class_eval do
|
20
24
|
include ScoutApm::Tracer
|
21
25
|
include ::ScoutApm::Instruments::ActionControllerRails2Instruments
|
22
26
|
end
|
23
27
|
|
24
|
-
|
28
|
+
logger.info "Instrumenting ActionView::Template"
|
25
29
|
::ActionView::Template.class_eval do
|
26
30
|
include ::ScoutApm::Tracer
|
27
31
|
instrument_method :render, :type => "View", :name => '#{path[%r{^(/.*/)?(.*)$},2]}/Rendering', :scope => true
|
@@ -33,7 +37,8 @@ module ScoutApm
|
|
33
37
|
|
34
38
|
module ActionControllerRails2Instruments
|
35
39
|
def self.included(instrumented_class)
|
36
|
-
|
40
|
+
# XXX: Don't lookup context by global
|
41
|
+
ScoutApm::Agent.instance.context.logger.info "Instrumenting #{instrumented_class.inspect}"
|
37
42
|
instrumented_class.class_eval do
|
38
43
|
unless instrumented_class.method_defined?(:perform_action_without_scout_instruments)
|
39
44
|
alias_method :perform_action_without_scout_instruments, :perform_action
|
@@ -2,27 +2,31 @@ module ScoutApm
|
|
2
2
|
module Instruments
|
3
3
|
# instrumentation for Rails 3, 4, and 5 is the same.
|
4
4
|
class ActionControllerRails3Rails4
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :context
|
6
6
|
|
7
|
-
def
|
8
|
-
@
|
7
|
+
def initialize(context)
|
8
|
+
@context = context
|
9
9
|
@installed = false
|
10
10
|
end
|
11
11
|
|
12
|
+
def logger
|
13
|
+
context.logger
|
14
|
+
end
|
15
|
+
|
12
16
|
def installed?
|
13
17
|
@installed
|
14
18
|
end
|
15
19
|
|
16
20
|
def install
|
17
|
-
@installed = true
|
18
|
-
|
19
21
|
# We previously instrumented ActionController::Metal, which missed
|
20
22
|
# before and after filter timing. Instrumenting Base includes those
|
21
23
|
# filters, at the expense of missing out on controllers that don't use
|
22
24
|
# the full Rails stack.
|
23
25
|
if defined?(::ActionController)
|
26
|
+
@installed = true
|
27
|
+
|
24
28
|
if defined?(::ActionController::Base)
|
25
|
-
|
29
|
+
logger.info "Instrumenting ActionController::Base"
|
26
30
|
::ActionController::Base.class_eval do
|
27
31
|
# include ScoutApm::Tracer
|
28
32
|
include ScoutApm::Instruments::ActionControllerBaseInstruments
|
@@ -30,14 +34,14 @@ module ScoutApm
|
|
30
34
|
end
|
31
35
|
|
32
36
|
if defined?(::ActionController::Metal)
|
33
|
-
|
37
|
+
logger.info "Instrumenting ActionController::Metal"
|
34
38
|
::ActionController::Metal.class_eval do
|
35
39
|
include ScoutApm::Instruments::ActionControllerMetalInstruments
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
39
43
|
if defined?(::ActionController::API)
|
40
|
-
|
44
|
+
logger.info "Instrumenting ActionController::Api"
|
41
45
|
::ActionController::API.class_eval do
|
42
46
|
include ScoutApm::Instruments::ActionControllerAPIInstruments
|
43
47
|
end
|
@@ -59,7 +63,7 @@ module ScoutApm
|
|
59
63
|
|
60
64
|
# Check if this this request is to be reported instantly
|
61
65
|
if instant_key = request.cookies['scoutapminstant']
|
62
|
-
Agent.instance.logger.info "Instant trace request with key=#{instant_key} for path=#{path}"
|
66
|
+
ScoutApm::Agent.instance.context.logger.info "Instant trace request with key=#{instant_key} for path=#{path}"
|
63
67
|
req.instant_key = instant_key
|
64
68
|
end
|
65
69
|
|
@@ -78,7 +82,7 @@ module ScoutApm
|
|
78
82
|
resolved_name = scout_action_name(*args)
|
79
83
|
layer = ScoutApm::Layer.new("Controller", "#{controller_path}/#{resolved_name}")
|
80
84
|
|
81
|
-
if enable_scoutprof? && ScoutApm::Agent.instance.config.value('profile') && ScoutApm::Instruments::Stacks::ENABLED
|
85
|
+
if enable_scoutprof? && ScoutApm::Agent.instance.context.config.value('profile') && ScoutApm::Instruments::Stacks::ENABLED
|
82
86
|
if defined?(ScoutApm::Instruments::Stacks::INSTALLED) && ScoutApm::Instruments::Stacks::INSTALLED
|
83
87
|
# Capture ScoutProf if we can
|
84
88
|
req.enable_profiled_thread!
|
@@ -102,8 +106,9 @@ module ScoutApm
|
|
102
106
|
end
|
103
107
|
|
104
108
|
# Given an +ActionDispatch::Request+, formats the uri based on config settings.
|
105
|
-
|
106
|
-
|
109
|
+
# XXX: Don't lookup context like this - find a way to pass it through
|
110
|
+
def self.scout_transaction_uri(request, config=ScoutApm::Agent.instance.context.config)
|
111
|
+
case config.value("uri_reporting")
|
107
112
|
when 'path'
|
108
113
|
request.path # strips off the query string for more security
|
109
114
|
else # default handles filtered params
|
@@ -2,22 +2,26 @@ module ScoutApm
|
|
2
2
|
module Instruments
|
3
3
|
# instrumentation for Rails 3 and Rails 4 is the same.
|
4
4
|
class ActionView
|
5
|
-
attr_reader :
|
5
|
+
attr_reader :context
|
6
6
|
|
7
|
-
def
|
8
|
-
@
|
7
|
+
def initialize(context)
|
8
|
+
@context = context
|
9
9
|
@installed = false
|
10
10
|
end
|
11
11
|
|
12
|
+
def logger
|
13
|
+
context.logger
|
14
|
+
end
|
15
|
+
|
12
16
|
def installed?
|
13
17
|
@installed
|
14
18
|
end
|
15
19
|
|
16
20
|
def install
|
17
|
-
@installed = true
|
18
|
-
|
19
21
|
if defined?(::ActionView) && defined?(::ActionView::PartialRenderer)
|
20
|
-
|
22
|
+
@installed = true
|
23
|
+
|
24
|
+
logger.info "Instrumenting ActionView::PartialRenderer"
|
21
25
|
::ActionView::PartialRenderer.class_eval do
|
22
26
|
include ScoutApm::Tracer
|
23
27
|
|
@@ -32,7 +36,7 @@ module ScoutApm
|
|
32
36
|
:scope => true
|
33
37
|
end
|
34
38
|
|
35
|
-
|
39
|
+
logger.info "Instrumenting ActionView::TemplateRenderer"
|
36
40
|
::ActionView::TemplateRenderer.class_eval do
|
37
41
|
include ScoutApm::Tracer
|
38
42
|
instrument_method :render_template,
|
@@ -3,21 +3,23 @@ require 'scout_apm/utils/sql_sanitizer'
|
|
3
3
|
module ScoutApm
|
4
4
|
module Instruments
|
5
5
|
class ActiveRecord
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :context
|
7
7
|
|
8
|
-
def
|
9
|
-
@
|
8
|
+
def initialize(context)
|
9
|
+
@context = context
|
10
10
|
@installed = false
|
11
11
|
end
|
12
12
|
|
13
|
+
def logger
|
14
|
+
context.logger
|
15
|
+
end
|
16
|
+
|
13
17
|
def installed?
|
14
18
|
@installed
|
15
19
|
end
|
16
20
|
|
17
21
|
def install
|
18
|
-
|
19
|
-
|
20
|
-
if defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3 && ::Rails.respond_to?(:configuration)
|
22
|
+
if install_via_after_initialize?
|
21
23
|
Rails.configuration.after_initialize do
|
22
24
|
add_instruments
|
23
25
|
end
|
@@ -26,9 +28,21 @@ module ScoutApm
|
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
31
|
+
# If we have the right version of rails, we should use the hooks provided
|
32
|
+
# to install these instruments
|
33
|
+
def install_via_after_initialize?
|
34
|
+
defined?(::Rails) &&
|
35
|
+
defined?(::Rails::VERSION) &&
|
36
|
+
defined?(::Rails::VERSION::MAJOR) &&
|
37
|
+
::Rails::VERSION::MAJOR.to_i == 3 &&
|
38
|
+
::Rails.respond_to?(:configuration)
|
39
|
+
end
|
40
|
+
|
29
41
|
def add_instruments
|
30
42
|
# Setup Tracer on AR::Base
|
31
43
|
if Utils::KlassHelper.defined?("ActiveRecord::Base")
|
44
|
+
@installed = true
|
45
|
+
|
32
46
|
::ActiveRecord::Base.class_eval do
|
33
47
|
include ::ScoutApm::Tracer
|
34
48
|
end
|
@@ -80,14 +94,14 @@ module ScoutApm
|
|
80
94
|
if layer && layer.type == "ActiveRecord"
|
81
95
|
layer.annotate_layer(payload)
|
82
96
|
elsif layer
|
83
|
-
|
97
|
+
logger.debug("Expected layer type: ActiveRecord, got #{layer && layer.type}")
|
84
98
|
else
|
85
99
|
# noop, no layer at all. We're probably ignoring this req.
|
86
100
|
end
|
87
101
|
end
|
88
102
|
end
|
89
103
|
rescue
|
90
|
-
|
104
|
+
logger.warn "ActiveRecord instrumentation exception: #{$!.message}"
|
91
105
|
end
|
92
106
|
end
|
93
107
|
|
@@ -102,7 +116,7 @@ module ScoutApm
|
|
102
116
|
################################################################################
|
103
117
|
module ActiveRecordInstruments
|
104
118
|
def self.included(instrumented_class)
|
105
|
-
ScoutApm::Agent.instance.logger.info "Instrumenting #{instrumented_class.inspect}"
|
119
|
+
ScoutApm::Agent.instance.context.logger.info "Instrumenting #{instrumented_class.inspect}"
|
106
120
|
instrumented_class.class_eval do
|
107
121
|
unless instrumented_class.method_defined?(:log_without_scout_instruments)
|
108
122
|
alias_method :log_without_scout_instruments, :log
|
@@ -176,7 +190,7 @@ module ScoutApm
|
|
176
190
|
|
177
191
|
module ActiveRecordQueryingInstruments
|
178
192
|
def self.included(instrumented_class)
|
179
|
-
ScoutApm::Agent.instance.logger.info "Instrumenting ActiveRecord::Querying - #{instrumented_class.inspect}"
|
193
|
+
ScoutApm::Agent.instance.context.logger.info "Instrumenting ActiveRecord::Querying - #{instrumented_class.inspect}"
|
180
194
|
instrumented_class.class_eval do
|
181
195
|
unless instrumented_class.method_defined?(:find_by_sql_without_scout_instruments)
|
182
196
|
alias_method :find_by_sql_without_scout_instruments, :find_by_sql
|
@@ -202,7 +216,7 @@ module ScoutApm
|
|
202
216
|
|
203
217
|
module ActiveRecordFinderMethodsInstruments
|
204
218
|
def self.included(instrumented_class)
|
205
|
-
ScoutApm::Agent.instance.logger.info "Instrumenting ActiveRecord::FinderMethods - #{instrumented_class.inspect}"
|
219
|
+
ScoutApm::Agent.instance.context.logger.info "Instrumenting ActiveRecord::FinderMethods - #{instrumented_class.inspect}"
|
206
220
|
instrumented_class.class_eval do
|
207
221
|
unless instrumented_class.method_defined?(:find_with_associations_without_scout_instruments)
|
208
222
|
alias_method :find_with_associations_without_scout_instruments, :find_with_associations
|