resque-analytics 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7de5a9dd7d1aec1589887da6071dc7b988f71c3a
4
- data.tar.gz: 22e1b5663baa1e2eeac7c2e858291899a59e26bf
3
+ metadata.gz: ee6adecc8664d4c813d51b0d276a09f3805eef5a
4
+ data.tar.gz: b3f61c77bfea5cc51b7bd9d1db1d2cdfcc5b786c
5
5
  SHA512:
6
- metadata.gz: 87b121b68b72695be1cc095cfaa7d3a7b0854c5f793d42bab36f2e3453833c9101d7e11684dde7ec368bf1f2c210a0ab11f70e85bae348b0fdc9002c27bb1032
7
- data.tar.gz: 6c81ccd7035efa82023b90befea4e927239b758bff7e4779298a9d3b4baecbfb83b02b1428419bbc31d607d23c1342b7c4fb28492488c9a45e62b24bdf3a254e
6
+ metadata.gz: d514eba2882be8a2625773e4d4411fafc7a044159fdeaecae0b516ff43d73722bd79502fef94056a2dda4b8ad2dce5f5cd25106b3420c370cfa2e63569756620
7
+ data.tar.gz: 72db95f784fe75998f2bb4714c8e110fe453126d05b305c40840503b98336884555c8a6ad29562abf0f4cd754b518f5a5a6c98936f8407031e32361a08850508
data/Changelog ADDED
@@ -0,0 +1,8 @@
1
+ ## 0.6.0 (June 9, 2014)
2
+
3
+ * Add queue wait time
4
+
5
+
6
+ ## 0.5.0 (June 8, 2014)
7
+
8
+ * Initial release
data/README.rdoc CHANGED
@@ -7,6 +7,11 @@ For each worker, the gem keeps the following key performance indicators:
7
7
  * Number of times it executed successfuly per day
8
8
  * Number of times is failed per day
9
9
  * Total run time per day
10
+ * Total wait time per day, which is the amount of time items for this worker were waiting in the queue
11
+
12
+ Wait is somewhat tricky, as Resque doesn't provide the proper hooks to calculate this value. To handle that, I had to
13
+ replace Resque's push method, and Job initialization method. These methods now add a timestamp when items are added
14
+ to queues, and use the timestamp to calculate the total wait time, when an item is taken out of the queue.
10
15
 
11
16
  == Installation
12
17
 
@@ -35,7 +40,6 @@ On the Resque screens, you will find a new tab called "Analytics".
35
40
  == TODO
36
41
 
37
42
  * Add tests
38
- * Add queued time to total run time analytics
39
43
 
40
44
  == Contributing to resque-analytics
41
45
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.6.0
@@ -32,6 +32,21 @@ module Resque
32
32
  def chart_data(data, job, kpi)
33
33
  legend_keys.map { |key| @data[job][kpi][key].to_i || 0 }
34
34
  end
35
+
36
+ def chart_it(title, legend, data)
37
+ Gchart.bar(
38
+ data: data,
39
+ title: title,
40
+ format: "image_tag",
41
+ size: "1000x300",
42
+ axis_with_labels: ['x,y'],
43
+ bar_width_and_spacing: '6',
44
+ axis_range: [[-90,0,-5], [0, data.map(&:max).sum ]],
45
+ legend: legend,
46
+ legend_position: 'top',
47
+ bar_colors: ['000000', '0088FF']
48
+ )
49
+ end
35
50
  end
36
51
 
37
52
  class << self
@@ -39,7 +54,7 @@ module Resque
39
54
  app.get '/analytics' do
40
55
  @data = measured_jobs.inject({}) { |res, job|
41
56
  res[job] = {}
42
- [PERFORMED, FAILED, TOTAL_TIME].each { |kpi| res[job][kpi] = counters_for(job, kpi) }
57
+ [PERFORMED, FAILED, TOTAL_TIME, WAIT_TIME].each { |kpi| res[job][kpi] = counters_for(job, kpi) }
43
58
  res
44
59
  }
45
60
  erb(File.read(File.join(VIEW_PATH, 'analytics.erb')))
@@ -8,30 +8,9 @@
8
8
  <h2><%= job %></h2>
9
9
  <% performed = chart_data(@data, job, Resque::Plugins::Analytics::PERFORMED) %>
10
10
  <% failed = chart_data(@data, job, Resque::Plugins::Analytics::FAILED) %>
11
- <%= Gchart.bar(
12
- data: [performed, failed],
13
- title: "Number of jobs",
14
- format: "image_tag",
15
- size: "1000x300",
16
- axis_with_labels: ['x,y'],
17
- bar_width_and_spacing: '6',
18
- axis_range: [[-90,0,-5], [0, performed.max + failed.max ]],
19
- legend: [Resque::Plugins::Analytics::PERFORMED, Resque::Plugins::Analytics::FAILED],
20
- legend_position: 'top',
21
- bar_colors: ['000000', '0088FF']
22
- ) %>
11
+ <%= chart_it("Number of jobs", [Resque::Plugins::Analytics::PERFORMED, Resque::Plugins::Analytics::FAILED], [performed, failed]) %>
23
12
 
24
13
  <% run_time = chart_data(@data, job, Resque::Plugins::Analytics::TOTAL_TIME) %>
25
- <%= Gchart.bar(
26
- data: [run_time],
27
- title: "Run time",
28
- format: "image_tag",
29
- size: "1000x300",
30
- axis_with_labels: ['x,y'],
31
- bar_width_and_spacing: '6',
32
- axis_range: [[-90,0,-5], [0, run_time.max ]],
33
- legend: [Resque::Plugins::Analytics::TOTAL_TIME],
34
- legend_position: 'top'
35
- ) %>
36
-
14
+ <% wait_time = chart_data(@data, job, Resque::Plugins::Analytics::WAIT_TIME) %>
15
+ <%= chart_it("Wait and Run times", [Resque::Plugins::Analytics::WAIT_TIME, Resque::Plugins::Analytics::TOTAL_TIME], [wait_time, run_time]) %>
37
16
  <% end %>
@@ -1,13 +1,35 @@
1
1
  require 'resque'
2
2
 
3
3
  module Resque
4
+ # Override Resque's push method to add a timestemp to each enqueued item
5
+ def push(queue, item)
6
+ item['analytics_timestamp'] = Time.now if item.is_a?(Hash)
7
+ redis.pipelined do
8
+ watch_queue(queue)
9
+ redis.rpush "queue:#{queue}", encode(item)
10
+ end
11
+ end
12
+
13
+ class Job
14
+ # Override Job initialization to extract the timestamp
15
+ def initialize(queue, payload)
16
+ timestamp = payload.delete('analytics_timestamp')
17
+ @queue = queue
18
+ @payload = payload
19
+ @failure_hooks_ran = false
20
+ payload_class.send(:analytics_timestamp, timestamp) if payload_class.respond_to?(:analytics_timestamp)
21
+ end
22
+ end
23
+
4
24
  module Plugins
5
25
  module Analytics
6
26
 
7
27
  FAILED = "failed"
8
28
  PERFORMED = "performed"
9
29
  TOTAL_TIME = "total_time"
10
- # WAIT_TIME = "wait_time"
30
+ WAIT_TIME = "wait_time"
31
+
32
+ EXPIRE = 90 * 24 * 60
11
33
 
12
34
  def key(kpi)
13
35
  date = Time.now.strftime("%y_%m_%d")
@@ -20,19 +42,24 @@ module Resque
20
42
  total_time = Time.now - start
21
43
 
22
44
  Resque.redis.lpush(key(TOTAL_TIME), total_time)
23
- Resque.redis.expire(key(TOTAL_TIME), 90 * 24 * 60)
45
+ Resque.redis.expire(key(WAIT_TIME), EXPIRE)
24
46
  end
25
47
 
26
48
  def after_perform_analytics(*args)
27
49
  Resque.redis.incr(key(PERFORMED))
28
- Resque.redis.expire(key(PERFORMED), 90 * 24 * 60)
50
+ Resque.redis.expire(key(WAIT_TIME), EXPIRE)
29
51
  end
30
52
 
31
- def on_failure_analytics(e,*args)
53
+ def on_failure_analytics(error, *args)
32
54
  Resque.redis.incr(key(FAILED))
33
- Resque.redis.expire(key(FAILED), 90 * 24 * 60)
55
+ Resque.redis.expire(key(WAIT_TIME), EXPIRE)
56
+ end
57
+
58
+ def analytics_timestamp(timestamp)
59
+ Resque.redis.lpush(key(WAIT_TIME), Time.now - Time.parse(timestamp))
60
+ Resque.redis.expire(key(WAIT_TIME), EXPIRE)
34
61
  end
35
62
 
36
63
  end
37
64
  end
38
- end
65
+ end
@@ -2,16 +2,15 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: resque-analytics 0.5.0 ruby lib
5
+ # stub: resque-analytics 0.6.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "resque-analytics"
9
- s.version = "0.5.0"
9
+ s.version = "0.6.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
12
  s.authors = ["Nir Tzur"]
14
- s.date = "2014-06-08"
13
+ s.date = "2014-06-09"
15
14
  s.description = "Shows Resque jobs key performance indciators over time"
16
15
  s.email = "nir.tzur@samanage.com"
17
16
  s.extra_rdoc_files = [
@@ -20,9 +19,11 @@ Gem::Specification.new do |s|
20
19
  ]
21
20
  s.files = [
22
21
  ".document",
22
+ "Changelog",
23
23
  "Gemfile",
24
24
  "Gemfile.lock",
25
25
  "LICENSE",
26
+ "README.rdoc",
26
27
  "Rakefile",
27
28
  "VERSION",
28
29
  "lib/resque-analytics.rb",
@@ -33,7 +34,8 @@ Gem::Specification.new do |s|
33
34
  ]
34
35
  s.homepage = "http://github.com/nirtzur/resque-analytics"
35
36
  s.licenses = ["MIT"]
36
- s.rubygems_version = "2.2.2"
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = "2.1.11"
37
39
  s.summary = "Resque Job Analytics"
38
40
 
39
41
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-analytics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nir Tzur
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-08 00:00:00.000000000 Z
11
+ date: 2014-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: resque
@@ -89,9 +89,11 @@ extra_rdoc_files:
89
89
  - README.rdoc
90
90
  files:
91
91
  - .document
92
+ - Changelog
92
93
  - Gemfile
93
94
  - Gemfile.lock
94
95
  - LICENSE
96
+ - README.rdoc
95
97
  - Rakefile
96
98
  - VERSION
97
99
  - lib/resque-analytics.rb
@@ -99,7 +101,6 @@ files:
99
101
  - lib/resque-analytics/server/views/analytics.erb
100
102
  - lib/resque/plugins/analytics.rb
101
103
  - resque-analytics.gemspec
102
- - README.rdoc
103
104
  homepage: http://github.com/nirtzur/resque-analytics
104
105
  licenses:
105
106
  - MIT