sqreen 1.21.0.beta3-java → 1.21.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 +28 -15
- data/lib/sqreen/condition_evaluator.rb +5 -6
- data/lib/sqreen/conditionable.rb +6 -24
- data/lib/sqreen/ecosystem.rb +29 -2
- data/lib/sqreen/ecosystem/databases/database_connection_data.rb +23 -0
- data/lib/sqreen/ecosystem/databases/mongo.rb +39 -0
- data/lib/sqreen/ecosystem/databases/mysql.rb +54 -0
- data/lib/sqreen/ecosystem/databases/postgres.rb +51 -0
- data/lib/sqreen/ecosystem/databases/redis.rb +36 -0
- data/lib/sqreen/ecosystem/exception_reporting.rb +4 -2
- data/lib/sqreen/ecosystem/messaging/bunny.rb +61 -0
- data/lib/sqreen/ecosystem/messaging/kafka.rb +70 -0
- data/lib/sqreen/ecosystem/messaging/kinesis.rb +66 -0
- data/lib/sqreen/ecosystem/messaging/sqs.rb +68 -0
- data/lib/sqreen/ecosystem/module_api/message_producer.rb +9 -3
- data/lib/sqreen/ecosystem/module_api/tracing/consumer_data.rb +13 -0
- data/lib/sqreen/ecosystem/module_api/tracing/messaging_data.rb +35 -0
- data/lib/sqreen/ecosystem/module_api/tracing/producer_data.rb +13 -0
- data/lib/sqreen/ecosystem/module_registry.rb +5 -1
- data/lib/sqreen/ecosystem/tracing/modules/client.rb +7 -3
- data/lib/sqreen/ecosystem/tracing/modules/consumer.rb +35 -0
- data/lib/sqreen/ecosystem/tracing/modules/determine_ip.rb +28 -0
- data/lib/sqreen/ecosystem/tracing/modules/producer.rb +35 -0
- data/lib/sqreen/ecosystem/tracing/signals/tracing_consumer.rb +56 -0
- data/lib/sqreen/ecosystem/tracing/signals/tracing_producer.rb +56 -0
- data/lib/sqreen/ecosystem_integration.rb +1 -7
- data/lib/sqreen/ecosystem_integration/around_callbacks.rb +10 -20
- data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +4 -8
- data/lib/sqreen/graft/call.rb +1 -21
- data/lib/sqreen/graft/hook.rb +75 -83
- data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +2 -0
- data/lib/sqreen/metrics.rb +0 -1
- data/lib/sqreen/rules/custom_error_cb.rb +1 -1
- data/lib/sqreen/rules/rule_cb.rb +2 -2
- data/lib/sqreen/runner.rb +12 -27
- data/lib/sqreen/version.rb +1 -1
- data/lib/sqreen/weave/budget.rb +14 -3
- data/lib/sqreen/weave/legacy/instrumentation.rb +94 -145
- metadata +22 -9
- data/lib/sqreen/ecosystem/redis/redis_connection.rb +0 -43
- data/lib/sqreen/metrics/req_detailed.rb +0 -41
@@ -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/kit/configuration'
|
6
7
|
require 'sqreen/kit/signals/point'
|
7
8
|
require 'sqreen/kit/signals/dto_helper'
|
8
9
|
|
@@ -38,6 +39,7 @@ class Sqreen::Kit::Signals::Specialized::SqreenException < Sqreen::Kit::Signals:
|
|
38
39
|
self.payload_schema = PAYLOAD_SCHEMA_VERSION
|
39
40
|
self.signal_name = 'sq.agent.exception'
|
40
41
|
self.time = values[:time] || Time.now
|
42
|
+
self.source = values[:source] || Sqreen::Kit::Configuration.default_source
|
41
43
|
super
|
42
44
|
end
|
43
45
|
|
data/lib/sqreen/metrics.rb
CHANGED
@@ -55,7 +55,7 @@ module Sqreen
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def respond_page
|
58
|
-
@page ||= File.
|
58
|
+
@page ||= File.open(File.join(File.dirname(__FILE__), '../attack_detected.html'), 'rb', &:read)
|
59
59
|
headers = {
|
60
60
|
'Content-Type' => 'text/html',
|
61
61
|
'Content-Length' => @page.size.to_s,
|
data/lib/sqreen/rules/rule_cb.rb
CHANGED
@@ -90,9 +90,9 @@ module Sqreen
|
|
90
90
|
framework.observe(:sqreen_exceptions, payload)
|
91
91
|
end
|
92
92
|
|
93
|
-
# Recommend taking an action (
|
93
|
+
# Recommend taking an action (optionnally adding more data/context)
|
94
94
|
#
|
95
|
-
# This will format the requested action and
|
95
|
+
# This will format the requested action and optionnally
|
96
96
|
# override it if it should not be taken (should not block for example)
|
97
97
|
def advise_action(action, additional_data = {})
|
98
98
|
return if action.nil? && additional_data.empty?
|
data/lib/sqreen/runner.rb
CHANGED
@@ -141,12 +141,7 @@ module Sqreen
|
|
141
141
|
end
|
142
142
|
|
143
143
|
if @configuration.get(:weave) || needs_weave.call
|
144
|
-
|
145
|
-
opts = {
|
146
|
-
perf_req_metrics_max_reqs: Sqreen.features['perf_req_metrics_max_reqs'],
|
147
|
-
perf_req_metrics_period: Sqreen.features['perf_req_metrics_period'],
|
148
|
-
}
|
149
|
-
@instrumenter = Sqreen::Weave::Legacy::Instrumentation.new(metrics_engine, opts)
|
144
|
+
@instrumenter = Sqreen::Weave::Legacy::Instrumentation.new(metrics_engine)
|
150
145
|
else
|
151
146
|
@instrumenter = Sqreen::Legacy::Instrumentation.new(metrics_engine)
|
152
147
|
end
|
@@ -172,9 +167,7 @@ module Sqreen
|
|
172
167
|
end
|
173
168
|
self.features = wanted_features
|
174
169
|
|
175
|
-
@ecosystem_integration = EcosystemIntegration.new(framework,
|
176
|
-
Sqreen.queue,
|
177
|
-
create_binning_metric_proc)
|
170
|
+
@ecosystem_integration = EcosystemIntegration.new(framework, Sqreen.queue)
|
178
171
|
framework.req_start_cb = @ecosystem_integration.method(:request_start)
|
179
172
|
framework.req_end_cb = @ecosystem_integration.method(:request_end)
|
180
173
|
|
@@ -281,7 +274,7 @@ module Sqreen
|
|
281
274
|
|
282
275
|
# XXX: ecosystem instrumentation should likely be deferred
|
283
276
|
# the same way the rest might be
|
284
|
-
@ecosystem_integration.init
|
277
|
+
@ecosystem_integration.init
|
285
278
|
rulespack_id.to_s
|
286
279
|
end
|
287
280
|
|
@@ -406,8 +399,15 @@ module Sqreen
|
|
406
399
|
prev = Sqreen::Weave::Budget.current
|
407
400
|
prev = prev.to_h if prev
|
408
401
|
|
409
|
-
budget_s = budget.to_f / 1000
|
410
|
-
|
402
|
+
budget_s = budget.to_f / 1000 if budget
|
403
|
+
|
404
|
+
feature = features['performance_budget']
|
405
|
+
if feature
|
406
|
+
budget_s = feature['threshold'] if feature.key?('threshold')
|
407
|
+
ratio = feature['ratio'] if feature.key?('ratio')
|
408
|
+
end
|
409
|
+
|
410
|
+
Sqreen::Weave::Budget.update(threshold: budget_s, ratio: ratio)
|
411
411
|
else
|
412
412
|
prev = Sqreen.performance_budget
|
413
413
|
Sqreen.update_performance_budget(budget)
|
@@ -555,21 +555,6 @@ module Sqreen
|
|
555
555
|
|
556
556
|
private
|
557
557
|
|
558
|
-
def create_binning_metric_proc
|
559
|
-
lambda do |metric_name|
|
560
|
-
return if @metrics_engine.metric?(metric_name)
|
561
|
-
metrics_engine.create_metric(
|
562
|
-
'name' => metric_name,
|
563
|
-
'kind' => 'Binning',
|
564
|
-
'period' => Sqreen.features['performance_metrics_period'] || 60,
|
565
|
-
'options' => {
|
566
|
-
'base' => Sqreen.features['perf_base'] || PerformanceNotifications::BinnedMetrics::DEFAULT_PERF_BASE,
|
567
|
-
'factor' => Sqreen.features['perf_unit'] || PerformanceNotifications::BinnedMetrics::DEFAULT_PERF_UNIT,
|
568
|
-
},
|
569
|
-
)
|
570
|
-
end
|
571
|
-
end
|
572
|
-
|
573
558
|
def post_endpoint_testing_msgs(chosen_endpoints)
|
574
559
|
chosen_endpoints.messages.each do |msg|
|
575
560
|
session.post_agent_message(@framework, msg)
|
data/lib/sqreen/version.rb
CHANGED
data/lib/sqreen/weave/budget.rb
CHANGED
@@ -9,14 +9,24 @@ require 'sqreen/weave'
|
|
9
9
|
class Sqreen::Weave::Budget
|
10
10
|
include Sqreen::Log::Loggable
|
11
11
|
|
12
|
-
def initialize(threshold)
|
12
|
+
def initialize(threshold, ratio = nil)
|
13
13
|
@threshold = threshold
|
14
|
+
@ratio = ratio
|
15
|
+
end
|
16
|
+
|
17
|
+
def static?
|
18
|
+
threshold && !ratio
|
19
|
+
end
|
20
|
+
|
21
|
+
def dynamic?
|
22
|
+
threshold && ratio
|
14
23
|
end
|
15
24
|
|
16
25
|
attr_reader :threshold
|
26
|
+
attr_reader :ratio
|
17
27
|
|
18
28
|
def to_h
|
19
|
-
{ threshold: threshold }
|
29
|
+
{ threshold: threshold, ratio: ratio }
|
20
30
|
end
|
21
31
|
|
22
32
|
class << self
|
@@ -28,8 +38,9 @@ class Sqreen::Weave::Budget
|
|
28
38
|
return @current = nil if opts.nil? || opts.empty?
|
29
39
|
|
30
40
|
threshold = opts[:threshold]
|
41
|
+
ratio = opts[:ratio]
|
31
42
|
|
32
|
-
@current = threshold
|
43
|
+
@current = new(threshold, ratio)
|
33
44
|
end
|
34
45
|
end
|
35
46
|
end
|
@@ -11,34 +11,19 @@ require 'sqreen/call_countable'
|
|
11
11
|
require 'sqreen/rules'
|
12
12
|
require 'sqreen/rules/record_request_context'
|
13
13
|
require 'sqreen/sqreen_signed_verifier'
|
14
|
-
require 'rack/request'
|
15
|
-
begin
|
16
|
-
require 'sq_detailed_metrics'
|
17
|
-
rescue LoadError => _e # rubocop:disable Lint/HandleExceptions
|
18
|
-
end
|
19
14
|
|
20
15
|
class Sqreen::Weave::Legacy::Instrumentation
|
21
16
|
attr_accessor :metrics_engine
|
22
17
|
|
23
|
-
HAS_SQ_DETAILED_METRICS = defined?(::SqDetailedMetrics)
|
24
|
-
REQ_LVL_2_METRIC = 'request_level_perf'.freeze
|
25
|
-
|
26
18
|
def initialize(metrics_engine, opts = {})
|
27
19
|
Sqreen::Weave.logger.debug { "#{self.class.name}#initialize #{metrics_engine}" }
|
28
20
|
@hooks = []
|
29
21
|
|
30
|
-
unless HAS_SQ_DETAILED_METRICS
|
31
|
-
Sqreen::Weave.logger.warn { "Detailed metrics are unavailable" }
|
32
|
-
end
|
33
|
-
|
34
22
|
self.metrics_engine = metrics_engine
|
35
23
|
|
36
24
|
### bail out if no metric engine
|
37
25
|
return if metrics_engine.nil?
|
38
26
|
|
39
|
-
# XXX: these metric definitions do not support change of opts
|
40
|
-
# due to features updates!
|
41
|
-
|
42
27
|
### init metric to count calls to sqreen
|
43
28
|
metrics_engine.create_metric(
|
44
29
|
'name' => 'sqreen_call_counts',
|
@@ -105,15 +90,6 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
105
90
|
'kind' => 'Binning',
|
106
91
|
'options' => opts[:perf_metric_percent] || { 'base' => 1.3, 'factor' => 1.0 },
|
107
92
|
)
|
108
|
-
|
109
|
-
if HAS_SQ_DETAILED_METRICS # rubocop:disable Style/GuardClause
|
110
|
-
@lvl_2_metric = metrics_engine.create_metric(
|
111
|
-
'name' => REQ_LVL_2_METRIC,
|
112
|
-
'period' => opts[:perf_req_metrics_period] || 60,
|
113
|
-
'kind' => 'ReqDetailed',
|
114
|
-
)
|
115
|
-
@lvl_2_max_reqs = opts[:perf_req_metrics_max_reqs] || 100
|
116
|
-
end
|
117
93
|
end
|
118
94
|
|
119
95
|
# needed by Sqreen::Runner#initialize
|
@@ -183,13 +159,11 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
183
159
|
end
|
184
160
|
|
185
161
|
metrics_engine = self.metrics_engine
|
186
|
-
lvl_2_metric = @lvl_2_metric
|
187
|
-
lvl_2_max_reqs = @lvl_2_max_reqs
|
188
162
|
|
189
163
|
request_hook = Sqreen::Graft::Hook['Sqreen::ShrinkWrap#call', strategy]
|
190
164
|
@hooks << request_hook
|
191
165
|
request_hook.add do
|
192
|
-
before('wave,meta,request', rank: -100000, mandatory: true) do |
|
166
|
+
before('wave,meta,request', rank: -100000, mandatory: true) do |_call|
|
193
167
|
next unless Sqreen.instrumentation_ready
|
194
168
|
|
195
169
|
# shrinkwrap_timer = Sqreen::Graft::Timer.new('weave,shrinkwrap')
|
@@ -199,42 +173,25 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
199
173
|
request_timer.start
|
200
174
|
sqreen_timer = Sqreen::Graft::Timer.new("sqreen")
|
201
175
|
budget = Sqreen::Weave::Budget.current
|
202
|
-
|
176
|
+
request_budget_threshold = budget.threshold if budget
|
177
|
+
request_budget_ratio = budget.ratio if budget
|
178
|
+
request_budget_is_dynamic = !request_budget_ratio.nil?
|
179
|
+
request_budget = !request_budget_threshold.nil?
|
203
180
|
timed_level = (Sqreen.features['perf_level'] || 1).to_i
|
204
|
-
|
205
|
-
if timed_level == 2 && lvl_2_metric.num_requests >= lvl_2_max_reqs
|
206
|
-
timed_level = 1
|
207
|
-
Sqreen::Weave.logger.debug { "Reducing timed level to 1 (#{lvl_2_metric.num_requests} reqs accumulated)" }
|
208
|
-
end
|
209
|
-
|
210
|
-
Sqreen::Weave.logger.debug { "request budget: #{budget} timed.level: #{timed_level}" } if Sqreen::Weave.logger.debug?
|
211
|
-
|
212
|
-
route_found = nil
|
213
|
-
if timed_level >= 2
|
214
|
-
rack_env, = call.args
|
215
|
-
rack_request = Rack::Request.new(rack_env) if rack_env
|
216
|
-
|
217
|
-
# TODO: Rails engines
|
218
|
-
# TODO: Struct
|
219
|
-
# TODO: Sinatra
|
220
|
-
# TODO: Rack?
|
221
|
-
Rails.application.routes.router.recognize(rack_request) do |route, params|
|
222
|
-
route = ActionDispatch::Routing::RouteWrapper.new(route)
|
223
|
-
route_found = { name: route.name, verb: route.verb, path: route.path, reqs: route.reqs, params: params }
|
224
|
-
end if defined?(Rails) && Rails.application && defined?(ActionDispatch::Routing::RouteWrapper)
|
225
|
-
end
|
181
|
+
Sqreen::Weave.logger.debug { "request budget: #{budget.to_h} timed.level: #{timed_level}" } if Sqreen::Weave.logger.debug?
|
226
182
|
|
227
|
-
# TODO: Struct
|
228
183
|
Thread.current[:sqreen_http_request] = {
|
229
184
|
request_timer: request_timer,
|
230
185
|
sqreen_timer: sqreen_timer,
|
231
186
|
time_budget_expended: false,
|
232
|
-
|
187
|
+
time_budget_threshold: request_budget_threshold,
|
188
|
+
time_budget_dynamic: request_budget_is_dynamic,
|
189
|
+
time_budget_ratio: request_budget_ratio,
|
190
|
+
time_budget: request_budget,
|
233
191
|
timed_callbacks: [],
|
234
192
|
timed_hooks: [],
|
235
193
|
timed_level: timed_level,
|
236
194
|
skipped_callbacks: [],
|
237
|
-
route: ("#{route_found[:verb]} #{route_found[:path]}" if route_found),
|
238
195
|
# timed_shrinkwrap: shrinkwrap_timer,
|
239
196
|
}
|
240
197
|
|
@@ -246,9 +203,6 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
246
203
|
|
247
204
|
next if request.nil?
|
248
205
|
|
249
|
-
timed_level = request[:timed_level]
|
250
|
-
req_detailed = SqDetailedMetrics::Request.new if timed_level >= 2
|
251
|
-
|
252
206
|
# shrinkwrap_timer = request[:timed_shrinkwrap]
|
253
207
|
# shrinkwrap_timer.start
|
254
208
|
|
@@ -256,30 +210,39 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
256
210
|
request_timer = request[:request_timer]
|
257
211
|
now = request_timer.stop
|
258
212
|
|
259
|
-
if timed_level >= 1
|
213
|
+
if request[:timed_level] >= 1
|
260
214
|
request[:timed_callbacks].each do |timer|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
215
|
+
duration = timer.duration
|
216
|
+
|
217
|
+
timer.tag =~ /weave,rule=(.*)$/ && rule = $1
|
218
|
+
next unless rule
|
219
|
+
|
220
|
+
whence = case timer.tag
|
221
|
+
when /@before/ then 'pre'
|
222
|
+
when /@after/ then 'post'
|
223
|
+
when /@raised/ then 'failing'
|
224
|
+
end
|
225
|
+
next unless whence
|
265
226
|
|
266
|
-
|
227
|
+
metric_name = "sq.#{rule}.#{whence}"
|
228
|
+
metrics_engine.update(metric_name, now, nil, duration * 1000)
|
229
|
+
# Sqreen.observations_queue.push([metric_name, nil, duration * 1000, utc_now])
|
230
|
+
end
|
267
231
|
|
268
|
-
|
269
|
-
|
270
|
-
|
232
|
+
request[:timed_hooks].each do |timer|
|
233
|
+
duration = timer.duration
|
234
|
+
metrics_engine.update('sq.hook.overhead', now, nil, duration * 1000)
|
235
|
+
# Sqreen.observations_queue.push(['sq.hook.overhead', nil, duration * 1000, utc_now])
|
271
236
|
end
|
272
237
|
end
|
273
238
|
|
274
239
|
sqreen_timer = request[:sqreen_timer]
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
Sqreen::Weave.logger.debug
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
if timed_level >= 1 && Sqreen::Weave.logger.debug?
|
240
|
+
total = sqreen_timer.duration
|
241
|
+
Sqreen::Weave.logger.debug { "request sqreen_timer.total: #{'%.03fus' % (total * 1_000_000)}" } if Sqreen::Weave.logger.debug?
|
242
|
+
total = request_timer.duration
|
243
|
+
Sqreen::Weave.logger.debug { "request request_timer.total: #{'%.03fus' % (total * 1_000_000)}" } if Sqreen::Weave.logger.debug?
|
244
|
+
|
245
|
+
if request[:timed_level] >= 2
|
283
246
|
skipped = request[:skipped_callbacks].map(&:name)
|
284
247
|
Sqreen::Weave.logger.debug { "request callback.skipped.count: #{skipped.count}" } if Sqreen::Weave.logger.debug?
|
285
248
|
timings = request[:timed_callbacks].map(&:to_s)
|
@@ -290,27 +253,50 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
290
253
|
Sqreen::Weave.logger.debug { "request hook.total: #{'%.03fus' % (total * 1_000_000)} hook.count: #{timings.count}" } if Sqreen::Weave.logger.debug?
|
291
254
|
end
|
292
255
|
|
293
|
-
|
294
|
-
|
295
|
-
metrics_engine.update('request_overtime', now,
|
256
|
+
skipped = request[:skipped_callbacks].map(&:name)
|
257
|
+
skipped_rule_name = skipped.first && skipped.first =~ /weave,rule=(.*)$/ && $1
|
258
|
+
metrics_engine.update('request_overtime', now, skipped_rule_name, 1) if skipped_rule_name
|
259
|
+
# Sqreen.observations_queue.push(['request_overtime', skipped_rule_name, 1, utc_now]) if skipped_rule_name
|
296
260
|
|
297
|
-
sqreen_request_duration = sqreen_timer.duration
|
298
|
-
metrics_engine.update('sq', now, nil, sqreen_request_duration)
|
261
|
+
sqreen_request_duration = sqreen_timer.duration
|
262
|
+
metrics_engine.update('sq', now, nil, sqreen_request_duration * 1000)
|
263
|
+
# Sqreen.observations_queue.push(['sq', nil, sqreen_request_duration * 1000, utc_now])
|
299
264
|
|
300
|
-
request_duration = request_timer.duration
|
301
|
-
metrics_engine.update('req', now, nil, request_duration)
|
265
|
+
request_duration = request_timer.duration
|
266
|
+
metrics_engine.update('req', now, nil, request_duration * 1000)
|
267
|
+
# Sqreen.observations_queue.push(['req', nil, request_duration * 1000, utc_now])
|
302
268
|
|
303
269
|
sqreen_request_ratio = (sqreen_request_duration * 100.0) / (request_duration - sqreen_request_duration)
|
304
270
|
metrics_engine.update('pct', now, nil, sqreen_request_ratio)
|
271
|
+
# Sqreen.observations_queue.push(['pct', nil, sqreen_request_ratio, utc_now])
|
305
272
|
Sqreen::Weave.logger.debug { "request sqreen_timer.ratio: #{'%.03f' % (sqreen_request_ratio / 100.0)}" } if Sqreen::Weave.logger.debug?
|
306
273
|
|
307
|
-
if
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
274
|
+
if request[:timed_level] >= 2
|
275
|
+
tallies = Hash.new(0.0)
|
276
|
+
request[:timed_callbacks].each do |timer|
|
277
|
+
duration = timer.duration
|
278
|
+
|
279
|
+
timer.tag =~ /weave,rule=(.*)$/ && rule = $1
|
280
|
+
next unless rule
|
281
|
+
|
282
|
+
whence = case timer.tag
|
283
|
+
when /@before/ then 'pre'
|
284
|
+
when /@after/ then 'post'
|
285
|
+
when /@raised/ then 'failing'
|
286
|
+
end
|
287
|
+
next unless whence
|
288
|
+
|
289
|
+
metric_name = "req.sq.#{rule}.#{whence}"
|
290
|
+
tallies[metric_name] += duration
|
291
|
+
end
|
292
|
+
tallies.each do |metric_name, duration|
|
293
|
+
metrics_engine.update(metric_name, now, nil, duration * 1000)
|
294
|
+
# Sqreen.observations_queue.push([metric_name, nil, duration * 1000, utc_now])
|
295
|
+
end
|
312
296
|
|
313
|
-
|
297
|
+
duration = request[:timed_hooks].sum(&:duration)
|
298
|
+
metrics_engine.update('req.sq.hook.overhead', now, nil, duration * 1000)
|
299
|
+
# Sqreen.observations_queue.push(['req.sq.hook.overhead', nil, duration * 1000, utc_now])
|
314
300
|
end
|
315
301
|
|
316
302
|
# shrinkwrap_timer.stop
|
@@ -369,8 +355,7 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
369
355
|
hook = Sqreen::Graft::Hook[hook_point, strategy]
|
370
356
|
hook.add do
|
371
357
|
if callback.pre?
|
372
|
-
|
373
|
-
before(rule, rank: priority, mandatory: !callback.overtimeable, flow: use_flow, ignore: ignore) do |call, b|
|
358
|
+
before(rule, rank: priority, mandatory: !callback.overtimeable, flow: block, ignore: ignore) do |call, b|
|
374
359
|
next unless Thread.current[:sqreen_http_request]
|
375
360
|
|
376
361
|
i = call.instance
|
@@ -402,12 +387,8 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
402
387
|
else
|
403
388
|
b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required."))
|
404
389
|
end
|
405
|
-
end
|
390
|
+
end
|
406
391
|
|
407
|
-
if ret && ret[:passed_conditions]
|
408
|
-
throw_val ||= b.noop
|
409
|
-
throw_val.passed_conditions!
|
410
|
-
end
|
411
392
|
next unless throw_val
|
412
393
|
throw_val.break! if ret[:skip_rem_cbs]
|
413
394
|
throw(b, throw_val)
|
@@ -434,21 +415,13 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
434
415
|
end
|
435
416
|
end
|
436
417
|
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
end unless ret.nil? || !ret.is_a?(Hash) || !block
|
445
|
-
|
446
|
-
if ret && ret[:passed_conditions]
|
447
|
-
throw_val ||= b.noop
|
448
|
-
throw_val.passed_conditions!
|
449
|
-
end
|
450
|
-
next unless throw_val
|
451
|
-
throw(b, throw_val)
|
418
|
+
case ret[:status]
|
419
|
+
when :override, 'override'
|
420
|
+
throw(b, b.return(ret[:new_return_value])) if ret.key?(:new_return_value)
|
421
|
+
when :raise, 'raise'
|
422
|
+
throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
|
423
|
+
throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
|
424
|
+
end unless ret.nil? || !ret.is_a?(Hash)
|
452
425
|
end
|
453
426
|
end
|
454
427
|
|
@@ -474,27 +447,19 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
474
447
|
|
475
448
|
throw(b, b.raise(e)) if ret.nil? || !ret.is_a?(Hash)
|
476
449
|
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
end unless ret.nil? || !ret.is_a?(Hash) || !block
|
491
|
-
|
492
|
-
if ret && ret[:passed_conditions]
|
493
|
-
throw_val ||= b.noop
|
494
|
-
throw_val.passed_conditions!
|
495
|
-
end
|
496
|
-
next unless throw_val
|
497
|
-
throw(b, throw_val)
|
450
|
+
case ret[:status]
|
451
|
+
when :override, 'override'
|
452
|
+
throw(b, b.return(ret[:new_return_value])) if ret.key?(:new_return_value)
|
453
|
+
when :retry, 'retry'
|
454
|
+
throw(b, b.retry)
|
455
|
+
when :raise, 'raise'
|
456
|
+
throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
|
457
|
+
throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
|
458
|
+
when :reraise, 'reraise'
|
459
|
+
throw(b, b.raise(e))
|
460
|
+
else
|
461
|
+
throw(b, b.raise(e))
|
462
|
+
end unless ret.nil? || !ret.is_a?(Hash)
|
498
463
|
end
|
499
464
|
end
|
500
465
|
end.install
|
@@ -529,20 +494,4 @@ class Sqreen::Weave::Legacy::Instrumentation
|
|
529
494
|
Sqreen::Rules::RunUserActions.new(Sqreen, :auth_track, 1),
|
530
495
|
]
|
531
496
|
end
|
532
|
-
|
533
|
-
def self.tag_to_metric_name(tag)
|
534
|
-
cached = @cache_tag_to_metric[tag]
|
535
|
-
return cached unless cached.nil?
|
536
|
-
|
537
|
-
tag =~ /weave,rule=(.*)$/ && rule = $1 and # rubocop:disable Style/AndOr
|
538
|
-
(tag =~ /@before/ && whence = 'pre' or # rubocop:disable Style/AndOr
|
539
|
-
tag =~ /@after/ && whence = 'post' or # rubocop:disable Style/AndOr
|
540
|
-
tag =~ /@raised/ && whence = 'failing' or # rubocop:disable Style/AndOr
|
541
|
-
tag =~ /@ensured/ && whence = 'finally')
|
542
|
-
|
543
|
-
@cache_tag_to_metric[tag] =
|
544
|
-
rule && whence ? "sq.#{rule}.#{whence}" : false
|
545
|
-
end
|
546
|
-
|
547
|
-
@cache_tag_to_metric = {}
|
548
497
|
end
|