sidekiq-benchmark 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
![Web UI](https://github.com/kosmatov/sidekiq-benchmark/raw/master/examples/web-ui.png)
|
50
71
|
|
72
|
+
### Sample Apps
|
73
|
+
|
74
|
+
![Heroku App](http://sidekiq-benchmark.herokuapp.com)
|
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|
|