scout_apm 2.5.1 → 2.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +21 -21
- data/CHANGELOG.markdown +7 -1
- data/gems/README.md +28 -0
- data/gems/octoshark.gemfile +4 -0
- data/gems/rails3.gemfile +4 -0
- data/gems/rails4.gemfile +4 -0
- data/gems/rails5.gemfile +4 -0
- data/gems/rails6.gemfile +4 -0
- data/lib/scout_apm/detailed_trace.rb +1 -1
- data/lib/scout_apm/instruments/active_record.rb +63 -4
- data/lib/scout_apm/layer_converters/trace_converter.rb +4 -4
- data/lib/scout_apm/tracked_request.rb +2 -2
- data/lib/scout_apm/version.rb +1 -1
- data/scout_apm.gemspec +6 -0
- data/test/test_helper.rb +1 -1
- data/test/unit/instruments/active_record_test.rb +40 -0
- metadata +40 -48
- data/test/unit/instruments/active_record_instruments_test.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c8715d4d303e068a7730e2ec2f788ee44c2bbd6762a3a3bd30cdcc9f167435b9
|
4
|
+
data.tar.gz: 58e17c6491c144b596a61501b01406b15da245b6ce517a7fdbcaddfa896b0929
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da8ddf5b4bb2a6d2223b49c1071dad0dd966234f2ed7b2e05747c67a0e3a9368b3831ef0496f5e6b57bd785ef486d12aade25db6815c2bf9a78ce1fce5f2acdf
|
7
|
+
data.tar.gz: 9fc04fcf1fa8350b1c95b00c936612a6dfc575905f22821d86e4fa01474c3cd9eab1343857ece2d7cd7e631b625c4e7e4f2e24dc895068f59f08c7fbe0e777c2
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
language: ruby
|
2
|
-
|
3
|
-
rvm:
|
4
|
-
- "1.8.7"
|
5
|
-
- "1.9.3"
|
6
|
-
- "2.0"
|
7
|
-
- "2.2"
|
8
|
-
- "2.4"
|
9
|
-
- "2.5"
|
10
|
-
|
11
2
|
cache: bundler
|
12
3
|
|
13
|
-
|
14
|
-
# Don't gem update, since it tries to install RubyGems requiring 2.3+.
|
15
|
-
# - gem update --system
|
16
|
-
|
17
|
-
# Lock down the version. Newer versions only support Ruby 2.3+, but we need
|
18
|
-
# to test back further.
|
19
|
-
- gem install bundler -v '1.17.3'
|
20
|
-
|
21
|
-
jobs:
|
4
|
+
matrix:
|
22
5
|
include:
|
23
|
-
-
|
24
|
-
|
25
|
-
|
6
|
+
- rvm: "1.8.7"
|
7
|
+
gemfile: gems/rails3.gemfile
|
8
|
+
- rvm: "1.9.3"
|
9
|
+
gemfile: gems/rails3.gemfile
|
10
|
+
- rvm: 2.0
|
11
|
+
gemfile: gems/rails3.gemfile
|
12
|
+
- rvm: 2.1
|
13
|
+
gemfile: gems/rails3.gemfile
|
14
|
+
- rvm: 2.2
|
15
|
+
- rvm: 2.3
|
16
|
+
- rvm: 2.4
|
17
|
+
- rvm: 2.5
|
18
|
+
- rvm: 2.6
|
19
|
+
- rvm: 2.6
|
20
|
+
gemfile: gems/octoshark.gemfile
|
21
|
+
- rvm: 2.6
|
22
|
+
name: rubocop yo
|
23
|
+
script: bundle exec rubocop
|
24
|
+
- rvm: 2.6
|
25
|
+
gemfile: gems/rails3.gemfile
|
data/CHANGELOG.markdown
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
+
# 2.5.2
|
2
|
+
|
3
|
+
* Don't process limited layers in detailed traces (#268)
|
4
|
+
* Fix OctoShark (and other gems which patch ActiveRecord) interaction (#217)
|
5
|
+
* Legacy [Rails 2.3 fix for as_json](https://github.com/scoutapp/scout_apm_ruby/pull/276)
|
6
|
+
|
1
7
|
# 2.5.1
|
2
8
|
|
3
|
-
* Decrease timeline trace span limit to 1,500
|
9
|
+
* Decrease timeline trace span limit to 1,500 to address [this bug](https://github.com/scoutapp/scout_apm_ruby/issues/267).
|
4
10
|
|
5
11
|
# 2.5.0
|
6
12
|
|
data/gems/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Gems
|
2
|
+
|
3
|
+
These gemfiles list specific configurations of gems that we use in travis testing.
|
4
|
+
|
5
|
+
## Travis Matrix
|
6
|
+
|
7
|
+
```yaml
|
8
|
+
matrix:
|
9
|
+
include:
|
10
|
+
- rvm: "1.8.7"
|
11
|
+
gemfile: gems/rails3.gemfile
|
12
|
+
```
|
13
|
+
|
14
|
+
Using a gemfile controls the specific versions of the gems that are installed, and can be used to reproduce customer configurations for testing.
|
15
|
+
|
16
|
+
## Local Testing
|
17
|
+
|
18
|
+
To install the gems specified by a specific gemfile:
|
19
|
+
|
20
|
+
```
|
21
|
+
BUNDLE_GEMFILE=gems/rails5.gemfile bundle install
|
22
|
+
```
|
23
|
+
|
24
|
+
Then, to run tests using these gems:
|
25
|
+
|
26
|
+
```
|
27
|
+
BUNDLE_GEMFILE=gems/rails5.gemfile bundle exec rake
|
28
|
+
```
|
data/gems/rails3.gemfile
ADDED
data/gems/rails4.gemfile
ADDED
data/gems/rails5.gemfile
ADDED
data/gems/rails6.gemfile
ADDED
@@ -82,9 +82,14 @@ module ScoutApm
|
|
82
82
|
|
83
83
|
# Install #log tracing
|
84
84
|
if Utils::KlassHelper.defined?("ActiveRecord::ConnectionAdapters::AbstractAdapter")
|
85
|
-
|
86
|
-
|
87
|
-
|
85
|
+
if Module.respond_to?(:prepend)
|
86
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend(ActiveRecordInstruments)
|
87
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.include(Tracer)
|
88
|
+
else
|
89
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
|
90
|
+
include ::ScoutApm::Instruments::ActiveRecordAliasMethodInstruments
|
91
|
+
include ::ScoutApm::Tracer
|
92
|
+
end
|
88
93
|
end
|
89
94
|
end
|
90
95
|
|
@@ -167,7 +172,9 @@ module ScoutApm
|
|
167
172
|
# to the real SQL, and an AR generated "name" for the Query
|
168
173
|
#
|
169
174
|
################################################################################
|
170
|
-
|
175
|
+
#
|
176
|
+
# Note, if you change this instrumentation, you also need to change ActiveRecordInstruments.
|
177
|
+
module ActiveRecordAliasMethodInstruments
|
171
178
|
def self.included(instrumented_class)
|
172
179
|
ScoutApm::Agent.instance.context.logger.info "Instrumenting #{instrumented_class.inspect}"
|
173
180
|
instrumented_class.class_eval do
|
@@ -225,6 +232,58 @@ module ScoutApm
|
|
225
232
|
end
|
226
233
|
end
|
227
234
|
|
235
|
+
module ActiveRecordInstruments
|
236
|
+
def self.prepended(instrumented_class)
|
237
|
+
ScoutApm::Agent.instance.context.logger.info "Instrumenting #{instrumented_class.inspect}"
|
238
|
+
end
|
239
|
+
|
240
|
+
def log(*args, &block)
|
241
|
+
# Extract data from the arguments
|
242
|
+
sql, name = args
|
243
|
+
metric_name = Utils::ActiveRecordMetricName.new(sql, name)
|
244
|
+
desc = SqlList.new(sql)
|
245
|
+
|
246
|
+
# Get current ScoutApm context
|
247
|
+
req = ScoutApm::RequestManager.lookup
|
248
|
+
current_layer = req.current_layer
|
249
|
+
|
250
|
+
# If we call #log, we have a real query to run, and we've already
|
251
|
+
# gotten through the cache gatekeeper. Since we want to only trace real
|
252
|
+
# queries, and not repeated identical queries that just hit cache, we
|
253
|
+
# mark layer as ignorable initially in #find_by_sql, then only when we
|
254
|
+
# know it's a real database call do we mark it back as usable.
|
255
|
+
#
|
256
|
+
# This flag is later used in SlowRequestConverter to skip adding ignorable layers
|
257
|
+
current_layer.annotate_layer(:ignorable => false) if current_layer
|
258
|
+
|
259
|
+
# Either: update the current layer and yield, don't start a new one.
|
260
|
+
if current_layer && current_layer.type == "ActiveRecord"
|
261
|
+
# TODO: Get rid of call .to_s, need to find this without forcing a previous run of the name logic
|
262
|
+
if current_layer.name.to_s == Utils::ActiveRecordMetricName::DEFAULT_METRIC
|
263
|
+
current_layer.name = metric_name
|
264
|
+
end
|
265
|
+
|
266
|
+
if current_layer.desc.nil?
|
267
|
+
current_layer.desc = SqlList.new
|
268
|
+
end
|
269
|
+
current_layer.desc.merge(desc)
|
270
|
+
|
271
|
+
super(*args, &block)
|
272
|
+
|
273
|
+
# OR: Start a new layer, we didn't pick up instrumentation earlier in the stack.
|
274
|
+
else
|
275
|
+
layer = ScoutApm::Layer.new("ActiveRecord", metric_name)
|
276
|
+
layer.desc = desc
|
277
|
+
req.start_layer(layer)
|
278
|
+
begin
|
279
|
+
super(*args, &block)
|
280
|
+
ensure
|
281
|
+
req.stop_layer
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
228
287
|
################################################################################
|
229
288
|
# Entry-point of instruments.
|
230
289
|
#
|
@@ -117,7 +117,9 @@ module ScoutApm
|
|
117
117
|
tags)
|
118
118
|
|
119
119
|
layer.children.each do |child|
|
120
|
-
|
120
|
+
# Don't create spans from limited layers. These don't have start/stop times and our processing can't
|
121
|
+
# handle these yet.
|
122
|
+
unless over_span_limit?(result) || child.is_a?(LimitedLayer)
|
121
123
|
result += create_spans(child, span_id)
|
122
124
|
end
|
123
125
|
end
|
@@ -152,10 +154,8 @@ module ScoutApm
|
|
152
154
|
# Limit Handling
|
153
155
|
################################################################################
|
154
156
|
|
155
|
-
# To prevent huge traces from being generated, we
|
157
|
+
# To prevent huge traces from being generated, we stop collecting
|
156
158
|
# spans as we go beyond some reasonably large count.
|
157
|
-
# Until the root cause of https://github.com/scoutapp/scout_apm_ruby/issues/267 is addressed,
|
158
|
-
# keep `MAX_SPANS` less than `DEFAULT_UNIQUE_CUTOFF`.
|
159
159
|
MAX_SPANS = 1500
|
160
160
|
|
161
161
|
def over_span_limit?(spans)
|
data/lib/scout_apm/version.rb
CHANGED
data/scout_apm.gemspec
CHANGED
@@ -29,6 +29,12 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency "addressable"
|
30
30
|
s.add_development_dependency "activesupport"
|
31
31
|
|
32
|
+
# These are general development dependencies which are used in instrumentation
|
33
|
+
# tests. Specific versions are pulled in using specific gemfiles, e.g.
|
34
|
+
# `gems/rails3.gemfile`.
|
35
|
+
s.add_development_dependency "activerecord"
|
36
|
+
s.add_development_dependency "sqlite3"
|
37
|
+
|
32
38
|
if RUBY_VERSION >= "1.9.3"
|
33
39
|
s.add_development_dependency "rubocop"
|
34
40
|
s.add_development_dependency "guard"
|
data/test/test_helper.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'sqlite3'
|
3
|
+
require 'active_record'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'octoshark'
|
7
|
+
rescue LoadError
|
8
|
+
# Ignore
|
9
|
+
end
|
10
|
+
|
11
|
+
class ActiveRecordTest < Minitest::Test
|
12
|
+
def database_path
|
13
|
+
File.expand_path('test.sqlite3', DATA_FILE_DIR)
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
database = SQLite3::Database.new(database_path)
|
18
|
+
database.execute("DROP TABLE IF EXISTS users;")
|
19
|
+
database.execute("CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(100));")
|
20
|
+
|
21
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => database_path)
|
22
|
+
end
|
23
|
+
|
24
|
+
class User < ActiveRecord::Base
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_instrumentation
|
28
|
+
recorder = FakeRecorder.new
|
29
|
+
agent_context.recorder = recorder
|
30
|
+
|
31
|
+
instrument = ScoutApm::Instruments::ActiveRecord.new(agent_context)
|
32
|
+
instrument.install
|
33
|
+
|
34
|
+
ScoutApm::Tracer.instrument("Controller", "foo/bar") do
|
35
|
+
user = User.create
|
36
|
+
end
|
37
|
+
|
38
|
+
assert 1, recorder.requests.size
|
39
|
+
end
|
40
|
+
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: 2.5.
|
4
|
+
version: 2.5.2
|
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: 2019-
|
12
|
+
date: 2019-08-13 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: activerecord
|
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: sqlite3
|
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
|
- !ruby/object:Gem::Dependency
|
113
141
|
name: rubocop
|
114
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -189,6 +217,12 @@ files:
|
|
189
217
|
- ext/rusage/README.md
|
190
218
|
- ext/rusage/extconf.rb
|
191
219
|
- ext/rusage/rusage.c
|
220
|
+
- gems/README.md
|
221
|
+
- gems/octoshark.gemfile
|
222
|
+
- gems/rails3.gemfile
|
223
|
+
- gems/rails4.gemfile
|
224
|
+
- gems/rails5.gemfile
|
225
|
+
- gems/rails6.gemfile
|
192
226
|
- lib/scout_apm.rb
|
193
227
|
- lib/scout_apm/agent.rb
|
194
228
|
- lib/scout_apm/agent/exit_handler.rb
|
@@ -332,6 +366,7 @@ files:
|
|
332
366
|
- scout_apm.gemspec
|
333
367
|
- test/data/config_test_1.yml
|
334
368
|
- test/test_helper.rb
|
369
|
+
- test/tmp/README.md
|
335
370
|
- test/unit/agent_test.rb
|
336
371
|
- test/unit/background_job_integrations/sidekiq_test.rb
|
337
372
|
- test/unit/config_test.rb
|
@@ -345,7 +380,7 @@ files:
|
|
345
380
|
- test/unit/git_revision_test.rb
|
346
381
|
- test/unit/histogram_test.rb
|
347
382
|
- test/unit/ignored_uris_test.rb
|
348
|
-
- test/unit/instruments/
|
383
|
+
- test/unit/instruments/active_record_test.rb
|
349
384
|
- test/unit/instruments/net_http_test.rb
|
350
385
|
- test/unit/instruments/percentile_sampler_test.rb
|
351
386
|
- test/unit/layaway_test.rb
|
@@ -394,51 +429,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
394
429
|
version: '0'
|
395
430
|
requirements: []
|
396
431
|
rubyforge_project: scout_apm
|
397
|
-
rubygems_version: 2.
|
432
|
+
rubygems_version: 2.7.6
|
398
433
|
signing_key:
|
399
434
|
specification_version: 4
|
400
435
|
summary: Ruby application performance monitoring
|
401
|
-
test_files:
|
402
|
-
- test/data/config_test_1.yml
|
403
|
-
- test/test_helper.rb
|
404
|
-
- test/unit/agent_test.rb
|
405
|
-
- test/unit/background_job_integrations/sidekiq_test.rb
|
406
|
-
- test/unit/config_test.rb
|
407
|
-
- test/unit/context_test.rb
|
408
|
-
- test/unit/db_query_metric_set_test.rb
|
409
|
-
- test/unit/db_query_metric_stats_test.rb
|
410
|
-
- test/unit/environment_test.rb
|
411
|
-
- test/unit/extensions/periodic_callbacks_test.rb
|
412
|
-
- test/unit/extensions/transaction_callbacks_test.rb
|
413
|
-
- test/unit/fake_store_test.rb
|
414
|
-
- test/unit/git_revision_test.rb
|
415
|
-
- test/unit/histogram_test.rb
|
416
|
-
- test/unit/ignored_uris_test.rb
|
417
|
-
- test/unit/instruments/active_record_instruments_test.rb
|
418
|
-
- test/unit/instruments/net_http_test.rb
|
419
|
-
- test/unit/instruments/percentile_sampler_test.rb
|
420
|
-
- test/unit/layaway_test.rb
|
421
|
-
- test/unit/layer_children_set_test.rb
|
422
|
-
- test/unit/layer_converters/depth_first_walker_test.rb
|
423
|
-
- test/unit/layer_converters/metric_converter_test.rb
|
424
|
-
- test/unit/layer_converters/stubs.rb
|
425
|
-
- test/unit/limited_layer_test.rb
|
426
|
-
- test/unit/logger_test.rb
|
427
|
-
- test/unit/metric_set_test.rb
|
428
|
-
- test/unit/remote/test_message.rb
|
429
|
-
- test/unit/remote/test_router.rb
|
430
|
-
- test/unit/remote/test_server.rb
|
431
|
-
- test/unit/scored_item_set_test.rb
|
432
|
-
- test/unit/serializers/payload_serializer_test.rb
|
433
|
-
- test/unit/slow_job_policy_test.rb
|
434
|
-
- test/unit/slow_request_policy_test.rb
|
435
|
-
- test/unit/sql_sanitizer_test.rb
|
436
|
-
- test/unit/store_test.rb
|
437
|
-
- test/unit/tracer_test.rb
|
438
|
-
- test/unit/tracked_request_test.rb
|
439
|
-
- test/unit/transaction_test.rb
|
440
|
-
- test/unit/transaction_time_consumed_test.rb
|
441
|
-
- test/unit/utils/active_record_metric_name_test.rb
|
442
|
-
- test/unit/utils/backtrace_parser_test.rb
|
443
|
-
- test/unit/utils/numbers_test.rb
|
444
|
-
- test/unit/utils/scm.rb
|
436
|
+
test_files: []
|