scout_apm 3.0.0.pre26 → 3.0.0.pre27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +9 -0
- data/lib/scout_apm.rb +1 -0
- data/lib/scout_apm/layer_converters/database_converter.rb +2 -15
- data/lib/scout_apm/store.rb +12 -7
- data/lib/scout_apm/utils/active_record_metric_name.rb +16 -3
- data/lib/scout_apm/version.rb +1 -1
- data/test/unit/utils/active_record_metric_name_test.rb +10 -2
- metadata +47 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83c69774d0c470897fe065d9ad4c72140b0ed48d
|
4
|
+
data.tar.gz: cf58a5b2f366ee3df3c7ecba9a453010684e00ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81b2c54c39a670f3a058c8493bee77a5ac0071bda90860bfabe1d4b7814d5ce0556354a800116ece34343739d6d6f0185d60958c7aaacf79731550861e9edb97
|
7
|
+
data.tar.gz: bc17ad078833fe7aacf9f461b6f3f0eee0a911e1cd3fe7d354dd5694e6cba70c81c24b312482f3f011f30ae261141bf6503b0810acb9a1206c7cf84a01bec53c
|
data/CHANGELOG.markdown
CHANGED
@@ -2,6 +2,15 @@
|
|
2
2
|
|
3
3
|
* ScoutProf BETA
|
4
4
|
|
5
|
+
# 2.4.17
|
6
|
+
|
7
|
+
* Renames SQL `BEGIN` and `COMMIT` statements from `SQL#other` to `SQL#begin` and `SQL#commit`, respectively.
|
8
|
+
* Makes naming between transaction and database metrics consistent. Previously, database metrics lacking a provided ActiveRecord label were named `SQL#other`.
|
9
|
+
|
10
|
+
# 2.4.16
|
11
|
+
|
12
|
+
* Fix synchronization bug in Store (#205, PR #210)
|
13
|
+
|
5
14
|
# 2.4.15
|
6
15
|
|
7
16
|
* Fix bug that causes no data to be reported to Scout when DataDog is installed (#211)
|
data/lib/scout_apm.rb
CHANGED
@@ -13,7 +13,6 @@ module ScoutApm
|
|
13
13
|
|
14
14
|
walker.on do |layer|
|
15
15
|
next if skip_layer?(layer)
|
16
|
-
|
17
16
|
stat = DbQueryMetricStats.new(
|
18
17
|
model_name(layer),
|
19
18
|
operation_name(layer),
|
@@ -52,23 +51,11 @@ module ScoutApm
|
|
52
51
|
DEFAULT_OPERATION = "other"
|
53
52
|
|
54
53
|
def model_name(layer)
|
55
|
-
|
56
|
-
layer.name.model || DEFAULT_MODEL
|
57
|
-
else
|
58
|
-
DEFAULT_MODEL
|
59
|
-
end
|
60
|
-
rescue
|
61
|
-
DEFAULT_MODEL
|
54
|
+
layer.name.to_s.split("/").first || DEFAULT_MODEL
|
62
55
|
end
|
63
56
|
|
64
57
|
def operation_name(layer)
|
65
|
-
|
66
|
-
layer.name.normalized_operation || DEFAULT_OPERATION
|
67
|
-
else
|
68
|
-
DEFAULT_OPERATION
|
69
|
-
end
|
70
|
-
rescue
|
71
|
-
DEFAULT_OPERATION
|
58
|
+
layer.name.to_s.split("/")[1] || DEFAULT_OPERATION
|
72
59
|
end
|
73
60
|
|
74
61
|
def records_returned(layer)
|
data/lib/scout_apm/store.rb
CHANGED
@@ -5,8 +5,10 @@ module ScoutApm
|
|
5
5
|
class Store
|
6
6
|
def initialize(context)
|
7
7
|
@context = context
|
8
|
-
@mutex =
|
9
|
-
@reporting_periods = Hash.new { |h,k|
|
8
|
+
@mutex = Monitor.new
|
9
|
+
@reporting_periods = Hash.new { |h,k|
|
10
|
+
@mutex.synchronize { h[k] = StoreReportingPeriod.new(k, @context) }
|
11
|
+
}
|
10
12
|
@samplers = []
|
11
13
|
end
|
12
14
|
|
@@ -87,8 +89,13 @@ module ScoutApm
|
|
87
89
|
def write_to_layaway(layaway, force=false)
|
88
90
|
logger.debug("Writing to layaway#{" (Forced)" if force}")
|
89
91
|
|
90
|
-
@
|
91
|
-
|
92
|
+
to_report = @mutex.synchronize {
|
93
|
+
@reporting_periods.select { |time, rp|
|
94
|
+
force || (time.timestamp < current_timestamp.timestamp)
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
to_report.each { |time, rp| write_reporting_period(layaway, time, rp) }
|
92
99
|
end
|
93
100
|
|
94
101
|
# For each tick (minute), be sure we have a reporting period, and that samplers are run for it.
|
@@ -98,14 +105,12 @@ module ScoutApm
|
|
98
105
|
end
|
99
106
|
|
100
107
|
def write_reporting_period(layaway, time, rp)
|
101
|
-
@mutex.synchronize {
|
102
108
|
layaway.write_reporting_period(rp)
|
103
|
-
}
|
104
109
|
rescue => e
|
105
110
|
logger.warn("Failed writing data to layaway file: #{e.message} / #{e.backtrace}")
|
106
111
|
ensure
|
107
112
|
logger.debug("Before delete, reporting periods length: #{@reporting_periods.size}")
|
108
|
-
deleted_items = @reporting_periods.delete(time)
|
113
|
+
deleted_items = @mutex.synchronize { @reporting_periods.delete(time) }
|
109
114
|
logger.debug("After delete, reporting periods length: #{@reporting_periods.size}. Did delete #{deleted_items}")
|
110
115
|
end
|
111
116
|
private :write_reporting_period
|
@@ -12,22 +12,27 @@ module ScoutApm
|
|
12
12
|
# Converts an SQL string and the name (typically assigned automatically
|
13
13
|
# by rails) into a Scout metric_name.
|
14
14
|
#
|
15
|
+
# This prefers to use the ActiveRecord-provided name over parsing SQL as parsing is slower.
|
16
|
+
#
|
15
17
|
# sql: SELECT "places".* FROM "places" ORDER BY "places"."position" ASC
|
16
18
|
# name: Place Load
|
17
19
|
# metric_name: Place/find
|
18
20
|
def to_s
|
21
|
+
return @to_s if @to_s
|
19
22
|
parsed = parse_operation
|
20
23
|
if parsed
|
21
|
-
"#{model}/#{parsed}"
|
24
|
+
@to_s = "#{model}/#{parsed}"
|
22
25
|
else
|
23
|
-
regex_name(sql)
|
26
|
+
@to_s = regex_name(sql)
|
24
27
|
end
|
25
28
|
end
|
26
29
|
|
30
|
+
# This only returns a value if a name is provided via +initialize+.
|
27
31
|
def model
|
28
32
|
parts.first
|
29
33
|
end
|
30
34
|
|
35
|
+
# This only returns a value if a name is provided via +initialize+.
|
31
36
|
def normalized_operation
|
32
37
|
parse_operation
|
33
38
|
end
|
@@ -49,12 +54,14 @@ module ScoutApm
|
|
49
54
|
|
50
55
|
private
|
51
56
|
|
57
|
+
# This only returns a value if a name is provided via +initialize+.
|
52
58
|
def operation
|
53
59
|
if parts.length >= 2
|
54
60
|
parts[1].downcase
|
55
61
|
end
|
56
62
|
end
|
57
63
|
|
64
|
+
# This only returns a value if a name is provided via +initialize+.
|
58
65
|
def parts
|
59
66
|
name.split(" ")
|
60
67
|
end
|
@@ -86,6 +93,8 @@ module ScoutApm
|
|
86
93
|
NON_GREEDY_CONSUME = '.*?'
|
87
94
|
TABLE = '(?:"|`)?(.*?)(?:"|`)?\s'
|
88
95
|
COUNT = 'COUNT\(.*?\)'
|
96
|
+
BEGIN_STATEMENT = 'BEGIN'.freeze # BEGIN is a reserved keyword
|
97
|
+
COMMIT = 'COMMIT'.freeze
|
89
98
|
|
90
99
|
SELECT_REGEX = /\A#{WHITE_SPACE}(SELECT)#{WHITE_SPACE}(#{COUNT})?#{NON_GREEDY_CONSUME}#{FROM}#{WHITE_SPACE}#{TABLE}/i.freeze
|
91
100
|
UPDATE_REGEX = /\A#{WHITE_SPACE}(UPDATE)#{WHITE_SPACE}#{TABLE}/i.freeze
|
@@ -121,13 +130,17 @@ module ScoutApm
|
|
121
130
|
else
|
122
131
|
SELECT_LABEL
|
123
132
|
end
|
124
|
-
"#{match[3].classify}/#{operation}"
|
133
|
+
"#{match[3].gsub(/\W/,'').classify}/#{operation}"
|
125
134
|
elsif match = UPDATE_REGEX.match(sql)
|
126
135
|
"#{match[2].classify}/#{UPDATE_LABEL}"
|
127
136
|
elsif match = INSERT_REGEX.match(sql)
|
128
137
|
"#{match[2].classify}/#{INSERT_LABEL}"
|
129
138
|
elsif match = DELETE_REGEX.match(sql)
|
130
139
|
"#{match[2].classify}/#{DELETE_LABEL}"
|
140
|
+
elsif sql == BEGIN_STATEMENT
|
141
|
+
"SQL/#{BEGIN_STATEMENT.downcase}"
|
142
|
+
elsif sql == COMMIT
|
143
|
+
"SQL/#{COMMIT.downcase}"
|
131
144
|
else
|
132
145
|
UNKNOWN_LABEL
|
133
146
|
end
|
data/lib/scout_apm/version.rb
CHANGED
@@ -64,6 +64,16 @@ class ActiveRecordMetricNameTest < Minitest::Test
|
|
64
64
|
assert_equal "User/find", mn.to_s
|
65
65
|
end
|
66
66
|
|
67
|
+
def test_begin_statement
|
68
|
+
mn = ScoutApm::Utils::ActiveRecordMetricName.new("BEGIN", nil)
|
69
|
+
assert_equal "SQL/begin", mn.to_s
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_commit
|
73
|
+
mn = ScoutApm::Utils::ActiveRecordMetricName.new("COMMIT", nil)
|
74
|
+
assert_equal "SQL/commit", mn.to_s
|
75
|
+
end
|
76
|
+
|
67
77
|
|
68
78
|
# Regex test cases, pass these in w/ "SQL" as the AR provided name field
|
69
79
|
[
|
@@ -89,8 +99,6 @@ class ActiveRecordMetricNameTest < Minitest::Test
|
|
89
99
|
# Stuff we don't care about in SQL
|
90
100
|
["SQL/other", 'SET SESSION statement_timeout = ?'],
|
91
101
|
["SQL/other", 'SHOW TIME ZONE'],
|
92
|
-
["SQL/other", 'BEGIN'],
|
93
|
-
["SQL/other", 'COMMIT'],
|
94
102
|
|
95
103
|
# Empty strings, or invalid SQL
|
96
104
|
["SQL/other", ''],
|
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.pre27
|
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-08-
|
12
|
+
date: 2018-08-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: minitest
|
@@ -397,8 +397,51 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
397
397
|
version: 1.3.1
|
398
398
|
requirements: []
|
399
399
|
rubyforge_project: scout_apm
|
400
|
-
rubygems_version: 2.4.
|
400
|
+
rubygems_version: 2.4.6
|
401
401
|
signing_key:
|
402
402
|
specification_version: 4
|
403
403
|
summary: Ruby application performance monitoring
|
404
|
-
test_files:
|
404
|
+
test_files:
|
405
|
+
- test/data/config_test_1.yml
|
406
|
+
- test/test_helper.rb
|
407
|
+
- test/unit/agent_test.rb
|
408
|
+
- test/unit/background_job_integrations/sidekiq_test.rb
|
409
|
+
- test/unit/config_test.rb
|
410
|
+
- test/unit/context_test.rb
|
411
|
+
- test/unit/db_query_metric_set_test.rb
|
412
|
+
- test/unit/db_query_metric_stats_test.rb
|
413
|
+
- test/unit/environment_test.rb
|
414
|
+
- test/unit/extensions/periodic_callbacks_test.rb
|
415
|
+
- test/unit/extensions/transaction_callbacks_test.rb
|
416
|
+
- test/unit/fake_store_test.rb
|
417
|
+
- test/unit/git_revision_test.rb
|
418
|
+
- test/unit/histogram_test.rb
|
419
|
+
- test/unit/ignored_uris_test.rb
|
420
|
+
- test/unit/instruments/active_record_instruments_test.rb
|
421
|
+
- test/unit/instruments/net_http_test.rb
|
422
|
+
- test/unit/instruments/percentile_sampler_test.rb
|
423
|
+
- test/unit/layaway_test.rb
|
424
|
+
- test/unit/layer_children_set_test.rb
|
425
|
+
- test/unit/layer_converters/depth_first_walker_test.rb
|
426
|
+
- test/unit/layer_converters/metric_converter_test.rb
|
427
|
+
- test/unit/layer_converters/stubs.rb
|
428
|
+
- test/unit/limited_layer_test.rb
|
429
|
+
- test/unit/logger_test.rb
|
430
|
+
- test/unit/metric_set_test.rb
|
431
|
+
- test/unit/remote/test_message.rb
|
432
|
+
- test/unit/remote/test_router.rb
|
433
|
+
- test/unit/remote/test_server.rb
|
434
|
+
- test/unit/scored_item_set_test.rb
|
435
|
+
- test/unit/serializers/payload_serializer_test.rb
|
436
|
+
- test/unit/slow_job_policy_test.rb
|
437
|
+
- test/unit/slow_request_policy_test.rb
|
438
|
+
- test/unit/sql_sanitizer_test.rb
|
439
|
+
- test/unit/store_test.rb
|
440
|
+
- test/unit/tracer_test.rb
|
441
|
+
- test/unit/tracked_request_test.rb
|
442
|
+
- test/unit/transaction_test.rb
|
443
|
+
- test/unit/transaction_time_consumed_test.rb
|
444
|
+
- test/unit/utils/active_record_metric_name_test.rb
|
445
|
+
- test/unit/utils/backtrace_parser_test.rb
|
446
|
+
- test/unit/utils/numbers_test.rb
|
447
|
+
- test/unit/utils/scm.rb
|