sidekiq-failures 0.2.2 → 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 +7 -0
- data/.travis.yml +7 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +13 -18
- data/README.md +22 -1
- data/lib/sidekiq/failures.rb +15 -0
- data/lib/sidekiq/failures/middleware.rb +5 -5
- data/lib/sidekiq/failures/version.rb +1 -1
- data/lib/sidekiq/failures/views/failures.erb +2 -4
- data/lib/sidekiq/failures/web_extension.rb +2 -11
- data/sidekiq-failures.gemspec +1 -2
- data/test/middleware_test.rb +22 -4
- data/test/test_helper.rb +0 -7
- metadata +20 -54
- data/lib/sidekiq/failures/views/failures.slim +0 -41
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 708163dea57e9c34fbaf279980cd23c56420415f
|
4
|
+
data.tar.gz: 1a8967ec4c7efc057fa48e2481601fc42980edf0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d8bca52118ae7b792ac8387c25aad0662680b2797ab8fe0bd0b668986fe4643f26ddefc2200d33cbf4c662a85d16d1279f2ff33097ebaa502eddbd1da5413beb
|
7
|
+
data.tar.gz: 5ac567f23aa5f0e9f27769ca5223da6c4d08f4e6de981c398c87e6a3978706d543302370539d413f9023a7c504e0015b200f641a76f433fbc1ca7c058242c2d8
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
+
## 0.3.0
|
4
|
+
* Bump sidekiq dependency to sidekiq >= 2.14.0
|
5
|
+
* Remove slim templates and dependecy
|
6
|
+
* Escape exception info when outputing to html
|
7
|
+
* Add `Sidekiq::Failures.reset_failures` helper method
|
8
|
+
* Add `Sidekiq::Failures.count` helper method (@zanker)
|
9
|
+
* Adhere to sidekiq approach of showing UTC times
|
10
|
+
* Catch all exceptions, not just those that inherit from StandardError (@tylerkovacs)
|
11
|
+
* Fix pricate method call (@bwthomas)
|
12
|
+
|
3
13
|
## 0.2.2
|
4
14
|
* Support ERB for sidekiq >= 2.14.0 (@tobiassvn)
|
5
15
|
* Bump sidekiq dep to >= 2.9.0
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sidekiq-failures (0.
|
5
|
-
sidekiq (>= 2.
|
4
|
+
sidekiq-failures (0.3.0)
|
5
|
+
sidekiq (>= 2.14.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
celluloid (0.
|
11
|
-
timers (
|
12
|
-
connection_pool (1.
|
10
|
+
celluloid (0.15.2)
|
11
|
+
timers (~> 1.1.0)
|
12
|
+
connection_pool (1.2.0)
|
13
13
|
hike (1.2.1)
|
14
|
-
json (1.8.
|
14
|
+
json (1.8.1)
|
15
15
|
multi_json (1.7.3)
|
16
16
|
rack (1.4.1)
|
17
17
|
rack-protection (1.2.0)
|
@@ -19,28 +19,24 @@ GEM
|
|
19
19
|
rack-test (0.6.2)
|
20
20
|
rack (>= 1.0)
|
21
21
|
rake (0.9.2.2)
|
22
|
-
redis (3.0.
|
23
|
-
redis-namespace (1.3.
|
24
|
-
redis (~> 3.0.
|
25
|
-
sidekiq (2.
|
26
|
-
celluloid (>= 0.
|
22
|
+
redis (3.0.6)
|
23
|
+
redis-namespace (1.3.2)
|
24
|
+
redis (~> 3.0.4)
|
25
|
+
sidekiq (2.17.0)
|
26
|
+
celluloid (>= 0.15.2)
|
27
27
|
connection_pool (>= 1.0.0)
|
28
28
|
json
|
29
|
-
redis (>= 3.0)
|
30
|
-
redis-namespace
|
29
|
+
redis (>= 3.0.4)
|
30
|
+
redis-namespace (>= 1.3.1)
|
31
31
|
sinatra (1.3.3)
|
32
32
|
rack (~> 1.3, >= 1.3.6)
|
33
33
|
rack-protection (~> 1.2)
|
34
34
|
tilt (~> 1.3, >= 1.3.3)
|
35
|
-
slim (1.3.4)
|
36
|
-
temple (~> 0.5.5)
|
37
|
-
tilt (~> 1.3.3)
|
38
35
|
sprockets (2.8.1)
|
39
36
|
hike (~> 1.2)
|
40
37
|
multi_json (~> 1.0)
|
41
38
|
rack (~> 1.0)
|
42
39
|
tilt (~> 1.1, != 1.3.0)
|
43
|
-
temple (0.5.5)
|
44
40
|
tilt (1.3.3)
|
45
41
|
timers (1.1.0)
|
46
42
|
|
@@ -52,5 +48,4 @@ DEPENDENCIES
|
|
52
48
|
rake
|
53
49
|
sidekiq-failures!
|
54
50
|
sinatra
|
55
|
-
slim
|
56
51
|
sprockets
|
data/README.md
CHANGED
@@ -113,9 +113,30 @@ end
|
|
113
113
|
|
114
114
|
The valid modes are `:all`, `:exhausted` or `:off`.
|
115
115
|
|
116
|
+
## Helper Methods
|
117
|
+
|
118
|
+
### Failures Count
|
119
|
+
|
120
|
+
Gives back the number of failed jobs currently stored in Sidekiq Failures. Notice that it's
|
121
|
+
different from `Sidekiq` built in failed stat. Also, notice that this might be
|
122
|
+
influenced by `failures_max_count`.
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
Sidekiq::Failures.count
|
126
|
+
```
|
127
|
+
|
128
|
+
### Reset Failures
|
129
|
+
|
130
|
+
Gives a convenient way of reseting Sidekiq Failure stored failed jobs programmatically.
|
131
|
+
Takes an options hash and if the `counter` key is present also resets Sidekiq own failed stats.
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
Sidekiq::Failures.reset_failures
|
135
|
+
```
|
136
|
+
|
116
137
|
## Dependencies
|
117
138
|
|
118
|
-
Depends on Sidekiq >= 2.
|
139
|
+
Depends on Sidekiq >= 2.14.0
|
119
140
|
|
120
141
|
## Contributing
|
121
142
|
|
data/lib/sidekiq/failures.rb
CHANGED
@@ -50,6 +50,21 @@ module Sidekiq
|
|
50
50
|
end
|
51
51
|
|
52
52
|
module Failures
|
53
|
+
|
54
|
+
LIST_KEY = :failed
|
55
|
+
|
56
|
+
def self.reset_failures(options = {})
|
57
|
+
Sidekiq.redis { |c|
|
58
|
+
c.multi do
|
59
|
+
c.del(LIST_KEY)
|
60
|
+
c.set("stat:failed", 0) if options[:counter] || options["counter"]
|
61
|
+
end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.count
|
66
|
+
Sidekiq.redis {|r| r.llen(LIST_KEY) }
|
67
|
+
end
|
53
68
|
end
|
54
69
|
end
|
55
70
|
|
@@ -10,11 +10,11 @@ module Sidekiq
|
|
10
10
|
yield
|
11
11
|
rescue Sidekiq::Shutdown
|
12
12
|
raise
|
13
|
-
rescue => e
|
13
|
+
rescue Exception => e
|
14
14
|
raise e if skip_failure?
|
15
15
|
|
16
16
|
data = {
|
17
|
-
:failed_at => Time.now.
|
17
|
+
:failed_at => Time.now.utc,
|
18
18
|
:payload => msg,
|
19
19
|
:exception => e.class.to_s,
|
20
20
|
:error => e.message,
|
@@ -25,9 +25,9 @@ module Sidekiq
|
|
25
25
|
}
|
26
26
|
|
27
27
|
Sidekiq.redis do |conn|
|
28
|
-
conn.lpush(
|
28
|
+
conn.lpush(LIST_KEY, Sidekiq.dump_json(data))
|
29
29
|
unless Sidekiq.failures_max_count == false
|
30
|
-
conn.ltrim(
|
30
|
+
conn.ltrim(LIST_KEY, 0, Sidekiq.failures_max_count - 1)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -66,7 +66,7 @@ module Sidekiq
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def max_retries
|
69
|
-
retry_middleware.retry_attempts_from
|
69
|
+
retry_middleware.send(:retry_attempts_from, msg['retry'], default_max_retries)
|
70
70
|
end
|
71
71
|
|
72
72
|
def retry_middleware
|
@@ -26,13 +26,11 @@
|
|
26
26
|
</td>
|
27
27
|
<td><%= msg['queue'] %></td>
|
28
28
|
<td>
|
29
|
-
|
30
|
-
<%= msg['failed_at'] %>
|
31
|
-
</time>
|
29
|
+
<%= relative_time(Time.parse(msg['failed_at'])) %>
|
32
30
|
</td>
|
33
31
|
<td style="overflow: auto; padding: 10px;">
|
34
32
|
<a class="backtrace" href="#" onclick="$(this).next().toggle(); return false">
|
35
|
-
<%= msg['exception'] %>: <%= msg['error'] %>
|
33
|
+
<%= h msg['exception'] %>: <%= h msg['error'] %>
|
36
34
|
</a>
|
37
35
|
<pre style="display: none; background: none; border: 0; width: 100%; max-height: 30em; font-size: 0.8em; white-space: nowrap;">
|
38
36
|
<%= msg['backtrace'].join("<br />") %>
|
@@ -10,20 +10,11 @@ module Sidekiq
|
|
10
10
|
(@current_page, @total_size, @messages) = page("failed", params[:page], @count)
|
11
11
|
@messages = @messages.map { |msg| Sidekiq.load_json(msg) }
|
12
12
|
|
13
|
-
|
14
|
-
render(:slim, File.read(File.join(view_path, "failures.slim")))
|
15
|
-
else
|
16
|
-
render(:erb, File.read(File.join(view_path, "failures.erb")))
|
17
|
-
end
|
13
|
+
render(:erb, File.read(File.join(view_path, "failures.erb")))
|
18
14
|
end
|
19
15
|
|
20
16
|
app.post "/failures/remove" do
|
21
|
-
Sidekiq.
|
22
|
-
c.multi do
|
23
|
-
c.del("failed")
|
24
|
-
c.set("stat:failed", 0) if params["counter"]
|
25
|
-
end
|
26
|
-
}
|
17
|
+
Sidekiq::Failures.reset_failures(counter: params["counter"])
|
27
18
|
|
28
19
|
redirect "#{root_path}failures"
|
29
20
|
end
|
data/sidekiq-failures.gemspec
CHANGED
@@ -15,11 +15,10 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Sidekiq::Failures::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency "sidekiq", ">= 2.
|
18
|
+
gem.add_dependency "sidekiq", ">= 2.14.0"
|
19
19
|
|
20
20
|
gem.add_development_dependency "rake"
|
21
21
|
gem.add_development_dependency "rack-test"
|
22
22
|
gem.add_development_dependency "sprockets"
|
23
23
|
gem.add_development_dependency "sinatra"
|
24
|
-
gem.add_development_dependency "slim"
|
25
24
|
end
|
data/test/middleware_test.rb
CHANGED
@@ -4,6 +4,7 @@ module Sidekiq
|
|
4
4
|
module Failures
|
5
5
|
describe "Middleware" do
|
6
6
|
before do
|
7
|
+
Celluloid.boot
|
7
8
|
$invokes = 0
|
8
9
|
@boss = MiniTest::Mock.new
|
9
10
|
@processor = ::Sidekiq::Processor.new(@boss)
|
@@ -13,7 +14,7 @@ module Sidekiq
|
|
13
14
|
Sidekiq.instance_eval { @failures_default_mode = nil }
|
14
15
|
end
|
15
16
|
|
16
|
-
TestException = Class.new(
|
17
|
+
TestException = Class.new(Exception)
|
17
18
|
ShutdownException = Class.new(Sidekiq::Shutdown)
|
18
19
|
|
19
20
|
class MockWorker
|
@@ -177,11 +178,11 @@ module Sidekiq
|
|
177
178
|
assert_raises TestException do
|
178
179
|
@processor.process(msg)
|
179
180
|
end
|
180
|
-
|
181
|
+
|
181
182
|
assert_equal 1, failures_count
|
182
183
|
assert_equal 1, $invokes
|
183
184
|
end
|
184
|
-
|
185
|
+
|
185
186
|
it "records failure if retry disabled and configured to track exhaustion by default" do
|
186
187
|
Sidekiq.failures_default_mode = 'exhausted'
|
187
188
|
|
@@ -233,7 +234,7 @@ module Sidekiq
|
|
233
234
|
3.times do
|
234
235
|
boss = MiniTest::Mock.new
|
235
236
|
processor = ::Sidekiq::Processor.new(boss)
|
236
|
-
|
237
|
+
|
237
238
|
actor = MiniTest::Mock.new
|
238
239
|
actor.expect(:processor_done, nil, [processor])
|
239
240
|
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
@@ -253,6 +254,23 @@ module Sidekiq
|
|
253
254
|
assert_equal 1000, Sidekiq.failures_max_count
|
254
255
|
end
|
255
256
|
|
257
|
+
it 'returns the total number of failed jobs in the queue' do
|
258
|
+
msg = create_work('class' => MockWorker.to_s, 'args' => ['myarg'], 'failures' => true)
|
259
|
+
|
260
|
+
assert_equal 0, Sidekiq::Failures.count
|
261
|
+
|
262
|
+
actor = MiniTest::Mock.new
|
263
|
+
actor.expect(:processor_done, nil, [@processor])
|
264
|
+
actor.expect(:real_thread, nil, [nil, Celluloid::Thread])
|
265
|
+
@boss.expect(:async, actor, [])
|
266
|
+
|
267
|
+
assert_raises TestException do
|
268
|
+
@processor.process(msg)
|
269
|
+
end
|
270
|
+
|
271
|
+
assert_equal 1, Sidekiq::Failures.count
|
272
|
+
end
|
273
|
+
|
256
274
|
def failures_count
|
257
275
|
Sidekiq.redis { |conn|conn.llen('failed') } || 0
|
258
276
|
end
|
data/test/test_helper.rb
CHANGED
@@ -5,13 +5,6 @@ require "minitest/autorun"
|
|
5
5
|
require "minitest/spec"
|
6
6
|
require "minitest/mock"
|
7
7
|
|
8
|
-
# FIXME Remove once https://github.com/mperham/sidekiq/pull/548 is released.
|
9
|
-
class String
|
10
|
-
def blank?
|
11
|
-
self !~ /[^[:space:]]/
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
8
|
require "rack/test"
|
16
9
|
|
17
10
|
require "celluloid"
|
metadata
CHANGED
@@ -1,110 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-failures
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Marcelo Silveira
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-12-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: sidekiq
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.
|
19
|
+
version: 2.14.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: 2.
|
26
|
+
version: 2.14.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rack-test
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: sprockets
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: sinatra
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: slim
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ! '>='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
80
|
+
- - '>='
|
108
81
|
- !ruby/object:Gem::Version
|
109
82
|
version: '0'
|
110
83
|
description: Keep track of Sidekiq failed jobs
|
@@ -115,6 +88,7 @@ extensions: []
|
|
115
88
|
extra_rdoc_files: []
|
116
89
|
files:
|
117
90
|
- .gitignore
|
91
|
+
- .travis.yml
|
118
92
|
- CHANGELOG.md
|
119
93
|
- Gemfile
|
120
94
|
- Gemfile.lock
|
@@ -126,7 +100,6 @@ files:
|
|
126
100
|
- lib/sidekiq/failures/middleware.rb
|
127
101
|
- lib/sidekiq/failures/version.rb
|
128
102
|
- lib/sidekiq/failures/views/failures.erb
|
129
|
-
- lib/sidekiq/failures/views/failures.slim
|
130
103
|
- lib/sidekiq/failures/web_extension.rb
|
131
104
|
- sidekiq-failures.gemspec
|
132
105
|
- test/middleware_test.rb
|
@@ -134,33 +107,26 @@ files:
|
|
134
107
|
- test/web_extension_test.rb
|
135
108
|
homepage: https://github.com/mhfs/sidekiq-failures/
|
136
109
|
licenses: []
|
110
|
+
metadata: {}
|
137
111
|
post_install_message:
|
138
112
|
rdoc_options: []
|
139
113
|
require_paths:
|
140
114
|
- lib
|
141
115
|
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
-
none: false
|
143
116
|
requirements:
|
144
|
-
- -
|
117
|
+
- - '>='
|
145
118
|
- !ruby/object:Gem::Version
|
146
119
|
version: '0'
|
147
|
-
segments:
|
148
|
-
- 0
|
149
|
-
hash: -612683227478286431
|
150
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
-
none: false
|
152
121
|
requirements:
|
153
|
-
- -
|
122
|
+
- - '>='
|
154
123
|
- !ruby/object:Gem::Version
|
155
124
|
version: '0'
|
156
|
-
segments:
|
157
|
-
- 0
|
158
|
-
hash: -612683227478286431
|
159
125
|
requirements: []
|
160
126
|
rubyforge_project:
|
161
|
-
rubygems_version:
|
127
|
+
rubygems_version: 2.0.3
|
162
128
|
signing_key:
|
163
|
-
specification_version:
|
129
|
+
specification_version: 4
|
164
130
|
summary: Keeps track of Sidekiq failed jobs and adds a tab to the Web UI to let you
|
165
131
|
browse them. Makes use of Sidekiq's custom tabs and middleware chain.
|
166
132
|
test_files:
|
@@ -1,41 +0,0 @@
|
|
1
|
-
header.row
|
2
|
-
.span5
|
3
|
-
h3 Failed Jobs
|
4
|
-
.span4
|
5
|
-
- if @messages.size > 0
|
6
|
-
== slim :_paging, :locals => { :url => "#{root_path}failures#@name" }
|
7
|
-
|
8
|
-
- if @messages.size > 0
|
9
|
-
table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;"
|
10
|
-
thead
|
11
|
-
th style="width: 25%" Worker, Args
|
12
|
-
th style="width: 10%" Queue
|
13
|
-
th style="width: 15%" Failed At
|
14
|
-
th style="width: 50%" Exception
|
15
|
-
- @messages.each do |msg|
|
16
|
-
tr
|
17
|
-
td style="overflow: hidden; text-overflow: ellipsis;"
|
18
|
-
= msg['worker']
|
19
|
-
br
|
20
|
-
= msg['payload']['args'].inspect[0..100]
|
21
|
-
td= msg['queue']
|
22
|
-
td
|
23
|
-
time datetime="#{Time.parse(msg['failed_at']).getutc.iso8601}"
|
24
|
-
= msg['failed_at']
|
25
|
-
td style="overflow: auto; padding: 10px;"
|
26
|
-
a.backtrace href="#" onclick="$(this).next().toggle(); return false" = "#{msg['exception']}: #{msg['error']}"
|
27
|
-
pre style="display: none; background: none; border: 0; width: 100%; max-height: 30em; font-size: 0.8em; white-space: nowrap;" == msg['backtrace'].join("<br />")
|
28
|
-
p
|
29
|
-
span Processor: #{msg['processor']}
|
30
|
-
|
31
|
-
div.row
|
32
|
-
.span5
|
33
|
-
form.form-inline action="#{root_path}failures/remove" method="post" style="margin: 20px 0"
|
34
|
-
input.btn.btn-danger.btn-small type="submit" name="delete" value="Clear All"
|
35
|
-
label class="checkbox"
|
36
|
-
input type="checkbox" name="counter" value="true"
|
37
|
-
= "reset failed counter"
|
38
|
-
.span4
|
39
|
-
== slim :_paging, :locals => { :url => "#{root_path}failures#@name" }
|
40
|
-
- else
|
41
|
-
.alert.alert-success No failed jobs found.
|