sqreen 1.19.1 → 1.21.0.beta1
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 +18 -0
- data/lib/sqreen/agent_message.rb +20 -0
- data/lib/sqreen/aggregated_metric.rb +25 -0
- data/lib/sqreen/attack_detected.html +1 -2
- data/lib/sqreen/ca.crt +24 -0
- data/lib/sqreen/configuration.rb +10 -4
- data/lib/sqreen/deliveries/batch.rb +12 -2
- data/lib/sqreen/deliveries/simple.rb +4 -0
- data/lib/sqreen/ecosystem.rb +80 -0
- data/lib/sqreen/ecosystem/dispatch_table.rb +43 -0
- data/lib/sqreen/ecosystem/http/net_http.rb +51 -0
- data/lib/sqreen/ecosystem/http/rack_request.rb +38 -0
- data/lib/sqreen/ecosystem/loggable.rb +13 -0
- data/lib/sqreen/ecosystem/module_api.rb +30 -0
- data/lib/sqreen/ecosystem/module_api/event_listener.rb +18 -0
- data/lib/sqreen/ecosystem/module_api/instrumentation.rb +23 -0
- data/lib/sqreen/ecosystem/module_api/signal_producer.rb +26 -0
- data/lib/sqreen/ecosystem/module_api/tracing_push_down.rb +34 -0
- data/lib/sqreen/ecosystem/module_api/transaction_storage.rb +71 -0
- data/lib/sqreen/ecosystem/module_registry.rb +39 -0
- data/lib/sqreen/ecosystem/redis/redis_connection.rb +35 -0
- data/lib/sqreen/ecosystem/tracing/sampler.rb +160 -0
- data/lib/sqreen/ecosystem/tracing/sampling_configuration.rb +150 -0
- data/lib/sqreen/ecosystem/tracing/signals/tracing_client.rb +53 -0
- data/lib/sqreen/ecosystem/tracing/signals/tracing_server.rb +53 -0
- data/lib/sqreen/ecosystem/tracing_id_setup.rb +34 -0
- data/lib/sqreen/ecosystem/transaction_storage.rb +64 -0
- data/lib/sqreen/ecosystem_integration.rb +70 -0
- data/lib/sqreen/ecosystem_integration/around_callbacks.rb +89 -0
- data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +38 -0
- data/lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb +56 -0
- data/lib/sqreen/ecosystem_integration/signal_consumption.rb +35 -0
- data/lib/sqreen/endpoint_testing.rb +184 -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/generic.rb +15 -1
- data/lib/sqreen/frameworks/request_recorder.rb +13 -2
- data/lib/sqreen/graft/call.rb +9 -0
- 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 +227 -0
- data/lib/sqreen/legacy/waf_redactions.rb +49 -0
- data/lib/sqreen/log/loggable.rb +1 -1
- 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/remote_command.rb +3 -0
- data/lib/sqreen/rules.rb +4 -2
- data/lib/sqreen/rules/not_found_cb.rb +2 -0
- data/lib/sqreen/rules/rule_cb.rb +2 -0
- data/lib/sqreen/rules/waf_cb.rb +13 -10
- data/lib/sqreen/runner.rb +94 -13
- data/lib/sqreen/sensitive_data_redactor.rb +19 -31
- data/lib/sqreen/session.rb +53 -43
- data/lib/sqreen/signals/conversions.rb +288 -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
- data/lib/sqreen/weave/legacy/instrumentation.rb +4 -4
- metadata +74 -10
- 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/log/loggable.rb
CHANGED
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
|
|
@@ -22,6 +22,7 @@ module Sqreen
|
|
22
22
|
:ips_whitelist => :change_whitelisted_ips,
|
23
23
|
:get_bundle => :upload_bundle,
|
24
24
|
:performance_budget => :change_performance_budget,
|
25
|
+
:tracing_enable => :tracing_enable,
|
25
26
|
}.freeze
|
26
27
|
|
27
28
|
attr_reader :uuid
|
@@ -39,6 +40,8 @@ module Sqreen
|
|
39
40
|
begin
|
40
41
|
output = runner.send(KNOWN_COMMANDS[@name], *@params, context_infos)
|
41
42
|
rescue => e
|
43
|
+
Sqreen.log.warn { "Command failed with #{e}" }
|
44
|
+
Sqreen.log.debug { e.backtrace.map { |x| " #{x}" }.join("\n") }
|
42
45
|
Sqreen::RemoteException.record(e)
|
43
46
|
return { :status => false, :reason => "error: #{e.inspect}" }
|
44
47
|
end
|
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
@@ -98,10 +98,10 @@ module Sqreen
|
|
98
98
|
|
99
99
|
case action
|
100
100
|
when :monitor
|
101
|
-
record_event({
|
101
|
+
record_event({ waf_data: data })
|
102
102
|
advise_action(nil)
|
103
103
|
when :block
|
104
|
-
record_event({
|
104
|
+
record_event({ waf_data: data })
|
105
105
|
advise_action(:raise)
|
106
106
|
when :good
|
107
107
|
advise_action(nil)
|
@@ -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
@@ -11,18 +11,23 @@ require 'sqreen/events/attack'
|
|
11
11
|
|
12
12
|
require 'sqreen/log'
|
13
13
|
|
14
|
+
require 'sqreen/agent_message'
|
14
15
|
require 'sqreen/rules'
|
15
16
|
require 'sqreen/session'
|
17
|
+
require 'sqreen/version'
|
16
18
|
require 'sqreen/remote_command'
|
17
19
|
require 'sqreen/capped_queue'
|
18
20
|
require 'sqreen/metrics_store'
|
19
21
|
require 'sqreen/deliveries/simple'
|
20
22
|
require 'sqreen/deliveries/batch'
|
23
|
+
require 'sqreen/endpoint_testing'
|
21
24
|
require 'sqreen/performance_notifications/metrics'
|
22
25
|
require 'sqreen/performance_notifications/binned_metrics'
|
23
26
|
require 'sqreen/legacy/instrumentation'
|
24
27
|
require 'sqreen/call_countable'
|
25
28
|
require 'sqreen/weave/legacy/instrumentation'
|
29
|
+
require 'sqreen/kit/configuration'
|
30
|
+
require 'sqreen/ecosystem_integration'
|
26
31
|
|
27
32
|
module Sqreen
|
28
33
|
@features = {}
|
@@ -37,6 +42,8 @@ module Sqreen
|
|
37
42
|
PERF_METRICS_PERIOD = 60 # 1 min
|
38
43
|
DEFAULT_PERF_LEVEL = 0 # disabled
|
39
44
|
|
45
|
+
DEFAULT_USE_SIGNALS = false
|
46
|
+
|
40
47
|
class << self
|
41
48
|
attr_reader :features
|
42
49
|
def update_features(features)
|
@@ -47,10 +54,6 @@ module Sqreen
|
|
47
54
|
@queue ||= CappedQueue.new(MAX_QUEUE_LENGTH)
|
48
55
|
end
|
49
56
|
|
50
|
-
def update_queue(queue)
|
51
|
-
@queue = queue
|
52
|
-
end
|
53
|
-
|
54
57
|
def observations_queue
|
55
58
|
@observations_queue ||= CappedQueue.new(MAX_OBS_QUEUE_LENGTH)
|
56
59
|
end
|
@@ -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
|
@@ -97,8 +102,8 @@ module Sqreen
|
|
97
102
|
# we may want to do that in a thread in order to prevent delaying app
|
98
103
|
# startup
|
99
104
|
# set_at_exit do not place a global at_exit (used for testing)
|
105
|
+
# @param [Sqreen::Frameworks::GenericFramework] framework
|
100
106
|
def initialize(configuration, framework, set_at_exit = true, session_class = Sqreen::Session)
|
101
|
-
Sqreen.update_queue(CappedQueue.new(MAX_QUEUE_LENGTH))
|
102
107
|
@logged_out_tried = false
|
103
108
|
@configuration = configuration
|
104
109
|
@framework = framework
|
@@ -108,15 +113,25 @@ module Sqreen
|
|
108
113
|
@next_metrics = []
|
109
114
|
@running = true
|
110
115
|
|
116
|
+
@proxy_url = @configuration.get(:proxy_url)
|
117
|
+
chosen_endpoints = determine_endpoints
|
118
|
+
|
111
119
|
@token = @configuration.get(:token)
|
112
120
|
@app_name = @configuration.get(:app_name)
|
113
|
-
@url =
|
121
|
+
@url = chosen_endpoints.control.url
|
122
|
+
@cert_store = chosen_endpoints.control.ca_store
|
123
|
+
|
114
124
|
Sqreen.update_whitelisted_paths([])
|
115
125
|
Sqreen.update_whitelisted_ips({})
|
116
126
|
Sqreen.update_performance_budget(nil)
|
117
|
-
raise(Sqreen::Exception, 'no url found') unless @url
|
118
127
|
raise(Sqreen::TokenNotFoundException, 'no token found') unless @token
|
119
128
|
|
129
|
+
Sqreen::Kit::Configuration.logger = Sqreen.log
|
130
|
+
Sqreen::Kit::Configuration.ingestion_url = chosen_endpoints.ingestion.url
|
131
|
+
Sqreen::Kit::Configuration.certificate_store = chosen_endpoints.ingestion.ca_store
|
132
|
+
Sqreen::Kit::Configuration.proxy_url = @proxy_url
|
133
|
+
Sqreen::Kit::Configuration.default_source = "sqreen:agent:ruby:#{Sqreen::VERSION}"
|
134
|
+
|
120
135
|
register_exit_cb if set_at_exit
|
121
136
|
|
122
137
|
self.metrics_engine = MetricsStore.new
|
@@ -133,6 +148,7 @@ module Sqreen
|
|
133
148
|
|
134
149
|
Sqreen.log.debug "Using token #{@token}"
|
135
150
|
response = create_session(session_class)
|
151
|
+
post_endpoint_testing_msgs(chosen_endpoints)
|
136
152
|
wanted_features = response.fetch('features', {})
|
137
153
|
conf_initial_features = configuration.get(:initial_features)
|
138
154
|
unless conf_initial_features.nil?
|
@@ -142,15 +158,19 @@ module Sqreen
|
|
142
158
|
Sqreen.log.debug do
|
143
159
|
"Override initial features with #{conf_features.inspect}"
|
144
160
|
end
|
145
|
-
wanted_features = conf_features
|
161
|
+
wanted_features = wanted_features.merge(conf_features)
|
146
162
|
rescue
|
147
163
|
Sqreen.log.warn do
|
148
|
-
"NOT using invalid
|
164
|
+
"NOT using invalid initial features #{conf_initial_features}"
|
149
165
|
end
|
150
166
|
end
|
151
167
|
end
|
152
168
|
self.features = wanted_features
|
153
169
|
|
170
|
+
@ecosystem_integration = EcosystemIntegration.new(framework, Sqreen.queue)
|
171
|
+
framework.req_start_cb = @ecosystem_integration.method(:request_start)
|
172
|
+
framework.req_end_cb = @ecosystem_integration.method(:request_end)
|
173
|
+
|
154
174
|
# Ensure a deliverer is there unless features have set it first
|
155
175
|
self.deliverer ||= Deliveries::Simple.new(session)
|
156
176
|
context_infos = {}
|
@@ -161,7 +181,7 @@ module Sqreen
|
|
161
181
|
end
|
162
182
|
|
163
183
|
def create_session(session_class)
|
164
|
-
@session = session_class.new(@url, @token, @app_name)
|
184
|
+
@session = session_class.new(@url, @cert_store, @token, @app_name, @proxy_url)
|
165
185
|
session.login(@framework)
|
166
186
|
end
|
167
187
|
|
@@ -170,8 +190,18 @@ module Sqreen
|
|
170
190
|
@deliverer = new_deliverer
|
171
191
|
end
|
172
192
|
|
173
|
-
def batch_events(batch_size, max_staleness = nil)
|
193
|
+
def batch_events(batch_size, max_staleness = nil, use_signals = false)
|
174
194
|
size = batch_size.to_i
|
195
|
+
|
196
|
+
if size <= 1 && use_signals
|
197
|
+
Sqreen.log.warn do
|
198
|
+
"Using signals with no delivery batching is unsupported. " \
|
199
|
+
"Using instead batching with batch size = 30, max_staleness = 60"
|
200
|
+
end
|
201
|
+
size = 30
|
202
|
+
max_staleness = 60
|
203
|
+
end
|
204
|
+
|
175
205
|
self.deliverer = if size < 1
|
176
206
|
Deliveries::Simple.new(session)
|
177
207
|
else
|
@@ -241,6 +271,10 @@ module Sqreen
|
|
241
271
|
rulespack_id, rules = load_rules(context_infos)
|
242
272
|
@framework.instrument_when_ready!(instrumenter, rules)
|
243
273
|
Sqreen.log.info 'Instrumentation set up'
|
274
|
+
|
275
|
+
# XXX: ecosystem instrumentation should likely be deferred
|
276
|
+
# the same way the rest might be
|
277
|
+
@ecosystem_integration.init
|
244
278
|
rulespack_id.to_s
|
245
279
|
end
|
246
280
|
|
@@ -301,19 +335,37 @@ module Sqreen
|
|
301
335
|
def do_heartbeat
|
302
336
|
@last_heartbeat_request = Time.now
|
303
337
|
@next_metrics.concat(metrics_engine.publish(false)) if metrics_engine
|
304
|
-
|
338
|
+
metrics_in_hb = use_signals? ? nil : next_metrics
|
339
|
+
|
340
|
+
res = session.heartbeat(next_command_results, metrics_in_hb)
|
305
341
|
next_command_results.clear
|
342
|
+
|
343
|
+
deliver_metrics_as_event if use_signals?
|
306
344
|
next_metrics.clear
|
345
|
+
|
307
346
|
process_commands(res['commands'])
|
308
347
|
end
|
309
348
|
|
349
|
+
def deliver_metrics_as_event
|
350
|
+
# this is disastrous withe simple delivery strategy,
|
351
|
+
# as each aggregated metric would trigger an http request
|
352
|
+
# Sending of metrics is therefore not supported with simple delivery strategy
|
353
|
+
# TODO: Confirm that only batch is used in production
|
354
|
+
next_metrics.each { |x| deliverer.post_event(x) }
|
355
|
+
end
|
356
|
+
|
310
357
|
def features(_context_infos = {})
|
311
358
|
Sqreen.features
|
312
359
|
end
|
313
360
|
|
361
|
+
def use_signals?
|
362
|
+
features.fetch('use_signals', DEFAULT_USE_SIGNALS)
|
363
|
+
end
|
364
|
+
|
314
365
|
def features=(features)
|
315
366
|
Sqreen.update_features(features)
|
316
367
|
session.request_compression = features['request_compression'] if session
|
368
|
+
session.use_signals = use_signals?
|
317
369
|
self.performance_metrics_period = features['performance_metrics_period']
|
318
370
|
|
319
371
|
unless @configuration.get(:weave)
|
@@ -331,7 +383,7 @@ module Sqreen
|
|
331
383
|
hd = features['heartbeat_delay'].to_i
|
332
384
|
self.heartbeat_delay = hd if hd > 0
|
333
385
|
return if features['batch_size'].nil?
|
334
|
-
batch_events(features['batch_size'], features['max_staleness'])
|
386
|
+
batch_events(features['batch_size'], features['max_staleness'], use_signals?)
|
335
387
|
end
|
336
388
|
|
337
389
|
def change_whitelisted_paths(paths, _context_infos = {})
|
@@ -347,6 +399,13 @@ module Sqreen
|
|
347
399
|
{ :was => prev }
|
348
400
|
end
|
349
401
|
|
402
|
+
# @param [String] tracing_id_prefix
|
403
|
+
# @param [Array<Hash{String=>Object}>] sampling_config
|
404
|
+
def tracing_enable(tracing_id_prefix, sampling_config, _context_infos = {})
|
405
|
+
@ecosystem_integration.handle_tracing_command(tracing_id_prefix, sampling_config)
|
406
|
+
{ status: true }
|
407
|
+
end
|
408
|
+
|
350
409
|
def upload_bundle(_context_infos = {})
|
351
410
|
t = Time.now
|
352
411
|
session.post_bundle(RuntimeInfos.dependencies_signature, RuntimeInfos.dependencies)
|
@@ -470,6 +529,28 @@ module Sqreen
|
|
470
529
|
|
471
530
|
private
|
472
531
|
|
532
|
+
def post_endpoint_testing_msgs(chosen_endpoints)
|
533
|
+
chosen_endpoints.messages.each do |msg|
|
534
|
+
session.post_agent_message(@framework, msg)
|
535
|
+
end
|
536
|
+
rescue => e
|
537
|
+
Sqreen.log.warn "Error submitting agent message: #{e}"
|
538
|
+
RemoteException.record(e)
|
539
|
+
end
|
540
|
+
|
541
|
+
def determine_endpoints
|
542
|
+
# there's no sniffing going on; just a misnamed config setting
|
543
|
+
if @configuration.get(:no_sniff_domains)
|
544
|
+
# reproduces behaviour before endpoint testing was introduced
|
545
|
+
EndpointTesting.no_test_endpoints(@configuration.get(:url),
|
546
|
+
@configuration.get(:ingestion_url))
|
547
|
+
else
|
548
|
+
EndpointTesting.test_endpoints(@proxy_url,
|
549
|
+
@configuration.get(:url),
|
550
|
+
@configuration.get(:ingestion_url))
|
551
|
+
end
|
552
|
+
end
|
553
|
+
|
473
554
|
def load_actions(hashes)
|
474
555
|
unsupported = Set.new
|
475
556
|
|