scout_apm 3.0.0.pre19 → 3.0.0.pre20
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 +8 -0
- data/lib/scout_apm/agent_context.rb +1 -1
- data/lib/scout_apm/db_query_metric_set.rb +6 -1
- data/lib/scout_apm/logger.rb +8 -1
- data/lib/scout_apm/tracked_request.rb +40 -13
- data/lib/scout_apm/version.rb +1 -1
- data/test/unit/logger_test.rb +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f047a3fde038ff766a4257bd06039aaa57bc5eda
|
4
|
+
data.tar.gz: 2e3aecc744bff0176bb449f0bade29a43ff2810d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57f0e123ba394164ea2263195a204f77787e254e8396bb5a0ca346523470f4e447e53b456005a082949e6f7f6a9154ac55b71cf701b19a7e8517f709591761fd
|
7
|
+
data.tar.gz: 555e23d6f39fd9c1ea919ab15f7fa28b868fef854c7f0dec610db7bc9ea20438de8d30a1c6c932e7d389cd5bd40f2a3b58af53b29e9fe44e965c8ff8b7ca2d8a
|
data/CHANGELOG.markdown
CHANGED
@@ -41,7 +41,7 @@ module ScoutApm
|
|
41
41
|
@remote_server = ScoutApm::Remote::Server.new(
|
42
42
|
bind,
|
43
43
|
port,
|
44
|
-
ScoutApm::Remote::Router.new(ScoutApm::SynchronousRecorder.new(
|
44
|
+
ScoutApm::Remote::Router.new(ScoutApm::SynchronousRecorder.new(self), logger),
|
45
45
|
logger
|
46
46
|
)
|
47
47
|
|
@@ -4,7 +4,6 @@ module ScoutApm
|
|
4
4
|
include Enumerable
|
5
5
|
|
6
6
|
attr_reader :metrics # the raw metrics. You probably want #metrics_to_report
|
7
|
-
attr_reader :context
|
8
7
|
|
9
8
|
def marshal_dump
|
10
9
|
[ @metrics ]
|
@@ -22,6 +21,12 @@ module ScoutApm
|
|
22
21
|
@metrics = Hash.new
|
23
22
|
end
|
24
23
|
|
24
|
+
# Need to look this up again if we end up as nil. Which I guess can happen
|
25
|
+
# after a Marshal load?
|
26
|
+
def context
|
27
|
+
@context ||= ScoutApm::Agent.instance.context
|
28
|
+
end
|
29
|
+
|
25
30
|
def each
|
26
31
|
metrics.each do |_key, db_query_metric_stat|
|
27
32
|
yield db_query_metric_stat
|
data/lib/scout_apm/logger.rb
CHANGED
@@ -8,11 +8,12 @@
|
|
8
8
|
# :stdout => true - explicitly force the log to write to stdout (if set, ignore log_file_path)
|
9
9
|
# :stderr => true - explicitly force the log to write to stderr (if set, ignore log_file_path)
|
10
10
|
# :logger_class => Class or String - a class to use as the underlying logger. Defaults to Ruby's Logger. See notes
|
11
|
-
# :log_level => symbol, string, or integer -
|
11
|
+
# :log_level => symbol, string, or integer - defaults to INFO level
|
12
12
|
#
|
13
13
|
# The :logger_class option
|
14
14
|
# - allows any class to be used as the underlying logger. Currently requires to respond to:
|
15
15
|
# - debug, info, warn, error, fatal in both string and block form.
|
16
|
+
# - debug?, info?, warn?, error?, fatal?
|
16
17
|
# - #level= with a number (0 = debug, 1 = info, 2= warn, 3=error, 4=fatal)
|
17
18
|
# - #formatter= that takes a Ruby Logger::Formatter class. This method must be here, but the value may be ignored
|
18
19
|
#
|
@@ -39,6 +40,12 @@ module ScoutApm
|
|
39
40
|
def error(*args, &block); @logger.error(*args, &block); end
|
40
41
|
def fatal(*args, &block); @logger.fatal(*args, &block); end
|
41
42
|
|
43
|
+
def debug?; @logger.debug?; end
|
44
|
+
def info?; @logger.info?; end
|
45
|
+
def warn?; @logger.warn?; end
|
46
|
+
def error?; @logger.error?; end
|
47
|
+
def fatal?; @logger.fatal?; end
|
48
|
+
|
42
49
|
def log_level=(level)
|
43
50
|
@logger.level = log_level_from_opts(level)
|
44
51
|
end
|
@@ -38,6 +38,13 @@ module ScoutApm
|
|
38
38
|
# An object that responds to `record!(TrackedRequest)` to store this tracked request
|
39
39
|
attr_reader :recorder
|
40
40
|
|
41
|
+
# When we see these layers, it means a real request is going through the
|
42
|
+
# system. We toggle a flag to turn on some slightly more expensive
|
43
|
+
# instrumentation (backtrace collection and the like) that would be too
|
44
|
+
# expensive in situations where the framework is constantly churning. We
|
45
|
+
# see that on Sidekiq.
|
46
|
+
REQUEST_TYPES = ["Controller", "Job"]
|
47
|
+
|
41
48
|
def initialize(agent_context, store)
|
42
49
|
@agent_context = agent_context
|
43
50
|
@store = store #this is passed in so we can use a real store (normal operation) or fake store (instant mode only)
|
@@ -52,6 +59,7 @@ module ScoutApm
|
|
52
59
|
@instant_key = nil
|
53
60
|
@mem_start = mem_usage
|
54
61
|
@recorder = agent_context.recorder
|
62
|
+
@real_request = false
|
55
63
|
|
56
64
|
ignore_request! if @recorder.nil?
|
57
65
|
end
|
@@ -67,6 +75,10 @@ module ScoutApm
|
|
67
75
|
layer.start_sampling
|
68
76
|
|
69
77
|
start_request(layer) unless @root_layer
|
78
|
+
|
79
|
+
if REQUEST_TYPES.include?(layer.type)
|
80
|
+
real_request!
|
81
|
+
end
|
70
82
|
@layers.push(layer)
|
71
83
|
end
|
72
84
|
|
@@ -110,6 +122,15 @@ module ScoutApm
|
|
110
122
|
end
|
111
123
|
end
|
112
124
|
|
125
|
+
def real_request!
|
126
|
+
@real_request = true
|
127
|
+
end
|
128
|
+
|
129
|
+
# Have we seen a "controller" or "job" layer so far?
|
130
|
+
def real_request?
|
131
|
+
@real_request
|
132
|
+
end
|
133
|
+
|
113
134
|
# Grab the currently running layer. Useful for adding additional data as we
|
114
135
|
# learn it. This is useful in ActiveRecord instruments, where we start the
|
115
136
|
# instrumentation early, and gradually learn more about the request that
|
@@ -133,7 +154,7 @@ module ScoutApm
|
|
133
154
|
# Only capture backtraces if we're in a real "request". Otherwise we
|
134
155
|
# can spend lot of time capturing backtraces from the internals of
|
135
156
|
# Sidekiq, only to throw them away immediately.
|
136
|
-
return false unless
|
157
|
+
return false unless real_request?
|
137
158
|
|
138
159
|
# Capture any individually slow layer.
|
139
160
|
return true if layer.total_exclusive_time > backtrace_threshold
|
@@ -245,16 +266,6 @@ module ScoutApm
|
|
245
266
|
@headers = headers
|
246
267
|
end
|
247
268
|
|
248
|
-
# This request is a job transaction iff it has a 'Job' layer
|
249
|
-
def job?
|
250
|
-
layer_finder.job != nil
|
251
|
-
end
|
252
|
-
|
253
|
-
# This request is a web transaction iff it has a 'Controller' layer
|
254
|
-
def web?
|
255
|
-
layer_finder.controller != nil
|
256
|
-
end
|
257
|
-
|
258
269
|
def instant?
|
259
270
|
return false if ignoring_request?
|
260
271
|
|
@@ -278,7 +289,7 @@ module ScoutApm
|
|
278
289
|
|
279
290
|
# If we didn't have store, but we're trying to record anyway, go
|
280
291
|
# figure that out. (this happens in Remote Agent scenarios)
|
281
|
-
|
292
|
+
restore_from_dump! if @agent_context.nil?
|
282
293
|
|
283
294
|
# Bail out early if the user asked us to ignore this uri
|
284
295
|
return if @agent_context.ignored_uris.ignore?(annotations[:uri])
|
@@ -317,6 +328,19 @@ module ScoutApm
|
|
317
328
|
end
|
318
329
|
end
|
319
330
|
|
331
|
+
# This request is a job transaction iff it has a 'Job' layer
|
332
|
+
# Use this only during recording
|
333
|
+
def job?
|
334
|
+
layer_finder.job != nil
|
335
|
+
end
|
336
|
+
|
337
|
+
# This request is a web transaction iff it has a 'Controller' layer
|
338
|
+
# Use this only during recording
|
339
|
+
def web?
|
340
|
+
layer_finder.controller != nil
|
341
|
+
end
|
342
|
+
|
343
|
+
|
320
344
|
def layer_finder
|
321
345
|
@layer_finder ||= LayerConverters::FindLayerByType.new(self)
|
322
346
|
end
|
@@ -457,11 +481,14 @@ module ScoutApm
|
|
457
481
|
@call_set = nil
|
458
482
|
@store = nil
|
459
483
|
@recorder = nil
|
484
|
+
@agent_context = nil
|
460
485
|
end
|
461
486
|
|
462
487
|
# Go re-fetch the store based on what the Agent's official one is. Used
|
463
488
|
# after hydrating a dumped TrackedRequest
|
464
|
-
def
|
489
|
+
def restore_from_dump!
|
490
|
+
@agent_context = ScoutApm::Agent.instance.context
|
491
|
+
@recorder = @agent_context.recorder
|
465
492
|
@store = @agent_context.store
|
466
493
|
end
|
467
494
|
end
|
data/lib/scout_apm/version.rb
CHANGED
data/test/unit/logger_test.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'test_helper'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
require 'scout_apm/logger'
|
4
5
|
|
5
6
|
class LoggerTest < Minitest::Test
|
6
7
|
def setup
|
7
8
|
@env_root = Pathname.new(File.dirname(__FILE__)) + "../../"
|
9
|
+
FileUtils.mkdir_p(@env_root + "log")
|
8
10
|
end
|
9
11
|
|
10
12
|
def test_detect_stdout
|
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.pre20
|
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: 2018-01
|
12
|
+
date: 2018-02-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|