misha-resque-cleaner 0.3.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1405bf5e1ebe278cb94cd251a5d9cb0336aff9c9
4
+ data.tar.gz: 85f0196dd01ea54e55a153292bf8b45d4a132142
5
+ SHA512:
6
+ metadata.gz: d7b9a7bc170754c7d0d217403f05d012514ebbb559c4ad5bb515d295c7f547aff27925777eb337039cd03e57f40efc2902101f6f9c89ec417836fcd1baf4801b
7
+ data.tar.gz: 14a6175730bdfbb787b490129820e007191ba15e877fcf7d2677abfeddabdfc5349f41cba8fae7096308038e5154283e292c9bc487e92f71503f7c2e0345f7a7
data/CHANGELOG.md ADDED
@@ -0,0 +1,76 @@
1
+ ## 0.3.0 (2014-05-27)
2
+
3
+ * Search by regex (#27)
4
+ * Show stats by exception (#29)
5
+ * Stop supporting ruby 1.8.x and 1.9.2
6
+ * Escape query parameters (#30)
7
+
8
+ ## 0.2.12 (2013-12-03)
9
+
10
+ * Remove Resque::Helpers include (#23)
11
+ * Tweak Gemspec (#24)
12
+ * Don't use yaml format to show arguments
13
+ * Tweak README
14
+
15
+ ## 0.2.11 (2013-07-19)
16
+
17
+ * Use transaction for retry-and-clear (#22).
18
+ * Fix for CI
19
+
20
+ ## 0.2.10 (2012-10-15)
21
+
22
+ * Bug fix: use URL helper to support resque-web which is not hosted under '/'.
23
+
24
+ ## 0.2.9 (2012-05-10)
25
+
26
+ * Make limiter configurable on resque-web.
27
+
28
+ ## 0.2.8 (2012-03-19)
29
+
30
+ * UI tweak (#15)
31
+
32
+ ## 0.2.7 (2012-01-17)
33
+
34
+ * Support Travis CI
35
+ * Support failure jobs without payload information (#11).
36
+
37
+ ## 0.2.6 (2011-08-23)
38
+
39
+ * Follow the latest resque for date format.
40
+
41
+ ## 0.2.5 (2011-05-05)
42
+
43
+ * BUGFIX: Pagination has been broken.
44
+ * Dump a list as JSON format.
45
+
46
+ ## 0.2.4 (2011-04-19)
47
+
48
+ * BUGFIX: "Select All" ignores exception filter.
49
+
50
+ ## 0.2.3 (2011-04-11)
51
+
52
+ * Exception filter.
53
+
54
+ ## 0.2.2 (2011-04-07)
55
+
56
+ * Changed a way to load yajl/json\_gem.
57
+
58
+ ## 0.2.1 (2011-04-06)
59
+
60
+ * BUGFIX: Bulk action didn't work properly when you select all jobs.
61
+ * Removed absolute paths from html.
62
+
63
+ ## 0.2.0 (2011-04-06)
64
+
65
+ * Extended with resque-web
66
+
67
+ ## 0.1.1 (2010-12-30)
68
+
69
+ * Fixed for ruby 1.9.2
70
+ * Fixed a bug on #retried? method
71
+
72
+ ## 0.1.0 (2010-11-24)
73
+
74
+ * First official release
75
+
76
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Tatsuya Ono
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,330 @@
1
+ ResqueCleaner
2
+ =============
3
+
4
+ [github.com/ono/resque-cleaner](https://github.com/ono/resque-cleaner)
5
+
6
+ Description
7
+ -----------
8
+
9
+ ResqueCleaner is a [Resque](https://github.com/defunkt/resque) plugin which
10
+ aims to help you to clean up failed jobs on Resque by:
11
+
12
+ * Showing stats of failed jobs
13
+ * Retrying failed jobs
14
+ * Removing failed jobs
15
+ * Filtering failed jobs
16
+
17
+
18
+ Installation
19
+ ------------
20
+
21
+ Install as a gem:
22
+
23
+ $ gem install resque-cleaner
24
+
25
+
26
+ Resque-Web integration
27
+ ----------------------
28
+
29
+ ![Screen 1](https://github.com/ono/resque-cleaner/raw/master/misc/resque-cleaner-main.png)
30
+ ![Screen 2](misc/resque-cleaner-list-with-regex.png)
31
+
32
+
33
+ Configuration
34
+ -------------
35
+
36
+ At first, you have to load ResqueCleaner to enable the Cleaner tab. Here is
37
+ an example step.
38
+
39
+ 1. Create a configuration file for resque-web
40
+ <br/>```touch [app_dir]/config/resque-web.rb```
41
+
42
+ 2. Add the following line into the file
43
+ <br/>```require 'resque-cleaner'```
44
+
45
+ 3. Then pass the file when you start resque-web
46
+ <br/>```% resque-web [app_dir]/config/resque-web.rb```
47
+
48
+ You can also configure [limiter](https://github.com/ono/resque-cleaner#limiter)
49
+ in the file.
50
+
51
+ e.g.
52
+
53
+ ```ruby
54
+ require 'resque-cleaner'
55
+ module Resque::Plugins
56
+ ResqueCleaner::Limiter.default_maximum = 10_000
57
+ end
58
+ ```
59
+
60
+ Console
61
+ -------
62
+
63
+ Hopefully a situation of your failed jobs is simple enough to get figured out through
64
+ the web interface. But, if not, a powerful filtering feature of ResqueCleaner may help
65
+ you to understand what is going on with your console(irb).
66
+
67
+ **Create Instance**
68
+
69
+ ```ruby
70
+ > cleaner = Resque::Plugins::ResqueCleaner.new
71
+ ```
72
+
73
+ **Show Stats**
74
+
75
+ Shows stats of failed jobs grouped by date.
76
+
77
+ ```ruby
78
+ > cleaner.stats_by_date
79
+ 2009/03/13: 6
80
+ 2009/11/13: 14
81
+ 2010/08/13: 22
82
+ total: 42
83
+ => {'2009/03/10' => 6, ...}
84
+ ```
85
+
86
+ You could also group them by class.
87
+
88
+ ```ruby
89
+ > cleaner.stats_by_class
90
+ BadJob: 3
91
+ HorribleJob: 7
92
+ total: 10
93
+ => {'BadJob' => 3, ...}
94
+ ```
95
+
96
+ Or you could also group them by exception.
97
+
98
+ ```ruby
99
+ > cleaner.stats_by_exception
100
+ RuntimeError: 35
101
+ SyntaxError: 7
102
+ total: 42
103
+ => {'RuntimeError' => 35, ...}
104
+ ```
105
+
106
+ You can get the ones filtered with a block: it targets only jobs which the block
107
+ evaluates true.
108
+
109
+ e.g. Show stats only of jobs entered with some arguments:
110
+
111
+ ```ruby
112
+ > cleaner.stats_by_date {|j| j["payload"]["args"].size > 0}
113
+ 2009/03/13: 3
114
+ 2009/11/13: 7
115
+ 2010/08/13: 11
116
+ total: 22
117
+ => {'2009/03/10' => 3, ...}
118
+ ```
119
+
120
+ A convenience helper for searching for failed jobs which satisfy a
121
+ regular expression:
122
+
123
+ ```ruby
124
+ cleaner.select_by_regex(/Jason/) # => all failed jobs that have "Jason" in them
125
+ ```
126
+
127
+ **Retry(Requeue) Jobs**
128
+
129
+ You can retry all failed jobs with this method.
130
+
131
+ ```ruby
132
+ > cleaner.requeue
133
+ ```
134
+
135
+ Of course, you can filter jobs with a block; it requeues only jobs which the
136
+ block evaluates true.
137
+
138
+ e.g. Retry only jobs with some arguments:
139
+
140
+ ```ruby
141
+ > cleaner.requeue {|j| j["payload"]["args"].size > 0}
142
+ ```
143
+
144
+ The job hash is extended with a module which defines some useful methods. You
145
+ can use it in the block.
146
+
147
+ e.g. Retry only jobs entered within a day:
148
+
149
+ ```ruby
150
+ > cleaner.requeue {|j| j.after?(1.day.ago)}
151
+ ```
152
+
153
+ e.g. Retry EmailJob entered with arguments within 3 days:
154
+
155
+ ```ruby
156
+ > cleaner.requeue {|j| j.after?(3.days.ago) && j.klass?(EmailJob) && j["payload"]["args"].size>0}
157
+ ```
158
+
159
+ See Helper Methods section bellow for more information.
160
+
161
+ NOTE:
162
+ [1.day.ago](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/numeric/time.rb)
163
+ is not in standard library. Using it for making explanation more understandable. It is equivalent to `Time.now - 60*60*24*3`.
164
+
165
+ **Clear Jobs**
166
+
167
+ You can clear all failed jobs with this method:
168
+
169
+ ```ruby
170
+ > cleaner.clear
171
+ ```
172
+
173
+ Like you can do with the retry method, the clear method takes a block. Here are
174
+ some examples:
175
+
176
+ ```ruby
177
+ > cleaner.clear {|j| j.retried?}
178
+ => clears all jobs already retried and returns number of the jobs.
179
+
180
+ > cleaner.clear {|j| j.queue?(:low) && j.before?('2010-10-10')}
181
+ => clears all jobs entried in :low queue before 10th October, 2010.
182
+
183
+ > cleaner.clear {|j| j.exception?("RuntimeError") && j.queue?(:low)}
184
+ => clears all jobs raised RuntimeError and queued :low queue
185
+ ```
186
+
187
+ **Retry and Clear Jobs**
188
+
189
+ You can retry(requeue) and clear failed jobs at the same time; just pass true
190
+ as an argument.
191
+
192
+ e.g. Retry EmailJob and remove from failed jobs:
193
+
194
+ ```ruby
195
+ > cleaner.requeue(true) {|j| j.klass?(EmailJob)}
196
+ ```
197
+
198
+ **Retry with other queue**
199
+
200
+ You can requeue failed jobs into other queue. In this way, you can retry failed
201
+ jobs without blocking jobs being entered by your service running in the live.
202
+
203
+ e.g. Retry failed jobs on :retry queue
204
+
205
+ ```ruby
206
+ > cleaner.requeue(false, :queue => :retry)
207
+ ```
208
+
209
+ Don't forget to launch resque worker for the queue.
210
+
211
+ % QUEUE=retry rake resque:work
212
+
213
+ **Select Jobs**
214
+
215
+ You can just select the jobs of course. Here are some examples:
216
+
217
+ ```ruby
218
+ > cleaner.select {|j| j["payload"]["args"][0]=="Johonson"}
219
+ > cleaner.select {|j| j.after?(2.days.ago)}
220
+ > cleaner.select #=> returns all jobs
221
+ ```
222
+
223
+ **Helper Methods**
224
+
225
+ Here is a list of methods a failed job retained through ResqueCleaner has:
226
+
227
+ retried?: returns true if the job has already been retried.
228
+ requeued?: alias of retried?.
229
+ before?(time): returns true if the job failed before the time.
230
+ after?(time): returns true if the job failed after the time.
231
+ klass?(klass_or_name): returns true if the class of job matches.
232
+ queue?(queue_name): returns true if the queue of job matches.
233
+ exception?(exception_name): returns true if the exception matches.
234
+
235
+
236
+ Failed Job
237
+ -----------
238
+
239
+ Here is a sample of failed jobs:
240
+
241
+ {"failed_at": "2009/03/13 00:00:00",
242
+ "payload": {"args": ["Johnson"], "class": "BadJob"},
243
+ "queue": "jobs",
244
+ "worker": "localhost:7327:jobs,jobs2",
245
+ "exception": "RuntimeError",
246
+ "error": "Bad job, Johnson",
247
+ "backtrace":
248
+ ["./test/test_helper.rb:108:in `perform'",
249
+ "/opt/local/lib/ruby/gems/1.8/gems/resque-1.10.0/lib/resque/job.rb:133:in `perform'",
250
+ "/opt/local/lib/ruby/gems/1.8/gems/resque-1.10.0/lib/resque/worker.rb:157:in `perform'",
251
+ "/opt/local/lib/ruby/gems/1.8/gems/resque-1.10.0/lib/resque/worker.rb:124:in `work'",
252
+ "....(omitted)....",
253
+ "./test/test_helper.rb:41",
254
+ "test/resque_cleaner_test.rb:3"]
255
+ }
256
+
257
+
258
+ Limiter
259
+ -------
260
+
261
+ ResqueCleaner expects a disaster situation like a huge number of failed jobs are
262
+ out there. Since ResqueCleaner's filter function is running on your application
263
+ process but on your Redis, it would not respond ages if you try to deal with all
264
+ of those jobs.
265
+
266
+ ResqueCleaner supposes recent jobs are more important than old jobs. Therefore
267
+ ResqueCleaner deals with **ONLY LAST X(default=1000) JOBS**. In this way, you
268
+ could avoid slow responses. You can change the number through `limiter` attribute.
269
+
270
+ Let's see how it works with an following example.
271
+
272
+ **Sample Situation**
273
+
274
+ * Number of failed jobs: 100,000
275
+
276
+ Default limiter is 1000 so that the limiter returns 1000 as a count.
277
+
278
+ ```ruby
279
+ > cleaner.limiter.count
280
+ => 1,000
281
+ > cleaner.failure.count
282
+ => 100,000
283
+ ```
284
+
285
+ You could know if the limiter is on with on? method.
286
+
287
+ ```ruby
288
+ > cleaner.limiter.on?
289
+ => true
290
+ ```
291
+
292
+ You can change the maximum number of the limiter with maximum attribute.
293
+
294
+ ```ruby
295
+ > cleaner.limiter.maximum = 3000
296
+ => 3,000
297
+ > cleaner.limiter.count
298
+ => 3,000
299
+ > cleaner.limiter.on?
300
+ => true
301
+ ```
302
+
303
+ With limiter, ResqueCleaner's filtering targets only the last X(3000 in this
304
+ sample) failed jobs.
305
+
306
+ ```ruby
307
+ > cleaner.select.size
308
+ => 3,000
309
+ ```
310
+
311
+ The clear\_stale method deletes all jobs entered prior to the last X(3000 in
312
+ this sample) failed jobs. This calls Redis API and no iteration occurs on Ruby
313
+ application; it should be quick even if there are huge number of failed jobs.
314
+
315
+ ```ruby
316
+ > cleaner.clear_stale
317
+ > cleaner.failure.count
318
+ => 3,000
319
+ > cleaner.limiter.count
320
+ => 3,000
321
+ > cleaner.limiter.on?
322
+ => false
323
+ ```
324
+
325
+ Many Thanks!
326
+ ------------
327
+
328
+ To our [Contributors](https://github.com/ono/resque-cleaner/contributors)
329
+
330
+
data/Rakefile ADDED
@@ -0,0 +1,38 @@
1
+ #
2
+ # Setup
3
+ #
4
+
5
+ # load 'tasks/redis.rake'
6
+ #require 'rake/testtask'
7
+
8
+ $LOAD_PATH.unshift 'lib'
9
+ #require 'resque/tasks'
10
+
11
+ def command?(command)
12
+ system("type #{command} > /dev/null 2>&1")
13
+ end
14
+
15
+
16
+ #
17
+ # Tests
18
+ #
19
+
20
+ task :default => :test
21
+
22
+ desc "Run the test suite"
23
+ task :test do
24
+ rg = command?(:rg)
25
+ Dir['test/**/*_test.rb'].each do |f|
26
+ rg ? sh("rg #{f}") : ruby(f)
27
+ end
28
+ end
29
+
30
+ if command? :kicker
31
+ desc "Launch Kicker (like autotest)"
32
+ task :kicker do
33
+ puts "Kicking... (ctrl+c to cancel)"
34
+ exec "kicker -e rake test lib examples"
35
+ end
36
+ end
37
+
38
+