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 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: