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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/lib/sqreen/aggregated_metric.rb +25 -0
  4. data/lib/sqreen/configuration.rb +7 -3
  5. data/lib/sqreen/deliveries/batch.rb +4 -1
  6. data/lib/sqreen/deliveries/simple.rb +4 -0
  7. data/lib/sqreen/event.rb +7 -5
  8. data/lib/sqreen/events/attack.rb +23 -18
  9. data/lib/sqreen/events/remote_exception.rb +0 -22
  10. data/lib/sqreen/events/request_record.rb +15 -70
  11. data/lib/sqreen/frameworks/request_recorder.rb +13 -2
  12. data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
  13. data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
  14. data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
  15. data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
  16. data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
  17. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
  18. data/lib/sqreen/legacy/old_event_submission_strategy.rb +221 -0
  19. data/lib/sqreen/legacy/waf_redactions.rb +49 -0
  20. data/lib/sqreen/metrics/base.rb +3 -0
  21. data/lib/sqreen/metrics_store.rb +22 -12
  22. data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
  23. data/lib/sqreen/rules.rb +4 -2
  24. data/lib/sqreen/rules/rule_cb.rb +2 -0
  25. data/lib/sqreen/rules/waf_cb.rb +11 -8
  26. data/lib/sqreen/runner.rb +43 -5
  27. data/lib/sqreen/sensitive_data_redactor.rb +19 -31
  28. data/lib/sqreen/session.rb +39 -37
  29. data/lib/sqreen/signals/conversions.rb +283 -0
  30. data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
  31. data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
  32. data/lib/sqreen/version.rb +1 -1
  33. metadata +42 -5
  34. data/lib/sqreen/backport.rb +0 -9
  35. data/lib/sqreen/backport/clock_gettime.rb +0 -74
  36. 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
@@ -12,6 +12,9 @@ module Sqreen
12
12
  FINISH_KEY = 'finish'.freeze
13
13
  # Base interface for a metric
14
14
  class Base
15
+ attr_accessor :name, :period # for signals serialization
16
+ attr_accessor :rule # optional
17
+
15
18
  def initialize(_opts={})
16
19
  @sample = nil
17
20
  end
@@ -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
- # @params at [Time] when is the store emptied
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
- # @params at [Time] when is the store emptied
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
- if r
79
- r[NAME_KEY] = name
80
- obs = r[Metric::OBSERVATION_KEY]
81
- start_of_mono = Time.now.utc - Sqreen.time
82
- r[Metric::START_KEY] = start_of_mono + r[Metric::START_KEY]
83
- r[Metric::FINISH_KEY] = start_of_mono + r[Metric::FINISH_KEY]
84
- @store << r if obs && (!obs.respond_to?(:empty?) || !obs.empty?)
85
- end
86
- r
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
- 'name' => metric_name, 'period' => period, 'kind' => 'Binning', 'options' => @perf_metric_opts
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
 
@@ -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
- cb_class.new(instr_class, instr_method, hash_rule)
146
+ rule_cb
145
147
  rescue => e
146
148
  rule_name = nil
147
149
  rulespack_id = nil
@@ -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')
@@ -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!(exception_to_infos(exception)) if exception.is_a?(Sqreen::WAFError)
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
- def exception_to_infos(e)
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
- waf_rule: e.rule_name,
144
- error_code: ERROR_CODES[e.error],
145
- }.tap do |r|
146
- r[:error_data] = e.data if e.data
147
- r[:args] = e.args if e.args
148
- end
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 = {
@@ -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
- res = session.heartbeat(next_command_results, next_metrics)
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 << v
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
- def redact_attacks!(attacks, values)
78
- return attacks if values.empty?
79
-
80
- values = values.map { |v| v.downcase if v.is_a?(String) }
81
-
82
- attacks.each do |e|
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
- f['match_status'] = MASK
95
- f['resolved_value'] = MASK
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
@@ -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
- payload['metrics'] = metrics unless metrics.nil? || metrics.empty?
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
- return if metrics.nil? || metrics.empty?
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
- post('attack', attack.to_hash, {}, RETRY_MANY)
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
- post('request_record', request_record.to_hash, {}, RETRY_MANY)
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
- post('sqreen_exception', exception.to_hash, {}, 5)
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
- batch = events.map do |event|
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