scout_apm 2.1.24 → 2.1.26
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/lib/scout_apm.rb +3 -0
- data/lib/scout_apm/agent.rb +1 -0
- data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +89 -57
- data/lib/scout_apm/instruments/action_view.rb +49 -0
- data/lib/scout_apm/rack.rb +26 -0
- data/lib/scout_apm/tracked_request.rb +1 -1
- data/lib/scout_apm/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f204bb73b571d29f24c1ef41ef3e643dd53ede06
|
4
|
+
data.tar.gz: 420211b4994ee6437de618b5fd6cea516881d6aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8095e97d2fc53bcad1a8b100ea13f574795cfbe1bc45a7d4717c7c356f2eab3f9d28ff09cd65df0485fca4a82439fb9d13aa668654a2e8599debc6b97ace906
|
7
|
+
data.tar.gz: ebe375745cb23716f9930cf12221d9ee11775ee0ba37a0fe89c510d342b2618171b80724201e9f76d141d612b919d6ac41486c2fc07dd9c6ad727ac4e454a17f
|
data/lib/scout_apm.rb
CHANGED
@@ -83,6 +83,7 @@ require 'scout_apm/instruments/sinatra'
|
|
83
83
|
require 'scout_apm/instruments/process/process_cpu'
|
84
84
|
require 'scout_apm/instruments/process/process_memory'
|
85
85
|
require 'scout_apm/instruments/percentile_sampler'
|
86
|
+
require 'scout_apm/instruments/action_view'
|
86
87
|
require 'allocations'
|
87
88
|
|
88
89
|
require 'scout_apm/app_server_load'
|
@@ -143,6 +144,8 @@ require 'scout_apm/middleware'
|
|
143
144
|
|
144
145
|
require 'scout_apm/instant/middleware'
|
145
146
|
|
147
|
+
require 'scout_apm/rack'
|
148
|
+
|
146
149
|
if defined?(Rails) && defined?(Rails::VERSION) && defined?(Rails::VERSION::MAJOR) && Rails::VERSION::MAJOR >= 3 && defined?(Rails::Railtie)
|
147
150
|
module ScoutApm
|
148
151
|
class Railtie < Rails::Railtie
|
data/lib/scout_apm/agent.rb
CHANGED
@@ -297,6 +297,7 @@ module ScoutApm
|
|
297
297
|
end
|
298
298
|
end
|
299
299
|
|
300
|
+
install_instrument(ScoutApm::Instruments::ActionView)
|
300
301
|
install_instrument(ScoutApm::Instruments::ActiveRecord)
|
301
302
|
install_instrument(ScoutApm::Instruments::Moped)
|
302
303
|
install_instrument(ScoutApm::Instruments::Mongoid)
|
@@ -20,73 +20,78 @@ module ScoutApm
|
|
20
20
|
# before and after filter timing. Instrumenting Base includes those
|
21
21
|
# filters, at the expense of missing out on controllers that don't use
|
22
22
|
# the full Rails stack.
|
23
|
-
if defined?(::ActionController)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
if defined?(::ActionController)
|
24
|
+
if defined?(::ActionController::Base)
|
25
|
+
ScoutApm::Agent.instance.logger.info "Instrumenting ActionController::Base"
|
26
|
+
::ActionController::Base.class_eval do
|
27
|
+
# include ScoutApm::Tracer
|
28
|
+
include ScoutApm::Instruments::ActionControllerBaseInstruments
|
29
|
+
end
|
28
30
|
end
|
29
|
-
end
|
30
|
-
|
31
|
-
if defined?(::ActionView) && defined?(::ActionView::PartialRenderer)
|
32
|
-
ScoutApm::Agent.instance.logger.info "Instrumenting ActionView::PartialRenderer"
|
33
|
-
::ActionView::PartialRenderer.class_eval do
|
34
|
-
include ScoutApm::Tracer
|
35
31
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
instrument_method :collection_with_template,
|
42
|
-
:type => "View",
|
43
|
-
:name => '#{@template.virtual_path rescue "Unknown Collection"}/Rendering',
|
44
|
-
:scope => true
|
32
|
+
if defined?(::ActionController::Metal)
|
33
|
+
ScoutApm::Agent.instance.logger.info "Instrumenting ActionController::Metal"
|
34
|
+
::ActionController::Metal.class_eval do
|
35
|
+
include ScoutApm::Instruments::ActionControllerMetalInstruments
|
36
|
+
end
|
45
37
|
end
|
46
38
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
:name => '#{args[0].virtual_path rescue "Unknown"}/Rendering',
|
53
|
-
:scope => true
|
39
|
+
if defined?(::ActionController::API)
|
40
|
+
ScoutApm::Agent.instance.logger.info "Instrumenting ActionController::Api"
|
41
|
+
::ActionController::API.class_eval do
|
42
|
+
include ScoutApm::Instruments::ActionControllerAPIInstruments
|
43
|
+
end
|
54
44
|
end
|
55
45
|
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
module ActionControllerRails3Rails4Instruments
|
60
|
-
def process_action(*args)
|
61
|
-
req = ScoutApm::RequestManager.lookup
|
62
|
-
req.annotate_request(:uri => scout_transaction_uri(request))
|
63
|
-
|
64
|
-
# IP Spoofing Protection can throw an exception, just move on w/o remote ip
|
65
|
-
req.context.add_user(:ip => request.remote_ip) rescue nil
|
66
46
|
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
req.web!
|
47
|
+
# Returns a new anonymous module each time it is called. So
|
48
|
+
# we can insert this multiple times into the ancestors
|
49
|
+
# stack. Otherwise it only exists the first time you include it
|
50
|
+
# (under Metal, instead of under API) and we miss instrumenting
|
51
|
+
# before_action callbacks
|
52
|
+
end
|
76
53
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
54
|
+
def self.build_instrument_module
|
55
|
+
Module.new do
|
56
|
+
def process_action(*args)
|
57
|
+
req = ScoutApm::RequestManager.lookup
|
58
|
+
current_layer = req.current_layer
|
59
|
+
|
60
|
+
# Check if this this request is to be reported instantly
|
61
|
+
if instant_key = request.cookies['scoutapminstant']
|
62
|
+
Agent.instance.logger.info "Instant trace request with key=#{instant_key} for path=#{path}"
|
63
|
+
req.instant_key = instant_key
|
64
|
+
end
|
65
|
+
|
66
|
+
if current_layer.type == "Controller"
|
67
|
+
# Don't start a new layer if ActionController::API or ActionController::Base handled it already.
|
68
|
+
super
|
69
|
+
else
|
70
|
+
req.annotate_request(:uri => ScoutApm::Instruments::ActionControllerRails3Rails4.scout_transaction_uri(request))
|
71
|
+
|
72
|
+
# IP Spoofing Protection can throw an exception, just move on w/o remote ip
|
73
|
+
req.context.add_user(:ip => request.remote_ip) rescue nil
|
74
|
+
req.set_headers(request.headers)
|
75
|
+
|
76
|
+
req.web!
|
77
|
+
|
78
|
+
resolved_name = scout_action_name(*args)
|
79
|
+
req.start_layer( ScoutApm::Layer.new("Controller", "#{controller_path}/#{resolved_name}") )
|
80
|
+
begin
|
81
|
+
super
|
82
|
+
rescue
|
83
|
+
req.error!
|
84
|
+
raise
|
85
|
+
ensure
|
86
|
+
req.stop_layer
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
85
90
|
end
|
86
|
-
end
|
91
|
+
end
|
87
92
|
|
88
93
|
# Given an +ActionDispatch::Request+, formats the uri based on config settings.
|
89
|
-
def scout_transaction_uri(request)
|
94
|
+
def self.scout_transaction_uri(request)
|
90
95
|
case ScoutApm::Agent.instance.config.value("uri_reporting")
|
91
96
|
when 'path'
|
92
97
|
request.path # strips off the query string for more security
|
@@ -94,8 +99,35 @@ module ScoutApm
|
|
94
99
|
request.filtered_path
|
95
100
|
end
|
96
101
|
end
|
102
|
+
end
|
97
103
|
|
98
|
-
|
104
|
+
module ActionControllerMetalInstruments
|
105
|
+
include ScoutApm::Instruments::ActionControllerRails3Rails4.build_instrument_module
|
106
|
+
|
107
|
+
def scout_action_name(*args)
|
108
|
+
action_name = args[0]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# Empty, noop module to provide compatibility w/ previous manual instrumentation
|
113
|
+
module ActionControllerRails3Rails4Instruments
|
114
|
+
end
|
115
|
+
|
116
|
+
module ActionControllerBaseInstruments
|
117
|
+
include ScoutApm::Instruments::ActionControllerRails3Rails4.build_instrument_module
|
118
|
+
|
119
|
+
def scout_action_name(*args)
|
120
|
+
action_name
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
module ActionControllerAPIInstruments
|
125
|
+
include ScoutApm::Instruments::ActionControllerRails3Rails4.build_instrument_module
|
126
|
+
|
127
|
+
def scout_action_name(*args)
|
128
|
+
action_name
|
129
|
+
end
|
130
|
+
end
|
99
131
|
end
|
100
132
|
end
|
101
133
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module ScoutApm
|
2
|
+
module Instruments
|
3
|
+
# instrumentation for Rails 3 and Rails 4 is the same.
|
4
|
+
class ActionView
|
5
|
+
attr_reader :logger
|
6
|
+
|
7
|
+
def initalize(logger=ScoutApm::Agent.instance.logger)
|
8
|
+
@logger = logger
|
9
|
+
@installed = false
|
10
|
+
end
|
11
|
+
|
12
|
+
def installed?
|
13
|
+
@installed
|
14
|
+
end
|
15
|
+
|
16
|
+
def install
|
17
|
+
@installed = true
|
18
|
+
|
19
|
+
if defined?(::ActionView) && defined?(::ActionView::PartialRenderer)
|
20
|
+
ScoutApm::Agent.instance.logger.info "Instrumenting ActionView::PartialRenderer"
|
21
|
+
::ActionView::PartialRenderer.class_eval do
|
22
|
+
include ScoutApm::Tracer
|
23
|
+
|
24
|
+
instrument_method :render_partial,
|
25
|
+
:type => "View",
|
26
|
+
:name => '#{@template.virtual_path rescue "Unknown Partial"}/Rendering',
|
27
|
+
:scope => true
|
28
|
+
|
29
|
+
instrument_method :collection_with_template,
|
30
|
+
:type => "View",
|
31
|
+
:name => '#{@template.virtual_path rescue "Unknown Collection"}/Rendering',
|
32
|
+
:scope => true
|
33
|
+
end
|
34
|
+
|
35
|
+
ScoutApm::Agent.instance.logger.info "Instrumenting ActionView::TemplateRenderer"
|
36
|
+
::ActionView::TemplateRenderer.class_eval do
|
37
|
+
include ScoutApm::Tracer
|
38
|
+
instrument_method :render_template,
|
39
|
+
:type => "View",
|
40
|
+
:name => '#{args[0].virtual_path rescue "Unknown"}/Rendering',
|
41
|
+
:scope => true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ScoutApm
|
2
|
+
module Rack
|
3
|
+
def self.install!
|
4
|
+
ScoutApm::Agent.instance.start(:skip_app_server_check => true)
|
5
|
+
ScoutApm::Agent.instance.start_background_worker
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.transaction(endpoint_name, env)
|
9
|
+
req = ScoutApm::RequestManager.lookup
|
10
|
+
req.annotate_request(:uri => env["REQUEST_PATH"]) rescue nil
|
11
|
+
req.context.add_user(:ip => env["REMOTE_ADDR"]) rescue nil
|
12
|
+
|
13
|
+
req.web!
|
14
|
+
req.start_layer(ScoutApm::Layer.new('Controller', endpoint_name))
|
15
|
+
|
16
|
+
begin
|
17
|
+
yield
|
18
|
+
rescue
|
19
|
+
req.error!
|
20
|
+
raise
|
21
|
+
ensure
|
22
|
+
req.stop_layer
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -53,7 +53,7 @@ module ScoutApm
|
|
53
53
|
@error = false
|
54
54
|
@instant_key = nil
|
55
55
|
@mem_start = mem_usage
|
56
|
-
@dev_trace = ScoutApm::Agent.instance.config.value('dev_trace') &&
|
56
|
+
@dev_trace = ScoutApm::Agent.instance.config.value('dev_trace') && ScoutApm::Agent.instance.environment.env == "development"
|
57
57
|
end
|
58
58
|
|
59
59
|
def start_layer(layer)
|
data/lib/scout_apm/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout_apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.
|
4
|
+
version: 2.1.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derek Haynes
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-06-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -160,6 +160,7 @@ files:
|
|
160
160
|
- lib/scout_apm/instruments/.DS_Store
|
161
161
|
- lib/scout_apm/instruments/action_controller_rails_2.rb
|
162
162
|
- lib/scout_apm/instruments/action_controller_rails_3_rails4.rb
|
163
|
+
- lib/scout_apm/instruments/action_view.rb
|
163
164
|
- lib/scout_apm/instruments/active_record.rb
|
164
165
|
- lib/scout_apm/instruments/elasticsearch.rb
|
165
166
|
- lib/scout_apm/instruments/grape.rb
|
@@ -198,6 +199,7 @@ files:
|
|
198
199
|
- lib/scout_apm/platform_integrations/cloud_foundry.rb
|
199
200
|
- lib/scout_apm/platform_integrations/heroku.rb
|
200
201
|
- lib/scout_apm/platform_integrations/server.rb
|
202
|
+
- lib/scout_apm/rack.rb
|
201
203
|
- lib/scout_apm/reporter.rb
|
202
204
|
- lib/scout_apm/request_histograms.rb
|
203
205
|
- lib/scout_apm/request_manager.rb
|