sqreen 1.15.4 → 1.15.5
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/lib/sqreen/deliveries/batch.rb +7 -4
- data/lib/sqreen/frameworks/request_recorder.rb +2 -0
- data/lib/sqreen/instrumentation.rb +55 -33
- data/lib/sqreen/metrics/average.rb +1 -1
- data/lib/sqreen/metrics/base.rb +4 -2
- data/lib/sqreen/metrics/binning.rb +3 -2
- data/lib/sqreen/metrics/collect.rb +1 -1
- data/lib/sqreen/metrics/sum.rb +1 -1
- data/lib/sqreen/metrics_store.rb +10 -5
- data/lib/sqreen/mono_time.rb +18 -0
- data/lib/sqreen/performance_notifications.rb +13 -38
- data/lib/sqreen/performance_notifications/binned_metrics.rb +12 -14
- data/lib/sqreen/performance_notifications/log.rb +6 -1
- data/lib/sqreen/performance_notifications/log_performance.rb +3 -1
- data/lib/sqreen/performance_notifications/metrics.rb +6 -3
- data/lib/sqreen/performance_notifications/newrelic.rb +6 -2
- data/lib/sqreen/rules_callbacks/binding_accessor_matcher.rb +3 -2
- data/lib/sqreen/runner.rb +4 -2
- data/lib/sqreen/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f460325e9377e9204840feb8c4f53d580b1f4c84fdf1d361889887d22f7bccf
|
4
|
+
data.tar.gz: 0a92e132141222360ef9deb652ef755e60c863aca6070e3bc2b102d9f43dfbbe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 331ef90dfd3164b75a56bbe9ee35bef1e64204feedd14b60074dc08f32dcfd8b9750f33793bf0dbc11c3063d011a8f9a824dddb1647b0cadad0b72d8d1ae9663
|
7
|
+
data.tar.gz: b5feb7683f00fe75714dea4fc163b5335272b05bb79dfbba59f9af93398a5ee8fda8f636dfb02b9f35b953fee6066154eeb4df5a6f95b3299224295aad8d3525
|
@@ -3,6 +3,8 @@
|
|
3
3
|
|
4
4
|
require 'sqreen/deliveries/simple'
|
5
5
|
require 'sqreen/events/remote_exception'
|
6
|
+
require 'sqreen/mono_time'
|
7
|
+
|
6
8
|
module Sqreen
|
7
9
|
module Deliveries
|
8
10
|
# Simple delivery method that batch event already seen in a batch
|
@@ -41,22 +43,23 @@ module Sqreen
|
|
41
43
|
def stale?
|
42
44
|
min = @first_seen.values.min
|
43
45
|
return false if min.nil?
|
44
|
-
(min + max_staleness) <
|
46
|
+
(min + max_staleness) < Sqreen.time
|
45
47
|
end
|
46
48
|
|
47
49
|
def post_batch_needed?(event)
|
48
|
-
now =
|
50
|
+
now = Sqreen.time
|
51
|
+
# do not use any? {} due to side effects inside block
|
49
52
|
event_keys(event).map do |key|
|
50
53
|
was = @first_seen[key]
|
51
54
|
@first_seen[key] ||= now
|
52
|
-
was.nil? || current_batch.size > max_batch || (was + max_staleness)
|
55
|
+
was.nil? || current_batch.size > max_batch || now > (was + max_staleness)
|
53
56
|
end.any?
|
54
57
|
end
|
55
58
|
|
56
59
|
def post_batch
|
57
60
|
session.post_batch(current_batch)
|
58
61
|
current_batch.clear
|
59
|
-
now =
|
62
|
+
now = Sqreen.time
|
60
63
|
@first_seen.each_key do |key|
|
61
64
|
@first_seen[key] = now
|
62
65
|
end
|
@@ -5,6 +5,8 @@ require 'sqreen/shared_storage'
|
|
5
5
|
require 'sqreen/events/request_record'
|
6
6
|
require 'sqreen/performance_notifications/log_performance'
|
7
7
|
require 'sqreen/performance_notifications/newrelic'
|
8
|
+
require 'sqreen/log'
|
9
|
+
require 'sqreen/runner'
|
8
10
|
|
9
11
|
module Sqreen
|
10
12
|
# Store event/observations that happened in this request
|
@@ -12,6 +12,7 @@ require 'sqreen/shared_storage'
|
|
12
12
|
require 'sqreen/rules_callbacks/record_request_context'
|
13
13
|
require 'sqreen/rules_callbacks/run_req_start_actions'
|
14
14
|
require 'sqreen/rules_callbacks/run_block_user_actions'
|
15
|
+
require 'sqreen/mono_time'
|
15
16
|
require 'set'
|
16
17
|
|
17
18
|
# How to override a class method:
|
@@ -37,6 +38,11 @@ require 'set'
|
|
37
38
|
module Sqreen
|
38
39
|
class Instrumentation
|
39
40
|
OVERTIME_METRIC = 'request_overtime'.freeze
|
41
|
+
|
42
|
+
PRE_CB = 'pre'.freeze
|
43
|
+
POST_CB = 'post'.freeze
|
44
|
+
FAILING_CB = 'failing'.freeze
|
45
|
+
|
40
46
|
MGMT_COST = 0.000025
|
41
47
|
@@override_semaphore = Mutex.new
|
42
48
|
@@overriden_singleton_methods = false
|
@@ -64,7 +70,7 @@ module Sqreen
|
|
64
70
|
@@overriden_methods
|
65
71
|
end
|
66
72
|
def self.callback_wrapper_pre(callbacks, framework, budget, _klass, method, instance, args, &block)
|
67
|
-
all_start = Sqreen
|
73
|
+
all_start = Sqreen.time
|
68
74
|
#Instrumentation.guard_call(method, []) do
|
69
75
|
returns = []
|
70
76
|
callbacks.each do |cb|
|
@@ -76,9 +82,9 @@ module Sqreen
|
|
76
82
|
end
|
77
83
|
Sqreen.log.debug { "running pre cb #{cb}" }
|
78
84
|
begin
|
79
|
-
start = Sqreen
|
85
|
+
start = Sqreen.time
|
80
86
|
res = cb.pre(instance, args, budget, &block)
|
81
|
-
stop = Sqreen
|
87
|
+
stop = Sqreen.time
|
82
88
|
# The first few pre callbacks could not have a request & hence a budget just yet so we try harder to find it
|
83
89
|
budget = framework.remaining_perf_budget if framework && !budget && Sqreen.performance_budget
|
84
90
|
if budget
|
@@ -106,21 +112,21 @@ module Sqreen
|
|
106
112
|
end
|
107
113
|
next
|
108
114
|
end
|
109
|
-
Sqreen::PerformanceNotifications.notify(
|
115
|
+
Sqreen::PerformanceNotifications.notify(rule || cb.class.name, PRE_CB, start, stop)
|
110
116
|
end
|
111
|
-
all_stop = Sqreen
|
117
|
+
all_stop = Sqreen.time
|
112
118
|
framework.remaining_perf_budget = budget - (all_stop - all_start) - MGMT_COST * callbacks.size if framework && budget
|
113
|
-
Sqreen::PerformanceNotifications.notify('
|
119
|
+
Sqreen::PerformanceNotifications.notify('hooks_pre', PRE_CB, all_start, all_stop)
|
114
120
|
returns
|
115
121
|
#end
|
116
122
|
rescue StandardError => e
|
117
|
-
Sqreen.log.warn { "we
|
123
|
+
Sqreen.log.warn { "we caught an exception between cbs: #{e.inspect}" }
|
118
124
|
Sqreen::RemoteException.record(e)
|
119
125
|
[]
|
120
126
|
end
|
121
127
|
|
122
128
|
def self.callback_wrapper_post(callbacks, framework, budget, _klass, method, return_val, instance, args, &block)
|
123
|
-
all_start = Sqreen
|
129
|
+
all_start = Sqreen.time
|
124
130
|
#Instrumentation.guard_call(method, []) do
|
125
131
|
returns = []
|
126
132
|
callbacks.reverse_each do |cb|
|
@@ -131,9 +137,9 @@ module Sqreen
|
|
131
137
|
end
|
132
138
|
Sqreen.log.debug { "running post cb #{cb}" }
|
133
139
|
begin
|
134
|
-
start = Sqreen
|
140
|
+
start = Sqreen.time
|
135
141
|
res = cb.post(return_val, instance, args, budget, &block)
|
136
|
-
stop = Sqreen
|
142
|
+
stop = Sqreen.time
|
137
143
|
if budget
|
138
144
|
budget -= (stop - start)
|
139
145
|
cb.overtime! if budget <= 0.0
|
@@ -158,23 +164,23 @@ module Sqreen
|
|
158
164
|
end
|
159
165
|
next
|
160
166
|
end
|
161
|
-
Sqreen::PerformanceNotifications.notify(
|
167
|
+
Sqreen::PerformanceNotifications.notify(rule || cb.class.name, POST_CB, start, stop)
|
162
168
|
end
|
163
|
-
all_stop = Sqreen
|
169
|
+
all_stop = Sqreen.time
|
164
170
|
if framework && budget && framework.remaining_perf_budget
|
165
171
|
framework.remaining_perf_budget = budget - (all_stop - all_start) - MGMT_COST * callbacks.size
|
166
172
|
end
|
167
|
-
Sqreen::PerformanceNotifications.notify('
|
173
|
+
Sqreen::PerformanceNotifications.notify('hooks_post', POST_CB, all_start, all_stop)
|
168
174
|
returns
|
169
175
|
#end
|
170
176
|
rescue StandardError => e
|
171
|
-
Sqreen.log.warn { "we
|
177
|
+
Sqreen.log.warn { "we caught an exception between cbs: #{e.inspect}" }
|
172
178
|
Sqreen::RemoteException.record(e)
|
173
179
|
[]
|
174
180
|
end
|
175
181
|
|
176
182
|
def self.callback_wrapper_failing(callbacks, framework, budget, exception, _klass, method, instance, args, &block)
|
177
|
-
all_start = Sqreen
|
183
|
+
all_start = Sqreen.time
|
178
184
|
#Instrumentation.guard_call(method, []) do
|
179
185
|
returns = []
|
180
186
|
callbacks.each do |cb|
|
@@ -185,9 +191,9 @@ module Sqreen
|
|
185
191
|
end
|
186
192
|
Sqreen.log.debug { "running failing cb #{cb}" }
|
187
193
|
begin
|
188
|
-
start = Sqreen
|
194
|
+
start = Sqreen.time
|
189
195
|
res = cb.failing(exception, instance, args, budget, &block)
|
190
|
-
stop = Sqreen
|
196
|
+
stop = Sqreen.time
|
191
197
|
if budget
|
192
198
|
budget -= (stop - start)
|
193
199
|
cb.overtime! if budget <= 0.0
|
@@ -212,17 +218,17 @@ module Sqreen
|
|
212
218
|
end
|
213
219
|
next
|
214
220
|
end
|
215
|
-
Sqreen::PerformanceNotifications.notify(
|
221
|
+
Sqreen::PerformanceNotifications.notify(rule || cb.class.name, FAILING_CB, start, stop)
|
216
222
|
end
|
217
|
-
all_stop = Sqreen
|
223
|
+
all_stop = Sqreen.time
|
218
224
|
if framework && budget && framework.remaining_perf_budget
|
219
225
|
framework.remaining_perf_budget = budget - (all_stop - all_start) - MGMT_COST * callbacks.size
|
220
226
|
end
|
221
|
-
Sqreen::PerformanceNotifications.notify('
|
227
|
+
Sqreen::PerformanceNotifications.notify('hooks_failing', FAILING_CB, all_start, all_stop)
|
222
228
|
returns
|
223
229
|
# end
|
224
230
|
rescue StandardError => e
|
225
|
-
Sqreen.log.warn "we
|
231
|
+
Sqreen.log.warn "we caught an exception between cbs: #{e.inspect}"
|
226
232
|
Sqreen::RemoteException.record(e)
|
227
233
|
[]
|
228
234
|
end
|
@@ -246,11 +252,8 @@ module Sqreen
|
|
246
252
|
|
247
253
|
def self.define_callback_method(meth, original_meth, klass_name)
|
248
254
|
@sqreen_multi_instr ||= nil
|
249
|
-
proc do |*args, &block|
|
250
|
-
record_req_hp = @@record_request_hookpoints.include?([klass_name, meth]) &&
|
251
|
-
Sqreen::PerformanceNotifications.listen_for?
|
252
|
-
Sqreen::PerformanceNotifications::BinnedMetrics.start_request if record_req_hp
|
253
255
|
|
256
|
+
proc do |*args, &block|
|
254
257
|
budget = nil
|
255
258
|
skip_call = Thread.current[:sqreen_in_use]
|
256
259
|
begin
|
@@ -386,16 +389,28 @@ module Sqreen
|
|
386
389
|
end
|
387
390
|
result
|
388
391
|
ensure
|
389
|
-
if record_req_hp
|
390
|
-
Sqreen::PerformanceNotifications.instrument('Callbacks/hooks_reporting/pre') do
|
391
|
-
Sqreen::PerformanceNotifications::LogPerformance.next_request
|
392
|
-
Sqreen::PerformanceNotifications::NewRelic.next_request
|
393
|
-
Sqreen::PerformanceNotifications::BinnedMetrics.finish_request
|
394
|
-
end
|
395
|
-
end
|
396
392
|
Thread.current[:sqreen_in_use] = false
|
397
393
|
end
|
398
394
|
end
|
395
|
+
end # end of proc
|
396
|
+
end
|
397
|
+
|
398
|
+
def self.request_hookpoint_method(original_meth)
|
399
|
+
proc do |*args, &block|
|
400
|
+
has_notifications = Sqreen::PerformanceNotifications.listen_for?
|
401
|
+
Sqreen::PerformanceNotifications::BinnedMetrics.start_request if has_notifications
|
402
|
+
|
403
|
+
begin
|
404
|
+
send(original_meth, *args, &block)
|
405
|
+
ensure
|
406
|
+
if has_notifications
|
407
|
+
Sqreen::PerformanceNotifications.instrument('next_req_notifs', PRE_CB) do
|
408
|
+
Sqreen::PerformanceNotifications::LogPerformance.next_request
|
409
|
+
Sqreen::PerformanceNotifications::NewRelic.next_request
|
410
|
+
Sqreen::PerformanceNotifications::BinnedMetrics.finish_request
|
411
|
+
end
|
412
|
+
end
|
413
|
+
end
|
399
414
|
end
|
400
415
|
end
|
401
416
|
|
@@ -477,6 +492,12 @@ module Sqreen
|
|
477
492
|
|
478
493
|
define_method(new_method, p)
|
479
494
|
|
495
|
+
if @@record_request_hookpoints.include?([klass_name, meth])
|
496
|
+
p = Instrumentation.request_hookpoint_method(new_method)
|
497
|
+
new_method = "#{new_method}_req_hp_wrapper"
|
498
|
+
define_method(new_method, p)
|
499
|
+
end
|
500
|
+
|
480
501
|
if public_method_defined?(meth)
|
481
502
|
method_kind = :public
|
482
503
|
elsif protected_method_defined?(meth)
|
@@ -569,6 +590,8 @@ module Sqreen
|
|
569
590
|
method = cb.method
|
570
591
|
key = [klass, method]
|
571
592
|
|
593
|
+
@@record_request_hookpoints << key if cb.is_a?(Sqreen::Rules::RecordRequestContext)
|
594
|
+
|
572
595
|
already_overriden = @@overriden_methods.include? key
|
573
596
|
|
574
597
|
if !already_overriden
|
@@ -610,7 +633,6 @@ module Sqreen
|
|
610
633
|
|
611
634
|
@@registered_callbacks.add(cb)
|
612
635
|
@@unovertimable_hookpoints << key unless cb.overtimeable
|
613
|
-
@@record_request_hookpoints << key if cb.is_a?(Sqreen::Rules::RecordRequestContext)
|
614
636
|
@@instrumented_pid = Process.pid
|
615
637
|
end
|
616
638
|
end
|
data/lib/sqreen/metrics/base.rb
CHANGED
@@ -18,12 +18,12 @@ module Sqreen
|
|
18
18
|
# @param _at [Time] when was the observation made
|
19
19
|
# @param _key [String] which aggregation key was it made for
|
20
20
|
# @param _value [Object] The observation
|
21
|
-
def update(
|
21
|
+
def update(_key, _value)
|
22
22
|
raise Sqreen::Exception, 'No current sample' unless @sample
|
23
23
|
end
|
24
24
|
|
25
25
|
# create a new empty sample and publish the last one
|
26
|
-
# @param time [
|
26
|
+
# @param time [Float] Time of start of new sample/end of the last one
|
27
27
|
def next_sample(time)
|
28
28
|
finalize_sample(time) unless @sample.nil?
|
29
29
|
current_sample = @sample
|
@@ -33,10 +33,12 @@ module Sqreen
|
|
33
33
|
|
34
34
|
protected
|
35
35
|
|
36
|
+
# @param time [Float]
|
36
37
|
def new_sample(time)
|
37
38
|
@sample = { OBSERVATION_KEY => {}, START_KEY => time }
|
38
39
|
end
|
39
40
|
|
41
|
+
# @param time [Float]
|
40
42
|
def finalize_sample(time)
|
41
43
|
@sample[FINISH_KEY] = time
|
42
44
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# Copyright (c) 2018 Sqreen. All Rights Reserved.
|
2
2
|
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
3
|
|
4
|
+
require 'sqreen/mono_time'
|
4
5
|
require 'sqreen/metrics/base'
|
5
6
|
|
6
7
|
module Sqreen
|
@@ -20,10 +21,10 @@ module Sqreen
|
|
20
21
|
log_factor = Math.log(@factor)
|
21
22
|
@inv_log_base = 1 / log_base
|
22
23
|
@add_parcel = - log_factor / log_base
|
23
|
-
new_sample(
|
24
|
+
new_sample(Sqreen.time)
|
24
25
|
end
|
25
26
|
|
26
|
-
def update(
|
27
|
+
def update(_key, x)
|
27
28
|
h = @sample[OBSERVATION_KEY]
|
28
29
|
bin = bin_no(x)
|
29
30
|
h[bin] += 1
|
data/lib/sqreen/metrics/sum.rb
CHANGED
data/lib/sqreen/metrics_store.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'sqreen/exception'
|
5
5
|
require 'sqreen/metrics'
|
6
|
+
require 'sqreen/mono_time'
|
6
7
|
|
7
8
|
module Sqreen
|
8
9
|
# This store and register metrics
|
@@ -17,6 +18,7 @@ module Sqreen
|
|
17
18
|
class AlreadyRegisteredMetric < Sqreen::Exception
|
18
19
|
end
|
19
20
|
|
21
|
+
# definition keys
|
20
22
|
NAME_KEY = 'name'.freeze
|
21
23
|
KIND_KEY = 'kind'.freeze
|
22
24
|
PERIOD_KEY = 'period'.freeze
|
@@ -29,7 +31,7 @@ module Sqreen
|
|
29
31
|
|
30
32
|
def initialize
|
31
33
|
@store = []
|
32
|
-
@metrics = {}
|
34
|
+
@metrics = {} # name => (metric, period, start)
|
33
35
|
end
|
34
36
|
|
35
37
|
# Definition contains a name,period and aggregate at least
|
@@ -54,17 +56,17 @@ module Sqreen
|
|
54
56
|
@metrics.key?(name)
|
55
57
|
end
|
56
58
|
|
59
|
+
# @params at [Time] when is the store emptied
|
57
60
|
def update(name, at, key, value)
|
58
|
-
at = at.utc
|
59
61
|
metric, period, start = @metrics[name]
|
60
62
|
raise UnregisteredMetric, "Unknown metric #{name}" unless metric
|
61
63
|
next_sample(name, at) if start.nil? || (start + period) < at
|
62
|
-
metric.update(
|
64
|
+
metric.update(key, value)
|
63
65
|
end
|
64
66
|
|
65
67
|
# Drains every metrics and returns the store content
|
66
68
|
# @params at [Time] when is the store emptied
|
67
|
-
def publish(flush = true, at =
|
69
|
+
def publish(flush = true, at = Sqreen.time)
|
68
70
|
@metrics.each do |name, (_, period, start)|
|
69
71
|
next_sample(name, at) if flush || !start.nil? && (start + period) < at
|
70
72
|
end
|
@@ -78,10 +80,13 @@ module Sqreen
|
|
78
80
|
def next_sample(name, at)
|
79
81
|
metric = @metrics[name][0]
|
80
82
|
r = metric.next_sample(at)
|
81
|
-
@metrics[name][2] = at # start
|
83
|
+
@metrics[name][2] = at # new start
|
82
84
|
if r
|
83
85
|
r[NAME_KEY] = name
|
84
86
|
obs = r[Metric::OBSERVATION_KEY]
|
87
|
+
start_of_mono = Time.now.utc - Sqreen.time
|
88
|
+
r[Metric::START_KEY] = start_of_mono + r[Metric::START_KEY]
|
89
|
+
r[Metric::FINISH_KEY] = start_of_mono + r[Metric::FINISH_KEY]
|
85
90
|
@store << r if obs && (!obs.respond_to?(:empty?) || !obs.empty?)
|
86
91
|
end
|
87
92
|
r
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Sqreen
|
2
|
+
has_mono_time = begin
|
3
|
+
Process.clock_gettime Process::CLOCK_MONOTONIC
|
4
|
+
true
|
5
|
+
rescue StandardError
|
6
|
+
false
|
7
|
+
end
|
8
|
+
|
9
|
+
if has_mono_time
|
10
|
+
def self.time
|
11
|
+
Process.clock_gettime Process::CLOCK_MONOTONIC
|
12
|
+
end
|
13
|
+
else
|
14
|
+
def self.time
|
15
|
+
Time.now.to_f
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,12 +1,7 @@
|
|
1
1
|
# Copyright (c) 2015 Sqreen. All Rights Reserved.
|
2
2
|
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
3
|
|
4
|
-
|
5
|
-
Process.clock_gettime Process::CLOCK_MONOTONIC
|
6
|
-
SQREEN_MONO_TIME = Process::CLOCK_MONOTONIC
|
7
|
-
rescue StandardError
|
8
|
-
SQREEN_MONO_TIME = nil
|
9
|
-
end
|
4
|
+
require 'sqreen/mono_time'
|
10
5
|
|
11
6
|
module Sqreen
|
12
7
|
# This module enable us to keep track of sqreen resource usage
|
@@ -17,39 +12,29 @@ module Sqreen
|
|
17
12
|
@subscriptions_all = {}
|
18
13
|
@subscription_id = 0
|
19
14
|
class << self
|
20
|
-
#
|
21
|
-
# returns a subscription
|
15
|
+
# Subscribe to receive notifications about an event
|
16
|
+
# returns a subscription identification
|
22
17
|
def subscribe(&block)
|
23
18
|
id = (@subscription_id += 1)
|
24
19
|
@subscriptions_all[id] = block
|
25
20
|
id
|
26
21
|
end
|
27
22
|
|
28
|
-
if SQREEN_MONO_TIME
|
29
|
-
def time
|
30
|
-
Process.clock_gettime(SQREEN_MONO_TIME)
|
31
|
-
end
|
32
|
-
else
|
33
|
-
def time
|
34
|
-
Time.now
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
23
|
# Is there a subscriber
|
39
24
|
def listen_for?
|
40
25
|
!@subscriptions_all.empty?
|
41
26
|
end
|
42
27
|
|
43
28
|
# Instrument a call identified by key
|
44
|
-
def instrument(
|
29
|
+
def instrument(rule, cb, meta = {}, &block)
|
45
30
|
return yield unless listen_for?
|
46
|
-
_instrument(
|
31
|
+
_instrument(rule, cb, meta, &block)
|
47
32
|
end
|
48
33
|
|
49
|
-
def notify(
|
34
|
+
def notify(rule, cb, start, stop, meta = {})
|
50
35
|
return unless listen_for?
|
51
36
|
notifiers.each do |callable|
|
52
|
-
callable.call(
|
37
|
+
callable.call(rule, cb, start, stop, meta)
|
53
38
|
end
|
54
39
|
end
|
55
40
|
|
@@ -70,22 +55,12 @@ module Sqreen
|
|
70
55
|
@subscriptions_all.values
|
71
56
|
end
|
72
57
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
notify(key, start, stop, meta)
|
80
|
-
end
|
81
|
-
else
|
82
|
-
def _instrument(key, meta)
|
83
|
-
start = Time.now
|
84
|
-
yield
|
85
|
-
ensure
|
86
|
-
stop = Time.now
|
87
|
-
notify(key, start, stop, meta)
|
88
|
-
end
|
58
|
+
def _instrument(rule, cb, meta)
|
59
|
+
start = Sqreen.time
|
60
|
+
yield
|
61
|
+
ensure
|
62
|
+
stop = Sqreen.time
|
63
|
+
notify(rule, cb, start, stop, meta)
|
89
64
|
end
|
90
65
|
end
|
91
66
|
end
|
@@ -16,8 +16,6 @@ module Sqreen
|
|
16
16
|
EVENT_TOTAL_TIME = 'sq'.freeze # sqreen total overhead callback time
|
17
17
|
EVENT_PERCENT = 'pct'.freeze # sqreen total overhead percent of time
|
18
18
|
|
19
|
-
EVT_NAME_REGEXP = %r{\ACallbacks/([^/]+)/([^/]+)\z}
|
20
|
-
|
21
19
|
# @param metrics_store [Sqreen::MetricsStore]
|
22
20
|
def initialize(metrics_store, period, perf_metric_opts, perf_metric_percent_opts)
|
23
21
|
@metrics_store = metrics_store
|
@@ -49,32 +47,28 @@ module Sqreen
|
|
49
47
|
@subid = nil
|
50
48
|
end
|
51
49
|
|
52
|
-
def log(
|
53
|
-
return unless event =~ EVT_NAME_REGEXP
|
54
|
-
rule, cb = Regexp.last_match.captures
|
55
|
-
|
50
|
+
def log(rule, cb, start, finish, _meta)
|
56
51
|
metric_name = "sq.#{rule}.#{cb}"
|
57
52
|
ensure_metric(metric_name)
|
58
53
|
|
59
|
-
finish_time = SQREEN_MONO_TIME ? Time.now.utc : finish
|
60
54
|
time_millis = (finish - start) * 1000
|
61
55
|
# Ensure we always have a timings if we somehow missed the request start
|
62
|
-
SharedStorage[:sqreen_request_time]
|
63
|
-
|
64
|
-
metrics_store.update(metric_name,
|
56
|
+
SharedStorage[:sqreen_request_time] =
|
57
|
+
(SharedStorage[:sqreen_request_time] || 0) + time_millis
|
58
|
+
metrics_store.update(metric_name, finish, nil, time_millis)
|
65
59
|
end
|
66
60
|
|
67
61
|
def start_request
|
68
|
-
SharedStorage[:request_start_time] =
|
62
|
+
SharedStorage[:request_start_time] = Sqreen.time
|
69
63
|
SharedStorage[:sqreen_request_time] = 0.0
|
70
64
|
end
|
71
65
|
|
72
66
|
def finish_request
|
73
67
|
start_time = SharedStorage[:request_start_time]
|
74
|
-
finish_time =
|
68
|
+
finish_time = Sqreen.time
|
75
69
|
duration_millis = (finish_time - start_time) * 1000
|
76
70
|
|
77
|
-
finish_time_obj =
|
71
|
+
finish_time_obj = Time.now.utc
|
78
72
|
# format of evt is [cat, key, value, timestamp]
|
79
73
|
Sqreen.observations_queue.push(
|
80
74
|
[EVENT_REQ, nil, duration_millis, finish_time_obj]
|
@@ -108,7 +102,11 @@ module Sqreen
|
|
108
102
|
class << self
|
109
103
|
# @return [Sqreen::PerformanceNotifications::BinnedMetrics]
|
110
104
|
attr_reader :instance
|
111
|
-
def enable(metrics_store, period = 60,
|
105
|
+
def enable(metrics_store, period = 60,
|
106
|
+
base = DEFAULT_PERF_BASE,
|
107
|
+
factor = DEFAULT_PERF_UNIT,
|
108
|
+
base_pct = DEFAULT_PERF_PCT_BASE,
|
109
|
+
factor_pct = DEFAULT_PERF_PCT_UNIT)
|
112
110
|
disable
|
113
111
|
@instance = new(metrics_store, period,
|
114
112
|
{'base'=> base, 'factor' => factor},
|
@@ -10,14 +10,19 @@ module Sqreen
|
|
10
10
|
@subid = nil
|
11
11
|
@facility = nil
|
12
12
|
class << self
|
13
|
-
def log(
|
13
|
+
def log(rule, cb, start, finish, meta)
|
14
14
|
(@facility || Sqreen.log).debug do
|
15
15
|
meta_str = nil
|
16
16
|
meta_str = ": #{meta.inspect}" unless meta.empty?
|
17
|
+
event = event_name(rule, cb)
|
17
18
|
format('%s took %.2fms%s', event, (finish - start) * 1000, meta_str)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
22
|
+
def event_name(rule, cb)
|
23
|
+
"Callbacks/#{rule}/#{cb}"
|
24
|
+
end
|
25
|
+
|
21
26
|
def enable(facility = nil)
|
22
27
|
return unless @subid.nil?
|
23
28
|
@facility = facility
|
@@ -2,6 +2,7 @@
|
|
2
2
|
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
3
|
|
4
4
|
require 'sqreen/performance_notifications'
|
5
|
+
require 'sqreen/performance_notifications/log'
|
5
6
|
|
6
7
|
module Sqreen
|
7
8
|
module PerformanceNotifications
|
@@ -23,7 +24,8 @@ module Sqreen
|
|
23
24
|
SharedStorage.set(:log_performance_timings, value)
|
24
25
|
end
|
25
26
|
|
26
|
-
def log(
|
27
|
+
def log(rule, cb, start, finish, _meta)
|
28
|
+
event = event_name(rule, cb)
|
27
29
|
timings << [event, start, finish]
|
28
30
|
end
|
29
31
|
|
@@ -2,17 +2,20 @@
|
|
2
2
|
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
3
|
|
4
4
|
require 'sqreen/performance_notifications'
|
5
|
+
require 'sqreen/performance_notifications/log'
|
6
|
+
require 'sqreen/runner'
|
5
7
|
|
6
8
|
module Sqreen
|
7
9
|
module PerformanceNotifications
|
8
10
|
# Log performances in sqreen metrics_store
|
9
|
-
class Metrics
|
11
|
+
class Metrics < Log
|
10
12
|
@subid = nil
|
11
13
|
@facility = nil
|
12
14
|
class << self
|
13
15
|
EVENT_CAT = 'sqreen_time'.freeze
|
14
|
-
def log(
|
15
|
-
|
16
|
+
def log(rule, cb, start, finish, _meta)
|
17
|
+
event = event_name(rule, cb)
|
18
|
+
evt = [EVENT_CAT, event, (finish - start) * 1000, Time.now.utc]
|
16
19
|
Sqreen.observations_queue.push(evt)
|
17
20
|
end
|
18
21
|
|
@@ -2,11 +2,14 @@
|
|
2
2
|
# Please refer to our terms for more information: https://www.sqreen.io/terms.html
|
3
3
|
|
4
4
|
require 'sqreen/performance_notifications'
|
5
|
+
require 'sqreen/performance_notifications/log'
|
6
|
+
require 'sqreen/log'
|
7
|
+
require 'sqreen/shared_storage'
|
5
8
|
|
6
9
|
module Sqreen
|
7
10
|
module PerformanceNotifications
|
8
11
|
# Log performances on the console
|
9
|
-
class NewRelic
|
12
|
+
class NewRelic < Log
|
10
13
|
@subid = nil
|
11
14
|
@level = 0
|
12
15
|
|
@@ -24,7 +27,8 @@ module Sqreen
|
|
24
27
|
SharedStorage.set(:log_performance_nr_timings, value)
|
25
28
|
end
|
26
29
|
|
27
|
-
def log(
|
30
|
+
def log(rule, cb, start, finish, _meta)
|
31
|
+
event = event_name(rule, cb)
|
28
32
|
timings << [event, start, finish]
|
29
33
|
end
|
30
34
|
|
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'sqreen/rule_callback'
|
5
5
|
require 'sqreen/binding_accessor'
|
6
|
+
require 'sqreen/mono_time'
|
6
7
|
require 'sqreen/rules_callbacks/matcher_rule'
|
7
8
|
|
8
9
|
module Sqreen
|
@@ -49,7 +50,7 @@ module Sqreen
|
|
49
50
|
|
50
51
|
def pre(inst, args, budget = nil, &_block)
|
51
52
|
unless budget.nil?
|
52
|
-
finish = budget + Sqreen
|
53
|
+
finish = budget + Sqreen.time
|
53
54
|
end
|
54
55
|
resol_cache = Hash.new do |hash, accessor|
|
55
56
|
hash[accessor] = accessor.resolve(binding, framework, inst, args)
|
@@ -61,7 +62,7 @@ module Sqreen
|
|
61
62
|
next unless val.respond_to?(:each)
|
62
63
|
next if val.respond_to?(:seek)
|
63
64
|
val.each do |v|
|
64
|
-
if !budget.nil? && Sqreen
|
65
|
+
if !budget.nil? && Sqreen.time > finish
|
65
66
|
return nil
|
66
67
|
end
|
67
68
|
next if !v.is_a?(String) || (!matcher.min_size.nil? && v.size < matcher.min_size)
|
data/lib/sqreen/runner.rb
CHANGED
@@ -214,9 +214,10 @@ module Sqreen
|
|
214
214
|
def config_binned_metrics(level, base, factor, base_pct, factor_pct)
|
215
215
|
level = level.to_i
|
216
216
|
if level <= 0
|
217
|
-
Sqreen.log.
|
217
|
+
Sqreen.log.info('Disabling binned metrics')
|
218
218
|
PerformanceNotifications::BinnedMetrics.disable
|
219
219
|
else
|
220
|
+
Sqreen.log.info('Enabling binned metrics')
|
220
221
|
Sqreen.log.warn("Unknown value for perf_level: #{level}. Treating as 1") unless level == 1
|
221
222
|
PerformanceNotifications::BinnedMetrics.enable(
|
222
223
|
metrics_engine, PERF_METRICS_PERIOD, base.to_f, factor.to_f, base_pct.to_f, factor_pct.to_f
|
@@ -352,9 +353,10 @@ module Sqreen
|
|
352
353
|
|
353
354
|
def aggregate_observations
|
354
355
|
q = Sqreen.observations_queue
|
356
|
+
conv = Sqreen.time - Time.now.utc.to_f
|
355
357
|
q.size.times do
|
356
358
|
cat, key, obs, t = q.pop
|
357
|
-
metrics_engine.update(cat, t, key, obs)
|
359
|
+
metrics_engine.update(cat, conv + t.utc.to_f, key, obs)
|
358
360
|
end
|
359
361
|
end
|
360
362
|
|
data/lib/sqreen/version.rb
CHANGED
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.15.
|
4
|
+
version: 1.15.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sqreen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sq_mini_racer
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- lib/sqreen/metrics/sum.rb
|
76
76
|
- lib/sqreen/metrics_store.rb
|
77
77
|
- lib/sqreen/middleware.rb
|
78
|
+
- lib/sqreen/mono_time.rb
|
78
79
|
- lib/sqreen/payload_creator.rb
|
79
80
|
- lib/sqreen/performance_notifications.rb
|
80
81
|
- lib/sqreen/performance_notifications/binned_metrics.rb
|