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 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
- ## Web UI
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
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Benchmark
3
- VERSION = "0.1.2"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -3,36 +3,38 @@ module Sidekiq
3
3
  module Worker
4
4
 
5
5
  def benchmark(options = {})
6
- bm = Benchmark.new Time.now
6
+ @benchmark ||= Benchmark.new Time.now, benchmark_redis_type_key, options
7
7
 
8
- yield(bm)
9
-
10
- bm.finish_time = Time.now
11
- bm.save benchmark_redis_base_key, options
8
+ if block_given?
9
+ yield @benchmark
10
+ @benchmark.finish
11
+ end
12
12
 
13
- bm.set_redis_key benchmark_redis_type_key
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
- attr_reader :metrics, :start_time, :finish_time
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 finish_time=(value)
34
- @finish_time = value.to_f
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 "benchmark:types", key
57
+ conn.sadd "#{REDIS_NAMESPACE}:types", key
56
58
  end
57
59
  end
58
60
 
59
- def save(redis_base_key, options = {})
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 "#{redis_base_key}:total", key, value
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.hsetnx "#{redis_base_key}:total", "start_time", start_time
76
- conn.hincrbyfloat "#{redis_base_key}:total", "job_time", @metrics[:job_time]
77
- conn.hset "#{redis_base_key}:total", "finish_time", finish_time
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
@@ -13,26 +13,52 @@ module Sidekiq
13
13
  end
14
14
 
15
15
  it "should collect metrics" do
16
- metrics = @worker.bm_obj.metrics
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.bm_obj.start_time.wont_be_nil
23
- @worker.bm_obj.finish_time.wont_be_nil
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.benchmark_redis_base_key}:total", :job_time)
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.benchmark_redis_base_key}:stats")
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
- @bm_obj = benchmark do |bm|
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|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-benchmark
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: