scout_apm 3.0.0.pre10 → 3.0.0.pre11
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/.gitignore +1 -0
- data/CHANGELOG.markdown +47 -0
- data/Guardfile +42 -0
- data/lib/scout_apm.rb +14 -0
- data/lib/scout_apm/agent.rb +58 -1
- data/lib/scout_apm/agent/logging.rb +6 -1
- data/lib/scout_apm/app_server_load.rb +21 -11
- data/lib/scout_apm/background_job_integrations/resque.rb +85 -0
- data/lib/scout_apm/background_job_integrations/sidekiq.rb +19 -3
- data/lib/scout_apm/background_recorder.rb +43 -0
- data/lib/scout_apm/background_worker.rb +6 -6
- data/lib/scout_apm/config.rb +14 -3
- data/lib/scout_apm/environment.rb +14 -0
- data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +112 -70
- data/lib/scout_apm/instruments/action_view.rb +49 -0
- data/lib/scout_apm/instruments/active_record.rb +2 -2
- data/lib/scout_apm/instruments/mongoid.rb +10 -2
- data/lib/scout_apm/instruments/resque.rb +40 -0
- data/lib/scout_apm/layer_children_set.rb +7 -2
- data/lib/scout_apm/rack.rb +26 -0
- data/lib/scout_apm/remote/message.rb +23 -0
- data/lib/scout_apm/remote/recorder.rb +57 -0
- data/lib/scout_apm/remote/router.rb +49 -0
- data/lib/scout_apm/remote/server.rb +58 -0
- data/lib/scout_apm/request_manager.rb +1 -1
- data/lib/scout_apm/synchronous_recorder.rb +26 -0
- data/lib/scout_apm/tracked_request.rb +53 -5
- data/lib/scout_apm/utils/backtrace_parser.rb +3 -3
- data/lib/scout_apm/utils/scm.rb +14 -0
- data/lib/scout_apm/version.rb +1 -1
- data/scout_apm.gemspec +2 -0
- data/test/unit/remote/test_message.rb +13 -0
- data/test/unit/remote/test_router.rb +33 -0
- data/test/unit/remote/test_server.rb +15 -0
- data/test/unit/test_tracked_request.rb +87 -0
- data/test/unit/utils/backtrace_parser_test.rb +5 -0
- data/test/unit/utils/scm.rb +17 -0
- metadata +52 -2
@@ -6,8 +6,8 @@ require 'scout_apm/environment'
|
|
6
6
|
module ScoutApm
|
7
7
|
module Utils
|
8
8
|
class BacktraceParser
|
9
|
-
|
10
|
-
APP_FRAMES =
|
9
|
+
# will return this many backtrace frames from the app stack.
|
10
|
+
APP_FRAMES = 8
|
11
11
|
|
12
12
|
attr_reader :call_stack
|
13
13
|
|
@@ -24,7 +24,7 @@ module ScoutApm
|
|
24
24
|
stack = []
|
25
25
|
call_stack.each do |c|
|
26
26
|
if m = c.match(@@app_dir_regex)
|
27
|
-
stack << m[1]
|
27
|
+
stack << ScoutApm::Utils::Scm.relative_scm_path(m[1])
|
28
28
|
break if stack.size == APP_FRAMES
|
29
29
|
end
|
30
30
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Module for helping to deal with Source Code Management settings
|
2
|
+
module ScoutApm
|
3
|
+
module Utils
|
4
|
+
class Scm
|
5
|
+
# Takes an *already relative* path +path+
|
6
|
+
# Returns a relative path, prepending the configured +scm_subdirectory+ environment string
|
7
|
+
def self.relative_scm_path(path, scm_subdirectory = ScoutApm::Environment.instance.scm_subdirectory)
|
8
|
+
@@scm_subdirectory ||= scm_subdirectory.sub(/^\//, '')
|
9
|
+
@@scm_subdirectoy_blank ||= @@scm_subdirectory.empty?
|
10
|
+
@@scm_subdirectoy_blank ? path : File.join(@@scm_subdirectory, path)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/scout_apm/version.rb
CHANGED
data/scout_apm.gemspec
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MessageTest < Minitest::Test
|
4
|
+
def test_message_encode_decode_roundtrip
|
5
|
+
message = ScoutApm::Remote::Message.new('type', 'command', ['arg'])
|
6
|
+
encoded = message.encode
|
7
|
+
decoded = ScoutApm::Remote::Message.decode(encoded)
|
8
|
+
assert_equal message.type, decoded.type
|
9
|
+
assert_equal message.command, decoded.command
|
10
|
+
assert_equal message.args, decoded.args
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RouterTest < Minitest::Test
|
4
|
+
def test_router_handles_record
|
5
|
+
recorder = stub
|
6
|
+
router = ScoutApm::Remote::Router.new(recorder, logger)
|
7
|
+
message = ScoutApm::Remote::Message.new("record", "foo", 1, 2).encode
|
8
|
+
|
9
|
+
recorder.expects(:foo).with(1, 2)
|
10
|
+
|
11
|
+
router.handle(message)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_router_raises_on_unknown_types
|
15
|
+
recorder = stub
|
16
|
+
router = ScoutApm::Remote::Router.new(recorder, logger)
|
17
|
+
message = ScoutApm::Remote::Message.new("something_else", "foo", 1, 2).encode
|
18
|
+
|
19
|
+
recorder.expects(:foo).never
|
20
|
+
assert_raises do
|
21
|
+
router.handle(message)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def logger
|
26
|
+
@logger ||= Logger.new(logger_io)
|
27
|
+
end
|
28
|
+
|
29
|
+
def logger_io
|
30
|
+
@logger_io ||= StringIO.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestRemoteServer < Minitest::Test
|
4
|
+
def test_start_and_bind
|
5
|
+
bind = "127.0.0.1"
|
6
|
+
port = 8938
|
7
|
+
router = stub(:router)
|
8
|
+
logger_io = StringIO.new
|
9
|
+
server = ScoutApm::Remote::Server.new(bind, port, router, Logger.new(logger_io))
|
10
|
+
|
11
|
+
server.start
|
12
|
+
sleep 0.01 # Let the server finish starting. The assert should instead allow a time
|
13
|
+
assert server.running?
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TrackedRequestDumpAndLoadTest < Minitest::Test
|
4
|
+
# TrackedRequest must be marshalable
|
5
|
+
def test_marshal_dump_load
|
6
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
7
|
+
tr.prepare_to_dump!
|
8
|
+
|
9
|
+
dumped = Marshal.dump(tr)
|
10
|
+
loaded = Marshal.load(dumped)
|
11
|
+
assert_false loaded.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_restore_store
|
15
|
+
faux = ScoutApm::FakeStore.new
|
16
|
+
tr = ScoutApm::TrackedRequest.new(faux)
|
17
|
+
assert_equal faux, tr.instance_variable_get("@store")
|
18
|
+
|
19
|
+
tr.prepare_to_dump!
|
20
|
+
assert_nil tr.instance_variable_get("@store")
|
21
|
+
|
22
|
+
tr.restore_store
|
23
|
+
assert_equal ScoutApm::Agent.instance.store, tr.instance_variable_get("@store")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class TrackedRequestFlagsTest < Minitest::Test
|
28
|
+
def test_set_web
|
29
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
30
|
+
assert_false tr.web?
|
31
|
+
tr.web!
|
32
|
+
assert tr.web?
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_set_job
|
36
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
37
|
+
assert ! tr.job?
|
38
|
+
tr.job!
|
39
|
+
assert tr.job?
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_set_error
|
43
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
44
|
+
assert_false tr.error?
|
45
|
+
tr.error!
|
46
|
+
assert tr.error?
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_set_error_and_web
|
50
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
51
|
+
assert_false tr.error?
|
52
|
+
assert_false tr.web?
|
53
|
+
|
54
|
+
tr.web!
|
55
|
+
assert_false tr.error?
|
56
|
+
assert tr.web?
|
57
|
+
|
58
|
+
tr.error!
|
59
|
+
assert tr.error?
|
60
|
+
assert tr.web?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class TrackedRequestLayerManipulationTest < Minitest::Test
|
65
|
+
def test_start_layer
|
66
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
67
|
+
tr.start_layer(ScoutApm::Layer.new("Foo", "Bar"))
|
68
|
+
|
69
|
+
assert_equal "Foo", tr.current_layer.type
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_start_several_layers
|
73
|
+
# layers are Controller -> ActiveRecord
|
74
|
+
controller_layer = ScoutApm::Layer.new("Controller", "users/index")
|
75
|
+
ar_layer = ScoutApm::Layer.new("ActiveRecord", "Users#find")
|
76
|
+
|
77
|
+
tr = ScoutApm::TrackedRequest.new(ScoutApm::FakeStore.new)
|
78
|
+
tr.start_layer(controller_layer)
|
79
|
+
tr.start_layer(ar_layer)
|
80
|
+
|
81
|
+
assert_equal "ActiveRecord", tr.current_layer.type
|
82
|
+
|
83
|
+
tr.stop_layer
|
84
|
+
|
85
|
+
assert_equal "Controller", tr.current_layer.type
|
86
|
+
end
|
87
|
+
end
|
@@ -39,6 +39,11 @@ class BacktraceParserTest < Minitest::Test
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
def test_calls_scm_relative_path
|
43
|
+
ScoutApm::Utils::Scm.expects(:relative_scm_path).at_least_once
|
44
|
+
assert ScoutApm::Utils::BacktraceParser.new(raw_backtrace, root).call
|
45
|
+
end
|
46
|
+
|
42
47
|
def test_works_on_shorter_backtraces
|
43
48
|
result = ScoutApm::Utils::BacktraceParser.new(raw_backtrace(1), root).call
|
44
49
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
require 'scout_apm/utils/scm'
|
3
|
+
|
4
|
+
class ScmTest < Minitest::Test
|
5
|
+
|
6
|
+
def test_relative_scm_path_blank
|
7
|
+
assert_equal 'app/models/person.rb', ScoutApm::Utils::Scm.relative_scm_path('app/models/person.rb', '')
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_relative_scm_path_not_blank
|
11
|
+
assert_equal 'src/app/models/person.rb', ScoutApm::Utils::Scm.relative_scm_path('app/models/person.rb', 'src')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_relative_scm_path_not_blank_with_slashes
|
15
|
+
assert_equal 'src/app/models/person.rb', ScoutApm::Utils::Scm.relative_scm_path('app/models/person.rb', '/src/')
|
16
|
+
end
|
17
|
+
end
|
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: 3.0.0.
|
4
|
+
version: 3.0.0.pre11
|
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-09-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -109,6 +109,34 @@ dependencies:
|
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: guard
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: guard-minitest
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '0'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
112
140
|
description: Monitors Ruby apps and reports detailed metrics on performance to Scout.
|
113
141
|
email:
|
114
142
|
- support@scoutapp.com
|
@@ -123,6 +151,7 @@ files:
|
|
123
151
|
- ".rubocop.yml"
|
124
152
|
- CHANGELOG.markdown
|
125
153
|
- Gemfile
|
154
|
+
- Guardfile
|
126
155
|
- LICENSE.md
|
127
156
|
- README.markdown
|
128
157
|
- Rakefile
|
@@ -142,7 +171,9 @@ files:
|
|
142
171
|
- lib/scout_apm/app_server_load.rb
|
143
172
|
- lib/scout_apm/attribute_arranger.rb
|
144
173
|
- lib/scout_apm/background_job_integrations/delayed_job.rb
|
174
|
+
- lib/scout_apm/background_job_integrations/resque.rb
|
145
175
|
- lib/scout_apm/background_job_integrations/sidekiq.rb
|
176
|
+
- lib/scout_apm/background_recorder.rb
|
146
177
|
- lib/scout_apm/background_worker.rb
|
147
178
|
- lib/scout_apm/bucket_name_splitter.rb
|
148
179
|
- lib/scout_apm/call_set.rb
|
@@ -164,6 +195,7 @@ files:
|
|
164
195
|
- lib/scout_apm/instruments/.DS_Store
|
165
196
|
- lib/scout_apm/instruments/action_controller_rails_2.rb
|
166
197
|
- lib/scout_apm/instruments/action_controller_rails_3_rails4.rb
|
198
|
+
- lib/scout_apm/instruments/action_view.rb
|
167
199
|
- lib/scout_apm/instruments/active_record.rb
|
168
200
|
- lib/scout_apm/instruments/elasticsearch.rb
|
169
201
|
- lib/scout_apm/instruments/grape.rb
|
@@ -179,6 +211,7 @@ files:
|
|
179
211
|
- lib/scout_apm/instruments/process/process_memory.rb
|
180
212
|
- lib/scout_apm/instruments/rails_router.rb
|
181
213
|
- lib/scout_apm/instruments/redis.rb
|
214
|
+
- lib/scout_apm/instruments/resque.rb
|
182
215
|
- lib/scout_apm/instruments/sinatra.rb
|
183
216
|
- lib/scout_apm/job_record.rb
|
184
217
|
- lib/scout_apm/layaway.rb
|
@@ -202,6 +235,11 @@ files:
|
|
202
235
|
- lib/scout_apm/platform_integrations/cloud_foundry.rb
|
203
236
|
- lib/scout_apm/platform_integrations/heroku.rb
|
204
237
|
- lib/scout_apm/platform_integrations/server.rb
|
238
|
+
- lib/scout_apm/rack.rb
|
239
|
+
- lib/scout_apm/remote/message.rb
|
240
|
+
- lib/scout_apm/remote/recorder.rb
|
241
|
+
- lib/scout_apm/remote/router.rb
|
242
|
+
- lib/scout_apm/remote/server.rb
|
205
243
|
- lib/scout_apm/reporter.rb
|
206
244
|
- lib/scout_apm/request_histograms.rb
|
207
245
|
- lib/scout_apm/request_manager.rb
|
@@ -227,6 +265,7 @@ files:
|
|
227
265
|
- lib/scout_apm/slow_transaction.rb
|
228
266
|
- lib/scout_apm/stack_item.rb
|
229
267
|
- lib/scout_apm/store.rb
|
268
|
+
- lib/scout_apm/synchronous_recorder.rb
|
230
269
|
- lib/scout_apm/trace_compactor.rb
|
231
270
|
- lib/scout_apm/tracer.rb
|
232
271
|
- lib/scout_apm/tracked_request.rb
|
@@ -238,6 +277,7 @@ files:
|
|
238
277
|
- lib/scout_apm/utils/klass_helper.rb
|
239
278
|
- lib/scout_apm/utils/null_logger.rb
|
240
279
|
- lib/scout_apm/utils/numbers.rb
|
280
|
+
- lib/scout_apm/utils/scm.rb
|
241
281
|
- lib/scout_apm/utils/sql_sanitizer.rb
|
242
282
|
- lib/scout_apm/utils/sql_sanitizer_regex.rb
|
243
283
|
- lib/scout_apm/utils/sql_sanitizer_regex_1_8_7.rb
|
@@ -262,15 +302,20 @@ files:
|
|
262
302
|
- test/unit/layer_children_set_test.rb
|
263
303
|
- test/unit/limited_layer_test.rb
|
264
304
|
- test/unit/metric_set_test.rb
|
305
|
+
- test/unit/remote/test_message.rb
|
306
|
+
- test/unit/remote/test_router.rb
|
307
|
+
- test/unit/remote/test_server.rb
|
265
308
|
- test/unit/scored_item_set_test.rb
|
266
309
|
- test/unit/serializers/payload_serializer_test.rb
|
267
310
|
- test/unit/slow_job_policy_test.rb
|
268
311
|
- test/unit/slow_request_policy_test.rb
|
269
312
|
- test/unit/sql_sanitizer_test.rb
|
270
313
|
- test/unit/store_test.rb
|
314
|
+
- test/unit/test_tracked_request.rb
|
271
315
|
- test/unit/utils/active_record_metric_name_test.rb
|
272
316
|
- test/unit/utils/backtrace_parser_test.rb
|
273
317
|
- test/unit/utils/numbers_test.rb
|
318
|
+
- test/unit/utils/scm.rb
|
274
319
|
- tester.rb
|
275
320
|
homepage: https://github.com/scoutapp/scout_apm_ruby
|
276
321
|
licenses:
|
@@ -315,12 +360,17 @@ test_files:
|
|
315
360
|
- test/unit/layer_children_set_test.rb
|
316
361
|
- test/unit/limited_layer_test.rb
|
317
362
|
- test/unit/metric_set_test.rb
|
363
|
+
- test/unit/remote/test_message.rb
|
364
|
+
- test/unit/remote/test_router.rb
|
365
|
+
- test/unit/remote/test_server.rb
|
318
366
|
- test/unit/scored_item_set_test.rb
|
319
367
|
- test/unit/serializers/payload_serializer_test.rb
|
320
368
|
- test/unit/slow_job_policy_test.rb
|
321
369
|
- test/unit/slow_request_policy_test.rb
|
322
370
|
- test/unit/sql_sanitizer_test.rb
|
323
371
|
- test/unit/store_test.rb
|
372
|
+
- test/unit/test_tracked_request.rb
|
324
373
|
- test/unit/utils/active_record_metric_name_test.rb
|
325
374
|
- test/unit/utils/backtrace_parser_test.rb
|
326
375
|
- test/unit/utils/numbers_test.rb
|
376
|
+
- test/unit/utils/scm.rb
|