scout_apm 3.0.0.pre11 → 3.0.0.pre12
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/CHANGELOG.markdown +13 -4
- data/Guardfile +1 -0
- data/lib/scout_apm.rb +6 -0
- data/lib/scout_apm/agent/reporting.rb +2 -1
- data/lib/scout_apm/attribute_arranger.rb +14 -1
- data/lib/scout_apm/config.rb +12 -0
- data/lib/scout_apm/db_query_metric_set.rb +80 -0
- data/lib/scout_apm/db_query_metric_stats.rb +102 -0
- data/lib/scout_apm/fake_store.rb +6 -0
- data/lib/scout_apm/instant/middleware.rb +6 -1
- data/lib/scout_apm/instruments/active_record.rb +111 -0
- data/lib/scout_apm/layer.rb +4 -0
- data/lib/scout_apm/layer_converters/allocation_metric_converter.rb +5 -6
- data/lib/scout_apm/layer_converters/converter_base.rb +7 -19
- data/lib/scout_apm/layer_converters/database_converter.rb +81 -0
- data/lib/scout_apm/layer_converters/depth_first_walker.rb +22 -10
- data/lib/scout_apm/layer_converters/error_converter.rb +5 -7
- data/lib/scout_apm/layer_converters/find_layer_by_type.rb +34 -0
- data/lib/scout_apm/layer_converters/histograms.rb +14 -0
- data/lib/scout_apm/layer_converters/job_converter.rb +35 -49
- data/lib/scout_apm/layer_converters/metric_converter.rb +16 -18
- data/lib/scout_apm/layer_converters/request_queue_time_converter.rb +10 -12
- data/lib/scout_apm/layer_converters/slow_job_converter.rb +33 -35
- data/lib/scout_apm/layer_converters/slow_request_converter.rb +22 -18
- data/lib/scout_apm/limited_layer.rb +4 -0
- data/lib/scout_apm/metric_meta.rb +0 -5
- data/lib/scout_apm/metric_stats.rb +8 -1
- data/lib/scout_apm/serializers/db_query_serializer_to_json.rb +15 -0
- data/lib/scout_apm/serializers/payload_serializer.rb +4 -3
- data/lib/scout_apm/serializers/payload_serializer_to_json.rb +5 -2
- data/lib/scout_apm/slow_job_policy.rb +1 -10
- data/lib/scout_apm/slow_request_policy.rb +1 -10
- data/lib/scout_apm/store.rb +41 -22
- data/lib/scout_apm/tracked_request.rb +28 -40
- data/lib/scout_apm/utils/active_record_metric_name.rb +8 -4
- data/lib/scout_apm/version.rb +1 -1
- data/test/unit/db_query_metric_set_test.rb +56 -0
- data/test/unit/db_query_metric_stats_test.rb +113 -0
- data/test/unit/fake_store_test.rb +10 -0
- data/test/unit/layer_converters/depth_first_walker_test.rb +66 -0
- data/test/unit/layer_converters/metric_converter_test.rb +22 -0
- data/test/unit/layer_converters/stubs.rb +33 -0
- data/test/unit/serializers/payload_serializer_test.rb +3 -12
- data/test/unit/store_test.rb +4 -4
- data/test/unit/utils/active_record_metric_name_test.rb +8 -0
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca4bf16454ad9fca2937243b738f7b8a6ae6c080
|
4
|
+
data.tar.gz: 9c84f2ee03e001220109dc1ffb32f2d5f7ab8e50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8b62b98284c93d8190408a9d364f9f3a82894670c52241a3de2faadd08635c332bdb93c50c37c331cd1458ebee8b67b68e979db03a2ea375d4775ce6103ea03
|
7
|
+
data.tar.gz: 99500b8f0e6e536e868c2f0e337775e61af71c7da1ddad986e2213807493e96d74b56330c0e84f4aca78cb35f6ecb1ddbeed0a6b4bd5e20cc5e367387e58fc29
|
data/CHANGELOG.markdown
CHANGED
@@ -1,13 +1,23 @@
|
|
1
|
-
<<<<<<< HEAD
|
2
1
|
# 3.0.0
|
3
2
|
|
4
3
|
* ScoutProf BETA
|
5
|
-
|
4
|
+
|
5
|
+
# 2.3.0
|
6
|
+
|
7
|
+
Note: ScoutApm Agent version 2.2.0 was the initial ScoutProf agent that was
|
8
|
+
determined quickly to be a big enough change to warrant the move to 3.0. We are not
|
9
|
+
reusing that version number to avoid confusion.
|
10
|
+
|
11
|
+
* Deeper database query instrumentation. The agent now collects app-wide
|
12
|
+
database usage on every call. This will allow you to better identify
|
13
|
+
persistently slow queries, and capacity bottlenecks.
|
14
|
+
* Optimize the approach used during recording each request to avoid unnecessary
|
15
|
+
work, improving performance
|
16
|
+
|
6
17
|
# 2.1.32
|
7
18
|
|
8
19
|
* Better naming when using Resque + ActiveJob
|
9
20
|
* Better naming when using Sidekiq + DelayedExtension
|
10
|
-
>>>>>>> master
|
11
21
|
|
12
22
|
# 2.1.31
|
13
23
|
|
@@ -46,7 +56,6 @@
|
|
46
56
|
# 2.1.23
|
47
57
|
|
48
58
|
* Extend Mongoid instrumentation to 6.x
|
49
|
-
>>>>>>> master
|
50
59
|
|
51
60
|
# 2.1.22
|
52
61
|
|
data/Guardfile
CHANGED
data/lib/scout_apm.rb
CHANGED
@@ -41,9 +41,12 @@ require 'scout_apm/layer_converters/error_converter'
|
|
41
41
|
require 'scout_apm/layer_converters/job_converter'
|
42
42
|
require 'scout_apm/layer_converters/slow_job_converter'
|
43
43
|
require 'scout_apm/layer_converters/metric_converter'
|
44
|
+
require 'scout_apm/layer_converters/database_converter'
|
44
45
|
require 'scout_apm/layer_converters/slow_request_converter'
|
45
46
|
require 'scout_apm/layer_converters/request_queue_time_converter'
|
46
47
|
require 'scout_apm/layer_converters/allocation_metric_converter'
|
48
|
+
require 'scout_apm/layer_converters/histograms'
|
49
|
+
require 'scout_apm/layer_converters/find_layer_by_type'
|
47
50
|
|
48
51
|
require 'scout_apm/server_integrations/passenger'
|
49
52
|
require 'scout_apm/server_integrations/puma'
|
@@ -122,6 +125,7 @@ require 'scout_apm/background_worker'
|
|
122
125
|
require 'scout_apm/bucket_name_splitter'
|
123
126
|
require 'scout_apm/stack_item'
|
124
127
|
require 'scout_apm/metric_set'
|
128
|
+
require 'scout_apm/db_query_metric_set'
|
125
129
|
require 'scout_apm/store'
|
126
130
|
require 'scout_apm/fake_store'
|
127
131
|
require 'scout_apm/tracer'
|
@@ -133,6 +137,7 @@ require 'scout_apm/synchronous_recorder'
|
|
133
137
|
|
134
138
|
require 'scout_apm/metric_meta'
|
135
139
|
require 'scout_apm/metric_stats'
|
140
|
+
require 'scout_apm/db_query_metric_stats'
|
136
141
|
require 'scout_apm/slow_transaction'
|
137
142
|
require 'scout_apm/slow_job_record'
|
138
143
|
require 'scout_apm/scored_item_set'
|
@@ -150,6 +155,7 @@ require 'scout_apm/serializers/jobs_serializer_to_json'
|
|
150
155
|
require 'scout_apm/serializers/slow_jobs_serializer_to_json'
|
151
156
|
require 'scout_apm/serializers/metrics_to_json_serializer'
|
152
157
|
require 'scout_apm/serializers/histograms_serializer_to_json'
|
158
|
+
require 'scout_apm/serializers/db_query_serializer_to_json'
|
153
159
|
require 'scout_apm/serializers/directive_serializer'
|
154
160
|
require 'scout_apm/serializers/app_server_load_serializer'
|
155
161
|
|
@@ -59,6 +59,7 @@ module ScoutApm
|
|
59
59
|
jobs = reporting_period.jobs
|
60
60
|
slow_jobs = reporting_period.slow_jobs_payload
|
61
61
|
histograms = reporting_period.histograms
|
62
|
+
db_query_metrics = reporting_period.db_query_metrics_payload
|
62
63
|
|
63
64
|
metadata = {
|
64
65
|
:app_root => ScoutApm::Environment.instance.root.to_s,
|
@@ -71,7 +72,7 @@ module ScoutApm
|
|
71
72
|
|
72
73
|
log_deliver(metrics, slow_transactions, metadata, slow_jobs, histograms)
|
73
74
|
|
74
|
-
payload = ScoutApm::Serializers::PayloadSerializer.serialize(metadata, metrics, slow_transactions, jobs, slow_jobs, histograms)
|
75
|
+
payload = ScoutApm::Serializers::PayloadSerializer.serialize(metadata, metrics, slow_transactions, jobs, slow_jobs, histograms, db_query_metrics)
|
75
76
|
logger.debug("Sending payload w/ Headers: #{headers.inspect}")
|
76
77
|
|
77
78
|
reporter.report(payload, headers)
|
@@ -14,7 +14,20 @@ module ScoutApm
|
|
14
14
|
when :name
|
15
15
|
attribute_hash[attribute] = subject.bucket_name
|
16
16
|
when Symbol
|
17
|
-
|
17
|
+
data = subject.send(attribute)
|
18
|
+
|
19
|
+
# Never try to `as_json` a time object, since it'll break if the
|
20
|
+
# app has the Oj gem set to mimic_JSON, and there's never
|
21
|
+
# anything interesting nested inside of a Time obj. We just want
|
22
|
+
# the ISO8601 string (which happens later in the payload
|
23
|
+
# serializing process)
|
24
|
+
if data.is_a?(Time)
|
25
|
+
attribute_hash[attribute] = data
|
26
|
+
elsif data.respond_to?(:as_json)
|
27
|
+
attribute_hash[attribute] = data.as_json
|
28
|
+
else
|
29
|
+
attribute_hash[attribute] = data
|
30
|
+
end
|
18
31
|
end
|
19
32
|
attribute_hash
|
20
33
|
end
|
data/lib/scout_apm/config.rb
CHANGED
@@ -41,6 +41,8 @@ module ScoutApm
|
|
41
41
|
'compress_payload',
|
42
42
|
'config_file',
|
43
43
|
'data_file',
|
44
|
+
'database_metric_limit',
|
45
|
+
'database_metric_report_limit',
|
44
46
|
'detailed_middleware',
|
45
47
|
'dev_trace',
|
46
48
|
'direct_host',
|
@@ -125,6 +127,12 @@ module ScoutApm
|
|
125
127
|
end
|
126
128
|
end
|
127
129
|
|
130
|
+
class IntegerCoercion
|
131
|
+
def coerce(val)
|
132
|
+
val.to_i
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
128
136
|
# Simply returns the passed in value, without change
|
129
137
|
class NullCoercion
|
130
138
|
def coerce(val)
|
@@ -140,6 +148,8 @@ module ScoutApm
|
|
140
148
|
"enable_background_jobs" => BooleanCoercion.new,
|
141
149
|
"ignore" => JsonCoercion.new,
|
142
150
|
"monitor" => BooleanCoercion.new,
|
151
|
+
'database_metric_limit' => IntegerCoercion.new,
|
152
|
+
'database_metric_report_limit' => IntegerCoercion.new,
|
143
153
|
}
|
144
154
|
|
145
155
|
|
@@ -227,6 +237,8 @@ module ScoutApm
|
|
227
237
|
'uri_reporting' => 'full_path',
|
228
238
|
'remote_agent_host' => '127.0.0.1',
|
229
239
|
'remote_agent_port' => 7721, # picked at random
|
240
|
+
'database_metric_limit' => 5000, # The hard limit on db metrics
|
241
|
+
'database_metric_report_limit' => 1000,
|
230
242
|
}.freeze
|
231
243
|
|
232
244
|
def value(key)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module ScoutApm
|
2
|
+
class DbQueryMetricSet
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :metrics # the raw metrics. You probably want #metrics_to_report
|
6
|
+
attr_reader :config # A ScoutApm::Config instance
|
7
|
+
|
8
|
+
def initialize(config=ScoutApm::Agent.instance.config)
|
9
|
+
# A hash of DbQueryMetricStats values, keyed by DbQueryMetricStats.key
|
10
|
+
@metrics = Hash.new
|
11
|
+
@config = config
|
12
|
+
end
|
13
|
+
|
14
|
+
def each
|
15
|
+
metrics.each do |_key, db_query_metric_stat|
|
16
|
+
yield db_query_metric_stat
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Looks up a DbQueryMetricStats instance in the +@metrics+ hash. Sets the value to +other+ if no key
|
21
|
+
# Returns a DbQueryMetricStats instance
|
22
|
+
def lookup(other)
|
23
|
+
metrics[other.key] ||= other
|
24
|
+
end
|
25
|
+
|
26
|
+
# Take another set, and merge it with this one
|
27
|
+
def combine!(other)
|
28
|
+
other.each do |metric|
|
29
|
+
self << metric
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
# Add a single DbQueryMetricStats object to this set.
|
35
|
+
#
|
36
|
+
# Looks up an existing one under this key and merges, or just saves a new
|
37
|
+
# one under the key
|
38
|
+
def <<(stat)
|
39
|
+
existing_stat = metrics[stat.key]
|
40
|
+
if existing_stat
|
41
|
+
existing_stat.combine!(stat)
|
42
|
+
elsif at_limit?
|
43
|
+
# We're full up, can't add any more.
|
44
|
+
# Should I log this? It may get super noisy?
|
45
|
+
else
|
46
|
+
metrics[stat.key] = stat
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def increment_transaction_count!
|
51
|
+
metrics.each do |_key, db_query_metric_stat|
|
52
|
+
db_query_metric_stat.increment_transaction_count!
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def metrics_to_report
|
57
|
+
report_limit = config.value('database_metric_report_limit')
|
58
|
+
if metrics.size > report_limit
|
59
|
+
metrics.
|
60
|
+
values.
|
61
|
+
sort_by {|stat| stat.call_time }.
|
62
|
+
reverse.
|
63
|
+
take(report_limit)
|
64
|
+
else
|
65
|
+
metrics.values
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def inspect
|
70
|
+
metrics.map {|key, metric|
|
71
|
+
"#{key.inspect} - Count: #{metric.call_count}, Total Time: #{"%.2f" % metric.call_time}"
|
72
|
+
}.join("\n")
|
73
|
+
end
|
74
|
+
|
75
|
+
def at_limit?
|
76
|
+
@limit ||= config.value('database_metric_limit')
|
77
|
+
metrics.size >= @limit
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module ScoutApm
|
2
|
+
class DbQueryMetricStats
|
3
|
+
|
4
|
+
DEFAULT_HISTOGRAM_SIZE = 50
|
5
|
+
|
6
|
+
attr_reader :model_name
|
7
|
+
attr_reader :operation
|
8
|
+
attr_reader :scope
|
9
|
+
|
10
|
+
attr_reader :transaction_count
|
11
|
+
|
12
|
+
attr_reader :call_count
|
13
|
+
attr_reader :call_time
|
14
|
+
attr_reader :rows_returned
|
15
|
+
|
16
|
+
attr_reader :min_call_time
|
17
|
+
attr_reader :max_call_time
|
18
|
+
|
19
|
+
attr_reader :min_rows_returned
|
20
|
+
attr_reader :max_rows_returned
|
21
|
+
|
22
|
+
attr_reader :histogram
|
23
|
+
|
24
|
+
def initialize(model_name, operation, scope, call_count, call_time, rows_returned)
|
25
|
+
@model_name = model_name
|
26
|
+
@operation = operation
|
27
|
+
|
28
|
+
@call_count = call_count
|
29
|
+
|
30
|
+
@call_time = call_time
|
31
|
+
@min_call_time = call_time
|
32
|
+
@max_call_time = call_time
|
33
|
+
|
34
|
+
@rows_returned = rows_returned
|
35
|
+
@min_rows_returned = rows_returned
|
36
|
+
@max_rows_returned = rows_returned
|
37
|
+
|
38
|
+
# Should we have a histogram for timing, and one for rows_returned?
|
39
|
+
# This histogram is for call_time
|
40
|
+
@histogram = NumericHistogram.new(DEFAULT_HISTOGRAM_SIZE)
|
41
|
+
@histogram.add(call_time)
|
42
|
+
|
43
|
+
@transaction_count = 0
|
44
|
+
|
45
|
+
@scope = scope
|
46
|
+
end
|
47
|
+
|
48
|
+
# Merge data in this scope. Used in DbQueryMetricSet
|
49
|
+
def key
|
50
|
+
@key ||= [model_name, operation, scope]
|
51
|
+
end
|
52
|
+
|
53
|
+
# Combine data from another DbQueryMetricStats into +self+. Modifies and returns +self+
|
54
|
+
def combine!(other)
|
55
|
+
return self if other == self
|
56
|
+
|
57
|
+
@transaction_count += other.transaction_count
|
58
|
+
@call_count += other.call_count
|
59
|
+
@rows_returned += other.rows_returned
|
60
|
+
@call_time += other.call_time
|
61
|
+
|
62
|
+
@min_call_time = other.min_call_time if @min_call_time.zero? or other.min_call_time < @min_call_time
|
63
|
+
@max_call_time = other.max_call_time if other.max_call_time > @max_call_time
|
64
|
+
|
65
|
+
@min_rows_returned = other.min_rows_returned if @min_rows_returned.zero? or other.min_rows_returned < @min_rows_returned
|
66
|
+
@max_rows_returned = other.max_rows_returned if other.max_rows_returned > @max_rows_returned
|
67
|
+
|
68
|
+
@histogram.combine!(other.histogram)
|
69
|
+
self
|
70
|
+
end
|
71
|
+
|
72
|
+
def as_json
|
73
|
+
json_attributes = [
|
74
|
+
:model_name,
|
75
|
+
:operation,
|
76
|
+
:scope,
|
77
|
+
|
78
|
+
:transaction_count,
|
79
|
+
:call_count,
|
80
|
+
|
81
|
+
:histogram,
|
82
|
+
:call_time,
|
83
|
+
:max_call_time,
|
84
|
+
:min_call_time,
|
85
|
+
|
86
|
+
:max_rows_returned,
|
87
|
+
:min_rows_returned,
|
88
|
+
:rows_returned,
|
89
|
+
]
|
90
|
+
|
91
|
+
ScoutApm::AttributeArranger.call(self, json_attributes)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Called by the Set on each DbQueryMetricStats object that it holds, only
|
95
|
+
# once during the recording of a transaction.
|
96
|
+
#
|
97
|
+
# Don't call elsewhere, and don't set to 1 in the initializer.
|
98
|
+
def increment_transaction_count!
|
99
|
+
@transaction_count += 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/scout_apm/fake_store.rb
CHANGED
@@ -17,6 +17,12 @@ module ScoutApm
|
|
17
17
|
def track_one!(type, name, value, options={})
|
18
18
|
end
|
19
19
|
|
20
|
+
def track_histograms!(histograms, options={})
|
21
|
+
end
|
22
|
+
|
23
|
+
def track_db_query_metrics!(db_query_metric_set, options={})
|
24
|
+
end
|
25
|
+
|
20
26
|
def track_slow_transaction!(slow_transaction)
|
21
27
|
end
|
22
28
|
|
@@ -224,7 +224,12 @@ module ScoutApm
|
|
224
224
|
end
|
225
225
|
|
226
226
|
def trace
|
227
|
-
@trace ||=
|
227
|
+
@trace ||=
|
228
|
+
begin
|
229
|
+
layer_finder = LayerConverters::FindLayerByType.new(tracked_request)
|
230
|
+
converter = LayerConverters::SlowRequestConverter.new(tracked_request, layer_finder, ScoutApm::FakeStore.new)
|
231
|
+
converter.call
|
232
|
+
end
|
228
233
|
end
|
229
234
|
|
230
235
|
def payload
|
@@ -42,6 +42,23 @@ module ScoutApm
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
if Utils::KlassHelper.defined?("ActiveRecord::Base")
|
46
|
+
::ActiveRecord::Base.class_eval do
|
47
|
+
include ::ScoutApm::Instruments::ActiveRecordUpdateInstruments
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Disabled until we can determine how to use Module#prepend in the
|
52
|
+
# agent. Otherwise, this will cause infinite loops if NewRelic is
|
53
|
+
# installed. We can't just use normal Module#include, since the
|
54
|
+
# original methods don't call super the way Base#save does
|
55
|
+
#
|
56
|
+
#if Utils::KlassHelper.defined?("ActiveRecord::Relation")
|
57
|
+
# ::ActiveRecord::Relation.class_eval do
|
58
|
+
# include ::ScoutApm::Instruments::ActiveRecordRelationInstruments
|
59
|
+
# end
|
60
|
+
#end
|
61
|
+
|
45
62
|
if Utils::KlassHelper.defined?("ActiveRecord::Querying")
|
46
63
|
::ActiveRecord::Querying.module_eval do
|
47
64
|
include ::ScoutApm::Tracer
|
@@ -208,5 +225,99 @@ module ScoutApm
|
|
208
225
|
end
|
209
226
|
end
|
210
227
|
end
|
228
|
+
|
229
|
+
module ActiveRecordUpdateInstruments
|
230
|
+
def save(*args, &block)
|
231
|
+
model = self.class.name
|
232
|
+
operation = self.persisted? ? "Update" : "Create"
|
233
|
+
|
234
|
+
req = ScoutApm::RequestManager.lookup
|
235
|
+
layer = ScoutApm::Layer.new("ActiveRecord", Utils::ActiveRecordMetricName.new("", "#{model} #{operation}"))
|
236
|
+
req.start_layer(layer)
|
237
|
+
req.ignore_children!
|
238
|
+
begin
|
239
|
+
super(*args, &block)
|
240
|
+
ensure
|
241
|
+
req.acknowledge_children!
|
242
|
+
req.stop_layer
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def save!(*args, &block)
|
247
|
+
model = self.class.name
|
248
|
+
operation = self.persisted? ? "Update" : "Create"
|
249
|
+
|
250
|
+
req = ScoutApm::RequestManager.lookup
|
251
|
+
layer = ScoutApm::Layer.new("ActiveRecord", Utils::ActiveRecordMetricName.new("", "#{model} #{operation}"))
|
252
|
+
req.start_layer(layer)
|
253
|
+
req.ignore_children!
|
254
|
+
begin
|
255
|
+
super(*args, &block)
|
256
|
+
ensure
|
257
|
+
req.acknowledge_children!
|
258
|
+
req.stop_layer
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
module ActiveRecordRelationInstruments
|
264
|
+
def self.included(instrumented_class)
|
265
|
+
::ActiveRecord::Relation.class_eval do
|
266
|
+
alias_method :update_all_without_scout_instruments, :update_all
|
267
|
+
alias_method :update_all, :update_all_with_scout_instruments
|
268
|
+
|
269
|
+
alias_method :delete_all_without_scout_instruments, :delete_all
|
270
|
+
alias_method :delete_all, :delete_all_with_scout_instruments
|
271
|
+
|
272
|
+
alias_method :destroy_all_without_scout_instruments, :destroy_all
|
273
|
+
alias_method :destroy_all, :destroy_all_with_scout_instruments
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def update_all_with_scout_instruments(*args, &block)
|
278
|
+
model = self.name
|
279
|
+
|
280
|
+
req = ScoutApm::RequestManager.lookup
|
281
|
+
layer = ScoutApm::Layer.new("ActiveRecord", Utils::ActiveRecordMetricName.new("", "#{model} Update"))
|
282
|
+
req.start_layer(layer)
|
283
|
+
req.ignore_children!
|
284
|
+
begin
|
285
|
+
update_all_without_scout_instruments(*args, &block)
|
286
|
+
ensure
|
287
|
+
req.acknowledge_children!
|
288
|
+
req.stop_layer
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
def delete_all_with_scout_instruments(*args, &block)
|
293
|
+
model = self.name
|
294
|
+
|
295
|
+
req = ScoutApm::RequestManager.lookup
|
296
|
+
layer = ScoutApm::Layer.new("ActiveRecord", Utils::ActiveRecordMetricName.new("", "#{model} Delete"))
|
297
|
+
req.start_layer(layer)
|
298
|
+
req.ignore_children!
|
299
|
+
begin
|
300
|
+
delete_all_without_scout_instruments(*args, &block)
|
301
|
+
ensure
|
302
|
+
req.acknowledge_children!
|
303
|
+
req.stop_layer
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def destroy_all_with_scout_instruments(*args, &block)
|
308
|
+
model = self.name
|
309
|
+
|
310
|
+
req = ScoutApm::RequestManager.lookup
|
311
|
+
layer = ScoutApm::Layer.new("ActiveRecord", Utils::ActiveRecordMetricName.new("", "#{model} Delete"))
|
312
|
+
req.start_layer(layer)
|
313
|
+
req.ignore_children!
|
314
|
+
begin
|
315
|
+
destroy_all_without_scout_instruments(*args, &block)
|
316
|
+
ensure
|
317
|
+
req.acknowledge_children!
|
318
|
+
req.stop_layer
|
319
|
+
end
|
320
|
+
end
|
321
|
+
end
|
211
322
|
end
|
212
323
|
end
|