sqreen 1.19.3-java → 1.20.0-java
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.md +5 -0
- data/lib/sqreen/aggregated_metric.rb +25 -0
- data/lib/sqreen/configuration.rb +7 -3
- data/lib/sqreen/deliveries/batch.rb +4 -1
- data/lib/sqreen/deliveries/simple.rb +4 -0
- data/lib/sqreen/event.rb +7 -5
- data/lib/sqreen/events/attack.rb +23 -18
- data/lib/sqreen/events/remote_exception.rb +0 -22
- data/lib/sqreen/events/request_record.rb +15 -70
- data/lib/sqreen/frameworks/request_recorder.rb +13 -2
- data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
- data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
- data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
- data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
- data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
- data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
- data/lib/sqreen/legacy/old_event_submission_strategy.rb +221 -0
- data/lib/sqreen/legacy/waf_redactions.rb +49 -0
- data/lib/sqreen/metrics/base.rb +3 -0
- data/lib/sqreen/metrics_store.rb +22 -12
- data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
- data/lib/sqreen/rules.rb +4 -2
- data/lib/sqreen/rules/rule_cb.rb +2 -0
- data/lib/sqreen/rules/waf_cb.rb +11 -8
- data/lib/sqreen/runner.rb +43 -5
- data/lib/sqreen/sensitive_data_redactor.rb +19 -31
- data/lib/sqreen/session.rb +39 -37
- data/lib/sqreen/signals/conversions.rb +283 -0
- data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
- data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
- data/lib/sqreen/version.rb +1 -1
- metadata +42 -5
- data/lib/sqreen/backport.rb +0 -9
- data/lib/sqreen/backport/clock_gettime.rb +0 -74
- data/lib/sqreen/backport/original_name.rb +0 -88
@@ -0,0 +1,49 @@
|
|
1
|
+
# typed: ignore
|
2
|
+
|
3
|
+
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
4
|
+
# Please refer to our terms for more information: https://www.sqreen.com/terms.html
|
5
|
+
|
6
|
+
module Sqreen
|
7
|
+
module Legacy
|
8
|
+
module WafRedactions
|
9
|
+
class << self
|
10
|
+
def redact_attacks!(attacks, values)
|
11
|
+
return attacks if values.empty?
|
12
|
+
|
13
|
+
values = values.map { |v| v.downcase if v.is_a?(String) }
|
14
|
+
|
15
|
+
attacks.each do |e|
|
16
|
+
next(e) unless e[:infos]
|
17
|
+
next(e) unless e[:infos][:waf_data]
|
18
|
+
|
19
|
+
parsed = JSON.parse(e[:infos][:waf_data])
|
20
|
+
redacted = parsed.each do |w|
|
21
|
+
next unless (filters = w['filter'])
|
22
|
+
|
23
|
+
filters.each do |f|
|
24
|
+
next unless (v = f['resolved_value'])
|
25
|
+
next unless values.include?(v.downcase)
|
26
|
+
|
27
|
+
f['match_status'] = SensitiveDataRedactor::MASK
|
28
|
+
f['resolved_value'] = SensitiveDataRedactor::MASK
|
29
|
+
end
|
30
|
+
end
|
31
|
+
e[:infos][:waf_data] = JSON.dump(redacted)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# see https://github.com/sqreen/TechDoc/blob/master/content/specs/spec000022-waf-data-sanitization.md#changes-to-the-agents
|
36
|
+
def redact_exceptions!(exceptions, values)
|
37
|
+
return exceptions if values.empty?
|
38
|
+
|
39
|
+
exceptions.each do |e|
|
40
|
+
next(e) unless e[:infos]
|
41
|
+
next(e) unless e[:infos][:waf]
|
42
|
+
|
43
|
+
e[:infos][:waf].delete(:args)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/sqreen/metrics/base.rb
CHANGED
data/lib/sqreen/metrics_store.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
4
4
|
# Please refer to our terms for more information: https://www.sqreen.com/terms.html
|
5
5
|
|
6
|
+
require 'sqreen/aggregated_metric'
|
6
7
|
require 'sqreen/metrics'
|
7
8
|
require 'sqreen/mono_time'
|
8
9
|
require 'sqreen/metrics_store/unknown_metric'
|
@@ -30,8 +31,9 @@ module Sqreen
|
|
30
31
|
|
31
32
|
# Definition contains a name,period and aggregate at least
|
32
33
|
# @param definition [Hash] a metric definition
|
34
|
+
# @param rule [RuleCB] the rule associated with this metric, if any
|
33
35
|
# @param mklass [Object] Override metric object (used in testing)
|
34
|
-
def create_metric(definition, mklass = nil)
|
36
|
+
def create_metric(definition, rule = nil, mklass = nil)
|
35
37
|
name = definition[NAME_KEY]
|
36
38
|
kind = definition[KIND_KEY]
|
37
39
|
klass = valid_metric(kind, name)
|
@@ -43,6 +45,9 @@ module Sqreen
|
|
43
45
|
definition[PERIOD_KEY],
|
44
46
|
nil # Start
|
45
47
|
]
|
48
|
+
metric.name = name
|
49
|
+
metric.rule = rule
|
50
|
+
metric.period = definition[PERIOD_KEY]
|
46
51
|
metric
|
47
52
|
end
|
48
53
|
|
@@ -50,7 +55,7 @@ module Sqreen
|
|
50
55
|
@metrics.key?(name)
|
51
56
|
end
|
52
57
|
|
53
|
-
# @
|
58
|
+
# @param at [Time] when is the store emptied
|
54
59
|
def update(name, at, key, value)
|
55
60
|
metric, period, start = @metrics[name]
|
56
61
|
raise UnregisteredMetric, "Unknown metric #{name}" unless metric
|
@@ -59,7 +64,7 @@ module Sqreen
|
|
59
64
|
end
|
60
65
|
|
61
66
|
# Drains every metrics and returns the store content
|
62
|
-
# @
|
67
|
+
# @param at [Time] when is the store emptied
|
63
68
|
def publish(flush = true, at = Sqreen.time)
|
64
69
|
@metrics.each do |name, (_, period, start)|
|
65
70
|
next_sample(name, at) if flush || !start.nil? && (start + period) < at
|
@@ -75,15 +80,20 @@ module Sqreen
|
|
75
80
|
metric = @metrics[name][0]
|
76
81
|
r = metric.next_sample(at)
|
77
82
|
@metrics[name][2] = at # new start
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
83
|
+
return unless r
|
84
|
+
|
85
|
+
r[NAME_KEY] = name
|
86
|
+
obs = r[Metric::OBSERVATION_KEY]
|
87
|
+
return unless obs && (!obs.respond_to?(:empty?) || !obs.empty?)
|
88
|
+
start_of_mono = Time.now.utc - Sqreen.time
|
89
|
+
|
90
|
+
agg = AggregatedMetric.new
|
91
|
+
agg.metric = metric
|
92
|
+
agg.rule = agg.metric.rule
|
93
|
+
agg.start = start_of_mono + r[Metric::START_KEY]
|
94
|
+
agg.finish = start_of_mono + r[Metric::FINISH_KEY]
|
95
|
+
agg.data = obs
|
96
|
+
@store << agg
|
87
97
|
end
|
88
98
|
|
89
99
|
def valid_metric(kind, name)
|
@@ -122,10 +122,16 @@ module Sqreen
|
|
122
122
|
attr_reader :metrics_store
|
123
123
|
attr_reader :period
|
124
124
|
|
125
|
-
def ensure_metric(metric_name)
|
125
|
+
def ensure_metric(metric_name, rule = nil)
|
126
126
|
return if metrics_store.metric?(metric_name)
|
127
127
|
metrics_store.create_metric(
|
128
|
-
|
128
|
+
{
|
129
|
+
'name' => metric_name,
|
130
|
+
'period' => period,
|
131
|
+
'kind' => 'Binning',
|
132
|
+
'options' => @perf_metric_opts,
|
133
|
+
},
|
134
|
+
rule
|
129
135
|
)
|
130
136
|
end
|
131
137
|
|
data/lib/sqreen/rules.rb
CHANGED
@@ -135,13 +135,15 @@ module Sqreen
|
|
135
135
|
return nil
|
136
136
|
end
|
137
137
|
|
138
|
+
rule_cb = cb_class.new(instr_class, instr_method, hash_rule)
|
139
|
+
|
138
140
|
if metrics_store
|
139
141
|
(hash_rule[Attrs::METRICS] || []).each do |metric|
|
140
|
-
metrics_store.create_metric(metric)
|
142
|
+
metrics_store.create_metric(metric, rule_cb)
|
141
143
|
end
|
142
144
|
end
|
143
145
|
|
144
|
-
|
146
|
+
rule_cb
|
145
147
|
rescue => e
|
146
148
|
rule_name = nil
|
147
149
|
rulespack_id = nil
|
data/lib/sqreen/rules/rule_cb.rb
CHANGED
@@ -61,7 +61,9 @@ module Sqreen
|
|
61
61
|
:infos => infos,
|
62
62
|
:rulespack_id => rulespack_id,
|
63
63
|
:rule_name => rule_name,
|
64
|
+
:attack_type => @rule['attack_type'], # for signal
|
64
65
|
:test => test,
|
66
|
+
:block => @rule['block'], # for signal
|
65
67
|
:time => at,
|
66
68
|
}
|
67
69
|
if payload_tpl.include?('context')
|
data/lib/sqreen/rules/waf_cb.rb
CHANGED
@@ -132,20 +132,23 @@ module Sqreen
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def record_exception(exception, infos = {}, at = Time.now.utc)
|
135
|
-
infos.merge!(
|
135
|
+
infos.merge!(waf_infos(exception)) if exception.is_a?(Sqreen::WAFError)
|
136
136
|
super(exception, infos, at)
|
137
137
|
end
|
138
138
|
|
139
139
|
private
|
140
140
|
|
141
|
-
|
141
|
+
# see https://github.com/sqreen/TechDoc/blob/master/content/specs/spec000016-waf-integration.md#error-management
|
142
|
+
def waf_infos(e)
|
142
143
|
{
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
144
|
+
waf: {
|
145
|
+
waf_rule: e.rule_name,
|
146
|
+
error_code: ERROR_CODES[e.error],
|
147
|
+
}.tap do |r|
|
148
|
+
r[:error_data] = e.data if e.data
|
149
|
+
r[:args] = e.args if e.arg
|
150
|
+
end,
|
151
|
+
}
|
149
152
|
end
|
150
153
|
|
151
154
|
ERROR_CODES = {
|
data/lib/sqreen/runner.rb
CHANGED
@@ -23,6 +23,7 @@ require 'sqreen/performance_notifications/binned_metrics'
|
|
23
23
|
require 'sqreen/legacy/instrumentation'
|
24
24
|
require 'sqreen/call_countable'
|
25
25
|
require 'sqreen/weave/legacy/instrumentation'
|
26
|
+
require 'sqreen/kit/configuration'
|
26
27
|
|
27
28
|
module Sqreen
|
28
29
|
@features = {}
|
@@ -37,6 +38,8 @@ module Sqreen
|
|
37
38
|
PERF_METRICS_PERIOD = 60 # 1 min
|
38
39
|
DEFAULT_PERF_LEVEL = 0 # disabled
|
39
40
|
|
41
|
+
DEFAULT_USE_SIGNALS = false
|
42
|
+
|
40
43
|
class << self
|
41
44
|
attr_reader :features
|
42
45
|
def update_features(features)
|
@@ -87,7 +90,9 @@ module Sqreen
|
|
87
90
|
|
88
91
|
attr_accessor :heartbeat_delay
|
89
92
|
attr_accessor :metrics_engine
|
93
|
+
# @return [Sqreen::Deliveries::Simple]
|
90
94
|
attr_reader :deliverer
|
95
|
+
# @return [Sqreen::Session]
|
91
96
|
attr_reader :session
|
92
97
|
attr_reader :instrumenter
|
93
98
|
attr_accessor :running
|
@@ -111,12 +116,17 @@ module Sqreen
|
|
111
116
|
@token = @configuration.get(:token)
|
112
117
|
@app_name = @configuration.get(:app_name)
|
113
118
|
@url = @configuration.get(:url)
|
119
|
+
@proxy_url = @configuration.get(:proxy_url)
|
114
120
|
Sqreen.update_whitelisted_paths([])
|
115
121
|
Sqreen.update_whitelisted_ips({})
|
116
122
|
Sqreen.update_performance_budget(nil)
|
117
123
|
raise(Sqreen::Exception, 'no url found') unless @url
|
118
124
|
raise(Sqreen::TokenNotFoundException, 'no token found') unless @token
|
119
125
|
|
126
|
+
Sqreen::Kit::Configuration.logger = Sqreen.log
|
127
|
+
Sqreen::Kit::Configuration.ingestion_url = @configuration.get(:ingestion_url)
|
128
|
+
Sqreen::Kit::Configuration.proxy_url = @configuration.get(:proxy_url)
|
129
|
+
|
120
130
|
register_exit_cb if set_at_exit
|
121
131
|
|
122
132
|
self.metrics_engine = MetricsStore.new
|
@@ -142,7 +152,7 @@ module Sqreen
|
|
142
152
|
Sqreen.log.debug do
|
143
153
|
"Override initial features with #{conf_features.inspect}"
|
144
154
|
end
|
145
|
-
wanted_features = conf_features
|
155
|
+
wanted_features = wanted_features.merge(conf_features)
|
146
156
|
rescue
|
147
157
|
Sqreen.log.warn do
|
148
158
|
"NOT using invalid inital features #{conf_initial_features}"
|
@@ -161,7 +171,7 @@ module Sqreen
|
|
161
171
|
end
|
162
172
|
|
163
173
|
def create_session(session_class)
|
164
|
-
@session = session_class.new(@url, @token, @app_name)
|
174
|
+
@session = session_class.new(@url, @token, @app_name, @proxy_url)
|
165
175
|
session.login(@framework)
|
166
176
|
end
|
167
177
|
|
@@ -170,8 +180,18 @@ module Sqreen
|
|
170
180
|
@deliverer = new_deliverer
|
171
181
|
end
|
172
182
|
|
173
|
-
def batch_events(batch_size, max_staleness = nil)
|
183
|
+
def batch_events(batch_size, max_staleness = nil, use_signals = false)
|
174
184
|
size = batch_size.to_i
|
185
|
+
|
186
|
+
if size <= 1 && use_signals
|
187
|
+
Sqreen.log.warn do
|
188
|
+
"Using signals with no delivery batching is unsupported. " \
|
189
|
+
"Using instead batching with batch size = 30, max_staleness = 60"
|
190
|
+
end
|
191
|
+
size = 30
|
192
|
+
max_staleness = 60
|
193
|
+
end
|
194
|
+
|
175
195
|
self.deliverer = if size < 1
|
176
196
|
Deliveries::Simple.new(session)
|
177
197
|
else
|
@@ -301,19 +321,37 @@ module Sqreen
|
|
301
321
|
def do_heartbeat
|
302
322
|
@last_heartbeat_request = Time.now
|
303
323
|
@next_metrics.concat(metrics_engine.publish(false)) if metrics_engine
|
304
|
-
|
324
|
+
metrics_in_hb = use_signals? ? nil : next_metrics
|
325
|
+
|
326
|
+
res = session.heartbeat(next_command_results, metrics_in_hb)
|
305
327
|
next_command_results.clear
|
328
|
+
|
329
|
+
deliver_metrics_as_event if use_signals?
|
306
330
|
next_metrics.clear
|
331
|
+
|
307
332
|
process_commands(res['commands'])
|
308
333
|
end
|
309
334
|
|
335
|
+
def deliver_metrics_as_event
|
336
|
+
# this is disastrous withe simple delivery strategy,
|
337
|
+
# as each aggregated metric would trigger an http request
|
338
|
+
# Sending of metrics is therefore not supported with simple delivery strategy
|
339
|
+
# TODO: Confirm that only batch is used in production
|
340
|
+
next_metrics.each { |x| deliverer.post_event(x) }
|
341
|
+
end
|
342
|
+
|
310
343
|
def features(_context_infos = {})
|
311
344
|
Sqreen.features
|
312
345
|
end
|
313
346
|
|
347
|
+
def use_signals?
|
348
|
+
features.fetch('use_signals', DEFAULT_USE_SIGNALS)
|
349
|
+
end
|
350
|
+
|
314
351
|
def features=(features)
|
315
352
|
Sqreen.update_features(features)
|
316
353
|
session.request_compression = features['request_compression'] if session
|
354
|
+
session.use_signals = use_signals?
|
317
355
|
self.performance_metrics_period = features['performance_metrics_period']
|
318
356
|
|
319
357
|
unless @configuration.get(:weave)
|
@@ -331,7 +369,7 @@ module Sqreen
|
|
331
369
|
hd = features['heartbeat_delay'].to_i
|
332
370
|
self.heartbeat_delay = hd if hd > 0
|
333
371
|
return if features['batch_size'].nil?
|
334
|
-
batch_events(features['batch_size'], features['max_staleness'])
|
372
|
+
batch_events(features['batch_size'], features['max_staleness'], use_signals?)
|
335
373
|
end
|
336
374
|
|
337
375
|
def change_whitelisted_paths(paths, _context_infos = {})
|
@@ -61,7 +61,7 @@ module Sqreen
|
|
61
61
|
obj.each do |k, v|
|
62
62
|
ck = k.is_a?(String) ? k.downcase : k
|
63
63
|
if @keys.include?(ck)
|
64
|
-
redacted
|
64
|
+
redacted += SensitiveDataRedactor.all_strings(v)
|
65
65
|
v = MASK
|
66
66
|
else
|
67
67
|
v, r = redact(v)
|
@@ -74,39 +74,27 @@ module Sqreen
|
|
74
74
|
[result, redacted]
|
75
75
|
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
next(e) unless e[:infos]
|
84
|
-
next(e) unless e[:infos][:waf_data]
|
85
|
-
|
86
|
-
parsed = JSON.parse(e[:infos][:waf_data])
|
87
|
-
redacted = parsed.each do |w|
|
88
|
-
next unless (filters = w['filter'])
|
89
|
-
|
90
|
-
filters.each do |f|
|
91
|
-
next unless (v = f['resolved_value'])
|
92
|
-
next unless values.include?(v.downcase)
|
77
|
+
class << self
|
78
|
+
def all_strings(v)
|
79
|
+
accum = []
|
80
|
+
all_strings_impl(v, accum)
|
81
|
+
accum
|
82
|
+
end
|
93
83
|
|
94
|
-
|
95
|
-
|
84
|
+
private
|
85
|
+
|
86
|
+
def all_strings_impl(obj, accum)
|
87
|
+
case obj
|
88
|
+
when String
|
89
|
+
accum << obj
|
90
|
+
when Array
|
91
|
+
obj.each { |el| all_strings_impl(el, accum) }
|
92
|
+
when Hash
|
93
|
+
obj.each do |k, v|
|
94
|
+
all_strings_impl(k, accum)
|
95
|
+
all_strings_impl(v, accum)
|
96
96
|
end
|
97
97
|
end
|
98
|
-
e[:infos][:waf_data] = JSON.dump(redacted)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def redact_exceptions!(exceptions, values)
|
103
|
-
return exceptions if values.empty?
|
104
|
-
|
105
|
-
exceptions.each do |e|
|
106
|
-
next(e) unless e[:infos]
|
107
|
-
next(e) unless e[:infos][:waf]
|
108
|
-
|
109
|
-
e[:infos][:waf].delete(:args)
|
110
98
|
end
|
111
99
|
end
|
112
100
|
end
|
data/lib/sqreen/session.rb
CHANGED
@@ -11,6 +11,10 @@ require 'sqreen/events/attack'
|
|
11
11
|
require 'sqreen/events/request_record'
|
12
12
|
require 'sqreen/exception'
|
13
13
|
require 'sqreen/safe_json'
|
14
|
+
require 'sqreen/kit'
|
15
|
+
require 'sqreen/kit/configuration'
|
16
|
+
require 'sqreen/signals/signals_submission_strategy'
|
17
|
+
require 'sqreen/legacy/old_event_submission_strategy'
|
14
18
|
|
15
19
|
require 'net/https'
|
16
20
|
require 'uri'
|
@@ -41,13 +45,12 @@ module Sqreen
|
|
41
45
|
RETRY_MANY = 301
|
42
46
|
|
43
47
|
MUTEX = Mutex.new
|
44
|
-
METRICS_KEY = 'metrics'.freeze
|
45
48
|
|
46
49
|
@@path_prefix = '/sqreen/v0/'
|
47
50
|
|
48
51
|
attr_accessor :request_compression
|
49
52
|
|
50
|
-
def initialize(server_url, token, app_name = nil)
|
53
|
+
def initialize(server_url, token, app_name = nil, proxy_url = nil)
|
51
54
|
@token = token
|
52
55
|
@app_name = app_name
|
53
56
|
@session_id = nil
|
@@ -59,16 +62,35 @@ module Sqreen
|
|
59
62
|
uri = parse_uri(server_url)
|
60
63
|
use_ssl = (uri.scheme == 'https')
|
61
64
|
|
65
|
+
proxy_params = []
|
66
|
+
if proxy_url
|
67
|
+
proxy_uri = parse_uri(proxy_url)
|
68
|
+
proxy_params = [proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password]
|
69
|
+
end
|
70
|
+
|
62
71
|
@req_nb = 0
|
63
72
|
|
64
|
-
@http = Net::HTTP.new(uri.host, uri.port)
|
73
|
+
@http = Net::HTTP.new(uri.host, uri.port, *proxy_params)
|
65
74
|
@http.use_ssl = use_ssl
|
75
|
+
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE if ENV['SQREEN_SSL_NO_VERIFY'] # for testing
|
66
76
|
if use_ssl
|
67
77
|
cert_file = File.join(File.dirname(__FILE__), 'ca.crt')
|
68
78
|
cert_store = OpenSSL::X509::Store.new
|
69
79
|
cert_store.add_file cert_file
|
70
80
|
@http.cert_store = cert_store
|
71
81
|
end
|
82
|
+
self.use_signals = false
|
83
|
+
end
|
84
|
+
|
85
|
+
def use_signals=(do_use)
|
86
|
+
return if do_use == @use_signals
|
87
|
+
|
88
|
+
@use_signals = do_use
|
89
|
+
if do_use
|
90
|
+
@evt_sub_strategy = Sqreen::Signals::SignalsSubmissionStrategy.new
|
91
|
+
else
|
92
|
+
@evt_sub_strategy = Sqreen::Legacy::OldEventSubmissionStrategy.new(method(:post))
|
93
|
+
end
|
72
94
|
end
|
73
95
|
|
74
96
|
def parse_uri(uri)
|
@@ -235,6 +257,8 @@ module Sqreen
|
|
235
257
|
end
|
236
258
|
Sqreen.log.info 'Login success.'
|
237
259
|
@session_id = res['session_id']
|
260
|
+
Kit::Configuration.session_key = @session_id
|
261
|
+
Kit.reset
|
238
262
|
Sqreen.log.debug { "received session_id #{@session_id}" }
|
239
263
|
Sqreen.logged_in = true
|
240
264
|
res
|
@@ -246,20 +270,24 @@ module Sqreen
|
|
246
270
|
|
247
271
|
def heartbeat(cmd_res = {}, metrics = [])
|
248
272
|
payload = {}
|
249
|
-
|
273
|
+
unless metrics.nil? || metrics.empty?
|
274
|
+
# never reached with signals
|
275
|
+
payload['metrics'] = metrics.map do |m|
|
276
|
+
Sqreen::Legacy::EventToHash.convert_agg_metric(m)
|
277
|
+
end
|
278
|
+
end
|
250
279
|
payload['command_results'] = cmd_res unless cmd_res.nil? || cmd_res.empty?
|
251
280
|
|
252
281
|
post('app-beat', payload.empty? ? nil : payload, {}, RETRY_MANY)
|
253
282
|
end
|
254
283
|
|
255
284
|
def post_metrics(metrics)
|
256
|
-
|
257
|
-
payload = { METRICS_KEY => metrics }
|
258
|
-
post(METRICS_KEY, payload, {}, RETRY_MANY)
|
285
|
+
@evt_sub_strategy.post_metrics(metrics)
|
259
286
|
end
|
260
287
|
|
288
|
+
# XXX never called
|
261
289
|
def post_attack(attack)
|
262
|
-
|
290
|
+
@evt_sub_strategy.post_attack(attack)
|
263
291
|
end
|
264
292
|
|
265
293
|
def post_bundle(bundle_sig, dependencies)
|
@@ -271,33 +299,17 @@ module Sqreen
|
|
271
299
|
end
|
272
300
|
|
273
301
|
def post_request_record(request_record)
|
274
|
-
|
302
|
+
@evt_sub_strategy.post_request_record(request_record)
|
275
303
|
end
|
276
304
|
|
277
305
|
# Post an exception to Sqreen for analysis
|
278
306
|
# @param exception [RemoteException] Exception and context to be sent over
|
279
307
|
def post_sqreen_exception(exception)
|
280
|
-
|
281
|
-
rescue StandardError => e
|
282
|
-
Sqreen.log.warn(format('Could not post exception (network down? %s) %s',
|
283
|
-
e.inspect,
|
284
|
-
exception.to_hash.inspect))
|
285
|
-
nil
|
308
|
+
@evt_sub_strategy.post_sqreen_exception(exception)
|
286
309
|
end
|
287
310
|
|
288
|
-
BATCH_KEY = 'batch'.freeze
|
289
|
-
EVENT_TYPE_KEY = 'event_type'.freeze
|
290
311
|
def post_batch(events)
|
291
|
-
|
292
|
-
h = event.to_hash
|
293
|
-
h[EVENT_TYPE_KEY] = event_kind(event)
|
294
|
-
h
|
295
|
-
end
|
296
|
-
Sqreen.log.debug do
|
297
|
-
tally = Hash[events.group_by(&:class).map{ |k,v| [k, v.count] }]
|
298
|
-
"Doing batch with the following tally of event types: #{tally}"
|
299
|
-
end
|
300
|
-
post(BATCH_KEY, { BATCH_KEY => batch }, {}, RETRY_MANY)
|
312
|
+
@evt_sub_strategy.post_batch(events)
|
301
313
|
end
|
302
314
|
|
303
315
|
# Perform agent logout
|
@@ -313,15 +325,5 @@ module Sqreen
|
|
313
325
|
Sqreen.logged_in = false
|
314
326
|
disconnect
|
315
327
|
end
|
316
|
-
|
317
|
-
protected
|
318
|
-
|
319
|
-
def event_kind(event)
|
320
|
-
case event
|
321
|
-
when Sqreen::RemoteException then 'sqreen_exception'
|
322
|
-
when Sqreen::Attack then 'attack'
|
323
|
-
when Sqreen::RequestRecord then 'request_record'
|
324
|
-
end
|
325
|
-
end
|
326
328
|
end
|
327
329
|
end
|