sqreen 1.20.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.
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