oneapm_rpm 1.3.6 → 1.3.7.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/one_apm/agent/agent/start_worker_thread.rb +8 -8
- data/lib/one_apm/agent/cross_app/cross_app_monitor.rb +2 -2
- data/lib/one_apm/agent/cross_app/cross_app_tracing.rb +2 -2
- data/lib/one_apm/agent/database.rb +17 -17
- data/lib/one_apm/agent/database/obfuscation_helpers.rb +13 -13
- data/lib/one_apm/agent/database/obfuscator.rb +5 -5
- data/lib/one_apm/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/one_apm/agent/datastore/metric_helper.rb +12 -12
- data/lib/one_apm/agent/datastore/mongo/command_formatter.rb +6 -6
- data/lib/one_apm/agent/datastore/mongo/metric_translator.rb +6 -6
- data/lib/one_apm/agent/datastore/mongo/obfuscator.rb +2 -2
- data/lib/one_apm/agent/datastore/mongo/statement_formatter.rb +4 -4
- data/lib/one_apm/agent/javascript_instrumentor.rb +22 -22
- data/lib/one_apm/agent/synthetics_monitor.rb +7 -7
- data/lib/one_apm/agent/threading/thread_profile.rb +2 -2
- data/lib/one_apm/collector/collector/http_connection.rb +4 -4
- data/lib/one_apm/collector/collector_service.rb +1 -1
- data/lib/one_apm/collector/commands/thread_profiler_session.rb +4 -4
- data/lib/one_apm/collector/containers/agent_command_router.rb +4 -4
- data/lib/one_apm/collector/containers/custom_event_aggregator.rb +10 -10
- data/lib/one_apm/collector/containers/error_collector.rb +4 -4
- data/lib/one_apm/collector/containers/sql_sampler.rb +2 -2
- data/lib/one_apm/collector/containers/transaction_event_aggregator.rb +36 -36
- data/lib/one_apm/collector/containers/transaction_sampler.rb +4 -4
- data/lib/one_apm/collector/containers/utilization_data.rb +1 -1
- data/lib/one_apm/collector/samplers/delayed_job_sampler.rb +7 -7
- data/lib/one_apm/collector/samplers/vm_sampler.rb +18 -18
- data/lib/one_apm/collector/stats_engine/gc_profiler.rb +6 -6
- data/lib/one_apm/collector/stats_engine/metric_stats.rb +1 -1
- data/lib/one_apm/collector/support/proc_poller.rb +2 -2
- data/lib/one_apm/configuration.rb +2 -2
- data/lib/one_apm/configuration/default_source.rb +2 -2
- data/lib/one_apm/configuration/environment_source.rb +5 -5
- data/lib/one_apm/configuration/high_security_source.rb +7 -7
- data/lib/one_apm/errors/noticed_error.rb +2 -2
- data/lib/one_apm/inst/dispatcher/puma.rb +7 -4
- data/lib/one_apm/inst/framework/grape.rb +9 -9
- data/lib/one_apm/inst/framework/sinatra/transaction_namer.rb +2 -2
- data/lib/one_apm/inst/http_clients/curb.rb +2 -2
- data/lib/one_apm/inst/http_clients/excon.rb +7 -7
- data/lib/one_apm/inst/http_clients/httpclient.rb +2 -2
- data/lib/one_apm/inst/http_clients/typhoeus.rb +2 -2
- data/lib/one_apm/inst/nosql/memcache.rb +5 -5
- data/lib/one_apm/inst/nosql/mongo2.rb +8 -8
- data/lib/one_apm/inst/orm/active_record.rb +2 -2
- data/lib/one_apm/inst/rails3/action_controller.rb +1 -1
- data/lib/one_apm/inst/rails4/action_view_subscriber.rb +2 -2
- data/lib/one_apm/inst/rails4/active_record_subscriber.rb +3 -3
- data/lib/one_apm/inst/support/queue_time.rb +14 -14
- data/lib/one_apm/logger/agent_logger.rb +4 -4
- data/lib/one_apm/metrics/metric_spec.rb +10 -10
- data/lib/one_apm/rack/browser_monitoring.rb +135 -144
- data/lib/one_apm/rack/developer_mode.rb +22 -33
- data/lib/one_apm/rack/developer_mode/helper.rb +1 -1
- data/lib/one_apm/rack/middleware_base.rb +2 -0
- data/lib/one_apm/rack/middleware_helper.rb +21 -0
- data/lib/one_apm/rack/middleware_hooks.rb +10 -8
- data/lib/one_apm/rack/middleware_tracing.rb +47 -44
- data/lib/one_apm/rack/middleware_wrapper.rb +63 -57
- data/lib/one_apm/support/backtrace/backtrace_node.rb +4 -4
- data/lib/one_apm/support/backtrace/backtrace_service.rb +7 -7
- data/lib/one_apm/support/collection_helper.rb +4 -4
- data/lib/one_apm/support/event_buffer/synthetics_event_buffer.rb +2 -2
- data/lib/one_apm/support/json_marshaller.rb +2 -2
- data/lib/one_apm/support/method_tracer.rb +2 -2
- data/lib/one_apm/support/method_tracer/helpers.rb +2 -2
- data/lib/one_apm/support/obfuscator.rb +5 -5
- data/lib/one_apm/support/rules_engine.rb +2 -2
- data/lib/one_apm/support/rules_engine/replacement_rule.rb +4 -4
- data/lib/one_apm/support/rules_engine/segment_terms_rule.rb +8 -8
- data/lib/one_apm/support/supported_versions.rb +9 -13
- data/lib/one_apm/support/vm/rubinius_vm.rb +1 -1
- data/lib/one_apm/transaction.rb +8 -8
- data/lib/one_apm/transaction/class_methods.rb +8 -8
- data/lib/one_apm/transaction/instance_helpers.rb +1 -1
- data/lib/one_apm/transaction/metric_constants.rb +27 -27
- data/lib/one_apm/transaction/sample_buffer/developer_mode_sample_buffer.rb +3 -3
- data/lib/one_apm/transaction/sample_buffer/force_persist_sample_buffer.rb +2 -2
- data/lib/one_apm/transaction/sample_buffer/slowest_sample_buffer.rb +2 -2
- data/lib/one_apm/transaction/sample_buffer/transaction_sample_buffer.rb +3 -3
- data/lib/one_apm/transaction/segment.rb +2 -2
- data/lib/one_apm/transaction/transaction_finish_append.rb +3 -3
- data/lib/one_apm/transaction/transaction_jruby_functions.rb +3 -3
- data/lib/one_apm/transaction/transaction_name.rb +3 -3
- data/lib/one_apm/transaction/transaction_namer.rb +7 -7
- data/lib/one_apm/transaction/transaction_sample_builder.rb +3 -3
- data/lib/one_apm/transaction/transaction_summary.rb +4 -4
- data/lib/one_apm/transaction/transaction_timings.rb +1 -1
- data/lib/one_apm/version.rb +3 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MmM5MDg1YzYyMWM0ZGNiZTdiNzY2OTBhYmZmNDIzODIwOGExNGVjNg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTY4ZjZhNzI3MWIwYmNhMDJhNTg1MDVhMTk2MzgzMWU2ODM5ZjQzMg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTBjMTIxZTlkZTMzODM4YjdlNzgxMWM4MjY3ZGFlNzM2YjM3MTJkYjFiNDhl
|
10
|
+
NjBkNWZlMzA0NGQzZDZhMGRmNjVlZTQxMDg1NzRmMmM0YjRlOWU5MTc0ZTEw
|
11
|
+
OWMyZmZmZjViNjQ5OTg3YmNmZTExOTIzYTYxNTMwM2M3ZjdkNDg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjJkYWQzZDNiMjczMTVjMGJhMjgzMzAzMzFhN2MyNWNkNjIyZWJiMDg0OTM2
|
14
|
+
N2ZkYzgxMjRhNzkxYTQ2NDE3MjNhNjEwYWU2YTA0Y2IzYWUyNjFhZWQ1MWYy
|
15
|
+
YTAyMmJhZmY0M2MxZDIyMGZmYzU5MWY5YmRmNmQ3NzQ4NmFjM2Y=
|
@@ -5,9 +5,9 @@ module OneApm
|
|
5
5
|
class Agent
|
6
6
|
module StartWorkerThread
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
OA_MIN_ALLOWED_REPORT_PERIOD = 1.0
|
9
|
+
OA_UTILIZATION_REPORT_PERIOD = 30 * 60
|
10
|
+
OA_LOG_ONCE_KEYS_RESET_PERIOD = 60.0
|
11
11
|
|
12
12
|
def start_worker_thread(connection_options = {})
|
13
13
|
if disable = OneApm::Manager.config[:disable_harvest_thread]
|
@@ -44,14 +44,14 @@ module OneApm
|
|
44
44
|
|
45
45
|
@event_loop.fire_every(Manager.config[:data_report_period], :report_data)
|
46
46
|
@event_loop.fire_every(report_period_for(:analytic_event_data), :report_event_data)
|
47
|
-
@event_loop.fire_every(
|
47
|
+
@event_loop.fire_every(OA_LOG_ONCE_KEYS_RESET_PERIOD, :reset_log_once_keys)
|
48
48
|
@event_loop.fire_every(Manager.config[:data_report_period], :detect_config)
|
49
49
|
|
50
50
|
if OneApm::Manager.config[:collect_utilization] && !in_resque_child_process?
|
51
51
|
@event_loop.on(:report_utilization_data) { transmit_utilization_data }
|
52
52
|
|
53
53
|
@event_loop.fire(:report_utilization_data)
|
54
|
-
@event_loop.fire_every(
|
54
|
+
@event_loop.fire_every(OA_UTILIZATION_REPORT_PERIOD, :report_utilization_data)
|
55
55
|
end
|
56
56
|
|
57
57
|
@event_loop.run
|
@@ -68,9 +68,9 @@ module OneApm
|
|
68
68
|
period = OneApm::Manager.config[:data_report_period]
|
69
69
|
OneApm::Manager.logger.warn("Could not find configured period for #{method}, falling back to data_report_period (#{period} s)")
|
70
70
|
end
|
71
|
-
if period <
|
72
|
-
OneApm::Manager.logger.warn("Configured #{config_key} was #{period}, but minimum allowed is #{
|
73
|
-
period =
|
71
|
+
if period < OA_MIN_ALLOWED_REPORT_PERIOD
|
72
|
+
OneApm::Manager.logger.warn("Configured #{config_key} was #{period}, but minimum allowed is #{OA_MIN_ALLOWED_REPORT_PERIOD}, using #{OA_MIN_ALLOWED_REPORT_PERIOD}.")
|
73
|
+
period = OA_MIN_ALLOWED_REPORT_PERIOD
|
74
74
|
end
|
75
75
|
period
|
76
76
|
end
|
@@ -16,7 +16,7 @@ module OneApm
|
|
16
16
|
|
17
17
|
ONEAPM_ID_HEADER_KEY = 'HTTP_X_ONEAPM_ID'.freeze
|
18
18
|
ONEAPM_TXN_HEADER_KEY = 'HTTP_X_ONEAPM_TRANSACTION'.freeze
|
19
|
-
|
19
|
+
OA_CONTENT_LENGTH_HEADER_KEY = 'HTTP_CONTENT_LENGTH'.freeze
|
20
20
|
|
21
21
|
def on_finished_configuring(events)
|
22
22
|
register_event_listeners(events)
|
@@ -163,7 +163,7 @@ module OneApm
|
|
163
163
|
end
|
164
164
|
|
165
165
|
def content_length_from_request(request)
|
166
|
-
request[
|
166
|
+
request[OA_CONTENT_LENGTH_HEADER_KEY] || -1
|
167
167
|
end
|
168
168
|
|
169
169
|
def hash_transaction_name(identifier)
|
@@ -20,7 +20,7 @@ module OneApm
|
|
20
20
|
OA_SYNTHETICS_HEADER = 'X-OneApm-Synthetics'
|
21
21
|
|
22
22
|
# The index of the transaction GUID in the appdata header of responses
|
23
|
-
|
23
|
+
OA_APPDATA_TXN_GUID_INDEX = 5
|
24
24
|
|
25
25
|
|
26
26
|
###############
|
@@ -200,7 +200,7 @@ module OneApm
|
|
200
200
|
def add_cat_transaction_trace_parameters( response )
|
201
201
|
appdata = extract_appdata( response )
|
202
202
|
transaction_sampler.add_segment_parameters( \
|
203
|
-
:transaction_guid => appdata[
|
203
|
+
:transaction_guid => appdata[OA_APPDATA_TXN_GUID_INDEX] )
|
204
204
|
end
|
205
205
|
|
206
206
|
|
@@ -6,7 +6,7 @@ require 'one_apm/agent/database/obfuscator'
|
|
6
6
|
require 'one_apm/agent/database/postgres_explain_obfuscator'
|
7
7
|
|
8
8
|
module OneApm
|
9
|
-
|
9
|
+
OA_MYSQL_EXPLAIN_COLUMNS = [
|
10
10
|
"Id",
|
11
11
|
"Select Type",
|
12
12
|
"Table",
|
@@ -21,7 +21,7 @@ module OneApm
|
|
21
21
|
|
22
22
|
module Agent
|
23
23
|
module Database
|
24
|
-
|
24
|
+
OA_MAX_QUERY_LENGTH = 16384
|
25
25
|
|
26
26
|
extend self
|
27
27
|
|
@@ -30,8 +30,8 @@ module OneApm
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def truncate_query(query)
|
33
|
-
if query.length > (
|
34
|
-
query[0..
|
33
|
+
if query.length > (OA_MAX_QUERY_LENGTH - 4)
|
34
|
+
query[0..OA_MAX_QUERY_LENGTH - 4] + '...'
|
35
35
|
else
|
36
36
|
query
|
37
37
|
end
|
@@ -60,10 +60,10 @@ module OneApm
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
|
63
|
+
OA_RECORD_FOR = [:raw, :obfuscated].freeze
|
64
64
|
|
65
65
|
def should_record_sql?(config_section=:transaction_tracer)
|
66
|
-
|
66
|
+
OA_RECORD_FOR.include?(record_sql_method(config_section))
|
67
67
|
end
|
68
68
|
|
69
69
|
def should_collect_explain_plans?(config_section=:transaction_tracer)
|
@@ -94,7 +94,7 @@ module OneApm
|
|
94
94
|
return explain_plan || []
|
95
95
|
end
|
96
96
|
|
97
|
-
|
97
|
+
OA_SUPPORTED_ADAPTERS_FOR_EXPLAIN = %w[postgres postgresql mysql2 mysql sqlite].freeze
|
98
98
|
|
99
99
|
def explain_statement(statement, config, &explainer)
|
100
100
|
return unless is_select?(statement)
|
@@ -110,7 +110,7 @@ module OneApm
|
|
110
110
|
end
|
111
111
|
|
112
112
|
adapter = adapter_from_config(config)
|
113
|
-
if !
|
113
|
+
if !OA_SUPPORTED_ADAPTERS_FOR_EXPLAIN.include?(adapter)
|
114
114
|
OneApm::Manager.logger.debug("Not collecting explain plan because an unknown connection adapter ('#{adapter}') was used.")
|
115
115
|
return
|
116
116
|
end
|
@@ -136,14 +136,14 @@ module OneApm
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
-
|
139
|
+
OA_QUERY_PLAN = 'QUERY PLAN'.freeze
|
140
140
|
|
141
141
|
def process_explain_results_postgres(results)
|
142
142
|
if results.is_a?(String)
|
143
143
|
query_plan_string = results
|
144
144
|
else
|
145
145
|
lines = []
|
146
|
-
results.each { |row| lines << row[
|
146
|
+
results.each { |row| lines << row[OA_QUERY_PLAN] }
|
147
147
|
query_plan_string = lines.join("\n")
|
148
148
|
end
|
149
149
|
|
@@ -152,7 +152,7 @@ module OneApm
|
|
152
152
|
end
|
153
153
|
values = query_plan_string.split("\n").map { |line| [line] }
|
154
154
|
|
155
|
-
[[
|
155
|
+
[[OA_QUERY_PLAN], values]
|
156
156
|
end
|
157
157
|
|
158
158
|
def string_explain_plan_results(results)
|
@@ -185,11 +185,11 @@ module OneApm
|
|
185
185
|
[headers, values]
|
186
186
|
end
|
187
187
|
|
188
|
-
|
188
|
+
OA_SQLITE_EXPLAIN_COLUMNS = %w[addr opcode p1 p2 p3 p4 p5 comment]
|
189
189
|
|
190
190
|
def process_explain_results_sqlite(results)
|
191
191
|
return string_explain_plan_results(results) if results.is_a?(String)
|
192
|
-
headers =
|
192
|
+
headers = OA_SQLITE_EXPLAIN_COLUMNS
|
193
193
|
values = []
|
194
194
|
results.each do |row|
|
195
195
|
values << headers.map { |h| row[h] }
|
@@ -210,7 +210,7 @@ module OneApm
|
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
213
|
-
|
213
|
+
OA_KNOWN_OPERATIONS = [
|
214
214
|
'alter',
|
215
215
|
'select',
|
216
216
|
'update',
|
@@ -224,13 +224,13 @@ module OneApm
|
|
224
224
|
'call'
|
225
225
|
]
|
226
226
|
|
227
|
-
|
227
|
+
OA_SQL_COMMENT_REGEX = Regexp.new('/\*.*?\*/', Regexp::MULTILINE).freeze
|
228
228
|
|
229
229
|
def parse_operation_from_query(sql)
|
230
|
-
sql = sql.gsub(
|
230
|
+
sql = sql.gsub(OA_SQL_COMMENT_REGEX, '')
|
231
231
|
if sql =~ /(\w+)/
|
232
232
|
op = $1.downcase
|
233
|
-
return op if
|
233
|
+
return op if OA_KNOWN_OPERATIONS.include?(op)
|
234
234
|
end
|
235
235
|
end
|
236
236
|
|
@@ -19,56 +19,56 @@ module OneApm
|
|
19
19
|
# Reversing the query string before obfuscation allows us to get around
|
20
20
|
# the fact that a \' appearing within a string may or may not terminate
|
21
21
|
# the string, because we know that a string cannot *start* with a \'.
|
22
|
-
|
23
|
-
|
22
|
+
OA_REVERSE_SINGLE_QUOTES_REGEX = /'(?:''|'\\|[^'])*'/
|
23
|
+
OA_REVERSE_ANY_QUOTES_REGEX = /'(?:''|'\\|[^'])*'|"(?:""|"\\|[^"])*"/
|
24
24
|
|
25
|
-
|
25
|
+
OA_NUMERICS_REGEX = /\b\d+\b/
|
26
26
|
|
27
27
|
# We take a conservative, overly-aggressive approach to obfuscating
|
28
28
|
# comments, and drop everything from the query after encountering any
|
29
29
|
# character sequence that could be a comment initiator. We do this after
|
30
30
|
# removal of string literals to avoid accidentally over-obfuscating when
|
31
31
|
# a string literal contains a comment initiator.
|
32
|
-
|
32
|
+
OA_SQL_COMMENT_REGEX = Regexp.new('(?:/\*|--|#).*', Regexp::MULTILINE).freeze
|
33
33
|
|
34
34
|
# We use these to check whether the query contains any quote characters
|
35
35
|
# after obfuscation. If so, that's a good indication that the original
|
36
36
|
# query was malformed, and so our obfuscation can't reliabily find
|
37
37
|
# literals. In such a case, we'll replace the entire query with a
|
38
38
|
# placeholder.
|
39
|
-
|
40
|
-
|
39
|
+
OA_LITERAL_SINGLE_QUOTE = "'".freeze
|
40
|
+
OA_LITERAL_DOUBLE_QUOTE = '"'.freeze
|
41
41
|
|
42
|
-
|
42
|
+
OA_PLACEHOLDER = '?'.freeze
|
43
43
|
|
44
44
|
def obfuscate_single_quote_literals(sql)
|
45
45
|
obfuscated = sql.reverse
|
46
|
-
obfuscated.gsub!(
|
46
|
+
obfuscated.gsub!(OA_REVERSE_SINGLE_QUOTES_REGEX, OA_PLACEHOLDER)
|
47
47
|
obfuscated.reverse!
|
48
48
|
obfuscated
|
49
49
|
end
|
50
50
|
|
51
51
|
def obfuscate_quoted_literals(sql)
|
52
52
|
obfuscated = sql.reverse
|
53
|
-
obfuscated.gsub!(
|
53
|
+
obfuscated.gsub!(OA_REVERSE_ANY_QUOTES_REGEX, OA_PLACEHOLDER)
|
54
54
|
obfuscated.reverse!
|
55
55
|
obfuscated
|
56
56
|
end
|
57
57
|
|
58
58
|
def obfuscate_numeric_literals(sql)
|
59
|
-
sql.gsub(
|
59
|
+
sql.gsub(OA_NUMERICS_REGEX, OA_PLACEHOLDER)
|
60
60
|
end
|
61
61
|
|
62
62
|
def remove_comments(sql)
|
63
|
-
sql.gsub(
|
63
|
+
sql.gsub(OA_SQL_COMMENT_REGEX, OA_PLACEHOLDER)
|
64
64
|
end
|
65
65
|
|
66
66
|
def contains_single_quotes?(str)
|
67
|
-
str.include?(
|
67
|
+
str.include?(OA_LITERAL_SINGLE_QUOTE)
|
68
68
|
end
|
69
69
|
|
70
70
|
def contains_quotes?(str)
|
71
|
-
str.include?(
|
71
|
+
str.include?(OA_LITERAL_SINGLE_QUOTE) || str.include?(OA_LITERAL_DOUBLE_QUOTE)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
end
|
@@ -11,8 +11,8 @@ module OneApm
|
|
11
11
|
|
12
12
|
attr_reader :obfuscator
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
OA_QUERY_TOO_LARGE_MESSAGE = "Query too large (over 16k characters) to safely obfuscate"
|
15
|
+
OA_FAILED_TO_OBFUSCATE_MESSAGE = "Failed to obfuscate SQL query - quote characters remained after obfuscation"
|
16
16
|
|
17
17
|
def initialize
|
18
18
|
reset
|
@@ -47,7 +47,7 @@ module OneApm
|
|
47
47
|
|
48
48
|
def default_sql_obfuscator(sql)
|
49
49
|
if sql[-3,3] == '...'
|
50
|
-
return
|
50
|
+
return OA_QUERY_TOO_LARGE_MESSAGE
|
51
51
|
end
|
52
52
|
|
53
53
|
stmt = sql.kind_of?(Statement) ? sql : Statement.new(sql)
|
@@ -59,13 +59,13 @@ module OneApm
|
|
59
59
|
obfuscated = obfuscate_quoted_literals(obfuscated)
|
60
60
|
obfuscated = remove_comments(obfuscated)
|
61
61
|
if contains_quotes?(obfuscated)
|
62
|
-
obfuscated =
|
62
|
+
obfuscated = OA_FAILED_TO_OBFUSCATE_MESSAGE
|
63
63
|
end
|
64
64
|
else
|
65
65
|
obfuscated = obfuscate_single_quote_literals(obfuscated)
|
66
66
|
obfuscated = remove_comments(obfuscated)
|
67
67
|
if contains_single_quotes?(obfuscated)
|
68
|
-
obfuscated =
|
68
|
+
obfuscated = OA_FAILED_TO_OBFUSCATE_MESSAGE
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -12,8 +12,8 @@ module OneApm
|
|
12
12
|
# Note that this regex can't be shared with the ones in the
|
13
13
|
# Database::Obfuscator class because here we don't look for
|
14
14
|
# backslash-escaped strings (and those regexes are backwards).
|
15
|
-
|
16
|
-
|
15
|
+
OA_QUOTED_STRINGS_REGEX = /'(?:[^']|'')*'|"(?:[^"]|"")*"/
|
16
|
+
OA_LABEL_LINE_REGEX = /^([^:\n]*:\s+).*$/.freeze
|
17
17
|
|
18
18
|
def obfuscate(explain)
|
19
19
|
# First, we replace all single-quoted strings.
|
@@ -28,7 +28,7 @@ module OneApm
|
|
28
28
|
# Note also that we make no special provisions for backslash-escaped
|
29
29
|
# single quotes (\') because these are canonicalized to two single
|
30
30
|
# quotes ('') in the explain output.
|
31
|
-
explain.gsub!(
|
31
|
+
explain.gsub!(OA_QUOTED_STRINGS_REGEX) do |match|
|
32
32
|
match.start_with?('"') ? match : '?'
|
33
33
|
end
|
34
34
|
|
@@ -36,7 +36,7 @@ module OneApm
|
|
36
36
|
# All parts of the query that can appear in the explain output are
|
37
37
|
# prefixed with "<label>: ", so we want to preserve the label, but
|
38
38
|
# remove the rest of the line.
|
39
|
-
explain.gsub!(
|
39
|
+
explain.gsub!(OA_LABEL_LINE_REGEX, '\1?')
|
40
40
|
explain
|
41
41
|
end
|
42
42
|
end
|
@@ -4,15 +4,15 @@ module OneApm
|
|
4
4
|
module Agent
|
5
5
|
module Datastore
|
6
6
|
module MetricHelper
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
OA_ROLLUP_METRIC = "Datastore/all".freeze
|
8
|
+
OA_WEB_ROLLUP_METRIC = "Datastore/allWeb".freeze
|
9
|
+
OA_OTHER_ROLLUP_METRIC = "Datastore/allOther".freeze
|
10
|
+
OA_DEFAULT_PRODUCT_NAME = "ActiveRecord".freeze
|
11
|
+
OA_OTHER = "Other".freeze
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
OA_ALL = "all".freeze
|
14
|
+
OA_ALL_WEB = "allWeb".freeze
|
15
|
+
OA_ALL_OTHER = "allOther".freeze
|
16
16
|
|
17
17
|
def self.statement_metric_for(product, collection, operation)
|
18
18
|
"Datastore/statement/#{product}/#{collection}/#{operation}"
|
@@ -36,9 +36,9 @@ module OneApm
|
|
36
36
|
|
37
37
|
def self.all_suffix
|
38
38
|
if OneApm::Transaction.recording_web_transaction?
|
39
|
-
|
39
|
+
OA_ALL_WEB
|
40
40
|
else
|
41
|
-
|
41
|
+
OA_ALL_OTHER
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -56,7 +56,7 @@ module OneApm
|
|
56
56
|
product_suffixed_rollup(product, suffix),
|
57
57
|
product_rollup(product),
|
58
58
|
suffixed_rollup(suffix),
|
59
|
-
|
59
|
+
OA_ROLLUP_METRIC
|
60
60
|
]
|
61
61
|
|
62
62
|
metrics.unshift statement_metric_for(product, collection, operation) if collection
|
@@ -65,7 +65,7 @@ module OneApm
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def self.metrics_from_sql(product, sql)
|
68
|
-
operation = OneApm::Agent::Database.parse_operation_from_query(sql) ||
|
68
|
+
operation = OneApm::Agent::Database.parse_operation_from_query(sql) || OA_OTHER
|
69
69
|
metrics_for(product, operation)
|
70
70
|
end
|
71
71
|
|
@@ -8,9 +8,9 @@ module OneApm
|
|
8
8
|
module Mongo
|
9
9
|
module CommandFormatter
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
OA_OBFUSCATE_KEYS = [ 'filter', 'query', ].freeze
|
12
|
+
OA_BLACKLISTED_KEYS = [ 'deletes', 'documents', 'updates' ].freeze
|
13
|
+
OA_OBFUSCATE_NOSQL_KEYS = [ 'filter', 'query', 'deletes', 'documents', 'updates' ].freeze
|
14
14
|
|
15
15
|
|
16
16
|
def self.format(event, status)
|
@@ -24,8 +24,8 @@ module OneApm
|
|
24
24
|
}
|
25
25
|
|
26
26
|
event.command.each do |key, value|
|
27
|
-
next if
|
28
|
-
if
|
27
|
+
next if OA_BLACKLISTED_KEYS.include?(key)
|
28
|
+
if OA_OBFUSCATE_KEYS.include?(key)
|
29
29
|
obfuscated = obfuscate(value)
|
30
30
|
result[key] = obfuscated if obfuscated
|
31
31
|
else
|
@@ -40,7 +40,7 @@ module OneApm
|
|
40
40
|
header = "db.#{event.command.values.first}.#{event.command_name}"
|
41
41
|
obfuscate_sql = []
|
42
42
|
event.command.each do |key, value|
|
43
|
-
if
|
43
|
+
if OA_OBFUSCATE_NOSQL_KEYS.include?(key)
|
44
44
|
if value.is_a?(Array)
|
45
45
|
value.each do |val|
|
46
46
|
obfuscate_sql << "(#{obfuscate_json(val)})"
|
@@ -55,10 +55,10 @@ module OneApm
|
|
55
55
|
[]
|
56
56
|
end
|
57
57
|
|
58
|
-
|
58
|
+
OA_MONGO_PRODUCT_NAME = "MongoDB".freeze
|
59
59
|
|
60
60
|
def self.build_metrics(name, collection)
|
61
|
-
OneApm::Agent::Datastore::MetricHelper.metrics_for(
|
61
|
+
OneApm::Agent::Datastore::MetricHelper.metrics_for(OA_MONGO_PRODUCT_NAME,
|
62
62
|
name,
|
63
63
|
collection)
|
64
64
|
end
|
@@ -67,7 +67,7 @@ module OneApm
|
|
67
67
|
payload[:collection] == '$cmd' && payload[:selector]
|
68
68
|
end
|
69
69
|
|
70
|
-
|
70
|
+
OA_NAMES_IN_SELECTOR = [
|
71
71
|
:findandmodify,
|
72
72
|
|
73
73
|
"aggregate",
|
@@ -88,7 +88,7 @@ module OneApm
|
|
88
88
|
|
89
89
|
def self.command_key_from_selector(payload)
|
90
90
|
selector = payload[:selector]
|
91
|
-
|
91
|
+
OA_NAMES_IN_SELECTOR.find do |check_name|
|
92
92
|
selector.key?(check_name)
|
93
93
|
end
|
94
94
|
end
|
@@ -102,14 +102,14 @@ module OneApm
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
|
105
|
+
OA_CMD_COLLECTION = "$cmd".freeze
|
106
106
|
|
107
107
|
def self.get_collection_from_selector(command_key, payload)
|
108
108
|
if command_key
|
109
109
|
payload[:selector][command_key]
|
110
110
|
else
|
111
111
|
OneApm::Manager.increment_metric("Supportability/Mongo/UnknownCollection")
|
112
|
-
|
112
|
+
OA_CMD_COLLECTION
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|