checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
---
2
- SHA1:
3
- metadata.gz: 89a778c6a185b81e358249aef0f9420bec2d9cbc
4
- data.tar.gz: d4f063fd0c52537c5780fab065052e3b1c989848
2
+ SHA256:
3
+ metadata.gz: c8715d4d303e068a7730e2ec2f788ee44c2bbd6762a3a3bd30cdcc9f167435b9
4
+ data.tar.gz: 58e17c6491c144b596a61501b01406b15da245b6ce517a7fdbcaddfa896b0929
5
5
SHA512:
6
- metadata.gz: 2d46fa2cb57eb83c07c6a4b0552f9565834423b3af09402753524af2af81ff963d60a6b2fee6b19b8c786976baa61d67efc448477421f04f4fa0a84c5d97b3f2
7
- data.tar.gz: 6db9909c632798dd5be1976577d74fc099a7587359a4af2736ae0c020240b4640cf8c6bbf2a165c299b7fe22c41d3fc5d2b73866d8c30a71809ced3a33019b78
6
+ metadata.gz: da8ddf5b4bb2a6d2223b49c1071dad0dd966234f2ed7b2e05747c67a0e3a9368b3831ef0496f5e6b57bd785ef486d12aade25db6815c2bf9a78ce1fce5f2acdf
7
+ data.tar.gz: 9fc04fcf1fa8350b1c95b00c936612a6dfc575905f22821d86e4fa01474c3cd9eab1343857ece2d7cd7e631b625c4e7e4f2e24dc895068f59f08c7fbe0e777c2
data/.gitignore CHANGED
@@ -18,3 +18,4 @@ coverage/*
18
18
lib/*.bundle
19
19
lib/*.so
20
20
log/scout_apm.log
21
+ gems/*.lock
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
- before_install:
4
+ matrix:
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:
22
5
include:
23
- - script: bundle exec rake test
24
- - script: bundle exec rubocop
25
- rvm: "2.5"
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 as an attempted workaround for [this bug](https://github.com/scoutapp/scout_apm_ruby/issues/267).
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/octoshark.gemfile ADDED
@@ -0,0 +1,4 @@
1
+ eval_gemfile("../Gemfile")
2
+
3
+ # https://github.com/scoutapp/scout_apm_ruby/issues/217
4
+ gem 'octoshark'
data/gems/rails3.gemfile ADDED
@@ -0,0 +1,4 @@
1
+ eval_gemfile("../Gemfile")
2
+
3
+ gem "rails", "~> 3.2"
4
+ gem "sqlite3", "~> 1.3.5"
data/gems/rails4.gemfile ADDED
@@ -0,0 +1,4 @@
1
+ eval_gemfile("../Gemfile")
2
+
3
+ gem "rails", "~> 4.2"
4
+ gem "sqlite3", "~> 1.3.6"
data/gems/rails5.gemfile ADDED
@@ -0,0 +1,4 @@
1
+ eval_gemfile("../Gemfile")
2
+
3
+ gem "rails", "~> 5.0"
4
+ gem "sqlite3", "~> 1.3", ">= 1.3.6"
data/gems/rails6.gemfile ADDED
@@ -0,0 +1,4 @@
1
+ eval_gemfile("../Gemfile")
2
+
3
+ gem "rails", "~> 6.0.0rc1"
4
+ gem "sqlite3", "~> 1.4"
data/lib/scout_apm/detailed_trace.rb CHANGED
@@ -98,7 +98,7 @@ class DetailedTrace
98
98
}
99
99
},
100
100
:tags => tags.as_json,
101
- :spans => spans.as_json,
101
+ :spans => spans.map{|span| span.as_json},
102
102
}
103
103
end
104
104
data/lib/scout_apm/instruments/active_record.rb CHANGED
@@ -82,9 +82,14 @@ module ScoutApm
82
82
83
83
# Install #log tracing
84
84
if Utils::KlassHelper.defined?("ActiveRecord::ConnectionAdapters::AbstractAdapter")
85
- ::ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
86
- include ::ScoutApm::Instruments::ActiveRecordInstruments
87
- include ::ScoutApm::Tracer
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
- module ActiveRecordInstruments
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
#
data/lib/scout_apm/layer_converters/trace_converter.rb CHANGED
@@ -117,7 +117,9 @@ module ScoutApm
117
117
tags)
118
118
119
119
layer.children.each do |child|
120
- unless over_span_limit?(result)
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 should stop collecting
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/tracked_request.rb CHANGED
@@ -212,8 +212,8 @@ module ScoutApm
212
212
def stop_request
213
213
@stopping = true
214
214
215
- if recorder
216
- recorder.record!(self)
215
+ if @recorder
216
+ @recorder.record!(self)
217
217
end
218
218
end
219
219
data/lib/scout_apm/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
module ScoutApm
2
- VERSION = "2.5.1"
2
+ VERSION = "2.5.2"
3
3
end
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
@@ -100,7 +100,7 @@ class Minitest::Test
100
100
end
101
101
102
102
def agent_context
103
- ScoutApm::AgentContext.new
103
+ ScoutApm::Agent.instance.context
104
104
end
105
105
106
106
DATA_FILE_DIR = File.dirname(__FILE__) + '/tmp'
data/test/unit/instruments/active_record_instruments_test.rb DELETED
@@ -1,5 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ActiveRecordInstrumentsTest < Minitest::Test
4
- end
5
-
data/test/unit/instruments/active_record_test.rb ADDED
@@ -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.1
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-06-24 00:00:00.000000000 Z
12
+ date: 2019-08-13 00:00:00.000000000 Z
13
13
dependencies:
14
14
- !ruby/object:Gem::Dependency
15
15
name: minitest
@@ -110,6 +110,34 @@ dependencies:
110
110
- !ruby/object:Gem::Version
111
111
version: '0'
112
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'
140
+ - !ruby/object:Gem::Dependency
113
141
name: rubocop
114
142
requirement: !ruby/object:Gem::Requirement
115
143
requirements:
@@ -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/active_record_instruments_test.rb
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.4.6
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:
436
+ 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