sidekiq-benchmark 0.1.2 → 0.2.0
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.
- data/README.md +26 -1
- data/lib/sidekiq-benchmark/version.rb +1 -1
- data/lib/sidekiq-benchmark/worker.rb +25 -28
- data/test/lib/worker_test.rb +31 -5
- data/test/test_helper.rb +21 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -30,6 +30,23 @@ class SampleWorker
|
|
30
30
|
include Sidekiq::Worker
|
31
31
|
include Sidekiq::Benchmark::Worker
|
32
32
|
|
33
|
+
def perform(id)
|
34
|
+
benchmark.first_metric do
|
35
|
+
100500.times do something end
|
36
|
+
end
|
37
|
+
|
38
|
+
benchmark.second_metric do
|
39
|
+
42.times do anything end
|
40
|
+
end
|
41
|
+
|
42
|
+
benchmark.finish
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class OtherSampleWorker
|
47
|
+
include Sidekiq::Worker
|
48
|
+
include Sidekiq::Benchmark::Worker
|
49
|
+
|
33
50
|
def perform(id)
|
34
51
|
benchmark do |bm|
|
35
52
|
bm.some_metric do
|
@@ -41,13 +58,21 @@ class SampleWorker
|
|
41
58
|
something_code
|
42
59
|
end
|
43
60
|
end
|
61
|
+
# if block given, yield and finish
|
44
62
|
end
|
45
63
|
|
46
64
|
end
|
47
65
|
```
|
48
|
-
##
|
66
|
+
## Examples
|
67
|
+
|
68
|
+
### Web UI
|
69
|
+
|
49
70
|

|
50
71
|
|
72
|
+
### Sample Apps
|
73
|
+
|
74
|
+

|
75
|
+
|
51
76
|
## Contributing
|
52
77
|
|
53
78
|
1. Fork it
|
@@ -3,36 +3,38 @@ module Sidekiq
|
|
3
3
|
module Worker
|
4
4
|
|
5
5
|
def benchmark(options = {})
|
6
|
-
|
6
|
+
@benchmark ||= Benchmark.new Time.now, benchmark_redis_type_key, options
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
if block_given?
|
9
|
+
yield @benchmark
|
10
|
+
@benchmark.finish
|
11
|
+
end
|
12
12
|
|
13
|
-
|
14
|
-
bm
|
13
|
+
@benchmark
|
15
14
|
end
|
16
15
|
|
17
16
|
def benchmark_redis_type_key
|
18
17
|
@benchmark_redis_type_key ||= self.class.name.gsub('::', '_').downcase
|
19
18
|
end
|
20
19
|
|
21
|
-
def benchmark_redis_base_key
|
22
|
-
@benchmark_redis_base_key ||= "benchmark:#{benchmark_redis_type_key}"
|
23
|
-
end
|
24
|
-
|
25
20
|
class Benchmark
|
26
|
-
|
21
|
+
REDIS_NAMESPACE = :benchmark
|
22
|
+
|
23
|
+
attr_reader :metrics, :start_time, :finish_time, :redis_key
|
27
24
|
|
28
|
-
def initialize(start_time)
|
25
|
+
def initialize(start_time, redis_key, options)
|
29
26
|
@metrics = {}
|
27
|
+
@options = options
|
30
28
|
@start_time = start_time.to_f
|
29
|
+
|
30
|
+
@redis_key = "#{REDIS_NAMESPACE}:#{redis_key}"
|
31
|
+
set_redis_key redis_key
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
-
@finish_time =
|
34
|
+
def finish
|
35
|
+
@finish_time = Time.now.to_f
|
35
36
|
@metrics[:job_time] = @finish_time - start_time
|
37
|
+
save
|
36
38
|
end
|
37
39
|
|
38
40
|
def method_missing(name, *args)
|
@@ -52,29 +54,24 @@ module Sidekiq
|
|
52
54
|
|
53
55
|
def set_redis_key(key)
|
54
56
|
Sidekiq.redis do |conn|
|
55
|
-
conn.sadd "
|
57
|
+
conn.sadd "#{REDIS_NAMESPACE}:types", key
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
59
|
-
def save
|
60
|
-
options.merge! start_time: start_time, finish_time: finish_time
|
61
|
-
options.merge! @metrics
|
62
|
-
|
61
|
+
def save
|
63
62
|
job_time_key = @metrics[:job_time].round(1)
|
64
63
|
|
65
64
|
Sidekiq.redis do |conn|
|
66
65
|
conn.multi do
|
67
|
-
# Isn't usefull at this moment
|
68
|
-
#conn.lpush "#{redis_base_key}:jobs", Sidekiq.dump_json(options)
|
69
|
-
|
70
66
|
@metrics.each do |key, value|
|
71
|
-
conn.hincrbyfloat "#{
|
72
|
-
conn.hincrby "#{redis_base_key}:stats", job_time_key, 1
|
67
|
+
conn.hincrbyfloat "#{redis_key}:total", key, value
|
73
68
|
end
|
74
69
|
|
75
|
-
conn.
|
76
|
-
|
77
|
-
conn.
|
70
|
+
conn.hincrby "#{redis_key}:stats", job_time_key, 1
|
71
|
+
|
72
|
+
conn.hsetnx "#{redis_key}:total", "start_time", start_time
|
73
|
+
conn.hincrbyfloat "#{redis_key}:total", "job_time", @metrics[:job_time]
|
74
|
+
conn.hset "#{redis_key}:total", "finish_time", finish_time
|
78
75
|
end
|
79
76
|
end
|
80
77
|
end
|
data/test/lib/worker_test.rb
CHANGED
@@ -13,26 +13,52 @@ module Sidekiq
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should collect metrics" do
|
16
|
-
metrics = @worker.
|
16
|
+
metrics = @worker.benchmark.metrics
|
17
17
|
|
18
18
|
@worker.metric_names.each do |metric_name|
|
19
19
|
metrics[metric_name].wont_be_nil
|
20
20
|
end
|
21
21
|
|
22
|
-
@worker.
|
23
|
-
@worker.
|
22
|
+
@worker.benchmark.start_time.wont_be_nil
|
23
|
+
@worker.benchmark.finish_time.wont_be_nil
|
24
24
|
metrics[:assigned_metric].must_equal @worker.assigned_metric
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should save metrics to redis" do
|
28
28
|
Sidekiq.redis do |conn|
|
29
|
-
total_time = conn.hget("#{@worker.
|
29
|
+
total_time = conn.hget("#{@worker.benchmark.redis_key}:total", :job_time)
|
30
30
|
total_time.wont_be_nil
|
31
31
|
|
32
|
-
metrics = conn.hkeys("#{@worker.
|
32
|
+
metrics = conn.hkeys("#{@worker.benchmark.redis_key}:stats")
|
33
33
|
metrics.wont_be_empty
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
it "should collect metrics with alter syntax" do
|
38
|
+
worker = AlterWorkerMock.new
|
39
|
+
metrics = worker.benchmark.metrics
|
40
|
+
|
41
|
+
Sidekiq.redis do |conn|
|
42
|
+
metric_set = conn.hkeys("#{worker.benchmark.redis_key}:stats")
|
43
|
+
metric_set.must_be_empty
|
44
|
+
end
|
45
|
+
|
46
|
+
worker.metric_names.each do |metric_name|
|
47
|
+
metrics[metric_name].wont_be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
worker.benchmark.finish_time.must_be_nil
|
51
|
+
|
52
|
+
worker.finish
|
53
|
+
|
54
|
+
worker.benchmark.finish_time.wont_be_nil
|
55
|
+
|
56
|
+
Sidekiq.redis do |conn|
|
57
|
+
metric_set = conn.hkeys("#{worker.benchmark.redis_key}:stats")
|
58
|
+
metric_set.wont_be_empty
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
36
62
|
end
|
37
63
|
end
|
38
64
|
end
|
data/test/test_helper.rb
CHANGED
@@ -29,7 +29,7 @@ module Sidekiq
|
|
29
29
|
def initialize
|
30
30
|
@assigned_metric = 0.1
|
31
31
|
|
32
|
-
|
32
|
+
benchmark do |bm|
|
33
33
|
bm.test_metric do
|
34
34
|
2.times do |i|
|
35
35
|
bm.send("nested_test_metric_#{i}") do
|
@@ -46,6 +46,26 @@ module Sidekiq
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
class AlterWorkerMock < WorkerMock
|
50
|
+
def initialize
|
51
|
+
benchmark.test_metric do
|
52
|
+
42.times do
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
benchmark.other_metric do
|
57
|
+
100500.times do
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
@metric_names = [:test_metric, :other_metric]
|
62
|
+
end
|
63
|
+
|
64
|
+
def finish
|
65
|
+
benchmark.finish
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
49
69
|
def self.flush_db
|
50
70
|
Sidekiq.redis = REDIS
|
51
71
|
Sidekiq.redis do |conn|
|