sqreen 1.19.1 → 1.21.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/lib/sqreen/agent_message.rb +20 -0
  4. data/lib/sqreen/aggregated_metric.rb +25 -0
  5. data/lib/sqreen/attack_detected.html +1 -2
  6. data/lib/sqreen/ca.crt +24 -0
  7. data/lib/sqreen/configuration.rb +10 -4
  8. data/lib/sqreen/deliveries/batch.rb +12 -2
  9. data/lib/sqreen/deliveries/simple.rb +4 -0
  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/endpoint_testing.rb +184 -0
  35. data/lib/sqreen/event.rb +7 -5
  36. data/lib/sqreen/events/attack.rb +23 -18
  37. data/lib/sqreen/events/remote_exception.rb +0 -22
  38. data/lib/sqreen/events/request_record.rb +15 -70
  39. data/lib/sqreen/frameworks/generic.rb +15 -1
  40. data/lib/sqreen/frameworks/request_recorder.rb +13 -2
  41. data/lib/sqreen/graft/call.rb +9 -0
  42. data/lib/sqreen/kit/signals/specialized/aggregated_metric.rb +72 -0
  43. data/lib/sqreen/kit/signals/specialized/attack.rb +57 -0
  44. data/lib/sqreen/kit/signals/specialized/binning_metric.rb +76 -0
  45. data/lib/sqreen/kit/signals/specialized/http_trace.rb +26 -0
  46. data/lib/sqreen/kit/signals/specialized/sdk_track_call.rb +50 -0
  47. data/lib/sqreen/kit/signals/specialized/sqreen_exception.rb +57 -0
  48. data/lib/sqreen/legacy/old_event_submission_strategy.rb +227 -0
  49. data/lib/sqreen/legacy/waf_redactions.rb +49 -0
  50. data/lib/sqreen/log/loggable.rb +1 -1
  51. data/lib/sqreen/metrics/base.rb +3 -0
  52. data/lib/sqreen/metrics_store.rb +22 -12
  53. data/lib/sqreen/performance_notifications/binned_metrics.rb +8 -2
  54. data/lib/sqreen/remote_command.rb +3 -0
  55. data/lib/sqreen/rules.rb +4 -2
  56. data/lib/sqreen/rules/not_found_cb.rb +2 -0
  57. data/lib/sqreen/rules/rule_cb.rb +2 -0
  58. data/lib/sqreen/rules/waf_cb.rb +13 -10
  59. data/lib/sqreen/runner.rb +94 -13
  60. data/lib/sqreen/sensitive_data_redactor.rb +19 -31
  61. data/lib/sqreen/session.rb +53 -43
  62. data/lib/sqreen/signals/conversions.rb +288 -0
  63. data/lib/sqreen/signals/http_trace_redaction.rb +111 -0
  64. data/lib/sqreen/signals/signals_submission_strategy.rb +78 -0
  65. data/lib/sqreen/version.rb +1 -1
  66. data/lib/sqreen/weave/legacy/instrumentation.rb +4 -4
  67. metadata +74 -10
  68. data/lib/sqreen/backport.rb +0 -9
  69. data/lib/sqreen/backport/clock_gettime.rb +0 -74
  70. data/lib/sqreen/backport/original_name.rb +0 -88
@@ -0,0 +1,111 @@
1
+ require 'json'
2
+ require 'sqreen/kit/loggable'
3
+ require 'sqreen/kit/signals/specialized/http_trace'
4
+
5
+ module Sqreen
6
+ module Signals
7
+ module HttpTraceRedaction
8
+ class << self
9
+ include Sqreen::Kit::Loggable
10
+
11
+ # @param [Sqreen::Kit::Signals::Specialized::HttpTrace] trace
12
+ # @param [Sqreen::SensitiveDataRedactor] redactor
13
+ def redact_trace!(trace, redactor)
14
+ return unless redactor
15
+ # redact headers (keys unsafe)
16
+ # @type [Sqreen::Kit::Signals::Context::HttpContext]
17
+ http_context = trace.context
18
+
19
+ all_redacted = []
20
+
21
+ # Redact headers; save redacted values
22
+ # headers are encoded as [key, value], not a hash, so
23
+ # they require some transformation
24
+ orig_headers = http_context.headers
25
+ if orig_headers
26
+ headers = orig_headers.map { |(k, v)| { k => v } }
27
+ headers, redacted = redactor.redact(headers)
28
+ http_context.headers = headers.map(&:first)
29
+ all_redacted += redacted
30
+ end
31
+
32
+ # Redact params; save redacted values
33
+ Kit::Signals::Context::HttpContext::PARAMS_ATTRS.each do |attr|
34
+ value = http_context.public_send(attr)
35
+ next unless value
36
+ value, redacted = redactor.redact(value)
37
+ all_redacted += redacted
38
+ http_context.public_send(:"#{attr}=", value)
39
+ end
40
+
41
+ all_redacted = all_redacted.uniq.map(&:downcase)
42
+
43
+ # Redact attacks and exceptions
44
+ # XXX: no redaction for infos in attacks/exceptions except for WAF data
45
+ # Is this the correct behavior?
46
+ redact_attacks!(trace, redactor, all_redacted)
47
+ redact_exceptions!(trace, redactor, all_redacted)
48
+ end
49
+
50
+ private
51
+
52
+ # @param [Sqreen::Kit::Signals::Specialized::HttpTrace] trace
53
+ # @param [Sqreen::SensitiveDataRedactor] redactor
54
+ # Redacts WAF data according to specific rules therefor
55
+ # Redacts infos according to general rules
56
+ def redact_attacks!(trace, redactor, redacted_data)
57
+ trace.data.each do |signal|
58
+ next unless signal.is_a?(Kit::Signals::Specialized::Attack)
59
+ # @type [Sqreen::Kit::Signals::Specialized::Attack::Payload] payload
60
+ payload = signal.payload
61
+ next unless payload.infos
62
+
63
+ if payload.infos[:waf_data]
64
+ redact_waf_attack_data!(payload.infos, redacted_data)
65
+ end
66
+ payload.infos, = redactor.redact(payload.infos)
67
+ end
68
+ end
69
+
70
+ def redact_exceptions!(trace, redactor, redacted_data)
71
+ trace.data.each do |signal|
72
+ next unless signal.is_a?(Kit::Signals::Specialized::SqreenException)
73
+ infos = signal.infos
74
+ next unless infos
75
+
76
+ redact_waf_exception_data!(signal.infos, redacted_data) if signal.infos[:waf]
77
+ signal.infos, = redactor.redact(infos)
78
+ end
79
+ end
80
+
81
+ # @param [Hash] infos from WAF attack
82
+ def redact_waf_attack_data!(infos, redacted_data)
83
+ begin
84
+ parsed = JSON.parse(infos[:waf_data])
85
+ rescue JSON::JSONError => e
86
+ logger.warn("waf_data is not valid json: #{e.message}")
87
+ return
88
+ end
89
+ redacted = parsed.each do |w|
90
+ next unless (filters = w['filter'])
91
+
92
+ filters.each do |f|
93
+ next unless (v = f['resolved_value'])
94
+ next unless redacted_data.include?(v.downcase)
95
+
96
+ f['match_status'] = SensitiveDataRedactor::MASK
97
+ f['resolved_value'] = SensitiveDataRedactor::MASK
98
+ end
99
+ end
100
+ infos[:waf_data] = JSON.dump(redacted)
101
+ end
102
+
103
+ # see https://github.com/sqreen/TechDoc/blob/master/content/specs/spec000022-waf-data-sanitization.md#changes-to-the-agents
104
+ def redact_waf_exception_data!(infos, redacted_data)
105
+ return if redacted_data.empty?
106
+ infos[:waf].delete(:args)
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,78 @@
1
+ require 'sqreen/aggregated_metric'
2
+ require 'sqreen/kit'
3
+ require 'sqreen/kit/string_sanitizer'
4
+ require 'sqreen/signals/conversions'
5
+ require 'sqreen/log/loggable'
6
+
7
+ module Sqreen
8
+ module Signals
9
+ # see also Sqreen::Legacy::OldEventSubmissionStrategy
10
+ # usage in Sqreen:Session
11
+ class SignalsSubmissionStrategy
12
+ include Sqreen::Log::Loggable
13
+
14
+ # @param [Array<Sqreen::AggregatedMetric>] metrics
15
+ def post_metrics(metrics)
16
+ return if metrics.nil? || metrics.empty?
17
+
18
+ guarded 'Failed to serialize or submit aggregated metrics' do
19
+ batch = metrics.map do |m|
20
+ Conversions.convert_metric_sample(m)
21
+ end
22
+ client.report_batch(batch)
23
+ end
24
+ end
25
+
26
+ # @param _attack [Sqreen::Attack]
27
+ # XXX: unused
28
+ def post_attack(_attack)
29
+ raise NotImplementedError
30
+ end
31
+
32
+ # @param request_record [Sqreen::RequestRecord]
33
+ def post_request_record(request_record)
34
+ guarded 'Failed to serialize or submit request record' do
35
+ trace = Conversions.convert_req_record(request_record)
36
+ append_sanitizing_filter(trace)
37
+ client.report_trace(trace)
38
+ end
39
+ end
40
+
41
+ # Post an exception to Sqreen for analysis
42
+ # @param exception [RemoteException] Exception and context to be sent over
43
+ def post_sqreen_exception(exception)
44
+ guarded 'Failed to serialize or submit exception', false do
45
+ data = Conversions.convert_exception(exception)
46
+ append_sanitizing_filter(data)
47
+ client.report_signal(data)
48
+ end
49
+ end
50
+
51
+ def post_batch(events)
52
+ guarded 'Failed to serialize or submit batch of events' do
53
+ batch = Conversions.convert_batch(events)
54
+ batch.each { |sig_or_trace| append_sanitizing_filter(sig_or_trace) }
55
+ client.report_batch(batch)
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def append_sanitizing_filter(sig_or_trace)
62
+ sig_or_trace.append_to_h_filter Kit::StringSanitizer.method(:sanitize)
63
+ end
64
+
65
+ # we don't want exceptions to propagate and kill the worker thread
66
+ def guarded(msg, report = true)
67
+ yield
68
+ rescue StandardError => e
69
+ logger.warn "#{msg}: #{e.message}\n#{e.backtrace.map { |x| " #{x}" }.join("\n")}"
70
+ post_sqreen_exception(RemoteException.new(e)) if report
71
+ end
72
+
73
+ def client
74
+ Sqreen::Kit.auth_signals_client
75
+ end
76
+ end
77
+ end
78
+ 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.19.1'.freeze
7
+ VERSION = '1.21.0.beta1'.freeze
8
8
  end
@@ -296,7 +296,7 @@ class Sqreen::Weave::Legacy::Instrumentation
296
296
  when :raise, 'raise'
297
297
  throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
298
298
  throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
299
- end unless ret.nil?
299
+ end unless ret.nil? || !ret.is_a?(Hash)
300
300
  end
301
301
  end
302
302
 
@@ -328,7 +328,7 @@ class Sqreen::Weave::Legacy::Instrumentation
328
328
  when :raise, 'raise'
329
329
  throw(b, b.raise(ret[:exception])) if ret.key?(:exception)
330
330
  throw(b, b.raise(Sqreen::AttackBlocked.new("Sqreen blocked a security threat (type: #{callback.rule_name}). No action is required.")))
331
- end unless ret.nil?
331
+ end unless ret.nil? || !ret.is_a?(Hash)
332
332
  end
333
333
  end
334
334
 
@@ -354,7 +354,7 @@ class Sqreen::Weave::Legacy::Instrumentation
354
354
  end
355
355
  Sqreen::Weave.logger.debug { "#{rule} klass=#{callback.klass} method=#{callback.method} when=#failing instance=#{i} => return=#{ret.inspect}" }
356
356
 
357
- raise e if ret.nil?
357
+ throw(b, b.raise(e)) if ret.nil? || !ret.is_a?(Hash)
358
358
 
359
359
  case ret[:status]
360
360
  when :override, 'override'
@@ -368,7 +368,7 @@ class Sqreen::Weave::Legacy::Instrumentation
368
368
  throw(b, b.raise(e))
369
369
  else
370
370
  throw(b, b.raise(e))
371
- end unless ret.nil?
371
+ end unless ret.nil? || !ret.is_a?(Hash)
372
372
  end
373
373
  end
374
374
  end.install
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sqreen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.19.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-01 00:00:00.000000000 Z
11
+ date: 2020-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sqreen-backport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqreen-kit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.1
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: sq_mini_racer
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -65,11 +93,10 @@ files:
65
93
  - lib/sqreen/actions/user_action_class.rb
66
94
  - lib/sqreen/actions/users_index.rb
67
95
  - lib/sqreen/agent.rb
96
+ - lib/sqreen/agent_message.rb
97
+ - lib/sqreen/aggregated_metric.rb
68
98
  - lib/sqreen/attack_blocked.rb
69
99
  - lib/sqreen/attack_detected.html
70
- - lib/sqreen/backport.rb
71
- - lib/sqreen/backport/clock_gettime.rb
72
- - lib/sqreen/backport/original_name.rb
73
100
  - lib/sqreen/binding_accessor.rb
74
101
  - lib/sqreen/binding_accessor/path_elem.rb
75
102
  - lib/sqreen/binding_accessor/transforms.rb
@@ -95,7 +122,32 @@ files:
95
122
  - lib/sqreen/dependency/rails.rb
96
123
  - lib/sqreen/dependency/sentry.rb
97
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
98
149
  - lib/sqreen/encoding_sanitizer.rb
150
+ - lib/sqreen/endpoint_testing.rb
99
151
  - lib/sqreen/error_handling_middleware.rb
100
152
  - lib/sqreen/event.rb
101
153
  - lib/sqreen/events/attack.rb
@@ -129,8 +181,16 @@ files:
129
181
  - lib/sqreen/js/mini_racer_adapter.rb
130
182
  - lib/sqreen/js/mini_racer_executable_js.rb
131
183
  - lib/sqreen/js/thread_local_exec_js_runnable.rb
184
+ - lib/sqreen/kit/signals/specialized/aggregated_metric.rb
185
+ - lib/sqreen/kit/signals/specialized/attack.rb
186
+ - lib/sqreen/kit/signals/specialized/binning_metric.rb
187
+ - lib/sqreen/kit/signals/specialized/http_trace.rb
188
+ - lib/sqreen/kit/signals/specialized/sdk_track_call.rb
189
+ - lib/sqreen/kit/signals/specialized/sqreen_exception.rb
132
190
  - lib/sqreen/legacy.rb
133
191
  - lib/sqreen/legacy/instrumentation.rb
192
+ - lib/sqreen/legacy/old_event_submission_strategy.rb
193
+ - lib/sqreen/legacy/waf_redactions.rb
134
194
  - lib/sqreen/log.rb
135
195
  - lib/sqreen/log/loggable.rb
136
196
  - lib/sqreen/logger.rb
@@ -201,6 +261,9 @@ files:
201
261
  - lib/sqreen/shared_storage.rb
202
262
  - lib/sqreen/shared_storage23.rb
203
263
  - lib/sqreen/shrink_wrap.rb
264
+ - lib/sqreen/signals/conversions.rb
265
+ - lib/sqreen/signals/http_trace_redaction.rb
266
+ - lib/sqreen/signals/signals_submission_strategy.rb
204
267
  - lib/sqreen/signature_verifier.rb
205
268
  - lib/sqreen/sinatra_middleware.rb
206
269
  - lib/sqreen/sqreen_signed_verifier.rb
@@ -238,7 +301,9 @@ metadata:
238
301
  changelog_uri: https://docs.sqreen.com/ruby/release-notes/
239
302
  source_code_uri: https://github.com/sqreen/ruby-agent
240
303
  bug_tracker_uri: https://github.com/sqreen/ruby-agent/issues
241
- 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.
242
307
  rdoc_options: []
243
308
  require_paths:
244
309
  - lib
@@ -249,12 +314,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
249
314
  version: 1.9.3
250
315
  required_rubygems_version: !ruby/object:Gem::Requirement
251
316
  requirements:
252
- - - ">="
317
+ - - ">"
253
318
  - !ruby/object:Gem::Version
254
- version: '0'
319
+ version: 1.3.1
255
320
  requirements: []
256
- rubyforge_project:
257
- rubygems_version: 2.7.7
321
+ rubygems_version: 3.1.2
258
322
  signing_key:
259
323
  specification_version: 4
260
324
  summary: Sqreen Ruby agent
@@ -1,9 +0,0 @@
1
- # typed: strong
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 Backport
8
- end
9
- end
@@ -1,74 +0,0 @@
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
- require 'sqreen/backport'
7
-
8
- module Sqreen
9
- module Backport
10
- module ClockGettime
11
- class << self
12
- def supported?
13
- Process.respond_to?(:clock_gettime)
14
- end
15
- end
16
-
17
- unless supported?
18
- require 'ffi'
19
-
20
- class Timespec < FFI::Struct
21
- layout :tv_sec => :time_t, :tv_nsec => :long
22
- end
23
-
24
- module LibC
25
- extend FFI::Library
26
- ffi_lib FFI::Library::LIBC
27
-
28
- # TODO: FFI::NotFoundError
29
-
30
- if RUBY_PLATFORM =~ /darwin/
31
- attach_function :mach_absolute_time, [], :uint64
32
- end
33
-
34
- attach_function :clock_gettime, [:int, :pointer], :int
35
- end
36
-
37
- module Constants
38
- case RUBY_PLATFORM
39
- when /darwin/
40
- CLOCK_REALTIME = 0
41
- CLOCK_MONOTONIC = 6
42
- CLOCK_PROCESS_CPUTIME_ID = 12
43
- CLOCK_THERAD_CPUTIME_ID = 16
44
- when /linux/
45
- CLOCK_REALTIME = 0
46
- CLOCK_MONOTONIC = 1
47
- CLOCK_PROCESS_CPUTIME_ID = 2
48
- CLOCK_THREAD_CPUTIME_ID = 3
49
- end
50
- end
51
-
52
- def clock_gettime(clock_id, unit = :float_second)
53
- unless unit == :float_second
54
- raise "Process.clock_gettime: unsupported unit #{unit.inspect}"
55
- end
56
-
57
- t = Timespec.new
58
- ret = LibC.clock_gettime(clock_id, t.pointer)
59
-
60
- raise SystemCallError, "Errno #{FFI.errno}" if ret == -1
61
-
62
- t[:tv_sec].to_f + t[:tv_nsec].to_f / 1_000_000_000
63
- end
64
- end
65
- end
66
- end
67
- end
68
-
69
- unless Sqreen::Backport::ClockGettime.supported?
70
- Process.instance_eval do
71
- extend Sqreen::Backport::ClockGettime
72
- include Sqreen::Backport::ClockGettime::Constants
73
- end
74
- end