scout_apm 3.0.0.pre6 → 3.0.0.pre7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +5 -0
- data/lib/scout_apm.rb +0 -1
- data/lib/scout_apm/agent.rb +0 -2
- data/lib/scout_apm/layaway.rb +12 -1
- data/lib/scout_apm/metric_set.rb +3 -1
- data/lib/scout_apm/version.rb +1 -1
- data/test/test_helper.rb +8 -0
- data/test/unit/layaway_test.rb +20 -0
- data/test/unit/store_test.rb +15 -0
- metadata +4 -31
- data/lib/scout_apm/capacity.rb +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 622bc9489b9add4f80ca65cd3b12e54e30eea269
|
4
|
+
data.tar.gz: ef00b8380eb4e163cf9b991b826287d63ba27819
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2057aaca2029567dd1a7ce09fb8b359cc2819566e0a03ef528f91b051e00170be7fef66dfe339186bc77d030c7e738be2bc3517b8306e874ce38c662988c46a2
|
7
|
+
data.tar.gz: 4e45127ed587dd0e86782d357f1916de915acff6698682f2b6920448ba63245a5412549d27efe7fff1e270b8bfc0e57d36cc7273ae94f1af4f83a348b525b9aa
|
data/CHANGELOG.markdown
CHANGED
data/lib/scout_apm.rb
CHANGED
data/lib/scout_apm/agent.rb
CHANGED
@@ -12,7 +12,6 @@ module ScoutApm
|
|
12
12
|
attr_accessor :store
|
13
13
|
attr_accessor :layaway
|
14
14
|
attr_accessor :config
|
15
|
-
attr_accessor :capacity
|
16
15
|
attr_accessor :logger
|
17
16
|
attr_accessor :log_file # path to the log file
|
18
17
|
attr_accessor :options # options passed to the agent when +#start+ is called.
|
@@ -58,7 +57,6 @@ module ScoutApm
|
|
58
57
|
@layaway = ScoutApm::Layaway.new(config, environment)
|
59
58
|
@metric_lookup = Hash.new
|
60
59
|
|
61
|
-
@capacity = ScoutApm::Capacity.new
|
62
60
|
@installed_instruments = []
|
63
61
|
end
|
64
62
|
|
data/lib/scout_apm/layaway.rb
CHANGED
@@ -11,6 +11,9 @@ module ScoutApm
|
|
11
11
|
# Letting it sit a bit may be useful for debugging
|
12
12
|
STALE_AGE = 10 * 60
|
13
13
|
|
14
|
+
# Failsafe to prevent writing layaway files if for some reason they are not being cleaned up
|
15
|
+
MAX_FILES_LIMIT = 5000
|
16
|
+
|
14
17
|
# A strftime format string for how we render timestamps in filenames.
|
15
18
|
# Must be sortable as an integer
|
16
19
|
TIME_FORMAT = "%Y%m%d%H%M"
|
@@ -45,7 +48,11 @@ module ScoutApm
|
|
45
48
|
@directory = Pathname.new(found)
|
46
49
|
end
|
47
50
|
|
48
|
-
def write_reporting_period(reporting_period)
|
51
|
+
def write_reporting_period(reporting_period, files_limit = MAX_FILES_LIMIT)
|
52
|
+
if at_layaway_file_limit?(files_limit)
|
53
|
+
ScoutApm::Agent.instance.logger.error("Hit layaway file limit. Not writing to layaway file")
|
54
|
+
return false
|
55
|
+
end
|
49
56
|
filename = file_for(reporting_period.timestamp)
|
50
57
|
layaway_file = LayawayFile.new(filename)
|
51
58
|
layaway_file.write(reporting_period)
|
@@ -170,6 +177,10 @@ module ScoutApm
|
|
170
177
|
end
|
171
178
|
end
|
172
179
|
|
180
|
+
def at_layaway_file_limit?(files_limit = MAX_FILES_LIMIT)
|
181
|
+
all_files_for(:all).count >= files_limit
|
182
|
+
end
|
183
|
+
|
173
184
|
def log_layaway_file_information
|
174
185
|
files_in_temp = Dir["#{directory}/*"].count
|
175
186
|
|
data/lib/scout_apm/metric_set.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module ScoutApm
|
2
2
|
class MetricSet
|
3
|
-
# We can't aggregate
|
3
|
+
# We can't aggregate a handful of things like samplers (CPU, Memory), or
|
4
|
+
# Controller, and Percentiles so pass through these metrics directly
|
5
|
+
#
|
4
6
|
# TODO: Figure out a way to not have this duplicate what's in Samplers, and also on server's ingest
|
5
7
|
PASSTHROUGH_METRICS = ["CPU", "Memory", "Instance", "Controller", "SlowTransaction", "Percentile", "Job"]
|
6
8
|
|
data/lib/scout_apm/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -16,6 +16,14 @@ Kernel.module_eval do
|
|
16
16
|
def self.const_unset(const)
|
17
17
|
self.instance_eval { remove_const(const) }
|
18
18
|
end
|
19
|
+
|
20
|
+
def silence_warnings(&block)
|
21
|
+
warn_level = $VERBOSE
|
22
|
+
$VERBOSE = nil
|
23
|
+
result = block.call
|
24
|
+
$VERBOSE = warn_level
|
25
|
+
result
|
26
|
+
end
|
19
27
|
end
|
20
28
|
|
21
29
|
# A test helper class to create a temporary "configuration" we can control entirely purposes
|
data/test/unit/layaway_test.rb
CHANGED
@@ -21,4 +21,24 @@ class LayawayTest < Minitest::Test
|
|
21
21
|
|
22
22
|
assert_equal Pathname.new("/tmp/scout_apm_test/tmp"), ScoutApm::Layaway.new(config, env).directory
|
23
23
|
end
|
24
|
+
|
25
|
+
def test_layaway_file_limit_prevents_new_writes
|
26
|
+
FileUtils.mkdir_p '/tmp/scout_apm_test/layaway_limit'
|
27
|
+
config = make_fake_config("data_file" => "/tmp/scout_apm_test/layaway_limit")
|
28
|
+
layaway = ScoutApm::Layaway.new(config, ScoutApm::Agent.instance.environment)
|
29
|
+
layaway.delete_files_for(:all)
|
30
|
+
|
31
|
+
current_time = Time.now.utc
|
32
|
+
current_rp = ScoutApm::StoreReportingPeriod.new(current_time)
|
33
|
+
stale_rp = ScoutApm::StoreReportingPeriod.new(current_time - current_time.sec - 120)
|
34
|
+
|
35
|
+
# layaway.write_reporting_period returns nil on successful write
|
36
|
+
# It should probably be changed to return true or the number of bytes written
|
37
|
+
assert_nil layaway.write_reporting_period(stale_rp, 1)
|
38
|
+
|
39
|
+
# layaway.write_reporting_period returns an explicit false class on failure
|
40
|
+
assert layaway.write_reporting_period(current_rp, 1).is_a?(FalseClass)
|
41
|
+
|
42
|
+
layaway.delete_files_for(:all)
|
43
|
+
end
|
24
44
|
end
|
data/test/unit/store_test.rb
CHANGED
@@ -20,6 +20,21 @@ class StoreTest < Minitest::Test
|
|
20
20
|
|
21
21
|
assert_equal({}, s.reporting_periods)
|
22
22
|
end
|
23
|
+
|
24
|
+
def test_writing_layaway_removes_stale_timestamps
|
25
|
+
current_time = Time.now.utc
|
26
|
+
current_rp = ScoutApm::StoreReportingPeriod.new(current_time)
|
27
|
+
stale_rp = ScoutApm::StoreReportingPeriod.new(current_time - current_time.sec - 120)
|
28
|
+
|
29
|
+
s = ScoutApm::Store.new
|
30
|
+
ScoutApm::Instruments::Process::ProcessMemory.new(Logger.new(StringIO.new)).metrics(stale_rp.timestamp, s)
|
31
|
+
ScoutApm::Instruments::Process::ProcessMemory.new(Logger.new(StringIO.new)).metrics(current_rp.timestamp, s)
|
32
|
+
assert_equal 2, s.reporting_periods.size
|
33
|
+
|
34
|
+
s.write_to_layaway(FakeFailingLayaway.new, true)
|
35
|
+
|
36
|
+
assert_equal({}, s.reporting_periods)
|
37
|
+
end
|
23
38
|
end
|
24
39
|
|
25
40
|
class StoreReportingPeriodTest < Minitest::Test
|
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.pre7
|
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: 2016-12-
|
12
|
+
date: 2016-12-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -146,7 +146,6 @@ files:
|
|
146
146
|
- lib/scout_apm/background_worker.rb
|
147
147
|
- lib/scout_apm/bucket_name_splitter.rb
|
148
148
|
- lib/scout_apm/call_set.rb
|
149
|
-
- lib/scout_apm/capacity.rb
|
150
149
|
- lib/scout_apm/config.rb
|
151
150
|
- lib/scout_apm/context.rb
|
152
151
|
- lib/scout_apm/environment.rb
|
@@ -293,34 +292,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
293
292
|
version: 1.3.1
|
294
293
|
requirements: []
|
295
294
|
rubyforge_project: scout_apm
|
296
|
-
rubygems_version: 2.
|
295
|
+
rubygems_version: 2.2.2
|
297
296
|
signing_key:
|
298
297
|
specification_version: 4
|
299
298
|
summary: Ruby application performance monitoring
|
300
|
-
test_files:
|
301
|
-
- test/data/config_test_1.yml
|
302
|
-
- test/test_helper.rb
|
303
|
-
- test/unit/agent_test.rb
|
304
|
-
- test/unit/background_job_integrations/sidekiq_test.rb
|
305
|
-
- test/unit/config_test.rb
|
306
|
-
- test/unit/context_test.rb
|
307
|
-
- test/unit/environment_test.rb
|
308
|
-
- test/unit/git_revision_test.rb
|
309
|
-
- test/unit/histogram_test.rb
|
310
|
-
- test/unit/ignored_uris_test.rb
|
311
|
-
- test/unit/instruments/active_record_instruments_test.rb
|
312
|
-
- test/unit/instruments/net_http_test.rb
|
313
|
-
- test/unit/instruments/percentile_sampler_test.rb
|
314
|
-
- test/unit/layaway_test.rb
|
315
|
-
- test/unit/layer_children_set_test.rb
|
316
|
-
- test/unit/limited_layer_test.rb
|
317
|
-
- test/unit/metric_set_test.rb
|
318
|
-
- test/unit/scored_item_set_test.rb
|
319
|
-
- test/unit/serializers/payload_serializer_test.rb
|
320
|
-
- test/unit/slow_job_policy_test.rb
|
321
|
-
- test/unit/slow_request_policy_test.rb
|
322
|
-
- test/unit/sql_sanitizer_test.rb
|
323
|
-
- test/unit/store_test.rb
|
324
|
-
- test/unit/utils/active_record_metric_name_test.rb
|
325
|
-
- test/unit/utils/backtrace_parser_test.rb
|
326
|
-
- test/unit/utils/numbers_test.rb
|
299
|
+
test_files: []
|
data/lib/scout_apm/capacity.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
# Encapsulates logic for determining capacity utilization of the Ruby processes.
|
2
|
-
module ScoutApm
|
3
|
-
class Capacity
|
4
|
-
attr_reader :processing_start_time, :accumulated_time, :transaction_entry_time
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@processing_start_time = Time.now
|
8
|
-
@lock ||= Mutex.new # the transaction_entry_time could be modified while processing a request or when #process is called.
|
9
|
-
@accumulated_time = 0.0
|
10
|
-
end
|
11
|
-
|
12
|
-
# Called when a transaction is traced.
|
13
|
-
def start_transaction!
|
14
|
-
@lock.synchronize do
|
15
|
-
@transaction_entry_time = Time.now
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Called when a transaction completes to record its time used.
|
20
|
-
def finish_transaction!
|
21
|
-
@lock.synchronize do
|
22
|
-
if transaction_entry_time
|
23
|
-
@accumulated_time += (Time.now - transaction_entry_time).to_f
|
24
|
-
else
|
25
|
-
ScoutApm::Agent.instance.logger.warn "No transaction entry time. Not recording capacity metrics for transaction."
|
26
|
-
end
|
27
|
-
@transaction_entry_time = nil
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Ran when sending metrics to server. Reports capacity usage metrics.
|
32
|
-
def process
|
33
|
-
process_time = Time.now
|
34
|
-
ScoutApm::Agent.instance.logger.debug "Processing capacity usage for [#{@processing_start_time}] to [#{process_time}]. Time Spent: #{@accumulated_time}."
|
35
|
-
@lock.synchronize do
|
36
|
-
time_spent = @accumulated_time
|
37
|
-
@accumulated_time = 0.0
|
38
|
-
# If a transaction is still running, capture its running time up to now and
|
39
|
-
# reset the +transaction_entry_time+ to now.
|
40
|
-
if @transaction_entry_time
|
41
|
-
time_spent += (process_time - @transaction_entry_time).to_f
|
42
|
-
ScoutApm::Agent.instance.logger.debug "A transaction is running while calculating capacity. Start time: [#{transaction_entry_time}]. Will update the entry time to [#{process_time}]."
|
43
|
-
@transaction_entry_time = process_time # prevent from over-counting capacity usage. update the transaction start time to now.
|
44
|
-
end
|
45
|
-
time_spent = 0.0 if time_spent < 0.0
|
46
|
-
|
47
|
-
window = (process_time - processing_start_time).to_f # time period we are evaulating capacity usage.
|
48
|
-
window = 1.0 if window <= 0.0 # prevent divide-by-zero if clock adjusted.
|
49
|
-
capacity = time_spent / window
|
50
|
-
ScoutApm::Agent.instance.logger.debug "Instance/Capacity: #{capacity}"
|
51
|
-
ScoutApm::Agent.instance.store.track_one!("Instance", "Capacity", capacity)
|
52
|
-
|
53
|
-
@processing_start_time = process_time
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|