sqreen 1.20.1 → 1.21.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sqreen/attack_detected.html +1 -2
  3. data/lib/sqreen/deliveries/batch.rb +8 -1
  4. data/lib/sqreen/ecosystem.rb +80 -0
  5. data/lib/sqreen/ecosystem/dispatch_table.rb +43 -0
  6. data/lib/sqreen/ecosystem/http/net_http.rb +51 -0
  7. data/lib/sqreen/ecosystem/http/rack_request.rb +38 -0
  8. data/lib/sqreen/ecosystem/loggable.rb +13 -0
  9. data/lib/sqreen/ecosystem/module_api.rb +30 -0
  10. data/lib/sqreen/ecosystem/module_api/event_listener.rb +18 -0
  11. data/lib/sqreen/ecosystem/module_api/instrumentation.rb +23 -0
  12. data/lib/sqreen/ecosystem/module_api/signal_producer.rb +26 -0
  13. data/lib/sqreen/ecosystem/module_api/tracing_push_down.rb +34 -0
  14. data/lib/sqreen/ecosystem/module_api/transaction_storage.rb +71 -0
  15. data/lib/sqreen/ecosystem/module_registry.rb +39 -0
  16. data/lib/sqreen/ecosystem/redis/redis_connection.rb +35 -0
  17. data/lib/sqreen/ecosystem/tracing/sampler.rb +160 -0
  18. data/lib/sqreen/ecosystem/tracing/sampling_configuration.rb +150 -0
  19. data/lib/sqreen/ecosystem/tracing/signals/tracing_client.rb +53 -0
  20. data/lib/sqreen/ecosystem/tracing/signals/tracing_server.rb +53 -0
  21. data/lib/sqreen/ecosystem/tracing_id_setup.rb +34 -0
  22. data/lib/sqreen/ecosystem/transaction_storage.rb +64 -0
  23. data/lib/sqreen/ecosystem_integration.rb +70 -0
  24. data/lib/sqreen/ecosystem_integration/around_callbacks.rb +89 -0
  25. data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +38 -0
  26. data/lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb +56 -0
  27. data/lib/sqreen/ecosystem_integration/signal_consumption.rb +35 -0
  28. data/lib/sqreen/frameworks/generic.rb +15 -1
  29. data/lib/sqreen/graft/call.rb +9 -0
  30. data/lib/sqreen/legacy/old_event_submission_strategy.rb +7 -1
  31. data/lib/sqreen/remote_command.rb +3 -0
  32. data/lib/sqreen/runner.rb +19 -5
  33. data/lib/sqreen/session.rb +2 -0
  34. data/lib/sqreen/signals/conversions.rb +6 -1
  35. data/lib/sqreen/version.rb +1 -1
  36. metadata +32 -7
@@ -55,6 +55,12 @@ module Sqreen
55
55
  when AggregatedMetric
56
56
  logger.warn "Aggregated metric event in non-signal mode. Signals disabled at runtime?"
57
57
  next
58
+ when Sqreen::Kit::Signals::Signal
59
+ logger.warn "Signal event in non-signal mode"
60
+ next
61
+ when Sqreen::Kit::Signals::Trace
62
+ logger.warn "Trace event in non-signal mode"
63
+ next
58
64
  when Attack # in practice only found inside req rec
59
65
  EventToHash.convert_attack event
60
66
  when RemoteException
@@ -72,7 +78,7 @@ module Sqreen
72
78
  tally = Hash[events.group_by(&:class).map { |k, v| [k, v.count] }]
73
79
  "Doing batch with the following tally of event types: #{tally}"
74
80
  end
75
- post('batch', { batch: batch }, {}, RETRY_MANY)
81
+ post('batch', { batch: batch.compact }, {}, RETRY_MANY)
76
82
  end
77
83
 
78
84
  private
@@ -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
@@ -14,6 +14,7 @@ require 'sqreen/log'
14
14
  require 'sqreen/agent_message'
15
15
  require 'sqreen/rules'
16
16
  require 'sqreen/session'
17
+ require 'sqreen/version'
17
18
  require 'sqreen/remote_command'
18
19
  require 'sqreen/capped_queue'
19
20
  require 'sqreen/metrics_store'
@@ -26,6 +27,7 @@ require 'sqreen/legacy/instrumentation'
26
27
  require 'sqreen/call_countable'
27
28
  require 'sqreen/weave/legacy/instrumentation'
28
29
  require 'sqreen/kit/configuration'
30
+ require 'sqreen/ecosystem_integration'
29
31
 
30
32
  module Sqreen
31
33
  @features = {}
@@ -52,10 +54,6 @@ module Sqreen
52
54
  @queue ||= CappedQueue.new(MAX_QUEUE_LENGTH)
53
55
  end
54
56
 
55
- def update_queue(queue)
56
- @queue = queue
57
- end
58
-
59
57
  def observations_queue
60
58
  @observations_queue ||= CappedQueue.new(MAX_OBS_QUEUE_LENGTH)
61
59
  end
@@ -104,8 +102,8 @@ module Sqreen
104
102
  # we may want to do that in a thread in order to prevent delaying app
105
103
  # startup
106
104
  # set_at_exit do not place a global at_exit (used for testing)
105
+ # @param [Sqreen::Frameworks::GenericFramework] framework
107
106
  def initialize(configuration, framework, set_at_exit = true, session_class = Sqreen::Session)
108
- Sqreen.update_queue(CappedQueue.new(MAX_QUEUE_LENGTH))
109
107
  @logged_out_tried = false
110
108
  @configuration = configuration
111
109
  @framework = framework
@@ -132,6 +130,7 @@ module Sqreen
132
130
  Sqreen::Kit::Configuration.ingestion_url = chosen_endpoints.ingestion.url
133
131
  Sqreen::Kit::Configuration.certificate_store = chosen_endpoints.ingestion.ca_store
134
132
  Sqreen::Kit::Configuration.proxy_url = @proxy_url
133
+ Sqreen::Kit::Configuration.default_source = "sqreen:agent:ruby:#{Sqreen::VERSION}"
135
134
 
136
135
  register_exit_cb if set_at_exit
137
136
 
@@ -168,6 +167,10 @@ module Sqreen
168
167
  end
169
168
  self.features = wanted_features
170
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
+
171
174
  # Ensure a deliverer is there unless features have set it first
172
175
  self.deliverer ||= Deliveries::Simple.new(session)
173
176
  context_infos = {}
@@ -268,6 +271,10 @@ module Sqreen
268
271
  rulespack_id, rules = load_rules(context_infos)
269
272
  @framework.instrument_when_ready!(instrumenter, rules)
270
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
271
278
  rulespack_id.to_s
272
279
  end
273
280
 
@@ -392,6 +399,13 @@ module Sqreen
392
399
  { :was => prev }
393
400
  end
394
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
+
395
409
  def upload_bundle(_context_infos = {})
396
410
  t = Time.now
397
411
  session.post_bundle(RuntimeInfos.dependencies_signature, RuntimeInfos.dependencies)
@@ -249,8 +249,10 @@ module Sqreen
249
249
  end
250
250
  Sqreen.log.info 'Login success.'
251
251
  @session_id = res['session_id']
252
+
252
253
  Kit::Configuration.session_key = @session_id
253
254
  Kit.reset
255
+
254
256
  Sqreen.log.debug { "received session_id #{@session_id}" }
255
257
  Sqreen.logged_in = true
256
258
  res
@@ -118,6 +118,7 @@ module Sqreen
118
118
  signals += req_rec.processed_sdk_calls
119
119
  .select { |h| h[:name] == :track }
120
120
  .map { |h| convert_track(h) }
121
+ signals += (observed[:signals] || [])
121
122
 
122
123
  trace = Kit::Signals::Specialized::HttpTrace.new(
123
124
  actor: Kit::Signals::Actor.new(
@@ -137,7 +138,7 @@ module Sqreen
137
138
  trace
138
139
  end
139
140
 
140
- # @param [Array<Sqreen::Kit::Signals::Signal|Sqreen::Kit::Signals::Trace>] batch
141
+ # @return [Array<Sqreen::Kit::Signals::Signal|Sqreen::Kit::Signals::Trace>]
141
142
  def convert_batch(batch)
142
143
  batch.map do |evt|
143
144
  case evt
@@ -147,6 +148,10 @@ module Sqreen
147
148
  convert_metric_sample(evt)
148
149
  when RequestRecord
149
150
  convert_req_record(evt)
151
+ when Sqreen::Kit::Signals::Signal
152
+ evt
153
+ when Sqreen::Kit::Signals::Trace
154
+ evt
150
155
  else
151
156
  raise NotImplementedError, "Unknown type of event in batch: #{evt}"
152
157
  end
@@ -4,5 +4,5 @@
4
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
5
 
6
6
  module Sqreen
7
- VERSION = '1.20.1'.freeze
7
+ VERSION = '1.21.0.beta1'.freeze
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.1
4
+ version: 1.21.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sqreen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-24 00:00:00.000000000 Z
11
+ date: 2020-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sqreen-backport
@@ -122,6 +122,30 @@ files:
122
122
  - lib/sqreen/dependency/rails.rb
123
123
  - lib/sqreen/dependency/sentry.rb
124
124
  - lib/sqreen/dependency/sinatra.rb
125
+ - lib/sqreen/ecosystem.rb
126
+ - lib/sqreen/ecosystem/dispatch_table.rb
127
+ - lib/sqreen/ecosystem/http/net_http.rb
128
+ - lib/sqreen/ecosystem/http/rack_request.rb
129
+ - lib/sqreen/ecosystem/loggable.rb
130
+ - lib/sqreen/ecosystem/module_api.rb
131
+ - lib/sqreen/ecosystem/module_api/event_listener.rb
132
+ - lib/sqreen/ecosystem/module_api/instrumentation.rb
133
+ - lib/sqreen/ecosystem/module_api/signal_producer.rb
134
+ - lib/sqreen/ecosystem/module_api/tracing_push_down.rb
135
+ - lib/sqreen/ecosystem/module_api/transaction_storage.rb
136
+ - lib/sqreen/ecosystem/module_registry.rb
137
+ - lib/sqreen/ecosystem/redis/redis_connection.rb
138
+ - lib/sqreen/ecosystem/tracing/sampler.rb
139
+ - lib/sqreen/ecosystem/tracing/sampling_configuration.rb
140
+ - lib/sqreen/ecosystem/tracing/signals/tracing_client.rb
141
+ - lib/sqreen/ecosystem/tracing/signals/tracing_server.rb
142
+ - lib/sqreen/ecosystem/tracing_id_setup.rb
143
+ - lib/sqreen/ecosystem/transaction_storage.rb
144
+ - lib/sqreen/ecosystem_integration.rb
145
+ - lib/sqreen/ecosystem_integration/around_callbacks.rb
146
+ - lib/sqreen/ecosystem_integration/instrumentation_service.rb
147
+ - lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb
148
+ - lib/sqreen/ecosystem_integration/signal_consumption.rb
125
149
  - lib/sqreen/encoding_sanitizer.rb
126
150
  - lib/sqreen/endpoint_testing.rb
127
151
  - lib/sqreen/error_handling_middleware.rb
@@ -277,7 +301,9 @@ metadata:
277
301
  changelog_uri: https://docs.sqreen.com/ruby/release-notes/
278
302
  source_code_uri: https://github.com/sqreen/ruby-agent
279
303
  bug_tracker_uri: https://github.com/sqreen/ruby-agent/issues
280
- post_install_message:
304
+ post_install_message: |2
305
+ This is a Sqreen beta release and may not work in all situations.
306
+ Make sure to review CHANGELOG.md for important details.
281
307
  rdoc_options: []
282
308
  require_paths:
283
309
  - lib
@@ -288,12 +314,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
288
314
  version: 1.9.3
289
315
  required_rubygems_version: !ruby/object:Gem::Requirement
290
316
  requirements:
291
- - - ">="
317
+ - - ">"
292
318
  - !ruby/object:Gem::Version
293
- version: '0'
319
+ version: 1.3.1
294
320
  requirements: []
295
- rubyforge_project:
296
- rubygems_version: 2.7.7
321
+ rubygems_version: 3.1.2
297
322
  signing_key:
298
323
  specification_version: 4
299
324
  summary: Sqreen Ruby agent