resque-job-stats 0.3.0 → 0.4.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6725ebddff932de1e8f60a5c04dacf4ea6416864
4
+ data.tar.gz: 0089002d0c928189c910db4d29135712e202ce77
5
+ SHA512:
6
+ metadata.gz: 812a9c4c46901932ec091be5be637063d91bbe58a5530d804f81d2b00974369f01a2c75b050d51f93261106b520381c4cf2c5ad93a380b1f899443ffd55635ad
7
+ data.tar.gz: 69f97e0b183122369d01c664d708f833cfc72f32992e54a8f96cfeb4570aec46bf8376726e6c9ad67334720820d87159f0854000bf57a995bdcf62caca9aa5f6
@@ -99,7 +99,7 @@ the jobs that include all of the metrics):
99
99
 
100
100
  The interface can be included in your app like this:
101
101
 
102
- require 'resque-job-status/server'
102
+ require 'resque-job-stats/server'
103
103
 
104
104
  If you wish to display only certain metrics, you can filter the metrics accordingly. The default metrics can be found in Resque::Plugins::JobStats::Statistic.
105
105
 
@@ -44,6 +44,10 @@ module Resque
44
44
  "<td>#{formatted_stat}</td>"
45
45
  end
46
46
  end
47
+
48
+ def check_or_cross_stat(value)
49
+ value ? "&#x2713;" : "&#x2717;"
50
+ end
47
51
  end
48
52
 
49
53
  class << self
@@ -57,6 +61,21 @@ module Resque
57
61
  # tab names with spaces in it (it translates the url as job%20stats)
58
62
  app.tabs << "Job_Stats"
59
63
 
64
+ app.get '/job_history/:job_class' do
65
+ @job_class = Resque::Plugins::JobStats.measured_jobs.find { |j| j.to_s == params[:job_class] }
66
+ pass unless @job_class
67
+
68
+ @start = 0
69
+ @start = params[:start].to_i if params[:start]
70
+ @limit = 100
71
+ @limit = params[:limit].to_i if params[:limit]
72
+
73
+ @histories = @job_class.job_histories(@start,@limit)
74
+ @size = @job_class.histories_recorded
75
+
76
+ erb(File.read(File.join(VIEW_PATH, 'job_histories.erb')))
77
+ end
78
+
60
79
  app.helpers(Helpers)
61
80
  end
62
81
  end
@@ -5,6 +5,7 @@ require 'resque/plugins/job_stats/failed'
5
5
  require 'resque/plugins/job_stats/duration'
6
6
  require 'resque/plugins/job_stats/timeseries'
7
7
  require 'resque/plugins/job_stats/statistic'
8
+ require 'resque/plugins/job_stats/history'
8
9
 
9
10
  module Resque
10
11
  module Plugins
@@ -15,6 +16,7 @@ module Resque
15
16
  include Resque::Plugins::JobStats::Duration
16
17
  include Resque::Plugins::JobStats::Timeseries::Enqueued
17
18
  include Resque::Plugins::JobStats::Timeseries::Performed
19
+ include Resque::Plugins::JobStats::History
18
20
 
19
21
  def self.extended(base)
20
22
  self.measured_jobs << base
@@ -0,0 +1,55 @@
1
+ module Resque
2
+ module Plugins
3
+ module JobStats
4
+ module History
5
+ include Resque::Helpers
6
+
7
+ def job_histories(start=0, limit=histories_recordable)
8
+ Resque.redis.lrange(jobs_history_key, start, start + limit - 1).map { |h| decode(h) }
9
+ end
10
+
11
+ # Returns the key used for tracking job histories
12
+ def jobs_history_key
13
+ "stats:jobs:#{self.name}:history"
14
+ end
15
+
16
+ def around_perform_job_stats_history(*args)
17
+ # we collect our own duration and start time rather
18
+ # than correlate with the duration stat to make sure
19
+ # we're associating them with the right job arguments
20
+ start = Time.now
21
+ begin
22
+ yield
23
+ duration = Time.now - start
24
+ push_history "success" => true, "args" => args, "run_at" => start, "duration" => duration
25
+ rescue Exception => e
26
+ duration = Time.now - start
27
+ exception = { "name" => e.to_s, "backtrace" => e.backtrace }
28
+ push_history "success" => false, "exception" => exception, "args" => args, "run_at" => start, "duration" => duration
29
+ raise e
30
+ end
31
+ end
32
+
33
+ def histories_recordable
34
+ @histories_recordable || 100
35
+ end
36
+
37
+ def histories_recorded
38
+ Resque.redis.llen(jobs_history_key)
39
+ end
40
+
41
+ def reset_job_histories
42
+ Resque.redis.del(jobs_history_key)
43
+ end
44
+
45
+ private
46
+
47
+ def push_history(history)
48
+ Resque.redis.lpush(jobs_history_key, encode(history))
49
+ Resque.redis.ltrim(jobs_history_key, 0, histories_recordable)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
@@ -0,0 +1,7 @@
1
+ module Resque
2
+ module Plugins
3
+ module JobStats
4
+ VERSION = '0.4.0'
5
+ end
6
+ end
7
+ end
metadata CHANGED
@@ -1,93 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-job-stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.4.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - alanpeabody
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-06-22 00:00:00.000000000Z
11
+ date: 2012-06-22 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: resque
16
- requirement: &70220064841520 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.17'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70220064841520
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.17'
25
27
  - !ruby/object:Gem::Dependency
26
- name: minitest
27
- requirement: &70220064841040 !ruby/object:Gem::Requirement
28
- none: false
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
- - - ! '>='
31
+ - - ">="
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70220064841040
36
- - !ruby/object:Gem::Dependency
37
- name: bundler
38
- requirement: &70220064840560 !ruby/object:Gem::Requirement
39
- none: false
36
+ version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - ~>
38
+ - - ">="
42
39
  - !ruby/object:Gem::Version
43
- version: 1.1.0
44
- type: :development
45
- prerelease: false
46
- version_requirements: *70220064840560
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
- name: jeweler
49
- requirement: &70220064840080 !ruby/object:Gem::Requirement
50
- none: false
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
51
44
  requirements:
52
- - - ~>
45
+ - - "~>"
53
46
  - !ruby/object:Gem::Version
54
- version: 1.8.3
47
+ version: '5.0'
55
48
  type: :development
56
49
  prerelease: false
57
- version_requirements: *70220064840080
58
- - !ruby/object:Gem::Dependency
59
- name: mynyml-redgreen
60
- requirement: &70220064839600 !ruby/object:Gem::Requirement
61
- none: false
50
+ version_requirements: !ruby/object:Gem::Requirement
62
51
  requirements:
63
- - - ~>
52
+ - - "~>"
64
53
  - !ruby/object:Gem::Version
65
- version: 0.7.1
66
- type: :development
67
- prerelease: false
68
- version_requirements: *70220064839600
54
+ version: '5.0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: timecop
71
- requirement: &70220064839120 !ruby/object:Gem::Requirement
72
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
73
58
  requirements:
74
- - - ! '>='
59
+ - - "~>"
75
60
  - !ruby/object:Gem::Version
76
- version: '0'
61
+ version: '0.6'
77
62
  type: :development
78
63
  prerelease: false
79
- version_requirements: *70220064839120
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.6'
80
69
  - !ruby/object:Gem::Dependency
81
70
  name: rack-test
82
- requirement: &70220064838640 !ruby/object:Gem::Requirement
83
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
84
72
  requirements:
85
- - - ! '>='
73
+ - - ">="
86
74
  - !ruby/object:Gem::Version
87
75
  version: '0'
88
76
  type: :development
89
77
  prerelease: false
90
- version_requirements: *70220064838640
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
91
83
  description: Tracks jobs performed, failed, and the duration of the last 100 jobs
92
84
  for each job type.
93
85
  email: gapeabody@gmail.com
@@ -97,54 +89,41 @@ extra_rdoc_files:
97
89
  - LICENSE.txt
98
90
  - README.rdoc
99
91
  files:
100
- - .document
101
- - .rvmrc
102
- - .travis.yml
103
- - Gemfile
104
92
  - LICENSE.txt
105
93
  - README.rdoc
106
- - Rakefile
107
- - VERSION
108
94
  - lib/resque-job-stats.rb
109
95
  - lib/resque-job-stats/server.rb
110
- - lib/resque-job-stats/server/views/job_stats.erb
111
96
  - lib/resque/plugins/job_stats.rb
112
97
  - lib/resque/plugins/job_stats/duration.rb
113
98
  - lib/resque/plugins/job_stats/enqueued.rb
114
99
  - lib/resque/plugins/job_stats/failed.rb
100
+ - lib/resque/plugins/job_stats/history.rb
115
101
  - lib/resque/plugins/job_stats/performed.rb
116
102
  - lib/resque/plugins/job_stats/statistic.rb
117
103
  - lib/resque/plugins/job_stats/timeseries.rb
118
- - resque-job-stats.gemspec
119
- - test/helper.rb
120
- - test/test_job_stats.rb
121
- - test/test_server.rb
104
+ - lib/resque/plugins/job_stats/version.rb
122
105
  homepage: http://github.com/alanpeabody/resque-job-stats
123
106
  licenses:
124
107
  - MIT
108
+ metadata: {}
125
109
  post_install_message:
126
110
  rdoc_options: []
127
111
  require_paths:
128
112
  - lib
129
113
  required_ruby_version: !ruby/object:Gem::Requirement
130
- none: false
131
114
  requirements:
132
- - - ! '>='
115
+ - - ">="
133
116
  - !ruby/object:Gem::Version
134
- version: '0'
135
- segments:
136
- - 0
137
- hash: 1776259179691476593
117
+ version: 1.9.2
138
118
  required_rubygems_version: !ruby/object:Gem::Requirement
139
- none: false
140
119
  requirements:
141
- - - ! '>='
120
+ - - ">="
142
121
  - !ruby/object:Gem::Version
143
122
  version: '0'
144
123
  requirements: []
145
124
  rubyforge_project:
146
- rubygems_version: 1.8.17
125
+ rubygems_version: 2.2.2
147
126
  signing_key:
148
- specification_version: 3
127
+ specification_version: 4
149
128
  summary: Job-centric stats for Resque
150
129
  test_files: []
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm 1.9.2@resque-job-stats
@@ -1,3 +0,0 @@
1
- rvm:
2
- - 1.9.2
3
- - 1.9.3
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- source 'http://rubygems.org'
2
-
3
- gem 'resque', '~> 1.17'
4
-
5
- group :development do
6
- gem 'minitest', '>= 0'
7
- gem 'bundler', '~> 1.1.0'
8
- gem 'jeweler', '~> 1.8.3'
9
- gem 'mynyml-redgreen', '~> 0.7.1'
10
- gem 'timecop'
11
- gem 'rack-test'
12
- end
data/Rakefile DELETED
@@ -1,45 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
13
-
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
- gem.name = "resque-job-stats"
18
- gem.homepage = "http://github.com/alanpeabody/resque-job-stats"
19
- gem.license = "MIT"
20
- gem.summary = %Q{Job-centric stats for Resque}
21
- gem.email = "gapeabody@gmail.com"
22
- gem.authors = ["alanpeabody"]
23
- gem.description = %Q{Tracks jobs performed, failed, and the duration of the last 100 jobs for each job type.}
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
27
-
28
- require 'rake/testtask'
29
- Rake::TestTask.new(:test) do |test|
30
- test.libs << 'lib' << 'test'
31
- test.pattern = 'test/**/test_*.rb'
32
- test.verbose = true
33
- end
34
-
35
- task :default => :test
36
-
37
- require 'rdoc/task'
38
- Rake::RDocTask.new do |rdoc|
39
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
40
-
41
- rdoc.rdoc_dir = 'rdoc'
42
- rdoc.title = "resque-job-stats #{version}"
43
- rdoc.rdoc_files.include('README*')
44
- rdoc.rdoc_files.include('lib/**/*.rb')
45
- end
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.3.0
@@ -1,26 +0,0 @@
1
- <h1>Resque Job Stats</h1>
2
-
3
- <p class="intro">
4
- This page displays statistics about jobs that have been executed.
5
- </p>
6
-
7
- <table>
8
- <tr>
9
- <th>Name</th>
10
- <%= stat_header(:jobs_enqueued) %>
11
- <%= stat_header(:jobs_performed) %>
12
- <%= stat_header(:jobs_failed) %>
13
- <%= stat_header(:job_rolling_avg) %>
14
- <%= stat_header(:longest_job) %>
15
- </tr>
16
- <% @jobs.each do |job| %>
17
- <tr>
18
- <td><%= job.name %></td>
19
- <%= display_stat(job, :jobs_enqueued, :number_display) %>
20
- <%= display_stat(job, :jobs_performed, :number_display) %>
21
- <%= display_stat(job, :jobs_failed, :number_display) %>
22
- <%= display_stat(job, :job_rolling_avg, :time_display) %>
23
- <%= display_stat(job, :longest_job, :time_display) %>
24
- </tr>
25
- <% end %>
26
- </table>
@@ -1,79 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "resque-job-stats"
8
- s.version = "0.3.0"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["alanpeabody"]
12
- s.date = "2012-06-22"
13
- s.description = "Tracks jobs performed, failed, and the duration of the last 100 jobs for each job type."
14
- s.email = "gapeabody@gmail.com"
15
- s.extra_rdoc_files = [
16
- "LICENSE.txt",
17
- "README.rdoc"
18
- ]
19
- s.files = [
20
- ".document",
21
- ".rvmrc",
22
- ".travis.yml",
23
- "Gemfile",
24
- "LICENSE.txt",
25
- "README.rdoc",
26
- "Rakefile",
27
- "VERSION",
28
- "lib/resque-job-stats.rb",
29
- "lib/resque-job-stats/server.rb",
30
- "lib/resque-job-stats/server/views/job_stats.erb",
31
- "lib/resque/plugins/job_stats.rb",
32
- "lib/resque/plugins/job_stats/duration.rb",
33
- "lib/resque/plugins/job_stats/enqueued.rb",
34
- "lib/resque/plugins/job_stats/failed.rb",
35
- "lib/resque/plugins/job_stats/performed.rb",
36
- "lib/resque/plugins/job_stats/statistic.rb",
37
- "lib/resque/plugins/job_stats/timeseries.rb",
38
- "resque-job-stats.gemspec",
39
- "test/helper.rb",
40
- "test/test_job_stats.rb",
41
- "test/test_server.rb"
42
- ]
43
- s.homepage = "http://github.com/alanpeabody/resque-job-stats"
44
- s.licenses = ["MIT"]
45
- s.require_paths = ["lib"]
46
- s.rubygems_version = "1.8.17"
47
- s.summary = "Job-centric stats for Resque"
48
-
49
- if s.respond_to? :specification_version then
50
- s.specification_version = 3
51
-
52
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
53
- s.add_runtime_dependency(%q<resque>, ["~> 1.17"])
54
- s.add_development_dependency(%q<minitest>, [">= 0"])
55
- s.add_development_dependency(%q<bundler>, ["~> 1.1.0"])
56
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
57
- s.add_development_dependency(%q<mynyml-redgreen>, ["~> 0.7.1"])
58
- s.add_development_dependency(%q<timecop>, [">= 0"])
59
- s.add_development_dependency(%q<rack-test>, [">= 0"])
60
- else
61
- s.add_dependency(%q<resque>, ["~> 1.17"])
62
- s.add_dependency(%q<minitest>, [">= 0"])
63
- s.add_dependency(%q<bundler>, ["~> 1.1.0"])
64
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
65
- s.add_dependency(%q<mynyml-redgreen>, ["~> 0.7.1"])
66
- s.add_dependency(%q<timecop>, [">= 0"])
67
- s.add_dependency(%q<rack-test>, [">= 0"])
68
- end
69
- else
70
- s.add_dependency(%q<resque>, ["~> 1.17"])
71
- s.add_dependency(%q<minitest>, [">= 0"])
72
- s.add_dependency(%q<bundler>, ["~> 1.1.0"])
73
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
74
- s.add_dependency(%q<mynyml-redgreen>, ["~> 0.7.1"])
75
- s.add_dependency(%q<timecop>, [">= 0"])
76
- s.add_dependency(%q<rack-test>, [">= 0"])
77
- end
78
- end
79
-
@@ -1,29 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'minitest/unit'
11
- require 'minitest/mock'
12
- require 'rack/test'
13
- require 'redgreen'
14
- require 'resque'
15
- require 'timecop'
16
-
17
- Resque.redis = 'localhost:6379'
18
- Resque.redis.namespace = 'resque:job_stats'
19
-
20
- $LOAD_PATH.unshift(File.dirname(__FILE__))
21
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
22
- require 'resque-job-stats'
23
-
24
-
25
-
26
- class MiniTest::Unit::TestCase
27
- end
28
-
29
- MiniTest::Unit.autorun
@@ -1,140 +0,0 @@
1
- require 'helper'
2
-
3
- class BaseJob
4
- @queue = :test
5
-
6
- def self.perform(sleep_time=0.01)
7
- sleep sleep_time
8
- end
9
- end
10
-
11
- class SimpleJob < BaseJob
12
- extend Resque::Plugins::JobStats
13
- @queue = :test
14
- end
15
-
16
- class FailJob < BaseJob
17
- extend Resque::Plugins::JobStats::Failed
18
- @queue = :test
19
-
20
- def self.perform(*args)
21
- raise 'fail'
22
- end
23
- end
24
-
25
- class CustomDurJob < BaseJob
26
- extend Resque::Plugins::JobStats::Duration
27
- @queue = :test
28
- @durations_recorded = 5
29
- end
30
-
31
- class TestResqueJobStats < MiniTest::Unit::TestCase
32
-
33
- def setup
34
- # Ensure empty redis for each test
35
- Resque.redis.flushdb
36
- @worker = Resque::Worker.new(:test)
37
- end
38
-
39
- def test_lint
40
- Resque::Plugin.lint(Resque::Plugins::JobStats)
41
- assert_equal true, true
42
- rescue => e
43
- assert_equal false, e
44
- end
45
-
46
- def test_jobs_performed
47
- assert_equal 'stats:jobs:SimpleJob:performed', SimpleJob.jobs_performed_key
48
- SimpleJob.jobs_performed = 0
49
- 3.times do
50
- Resque.enqueue(SimpleJob)
51
- @worker.work(0)
52
- end
53
- assert_equal 3, SimpleJob.jobs_performed
54
- end
55
-
56
- def test_jobs_enqueued
57
- assert_equal 'stats:jobs:SimpleJob:enqueued', SimpleJob.jobs_enqueued_key
58
- SimpleJob.jobs_enqueued = 0
59
- 3.times do
60
- Resque.enqueue(SimpleJob)
61
- @worker.work(0)
62
- end
63
- assert_equal 3, SimpleJob.jobs_enqueued
64
- end
65
-
66
- def test_jobs_failed
67
- assert_equal 'stats:jobs:FailJob:failed', FailJob.jobs_failed_key
68
- FailJob.jobs_failed = 0
69
- 3.times do
70
- Resque.enqueue(FailJob)
71
- @worker.work(0)
72
- end
73
- assert_equal 3, FailJob.jobs_failed
74
- end
75
-
76
- def test_duration
77
- assert_equal 'stats:jobs:SimpleJob:duration', SimpleJob.jobs_duration_key
78
- SimpleJob.reset_job_durations
79
- assert_equal 0.0, SimpleJob.job_rolling_avg
80
- assert_equal 0.0, SimpleJob.longest_job
81
-
82
- 3.times do |i|
83
- d = (i + 1)/10.0
84
- Resque.enqueue(SimpleJob,d)
85
- @worker.work(0)
86
- end
87
-
88
- assert_in_delta 0.3, SimpleJob.job_durations[0], 0.01
89
- assert_in_delta 0.2, SimpleJob.job_durations[1], 0.01
90
- assert_in_delta 0.1, SimpleJob.job_durations[2], 0.01
91
- assert_in_delta 0.3, SimpleJob.longest_job, 0.01
92
- assert_in_delta 0.2, SimpleJob.job_rolling_avg, 0.01
93
- end
94
-
95
- def test_custom_duration
96
- CustomDurJob.reset_job_durations
97
-
98
- 2.times do
99
- Resque.enqueue(CustomDurJob,1.0)
100
- @worker.work(0)
101
- end
102
-
103
- 5.times do
104
- Resque.enqueue(CustomDurJob,0.1)
105
- @worker.work(0)
106
- end
107
-
108
- assert_in_delta 0.1, CustomDurJob.longest_job, 0.01
109
- assert_in_delta 0.1, CustomDurJob.job_rolling_avg, 0.01
110
- end
111
-
112
- def test_perform_timeseries
113
- time = SimpleJob.timestamp
114
- 3.times do
115
- Resque.enqueue(SimpleJob)
116
- @worker.work(0)
117
- end
118
- assert_equal 3, SimpleJob.performed_per_minute[time]
119
- assert_equal 0, SimpleJob.performed_per_minute[(time - 60)]
120
-
121
- assert_equal 3, SimpleJob.performed_per_hour[time]
122
- assert_equal 0, SimpleJob.performed_per_hour[(time - 3600)]
123
- end
124
-
125
- def test_enqueue_timeseries
126
- time = SimpleJob.timestamp
127
- Timecop.freeze(time)
128
- Resque.enqueue(SimpleJob,0)
129
- Timecop.freeze(time + 60)
130
- @worker.work(0)
131
- assert_equal 1, SimpleJob.queued_per_minute[time]
132
- assert_equal 0, SimpleJob.queued_per_minute[(time + 60)]
133
- assert_equal 1, SimpleJob.performed_per_minute[(time + 60)]
134
- Timecop.return
135
- end
136
-
137
- def test_measured_jobs
138
- assert_equal [SimpleJob], Resque::Plugins::JobStats.measured_jobs
139
- end
140
- end
@@ -1,102 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
- require 'resque-job-stats/server'
3
-
4
- # A pretend job that has all of the statistics we want to display (i.e. extends
5
- # Resque::Plugins::JobStats)
6
- class AnyJobber
7
- class << self
8
- def jobs_enqueued
9
- 111
10
- end
11
-
12
- def jobs_performed
13
- 12345
14
- end
15
-
16
- def jobs_failed
17
- 0
18
- end
19
-
20
- def job_rolling_avg
21
- 0.3333232
22
- end
23
-
24
- def longest_job
25
- 0.455555
26
- end
27
- end
28
- end
29
-
30
- class YetAnotherJobber < AnyJobber
31
- end
32
-
33
- class MyServer
34
- def self.job_stats_to_display
35
- [:jobs_enqueued]
36
- end
37
-
38
- include Resque::Plugins::JobStats::Server::Helpers
39
- end
40
-
41
- ENV['RACK_ENV'] = 'test'
42
- class TestServer < MiniTest::Unit::TestCase
43
- include Rack::Test::Methods
44
-
45
- def setup
46
- Resque::Server.job_stats_to_display = Resque::Plugins::JobStats::Statistic::DEFAULT_STATS
47
- @server = MyServer.new
48
- end
49
-
50
- def app
51
- Resque::Server
52
- end
53
-
54
- def test_job_stats
55
- Resque::Plugins::JobStats.stub :measured_jobs, [AnyJobber] do
56
- get '/job_stats'
57
- assert_equal 200, last_response.status, last_response.body
58
- assert last_response.body.include?("<td>AnyJobber</td>"), "job name was not found"
59
- assert last_response.body.include?("<td>111</td>"), "jobs_enqueued was not found"
60
- assert last_response.body.include?("<td>12345</td>"), "jobs_performed was not found"
61
- assert last_response.body.include?("<td></td>"), "jobs_failed was not found"
62
- assert last_response.body.include?("<td>0.33s</td>"), "job_rolling_avg was not found"
63
- assert last_response.body.include?("<td>0.46s</td>"), "longest_job was not found"
64
- end
65
- end
66
-
67
- def test_job_stats_filtered
68
- Resque::Server.job_stats_to_display = [:longest_job]
69
- Resque::Plugins::JobStats.stub :measured_jobs, [AnyJobber] do
70
- get '/job_stats'
71
- assert_equal 200, last_response.status, last_response.body
72
- assert last_response.body.include?("<td>AnyJobber</td>"), "job name was not found"
73
- assert !last_response.body.include?("<td>111</td>"), "jobs_enqueued was not found"
74
- assert !last_response.body.include?("<td>12345</td>"), "jobs_performed was not found"
75
- assert !last_response.body.include?("<td></td>"), "jobs_failed was not found"
76
- assert !last_response.body.include?("<td>0.33s</td>"), "job_rolling_avg was not found"
77
- assert last_response.body.include?("<td>0.46s</td>"), "longest_job was not found"
78
- end
79
- end
80
-
81
- def test_stat_header
82
- assert_equal "<th>Jobs enqueued</th>", @server.stat_header(:jobs_enqueued)
83
- assert_equal nil, @server.stat_header(:FOOOOOOO)
84
- end
85
-
86
- def test_display_stat?
87
- assert !@server.display_stat?(:jobs_barfing)
88
- assert @server.display_stat?(:jobs_enqueued)
89
- end
90
-
91
- def test_job_sorting
92
- Resque::Plugins::JobStats.stub :measured_jobs, [YetAnotherJobber, AnyJobber] do
93
- get '/job_stats'
94
- assert_equal 200, last_response.status, last_response.body
95
- assert(last_response.body =~ /AnyJobber(.|\n)+YetAnotherJobber/, "AnyJobber should be found before YetAnotherJobber")
96
- end
97
- end
98
-
99
- def test_tabs
100
- assert app.tabs.include?("Job_Stats"), "The tab should be in resque's server"
101
- end
102
- end