sqreen 1.20.4 → 1.21.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -25
  3. data/lib/sqreen/actions/block_user.rb +1 -1
  4. data/lib/sqreen/actions/redirect_ip.rb +1 -1
  5. data/lib/sqreen/actions/redirect_user.rb +1 -1
  6. data/lib/sqreen/condition_evaluator.rb +2 -8
  7. data/lib/sqreen/configuration.rb +1 -1
  8. data/lib/sqreen/deferred_logger.rb +14 -50
  9. data/lib/sqreen/deliveries/batch.rb +8 -1
  10. data/lib/sqreen/ecosystem.rb +80 -0
  11. data/lib/sqreen/ecosystem/dispatch_table.rb +43 -0
  12. data/lib/sqreen/ecosystem/http/net_http.rb +51 -0
  13. data/lib/sqreen/ecosystem/http/rack_request.rb +38 -0
  14. data/lib/sqreen/ecosystem/loggable.rb +13 -0
  15. data/lib/sqreen/ecosystem/module_api.rb +30 -0
  16. data/lib/sqreen/ecosystem/module_api/event_listener.rb +18 -0
  17. data/lib/sqreen/ecosystem/module_api/instrumentation.rb +23 -0
  18. data/lib/sqreen/ecosystem/module_api/signal_producer.rb +26 -0
  19. data/lib/sqreen/ecosystem/module_api/tracing_push_down.rb +34 -0
  20. data/lib/sqreen/ecosystem/module_api/transaction_storage.rb +71 -0
  21. data/lib/sqreen/ecosystem/module_registry.rb +39 -0
  22. data/lib/sqreen/ecosystem/redis/redis_connection.rb +35 -0
  23. data/lib/sqreen/ecosystem/tracing/sampler.rb +160 -0
  24. data/lib/sqreen/ecosystem/tracing/sampling_configuration.rb +150 -0
  25. data/lib/sqreen/ecosystem/tracing/signals/tracing_client.rb +53 -0
  26. data/lib/sqreen/ecosystem/tracing/signals/tracing_server.rb +53 -0
  27. data/lib/sqreen/ecosystem/tracing_id_setup.rb +34 -0
  28. data/lib/sqreen/ecosystem/transaction_storage.rb +64 -0
  29. data/lib/sqreen/ecosystem_integration.rb +70 -0
  30. data/lib/sqreen/ecosystem_integration/around_callbacks.rb +89 -0
  31. data/lib/sqreen/ecosystem_integration/instrumentation_service.rb +38 -0
  32. data/lib/sqreen/ecosystem_integration/request_lifecycle_tracking.rb +56 -0
  33. data/lib/sqreen/ecosystem_integration/signal_consumption.rb +35 -0
  34. data/lib/sqreen/encoding_sanitizer.rb +27 -0
  35. data/lib/sqreen/events/request_record.rb +1 -0
  36. data/lib/sqreen/frameworks/generic.rb +15 -10
  37. data/lib/sqreen/frameworks/rails.rb +7 -0
  38. data/lib/sqreen/frameworks/request_recorder.rb +0 -2
  39. data/lib/sqreen/graft/call.rb +23 -72
  40. data/lib/sqreen/graft/callback.rb +1 -1
  41. data/lib/sqreen/graft/hook.rb +85 -187
  42. data/lib/sqreen/graft/hook_point.rb +1 -1
  43. data/lib/sqreen/legacy/instrumentation.rb +10 -22
  44. data/lib/sqreen/legacy/old_event_submission_strategy.rb +8 -3
  45. data/lib/sqreen/log.rb +2 -3
  46. data/lib/sqreen/log/loggable.rb +0 -1
  47. data/lib/sqreen/logger.rb +0 -24
  48. data/lib/sqreen/metrics_store.rb +0 -11
  49. data/lib/sqreen/null_logger.rb +0 -22
  50. data/lib/sqreen/remote_command.rb +3 -1
  51. data/lib/sqreen/rules.rb +4 -8
  52. data/lib/sqreen/rules/blacklist_ips_cb.rb +2 -2
  53. data/lib/sqreen/rules/custom_error_cb.rb +3 -3
  54. data/lib/sqreen/rules/rule_cb.rb +0 -2
  55. data/lib/sqreen/rules/waf_cb.rb +3 -3
  56. data/lib/sqreen/runner.rb +21 -33
  57. data/lib/sqreen/session.rb +2 -0
  58. data/lib/sqreen/signals/conversions.rb +6 -1
  59. data/lib/sqreen/version.rb +1 -1
  60. data/lib/sqreen/weave/legacy/instrumentation.rb +103 -194
  61. data/lib/sqreen/worker.rb +2 -6
  62. metadata +35 -10
  63. data/lib/sqreen/deprecation.rb +0 -38
  64. data/lib/sqreen/weave/budget.rb +0 -46
@@ -42,7 +42,7 @@ module Sqreen
42
42
  end
43
43
 
44
44
  def to_s
45
- @to_s ||= "#{@klass_name}#{@method_kind == :instance_method ? '#' : '.'}#{@method_name}"
45
+ "#{@klass_name}#{@method_kind == :instance_method ? '#' : '.'}#{@method_name}"
46
46
  end
47
47
 
48
48
  def exist?
@@ -109,7 +109,7 @@ module Legacy
109
109
  break if res.is_a?(Hash) && res[:skip_rem_cbs]
110
110
  rescue StandardError => e
111
111
  Sqreen.log.warn { "we catch an exception: #{e.inspect}" }
112
- Sqreen.log.debug { e.backtrace }
112
+ Sqreen.log.debug e.backtrace
113
113
  if cb.respond_to?(:record_exception)
114
114
  cb.record_exception(e)
115
115
  else
@@ -162,7 +162,7 @@ module Legacy
162
162
  returns << res
163
163
  rescue StandardError => e
164
164
  Sqreen.log.warn { "we catch an exception: #{e.inspect}" }
165
- Sqreen.log.debug { e.backtrace }
165
+ Sqreen.log.debug e.backtrace
166
166
  if cb.respond_to?(:record_exception)
167
167
  cb.record_exception(e)
168
168
  else
@@ -597,25 +597,16 @@ module Legacy
597
597
  method = cb.method
598
598
  key = [klass, method]
599
599
 
600
- if (call_count = ENV['SQREEN_DEBUG_CALL_COUNT'])
601
- call_count = JSON.parse(call_count)
602
- if cb.respond_to?(:rule_name) && call_count.key?(cb.rule_name)
603
- count = call_count[cb.rule_name]
604
- Sqreen.log.debug { "override rule:#{cb.rule_name} call_count:#{count.inspect}" }
605
- cb.instance_eval { @call_count_interval = call_count[cb.rule_name] }
606
- end
607
- end
608
-
609
600
  @@record_request_hookpoints << key if cb.is_a?(Sqreen::Rules::RecordRequestContext)
610
601
 
611
602
  already_overriden = @@overriden_methods.include? key
612
603
 
613
604
  if !already_overriden
614
605
  if is_class_method?(klass, method)
615
- Sqreen.log.debug { "overriding class method for #{cb}" }
606
+ Sqreen.log.debug "overriding class method for #{cb}"
616
607
  success = override_class_method(klass, method)
617
608
  elsif is_instance_method?(klass, method)
618
- Sqreen.log.debug { "overriding instance method for #{cb}" }
609
+ Sqreen.log.debug "overriding instance method for #{cb}"
619
610
  success = override_instance_method(klass, method)
620
611
  else
621
612
  # FIXME: Override define_method and other dynamic ways to
@@ -632,7 +623,7 @@ module Legacy
632
623
 
633
624
  @@overriden_methods += [key] if success
634
625
  else
635
- Sqreen.log.debug { "#{key} was already overriden" }
626
+ Sqreen.log.debug "#{key} was already overriden"
636
627
  end
637
628
 
638
629
  if klass != Object && klass != Kernel && !Sqreen.features['instrument_all_instances'] && !defined?(::JRUBY_VERSION)
@@ -647,7 +638,7 @@ module Legacy
647
638
  end
648
639
  end
649
640
 
650
- Sqreen.log.debug { "Adding callback #{cb} for #{klass} #{method}" }
641
+ Sqreen.log.debug "Adding callback #{cb} for #{klass} #{method}"
651
642
  @@registered_callbacks.add(cb)
652
643
  @@unovertimable_hookpoints << key unless cb.overtimeable
653
644
  @@instrumented_pid = Process.pid
@@ -668,7 +659,7 @@ module Legacy
668
659
 
669
660
  already_overriden = @@overriden_methods.include? key
670
661
  unless already_overriden
671
- Sqreen.log.debug { "#{key} apparently not overridden" }
662
+ Sqreen.log.debug "#{key} apparently not overridden"
672
663
  end
673
664
 
674
665
  defined_cbs = @@registered_callbacks.get(klass, method).flatten
@@ -676,17 +667,17 @@ module Legacy
676
667
  nb_removed = 0
677
668
  defined_cbs.each do |found_cb|
678
669
  if found_cb == cb
679
- Sqreen.log.debug { "Removing callback #{found_cb}" }
670
+ Sqreen.log.debug "Removing callback #{found_cb}"
680
671
  @@registered_callbacks.remove(found_cb)
681
672
  nb_removed += 1
682
673
  else
683
- Sqreen.log.debug { "Not removing callback #{found_cb} (remains #{defined_cbs.size} cbs)" }
674
+ Sqreen.log.debug "Not removing callback #{found_cb} (remains #{defined_cbs.size} cbs)"
684
675
  end
685
676
  end
686
677
 
687
678
  return unless nb_removed == defined_cbs.size
688
679
 
689
- Sqreen.log.debug { "Removing overriden method #{key}" }
680
+ Sqreen.log.debug "Removing overriden method #{key}"
690
681
  @@overriden_methods.delete(key)
691
682
 
692
683
  if is_class_method?(klass, method)
@@ -714,7 +705,6 @@ module Legacy
714
705
  remove_callback_no_lock(cb)
715
706
  end
716
707
  Sqreen.instrumentation_ready = false
717
- Sqreen.log.info('Instrumentation deactivated')
718
708
  end
719
709
  end
720
710
 
@@ -767,8 +757,6 @@ module Legacy
767
757
  ### globally declare instrumentation ready
768
758
  ### from within instance method? not even thread local?
769
759
  Sqreen.instrumentation_ready = true
770
-
771
- Sqreen.log.info('Instrumentation activated')
772
760
  end
773
761
 
774
762
  def initialize(metrics_engine = nil)
@@ -6,7 +6,6 @@
6
6
  require 'sqreen/aggregated_metric'
7
7
  require 'sqreen/log/loggable'
8
8
  require 'sqreen/legacy/waf_redactions'
9
- require 'sqreen/kit/string_sanitizer'
10
9
 
11
10
  module Sqreen
12
11
  module Legacy
@@ -56,6 +55,12 @@ module Sqreen
56
55
  when AggregatedMetric
57
56
  logger.warn "Aggregated metric event in non-signal mode. Signals disabled at runtime?"
58
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
59
64
  when Attack # in practice only found inside req rec
60
65
  EventToHash.convert_attack event
61
66
  when RemoteException
@@ -73,7 +78,7 @@ module Sqreen
73
78
  tally = Hash[events.group_by(&:class).map { |k, v| [k, v.count] }]
74
79
  "Doing batch with the following tally of event types: #{tally}"
75
80
  end
76
- post('batch', { batch: batch }, {}, RETRY_MANY)
81
+ post('batch', { batch: batch.compact }, {}, RETRY_MANY)
77
82
  end
78
83
 
79
84
  private
@@ -167,7 +172,7 @@ module Sqreen
167
172
  res[:request][:parameters] = payload['params'] if payload['params']
168
173
  res[:request][:headers] = payload['headers'] if payload['headers']
169
174
 
170
- res = Sqreen::Kit::StringSanitizer.sanitize(res)
175
+ res = Sqreen::EncodingSanitizer.sanitize(res)
171
176
 
172
177
  if rr.redactor
173
178
  res[:request], redacted = rr.redactor.redact(res[:request])
@@ -14,17 +14,16 @@ require 'sqreen/deferred_logger'
14
14
 
15
15
  module Sqreen
16
16
  def self.log_init
17
- deferred_logger = @logger
18
17
  @logger = Sqreen::Logger.new(
19
18
  Sqreen.config_get(:log_level).to_s.upcase,
20
19
  Sqreen.config_get(:log_location)
21
20
  )
22
- deferred_logger.flush_to(@logger.instance_eval { @logger })
21
+ Sqreen::DeferredLogger.instance.flush_to(@logger.instance_eval { @logger })
23
22
  rescue => e
24
23
  warn "Sqreen logger exception: #{e}"
25
24
  end
26
25
 
27
26
  def self::log
28
- @logger ||= Sqreen::DeferredLogger.new
27
+ @logger || Sqreen::DeferredLogger.instance
29
28
  end
30
29
  end
@@ -4,7 +4,6 @@
4
4
  # Please refer to our terms for more information: https://www.sqreen.com/terms.html
5
5
 
6
6
  require 'logger'
7
- require 'sqreen/log'
8
7
 
9
8
  module Sqreen; end
10
9
  module Sqreen::Log; end
@@ -28,26 +28,6 @@ module Sqreen
28
28
  create_error_logger
29
29
  end
30
30
 
31
- def debug?
32
- @logger.debug?
33
- end
34
-
35
- def info?
36
- @logger.info?
37
- end
38
-
39
- def warn?
40
- @logger.warn?
41
- end
42
-
43
- def error?
44
- @logger.error?
45
- end
46
-
47
- def fatal?
48
- @logger.fatal?
49
- end
50
-
51
31
  def debug(msg = nil, &block)
52
32
  @logger.debug(msg, &block)
53
33
  end
@@ -65,10 +45,6 @@ module Sqreen
65
45
  @logger.error(msg, &block)
66
46
  end
67
47
 
68
- def unknown(msg = nil, &block)
69
- @logger.unknown(msg, &block)
70
- end
71
-
72
48
  def add(severity, msg = nil, &block)
73
49
  send(SEVERITY_TO_METHOD[severity], msg, &block)
74
50
  end
@@ -27,7 +27,6 @@ module Sqreen
27
27
  def initialize
28
28
  @store = []
29
29
  @metrics = {} # name => (metric, period, start)
30
- @mutex = Mutex.new
31
30
  end
32
31
 
33
32
  # Definition contains a name,period and aggregate at least
@@ -35,8 +34,6 @@ module Sqreen
35
34
  # @param rule [RuleCB] the rule associated with this metric, if any
36
35
  # @param mklass [Object] Override metric object (used in testing)
37
36
  def create_metric(definition, rule = nil, mklass = nil)
38
- @mutex.lock
39
-
40
37
  name = definition[NAME_KEY]
41
38
  kind = definition[KIND_KEY]
42
39
  klass = valid_metric(kind, name)
@@ -52,8 +49,6 @@ module Sqreen
52
49
  metric.rule = rule
53
50
  metric.period = definition[PERIOD_KEY]
54
51
  metric
55
- ensure
56
- @mutex.unlock
57
52
  end
58
53
 
59
54
  def metric?(name)
@@ -62,27 +57,21 @@ module Sqreen
62
57
 
63
58
  # @param at [Time] when is the store emptied
64
59
  def update(name, at, key, value)
65
- @mutex.lock
66
60
  metric, period, start = @metrics[name]
67
61
  raise UnregisteredMetric, "Unknown metric #{name}" unless metric
68
62
  next_sample(name, at) if start.nil? || (start + period) < at
69
63
  metric.update(key, value)
70
- ensure
71
- @mutex.unlock
72
64
  end
73
65
 
74
66
  # Drains every metrics and returns the store content
75
67
  # @param at [Time] when is the store emptied
76
68
  def publish(flush = true, at = Sqreen.time)
77
- @mutex.lock
78
69
  @metrics.each do |name, (_, period, start)|
79
70
  next_sample(name, at) if flush || !start.nil? && (start + period) < at
80
71
  end
81
72
  out = @store
82
73
  @store = []
83
74
  out
84
- ensure
85
- @mutex.unlock
86
75
  end
87
76
 
88
77
  protected
@@ -9,26 +9,6 @@ module Sqreen
9
9
  class NullLogger
10
10
  include Singleton
11
11
 
12
- def debug?
13
- false
14
- end
15
-
16
- def info?
17
- false
18
- end
19
-
20
- def warn?
21
- false
22
- end
23
-
24
- def error?
25
- false
26
- end
27
-
28
- def fatal?
29
- false
30
- end
31
-
32
12
  def debug(_msg = nil); end
33
13
 
34
14
  def info(_msg = nil); end
@@ -39,8 +19,6 @@ module Sqreen
39
19
 
40
20
  def fatal(_msg = nil); end
41
21
 
42
- def unknown(_msg = nil); end
43
-
44
22
  def add(_severity, _msg = nil); end
45
23
 
46
24
  def formatter=(_); end
@@ -18,11 +18,11 @@ module Sqreen
18
18
  :features_get => :features,
19
19
  :features_change => :change_features,
20
20
  :force_logout => :shutdown,
21
- :force_restart => :restart,
22
21
  :paths_whitelist => :change_whitelisted_paths,
23
22
  :ips_whitelist => :change_whitelisted_ips,
24
23
  :get_bundle => :upload_bundle,
25
24
  :performance_budget => :change_performance_budget,
25
+ :tracing_enable => :tracing_enable,
26
26
  }.freeze
27
27
 
28
28
  attr_reader :uuid
@@ -40,6 +40,8 @@ module Sqreen
40
40
  begin
41
41
  output = runner.send(KNOWN_COMMANDS[@name], *@params, context_infos)
42
42
  rescue => e
43
+ Sqreen.log.warn { "Command failed with #{e}" }
44
+ Sqreen.log.debug { e.backtrace.map { |x| " #{x}" }.join("\n") }
43
45
  Sqreen::RemoteException.record(e)
44
46
  return { :status => false, :reason => "error: #{e.inspect}" }
45
47
  end
@@ -114,19 +114,15 @@ module Sqreen
114
114
  Sqreen.log.warn('No JavaScript engine is available. ' \
115
115
  'JavaScript callbacks will be ignored')
116
116
  end
117
- Sqreen.log.debug("Ignoring JS callback #{rule_name}")
117
+ Sqreen.log.info("Ignoring JS callback #{rule_name}")
118
118
  return nil
119
119
  end
120
120
 
121
121
  cb_class = ExecJSCB if js
122
122
 
123
- if cbname
124
- cb_class = if cbname.include?('::')
125
- # Only load callbacks from sqreen
126
- Rules.walk_const_get(cbname) if cbname.start_with?('::Sqreen::', 'Sqreen::')
127
- else
128
- Rules.const_get(cbname) if Rules.const_defined?(cbname) # rubocop:disable Style/IfInsideElse
129
- end
123
+ if cbname && Rules.const_defined?(cbname)
124
+ # Only load callbacks from sqreen
125
+ cb_class = Rules.const_get(cbname)
130
126
  end
131
127
 
132
128
  if cb_class.nil?
@@ -33,7 +33,7 @@ module Sqreen
33
33
  private
34
34
 
35
35
  def insert_values(ranges)
36
- Sqreen.log.debug 'no ips given for IP blacklisting' if ranges.empty?
36
+ Sqreen.log.info 'no ips given for IP blacklisting' if ranges.empty?
37
37
 
38
38
  ranges.map { |r| Prefix.from_str(r, r) }.each do |prefix|
39
39
  trie_for(prefix).insert prefix
@@ -50,7 +50,7 @@ module Sqreen
50
50
  begin
51
51
  ipa = IPAddr.new(rip)
52
52
  rescue StandardError
53
- Sqreen.log.debug "invalid IP address given by framework: #{rip}"
53
+ Sqreen.log.info "invalid IP address given by framework: #{rip}"
54
54
  return nil
55
55
  end
56
56
 
@@ -55,12 +55,12 @@ module Sqreen
55
55
  end
56
56
 
57
57
  def respond_page
58
- @page ||= File.read(File.join(File.dirname(__FILE__), '../attack_detected.html'))
58
+ page = open(File.join(File.dirname(__FILE__), '../attack_detected.html'))
59
59
  headers = {
60
60
  'Content-Type' => 'text/html',
61
- 'Content-Length' => @page.size.to_s,
61
+ 'Content-Length' => page.size.to_s,
62
62
  }
63
- [@status_code, headers, [@page]]
63
+ [@status_code, headers, page]
64
64
  end
65
65
  end
66
66
  end
@@ -3,7 +3,6 @@
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/deprecation'
7
6
  require 'sqreen/framework_cb'
8
7
  require 'sqreen/context'
9
8
  require 'sqreen/conditionable'
@@ -110,7 +109,6 @@ module Sqreen
110
109
  )
111
110
  true
112
111
  end
113
- Sqreen::Deprecation.deprecate(instance_method(:overtime!))
114
112
  end
115
113
  end
116
114
  end
@@ -11,7 +11,7 @@ require 'sqreen/safe_json'
11
11
  require 'sqreen/exception'
12
12
  require 'sqreen/util/capper'
13
13
  require 'sqreen/dependency/libsqreen'
14
- require 'sqreen/kit/string_sanitizer'
14
+ require 'sqreen/encoding_sanitizer'
15
15
 
16
16
  module Sqreen
17
17
  module Rules
@@ -60,7 +60,7 @@ module Sqreen
60
60
  end
61
61
 
62
62
  # 0 for using defaults (PW_RUN_TIMEOUT)
63
- @max_run_budget_us = (@data['values'].fetch('max_budget_ms', 0) * 1000).to_i
63
+ @max_run_budget_us = (@data['values'].fetch('budget_in_ms', 0) * 1000).to_i
64
64
  @max_run_budget_us = INFINITE_BUDGET_US if @max_run_budget_us >= INFINITE_BUDGET_US
65
65
 
66
66
  Sqreen.log.debug { "Max WAF run budget for #{@waf_rule_name} set to #{@max_run_budget_us} us" }
@@ -82,7 +82,7 @@ module Sqreen
82
82
  waf_args = binding_accessors.each_with_object({}) do |(e, b), h|
83
83
  h[e] = capper.call(b.resolve(*env))
84
84
  end
85
- waf_args = Sqreen::Kit::StringSanitizer.sanitize(waf_args)
85
+ waf_args = Sqreen::EncodingSanitizer.sanitize(waf_args)
86
86
 
87
87
  if budget
88
88
  rem_budget_s = budget - (Sqreen.time - start)
@@ -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
 
@@ -387,28 +394,18 @@ module Sqreen
387
394
 
388
395
  def change_performance_budget(budget, _context_infos = {})
389
396
  return false unless budget.nil? || budget.to_f > 0
390
-
391
- if @configuration.get(:weave)
392
- prev = Sqreen::Weave::Budget.current
393
- prev = prev.to_h if prev
394
-
395
- budget_s = budget.to_f / 1000 if budget
396
-
397
- feature = features['performance_budget']
398
- if feature
399
- budget_s = feature['threshold'] if feature.key?('threshold')
400
- ratio = feature['ratio'] if feature.key?('ratio')
401
- end
402
-
403
- Sqreen::Weave::Budget.update(threshold: budget_s, ratio: ratio)
404
- else
405
- prev = Sqreen.performance_budget
406
- Sqreen.update_performance_budget(budget)
407
- end
408
-
397
+ prev = Sqreen.performance_budget
398
+ Sqreen.update_performance_budget(budget)
409
399
  { :was => prev }
410
400
  end
411
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
+
412
409
  def upload_bundle(_context_infos = {})
413
410
  t = Time.now
414
411
  session.post_bundle(RuntimeInfos.dependencies_signature, RuntimeInfos.dependencies)
@@ -495,15 +492,6 @@ module Sqreen
495
492
  logout
496
493
  end
497
494
 
498
- def restart(_context_infos = {})
499
- shutdown
500
- heartbeat_delay = @heartbeat_delay
501
- Thread.new do
502
- sleep(2 * heartbeat_delay)
503
- Sqreen::Worker.start(Sqreen.framework)
504
- end
505
- end
506
-
507
495
  def logout(retrying = true)
508
496
  return unless session
509
497
  Sqreen.log.debug("Logging out")