scout_apm 2.0.0.pre → 2.0.0.pre2
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 +22 -5
- data/Rakefile +5 -0
- data/lib/scout_apm.rb +4 -0
- data/lib/scout_apm/agent.rb +22 -8
- data/lib/scout_apm/agent/reporting.rb +8 -3
- data/lib/scout_apm/attribute_arranger.rb +4 -0
- data/lib/scout_apm/bucket_name_splitter.rb +3 -3
- data/lib/scout_apm/config.rb +5 -2
- data/lib/scout_apm/histogram.rb +20 -0
- data/lib/scout_apm/instant_reporting.rb +40 -0
- data/lib/scout_apm/instruments/action_controller_rails_3_rails4.rb +11 -1
- data/lib/scout_apm/instruments/percentile_sampler.rb +38 -0
- data/lib/scout_apm/layaway.rb +1 -4
- data/lib/scout_apm/layaway_file.rb +26 -2
- data/lib/scout_apm/layer.rb +1 -1
- data/lib/scout_apm/layer_converters/converter_base.rb +6 -4
- data/lib/scout_apm/layer_converters/slow_job_converter.rb +21 -13
- data/lib/scout_apm/layer_converters/slow_request_converter.rb +37 -24
- data/lib/scout_apm/metric_meta.rb +5 -1
- data/lib/scout_apm/metric_set.rb +15 -6
- data/lib/scout_apm/reporter.rb +9 -3
- data/lib/scout_apm/request_histograms.rb +46 -0
- data/lib/scout_apm/scored_item_set.rb +79 -0
- data/lib/scout_apm/serializers/payload_serializer_to_json.rb +2 -0
- data/lib/scout_apm/serializers/slow_jobs_serializer_to_json.rb +2 -0
- data/lib/scout_apm/slow_job_policy.rb +89 -19
- data/lib/scout_apm/slow_job_record.rb +18 -1
- data/lib/scout_apm/slow_request_policy.rb +80 -12
- data/lib/scout_apm/slow_transaction.rb +22 -3
- data/lib/scout_apm/store.rb +35 -13
- data/lib/scout_apm/tracked_request.rb +63 -11
- data/lib/scout_apm/utils/backtrace_parser.rb +4 -4
- data/lib/scout_apm/utils/sql_sanitizer.rb +1 -1
- data/lib/scout_apm/utils/sql_sanitizer_regex.rb +2 -2
- data/lib/scout_apm/utils/sql_sanitizer_regex_1_8_7.rb +2 -2
- data/lib/scout_apm/version.rb +1 -1
- data/scout_apm.gemspec +1 -0
- data/test/test_helper.rb +4 -3
- data/test/unit/layaway_test.rb +5 -8
- data/test/unit/metric_set_test.rb +101 -0
- data/test/unit/scored_item_set_test.rb +65 -0
- data/test/unit/serializers/payload_serializer_test.rb +2 -1
- data/test/unit/slow_item_set_test.rb +2 -1
- data/test/unit/slow_request_policy_test.rb +42 -0
- data/test/unit/sql_sanitizer_test.rb +6 -0
- metadata +28 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 119d6658eaefd7e3b177c1e982006f0d59dd208b
|
4
|
+
data.tar.gz: 5585bca449804241d8778a1ff716444c50ac86d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e6ad957c5948b239d530e9cc4e35445a37abb1331ef3c20357371a1c5da9286e4b9d38e84df2aecedd23a39e1a5d0163d76dd76549e41c700b78e15f770338d
|
7
|
+
data.tar.gz: 060b1d7a09e6e5c37cd1a087bd7bf13faaab3e3b5b3aaf8d7f4173a50fa97c76d39c4ccaf299b05cdd48232a6b7638caeab88674110072a26692ad77fad2533e
|
data/.gitignore
CHANGED
data/CHANGELOG.markdown
CHANGED
@@ -1,17 +1,34 @@
|
|
1
|
+
|
1
2
|
# 2.0.0
|
2
3
|
|
3
4
|
* Reporting object allocation metrics and mem delta with slow requests and jobs.
|
5
|
+
* Collecting memory metrics on slow transactions
|
6
|
+
* Collecting additional fields for slow transactions:
|
7
|
+
* hostname
|
8
|
+
* seconds_since_startup (larger memory increases and other other odd behavior more common when close to startup)
|
9
|
+
* Initial support for instant traces
|
10
|
+
* Collect 95th percentiles
|
11
|
+
|
12
|
+
# 1.5.5
|
13
|
+
|
14
|
+
* Handle backslash escaped quotes inside mysql strings.
|
15
|
+
|
16
|
+
# 1.5.4
|
17
|
+
|
18
|
+
* Fix issue where error counts were being misreported
|
19
|
+
* Politely ignore cases when `request.remote_ip` raises exceptions.
|
20
|
+
|
21
|
+
# 1.5.3
|
22
|
+
|
23
|
+
* Fix another minor bug related to iso8601 timestamps
|
4
24
|
|
5
25
|
# 1.5.2
|
6
26
|
|
7
|
-
*
|
27
|
+
* Force timestamps to be iso8601 format
|
8
28
|
|
9
29
|
# 1.5.1
|
10
30
|
|
11
|
-
*
|
12
|
-
* Collecting additional fields for slow transactions:
|
13
|
-
* hostname
|
14
|
-
* seconds_since_startup (larger memory increases and other other odd behavior more common when close to startup)
|
31
|
+
* Add `ignore_traces` config option to ignore SlowTransactions from certain URIs.
|
15
32
|
|
16
33
|
# 1.5.0
|
17
34
|
|
data/Rakefile
CHANGED
data/lib/scout_apm.rb
CHANGED
@@ -87,6 +87,7 @@ require 'scout_apm/instruments/rails_router'
|
|
87
87
|
require 'scout_apm/instruments/sinatra'
|
88
88
|
require 'scout_apm/instruments/process/process_cpu'
|
89
89
|
require 'scout_apm/instruments/process/process_memory'
|
90
|
+
require 'scout_apm/instruments/percentile_sampler'
|
90
91
|
require 'allocations'
|
91
92
|
|
92
93
|
require 'scout_apm/app_server_load'
|
@@ -116,15 +117,18 @@ require 'scout_apm/store'
|
|
116
117
|
require 'scout_apm/tracer'
|
117
118
|
require 'scout_apm/context'
|
118
119
|
require 'scout_apm/stackprof_tree_collapser'
|
120
|
+
require 'scout_apm/instant_reporting'
|
119
121
|
|
120
122
|
require 'scout_apm/metric_meta'
|
121
123
|
require 'scout_apm/metric_stats'
|
122
124
|
require 'scout_apm/slow_transaction'
|
123
125
|
require 'scout_apm/slow_job_record'
|
124
126
|
require 'scout_apm/slow_item_set'
|
127
|
+
require 'scout_apm/scored_item_set'
|
125
128
|
require 'scout_apm/slow_request_policy'
|
126
129
|
require 'scout_apm/slow_job_policy'
|
127
130
|
require 'scout_apm/job_record'
|
131
|
+
require 'scout_apm/request_histograms'
|
128
132
|
|
129
133
|
require 'scout_apm/capacity'
|
130
134
|
require 'scout_apm/attribute_arranger'
|
data/lib/scout_apm/agent.rb
CHANGED
@@ -21,6 +21,12 @@ module ScoutApm
|
|
21
21
|
attr_reader :slow_job_policy
|
22
22
|
attr_reader :process_start_time # used when creating slow transactions to report how far from startup the transaction was recorded.
|
23
23
|
|
24
|
+
# Histogram of the cumulative requests since the start of the process
|
25
|
+
attr_reader :request_histograms
|
26
|
+
|
27
|
+
# Histogram of the requests since last reset. Reset by the sampler, so once per minutes.
|
28
|
+
attr_reader :request_histograms_resettable
|
29
|
+
|
24
30
|
# All access to the agent is thru this class method to ensure multiple Agent instances are not initialized per-Ruby process.
|
25
31
|
def self.instance(options = {})
|
26
32
|
@@instance ||= self.new(options)
|
@@ -41,14 +47,15 @@ module ScoutApm
|
|
41
47
|
# Later in initialization, we reset @config to include the file.
|
42
48
|
@config = ScoutApm::Config.without_file
|
43
49
|
|
50
|
+
@slow_request_policy = ScoutApm::SlowRequestPolicy.new
|
44
51
|
@slow_job_policy = ScoutApm::SlowJobPolicy.new
|
52
|
+
@request_histograms = ScoutApm::RequestHistograms.new
|
53
|
+
@request_histograms_resettable = ScoutApm::RequestHistograms.new
|
45
54
|
|
46
55
|
@store = ScoutApm::Store.new
|
47
56
|
@layaway = ScoutApm::Layaway.new
|
48
57
|
@metric_lookup = Hash.new
|
49
58
|
|
50
|
-
@slow_request_policy = ScoutApm::SlowRequestPolicy.new
|
51
|
-
|
52
59
|
@capacity = ScoutApm::Capacity.new
|
53
60
|
@installed_instruments = []
|
54
61
|
end
|
@@ -119,7 +126,8 @@ module ScoutApm
|
|
119
126
|
|
120
127
|
@samplers = [
|
121
128
|
ScoutApm::Instruments::Process::ProcessCpu.new(environment.processors, logger),
|
122
|
-
ScoutApm::Instruments::Process::ProcessMemory.new(logger)
|
129
|
+
ScoutApm::Instruments::Process::ProcessMemory.new(logger),
|
130
|
+
ScoutApm::Instruments::PercentileSampler.new(logger, 95),
|
123
131
|
]
|
124
132
|
|
125
133
|
app_server_load_hook
|
@@ -193,9 +201,11 @@ module ScoutApm
|
|
193
201
|
store.write_to_layaway(layaway, :force)
|
194
202
|
end
|
195
203
|
|
196
|
-
#
|
197
|
-
|
198
|
-
|
204
|
+
# make sure we don't exit the process while the background worker is running its task. Bypass this step in development.
|
205
|
+
if environment.env != 'development'
|
206
|
+
logger.debug "Joining background worker thread"
|
207
|
+
@background_worker_thread.join if @background_worker_thread
|
208
|
+
end
|
199
209
|
end
|
200
210
|
|
201
211
|
def started?
|
@@ -308,8 +318,12 @@ module ScoutApm
|
|
308
318
|
def run_samplers
|
309
319
|
@samplers.each do |sampler|
|
310
320
|
begin
|
311
|
-
|
312
|
-
|
321
|
+
if sampler.respond_to? :metrics
|
322
|
+
store.track!(sampler.metrics)
|
323
|
+
else
|
324
|
+
result = sampler.run
|
325
|
+
store.track_one!(sampler.metric_type, sampler.metric_name, result) if result
|
326
|
+
end
|
313
327
|
rescue => e
|
314
328
|
logger.info "Error reading #{sampler.human_name}"
|
315
329
|
logger.debug e.message
|
@@ -50,7 +50,7 @@ module ScoutApm
|
|
50
50
|
:platform => "ruby",
|
51
51
|
}
|
52
52
|
|
53
|
-
log_deliver(metrics, slow_transactions, metadata)
|
53
|
+
log_deliver(metrics, slow_transactions, metadata, slow_jobs)
|
54
54
|
|
55
55
|
payload = ScoutApm::Serializers::PayloadSerializer.serialize(metadata, metrics, slow_transactions, jobs, slow_jobs)
|
56
56
|
logger.debug("Payload: #{payload}")
|
@@ -62,7 +62,7 @@ module ScoutApm
|
|
62
62
|
logger.debug e.backtrace
|
63
63
|
end
|
64
64
|
|
65
|
-
def log_deliver(metrics, slow_transactions, metadata)
|
65
|
+
def log_deliver(metrics, slow_transactions, metadata, jobs_traces)
|
66
66
|
total_request_count = metrics.
|
67
67
|
select { |meta,stats| meta.metric_name =~ /\AController/ }.
|
68
68
|
inject(0) {|sum, (_, stat)| sum + stat.call_count }
|
@@ -75,7 +75,12 @@ module ScoutApm
|
|
75
75
|
"Recorded across (unknown) processes"
|
76
76
|
end
|
77
77
|
|
78
|
-
|
78
|
+
time_clause = "[#{Time.parse(metadata[:agent_time]).strftime("%H:%M")}]"
|
79
|
+
metrics_clause = "#{metrics.length} Metrics for #{total_request_count} requests"
|
80
|
+
slow_trans_clause = "#{slow_transactions.length} Slow Transaction Traces"
|
81
|
+
job_clause = "#{jobs_traces.length} Job Traces"
|
82
|
+
|
83
|
+
logger.info "#{time_clause} Delivering #{metrics_clause} and #{slow_trans_clause} and #{job_clause}, #{process_log_str}."
|
79
84
|
logger.debug("Metrics: #{metrics.pretty_inspect}\nSlowTrans: #{slow_transactions.pretty_inspect}\nMetadata: #{metadata.inspect.pretty_inspect}")
|
80
85
|
end
|
81
86
|
|
@@ -7,6 +7,10 @@ module ScoutApm
|
|
7
7
|
case attribute
|
8
8
|
when Array
|
9
9
|
attribute_hash[attribute[0]] = subject.send(attribute[1])
|
10
|
+
when :bucket
|
11
|
+
attribute_hash[attribute] = subject.bucket_type
|
12
|
+
when :name
|
13
|
+
attribute_hash[attribute] = subject.bucket_name
|
10
14
|
when Symbol
|
11
15
|
attribute_hash[attribute] = subject.send(attribute)
|
12
16
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module ScoutApm
|
2
2
|
module BucketNameSplitter
|
3
|
-
def
|
3
|
+
def bucket_type
|
4
4
|
split_metric_name(metric_name).first
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
7
|
+
def bucket_name
|
8
8
|
split_metric_name(metric_name).last
|
9
9
|
end
|
10
10
|
|
11
11
|
def key
|
12
|
-
{:bucket =>
|
12
|
+
{:bucket => bucket_type, :name => bucket_name}
|
13
13
|
end
|
14
14
|
|
15
15
|
private
|
data/lib/scout_apm/config.rb
CHANGED
@@ -7,14 +7,15 @@ require 'scout_apm/environment'
|
|
7
7
|
#
|
8
8
|
# application_root - override the detected directory of the application
|
9
9
|
# data_file - override the default temporary storage location. Must be a location in a writable directory
|
10
|
-
#
|
10
|
+
# host - override the default hostname detection. Default varies by environment - either system hostname, or PAAS hostname
|
11
|
+
# direct_host - override the default "direct" host. The direct_host bypasses the ingestion pipeline and goes directly to the webserver, and is primarily used for features under development.
|
11
12
|
# key - the account key with Scout APM. Found in Settings in the Web UI
|
12
13
|
# log_file_path - either a directory or "STDOUT".
|
13
14
|
# log_level - DEBUG / INFO / WARN as usual
|
14
15
|
# monitor - true or false. False prevents any instrumentation from starting
|
15
16
|
# name - override the name reported to APM. This is the name that shows in the Web UI
|
16
17
|
# uri_reporting - 'path' or 'full_path' default is 'full_path', which reports URL params as well as the path.
|
17
|
-
# report_format - 'json' or 'marshal'.
|
18
|
+
# report_format - 'json' or 'marshal'. Marshal is legacy and will be removed.
|
18
19
|
#
|
19
20
|
# Any of these config settings can be set with an environment variable prefixed
|
20
21
|
# by SCOUT_ and uppercasing the key: SCOUT_LOG_LEVEL for instance.
|
@@ -65,12 +66,14 @@ module ScoutApm
|
|
65
66
|
class ConfigDefaults
|
66
67
|
DEFAULTS = {
|
67
68
|
'host' => 'https://checkin.scoutapp.com',
|
69
|
+
'direct_host' => 'https://apm.scoutapp.com',
|
68
70
|
'log_level' => 'info',
|
69
71
|
'stackprof_interval' => 20000, # microseconds, 1000 = 1 millisecond, so 20k == 20 milliseconds
|
70
72
|
'uri_reporting' => 'full_path',
|
71
73
|
'report_format' => 'json',
|
72
74
|
'disabled_instruments' => [],
|
73
75
|
'enable_background_jobs' => true,
|
76
|
+
'ignore_traces' => [],
|
74
77
|
}.freeze
|
75
78
|
|
76
79
|
def value(key)
|
data/lib/scout_apm/histogram.rb
CHANGED
@@ -56,6 +56,26 @@ module ScoutApm
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
+
# Given a value, where in this histogram does it fall?
|
60
|
+
# Returns a float between 0 and 1
|
61
|
+
def approximate_quantile_of_value(v)
|
62
|
+
mutex.synchronize do
|
63
|
+
return 100 if total == 0
|
64
|
+
|
65
|
+
count_examined = 0
|
66
|
+
|
67
|
+
bins.each_with_index do |bin, index|
|
68
|
+
if v <= bin.value
|
69
|
+
break
|
70
|
+
end
|
71
|
+
|
72
|
+
count_examined += bin.count
|
73
|
+
end
|
74
|
+
|
75
|
+
count_examined / total.to_f
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
59
79
|
def mean
|
60
80
|
mutex.synchronize do
|
61
81
|
if total == 0
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# InstantReporting is used when a specially flagged request hits the application.
|
2
|
+
# The agent traces the request regardless of its performance characteristics, and reports it immediately to our servers, for instant feedback.
|
3
|
+
# The request is detected in the ActionController instrumentation, and flagged in TrackedRequest. The trace is prepped here, and handed off to a Reporter for the actual POST.
|
4
|
+
module ScoutApm
|
5
|
+
class InstantReporting
|
6
|
+
# trace is an instance of SlowTransaction
|
7
|
+
# instant_key is what was passed in from the browser to trigger the instant trace
|
8
|
+
def initialize(trace, instant_key)
|
9
|
+
@trace = trace
|
10
|
+
@instant_key = instant_key
|
11
|
+
end
|
12
|
+
|
13
|
+
def call
|
14
|
+
Thread.new do
|
15
|
+
# Serialize that trace. We reuse the PayloadSerializer, but only provide the metadata and traces.
|
16
|
+
# In this case, the traces array will always have just one element.
|
17
|
+
metadata = {
|
18
|
+
:app_root => ScoutApm::Environment.instance.root.to_s,
|
19
|
+
:unique_id => ScoutApm::Utils::UniqueId.simple,
|
20
|
+
:agent_version => ScoutApm::VERSION,
|
21
|
+
:agent_time => Time.now.iso8601,
|
22
|
+
:agent_pid => Process.pid,
|
23
|
+
:platform => "ruby",
|
24
|
+
}
|
25
|
+
|
26
|
+
metrics = []
|
27
|
+
traces = [@trace]
|
28
|
+
jobs = []
|
29
|
+
slow_jobs = []
|
30
|
+
|
31
|
+
payload = ScoutApm::Serializers::PayloadSerializer.serialize(metadata, metrics, traces, jobs, slow_jobs)
|
32
|
+
|
33
|
+
# Hand it off to the reporter for POST to our servers
|
34
|
+
reporter = Reporter.new(:instant_trace, config = Agent.instance.config, logger = Agent.instance.logger, instant_key = @instant_key)
|
35
|
+
reporter.report(payload, {'Content-Type' => 'application/json'} )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -61,8 +61,18 @@ module ScoutApm
|
|
61
61
|
req = ScoutApm::RequestManager.lookup
|
62
62
|
path = ScoutApm::Agent.instance.config.value("uri_reporting") == 'path' ? request.path : request.fullpath
|
63
63
|
req.annotate_request(:uri => path)
|
64
|
-
|
64
|
+
|
65
|
+
# IP Spoofing Protection can throw an exception, just move on w/o remote ip
|
66
|
+
req.context.add_user(:ip => request.remote_ip) rescue nil
|
67
|
+
|
65
68
|
req.set_headers(request.headers)
|
69
|
+
|
70
|
+
# Check if this this request is to be reported instantly
|
71
|
+
if instant_key = request.cookies['scoutapminstant']
|
72
|
+
Agent.instance.logger.info "Instant trace request with key=#{instant_key} for path=#{path}"
|
73
|
+
req.instant_key = instant_key
|
74
|
+
end
|
75
|
+
|
66
76
|
req.web!
|
67
77
|
|
68
78
|
req.start_layer( ScoutApm::Layer.new("Controller", "#{controller_path}/#{action_name}") )
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ScoutApm
|
2
|
+
module Instruments
|
3
|
+
class PercentileSampler
|
4
|
+
attr_reader :logger
|
5
|
+
|
6
|
+
attr_reader :percentiles
|
7
|
+
|
8
|
+
def initialize(logger, percentiles)
|
9
|
+
@logger = logger
|
10
|
+
@percentiles = Array(percentiles)
|
11
|
+
end
|
12
|
+
|
13
|
+
def human_name
|
14
|
+
"Percentiles"
|
15
|
+
end
|
16
|
+
|
17
|
+
def metrics
|
18
|
+
ms = {}
|
19
|
+
|
20
|
+
ScoutApm::Agent.instance.request_histograms_resettable.each_name do |name|
|
21
|
+
percentiles.each do |percentile|
|
22
|
+
meta = MetricMeta.new("Percentile/#{percentile}/#{name}")
|
23
|
+
stat = MetricStats.new
|
24
|
+
stat.update!(ScoutApm::Agent.instance.request_histograms_resettable.quantile(name, percentile))
|
25
|
+
ms[meta] = stat
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Wipe the histograms, get ready for the next minute's worth of data.
|
30
|
+
ScoutApm::Agent.instance.request_histograms_resettable.reset_all!
|
31
|
+
|
32
|
+
ms
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/scout_apm/layaway.rb
CHANGED
@@ -18,10 +18,7 @@ module ScoutApm
|
|
18
18
|
new_req = new_val.request_count
|
19
19
|
ScoutApm::Agent.instance.logger.debug("Merging Two reporting periods (#{old_val.timestamp.to_s}, #{new_val.timestamp.to_s}): old req #{old_req}, new req #{new_req}")
|
20
20
|
|
21
|
-
old_val.
|
22
|
-
merge_metrics!(new_val.metrics_payload).
|
23
|
-
merge_slow_transactions!(new_val.slow_transactions).
|
24
|
-
merge_jobs!(new_val.jobs)
|
21
|
+
old_val.merge(new_val)
|
25
22
|
}
|
26
23
|
|
27
24
|
ScoutApm::Agent.instance.logger.debug("AddReportingPeriod: AfterMerge Timestamps: #{existing_data.keys.map(&:to_s).inspect}")
|
@@ -2,8 +2,32 @@
|
|
2
2
|
module ScoutApm
|
3
3
|
class LayawayFile
|
4
4
|
def path
|
5
|
-
|
6
|
-
|
5
|
+
return @path if @path
|
6
|
+
|
7
|
+
candidates = [
|
8
|
+
ScoutApm::Agent.instance.config.value("data_file"),
|
9
|
+
"#{ScoutApm::Agent.instance.default_log_path}/scout_apm.db",
|
10
|
+
"#{ScoutApm::Agent.instance.environment.root}/tmp/scout_apm.db"
|
11
|
+
]
|
12
|
+
|
13
|
+
candidates.each do |candidate|
|
14
|
+
next if candidate.nil?
|
15
|
+
|
16
|
+
begin
|
17
|
+
ScoutApm::Agent.instance.logger.debug("Checking Layaway File Location: #{candidate}")
|
18
|
+
File.open(candidate, "w") { |f| } # Open & Close to check that we can
|
19
|
+
|
20
|
+
# No exception, it is valid
|
21
|
+
ScoutApm::Agent.instance.logger.info("Layaway File location found: #{candidate}")
|
22
|
+
@path = candidate
|
23
|
+
return @path
|
24
|
+
rescue Exception
|
25
|
+
ScoutApm::Agent.instance.logger.debug("Couldn't open layaway file for test write at #{candidate}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
ScoutApm::Agent.instance.logger.error("No valid layaway file found, please set a location in the configuration key `data_file`")
|
30
|
+
nil
|
7
31
|
end
|
8
32
|
|
9
33
|
def dump(object)
|
data/lib/scout_apm/layer.rb
CHANGED
@@ -40,7 +40,7 @@ module ScoutApm
|
|
40
40
|
# :class_name - The ActiveRecord class name (From notification instantiation.active_record)
|
41
41
|
attr_reader :annotations
|
42
42
|
|
43
|
-
BACKTRACE_CALLER_LIMIT =
|
43
|
+
BACKTRACE_CALLER_LIMIT = 50 # maximum number of lines to send thru for backtrace analysis
|
44
44
|
|
45
45
|
def initialize(type, name, start_time = Time.now)
|
46
46
|
@type = type
|