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.
- checksums.yaml +7 -0
- data/README.rdoc +1 -1
- data/lib/resque-job-stats/server.rb +19 -0
- data/lib/resque/plugins/job_stats.rb +2 -0
- data/lib/resque/plugins/job_stats/history.rb +55 -0
- data/lib/resque/plugins/job_stats/version.rb +7 -0
- metadata +45 -66
- data/.document +0 -5
- data/.rvmrc +0 -1
- data/.travis.yml +0 -3
- data/Gemfile +0 -12
- data/Rakefile +0 -45
- data/VERSION +0 -1
- data/lib/resque-job-stats/server/views/job_stats.erb +0 -26
- data/resque-job-stats.gemspec +0 -79
- data/test/helper.rb +0 -29
- data/test/test_job_stats.rb +0 -140
- data/test/test_server.rb +0 -102
checksums.yaml
ADDED
@@ -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
|
data/README.rdoc
CHANGED
@@ -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-
|
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 ? "✓" : "✗"
|
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
|
+
|
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.
|
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.
|
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:
|
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:
|
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:
|
27
|
-
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:
|
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:
|
44
|
-
type: :development
|
45
|
-
prerelease: false
|
46
|
-
version_requirements: *70220064840560
|
40
|
+
version: '0'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
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:
|
47
|
+
version: '5.0'
|
55
48
|
type: :development
|
56
49
|
prerelease: false
|
57
|
-
version_requirements:
|
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
|
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:
|
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:
|
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:
|
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:
|
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
|
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:
|
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:
|
125
|
+
rubygems_version: 2.2.2
|
147
126
|
signing_key:
|
148
|
-
specification_version:
|
127
|
+
specification_version: 4
|
149
128
|
summary: Job-centric stats for Resque
|
150
129
|
test_files: []
|
data/.document
DELETED
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm 1.9.2@resque-job-stats
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
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>
|
data/resque-job-stats.gemspec
DELETED
@@ -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
|
-
|
data/test/helper.rb
DELETED
@@ -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
|
data/test/test_job_stats.rb
DELETED
@@ -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
|
data/test/test_server.rb
DELETED
@@ -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
|