resque-job-stats 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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