sidekiq-undertaker 1.3.0 → 1.5.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 +4 -4
- data/.github/workflows/ruby-build.yml +30 -2
- data/.rubocop.yml +4 -0
- data/.rubocop_codeclimate.yml +9 -0
- data/CHANGELOG.md +21 -0
- data/README.md +2 -1
- data/lib/sidekiq/undertaker/dead_job.rb +10 -2
- data/lib/sidekiq/undertaker/job_distributor.rb +4 -0
- data/lib/sidekiq/undertaker/job_filter.rb +7 -2
- data/lib/sidekiq/undertaker/version.rb +1 -1
- data/lib/sidekiq/undertaker/web_extension/api_helpers.rb +42 -21
- data/lib/sidekiq/undertaker/web_extension.rb +11 -9
- data/lib/sidekiq/undertaker.rb +16 -0
- data/sidekiq-undertaker.gemspec +5 -6
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +4 -4
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +25 -25
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +25 -25
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +231 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +231 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +9 -8
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +284 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1310 -0
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +7 -6
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +55 -54
- data/spec/sidekiq/undertaker/dead_jobs_spec.rb +7 -4
- data/spec/sidekiq/undertaker/job_distributor_spec.rb +38 -16
- data/spec/sidekiq/undertaker/job_filter_spec.rb +26 -9
- data/spec/sidekiq/undertaker/web_extension_spec.rb +60 -17
- data/spec/sidekiq/undertaker_spec.rb +26 -0
- data/spec/spec_helper.rb +4 -0
- data/web/views/filter.erb +1 -1
- data/web/views/filter_job_class.erb +8 -8
- data/web/views/filter_job_class_error_class.erb +36 -0
- data/web/views/morgue.erb +4 -3
- metadata +63 -70
- data/.travis.yml +0 -51
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: be6e466de018cc344512e76981a4f4c98ea436873d666dc8b49ddaba592e2cd3
|
|
4
|
+
data.tar.gz: c2667a175749a46487e8f807b800e7a06835365f421591d0af6b1e36c8cd2465
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fe72efc8d5ddce343d8df6adb821efbe12bf92701743fb30f757217ffb19be3a5485e4ca0036432c01f537ed48469fcf306d40a66859aa17524b638cafb5d980
|
|
7
|
+
data.tar.gz: ccbcf7042e8a80cee8a22400e496cbb8884d9b76ba7e6c177ee368d134dc421e03dfe2e1599debf787a9ebacb719870b1cfa8265707c3c905e442b7ab6f37402
|
|
@@ -34,10 +34,13 @@ jobs:
|
|
|
34
34
|
- '2.7'
|
|
35
35
|
- 'jruby'
|
|
36
36
|
- 'jruby-9.3.2.0'
|
|
37
|
-
- 'jruby-9.2.20.
|
|
37
|
+
- 'jruby-9.2.20.1'
|
|
38
38
|
- 'truffleruby'
|
|
39
39
|
- 'truffleruby+graalvm'
|
|
40
40
|
|
|
41
|
+
env:
|
|
42
|
+
JRUBY_OPTS: '--debug'
|
|
43
|
+
|
|
41
44
|
steps:
|
|
42
45
|
- uses: actions/checkout@v3
|
|
43
46
|
- name: Set up Ruby
|
|
@@ -48,4 +51,29 @@ jobs:
|
|
|
48
51
|
ruby-version: ${{ matrix.ruby-version }}
|
|
49
52
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
|
50
53
|
- name: Run tests
|
|
51
|
-
run: bundle exec rspec
|
|
54
|
+
run: COVERAGE=true bundle exec rspec
|
|
55
|
+
- name: 'Upload Coverage Report'
|
|
56
|
+
uses: actions/upload-artifact@v3
|
|
57
|
+
if: ${{ matrix.ruby-version == 'ruby' }}
|
|
58
|
+
with:
|
|
59
|
+
name: coverage-report
|
|
60
|
+
path: ./coverage
|
|
61
|
+
retention-days: 1
|
|
62
|
+
|
|
63
|
+
coverage:
|
|
64
|
+
needs: [ test ]
|
|
65
|
+
name: coverage
|
|
66
|
+
runs-on: ubuntu-latest
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v3
|
|
69
|
+
- name: Download Coverage Report
|
|
70
|
+
uses: actions/download-artifact@v3
|
|
71
|
+
with:
|
|
72
|
+
name: coverage-report
|
|
73
|
+
path: ./coverage
|
|
74
|
+
- uses: paambaati/codeclimate-action@v3.0.0
|
|
75
|
+
env:
|
|
76
|
+
# Set CC_TEST_REPORTER_ID as secret of your repo
|
|
77
|
+
CC_TEST_REPORTER_ID: ${{secrets.CC_TEST_REPORTER_ID}}
|
|
78
|
+
with:
|
|
79
|
+
debug: true
|
data/.rubocop.yml
CHANGED
data/.rubocop_codeclimate.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## [1.5.0] - 2022-09-06
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- Updated max error message length to be configurable
|
|
9
|
+
- Updated rack-test requirement from ~> 1.1 to ~> 2.0
|
|
10
|
+
|
|
11
|
+
## [1.4.1] - 2022-06-03
|
|
12
|
+
### Fixed
|
|
13
|
+
- Fix downgrade rubocop to '1.28' to keep support for JRuby '9.2.20.1'
|
|
14
|
+
|
|
15
|
+
## [1.4.0] - 2022-06-03
|
|
16
|
+
### Added
|
|
17
|
+
- Added a filter based on error messages
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- Updated rubocop to version 1.30
|
|
21
|
+
- Updated rubyzip to version 2.3
|
|
22
|
+
|
|
23
|
+
### Removed
|
|
24
|
+
- Removed Travis CI integration
|
|
25
|
+
|
|
5
26
|
## [1.3.0] - 2022-04-27
|
|
6
27
|
### Added
|
|
7
28
|
- Added option to export and re-import dead jobs
|
data/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Sidekiq::Undertaker
|
|
2
2
|
|
|
3
3
|
[](https://badge.fury.io/rb/sidekiq-undertaker)
|
|
4
|
-
[](https://github.com/ThomasKoppensteiner/sidekiq-undertaker/actions/workflows/ruby-build.yml)
|
|
5
5
|
[](https://codeclimate.com/github/ThomasKoppensteiner/sidekiq-undertaker)
|
|
6
6
|
[](https://codeclimate.com/github/ThomasKoppensteiner/sidekiq-undertaker/test_coverage)
|
|
7
7
|
[](https://github.com/rubocop-hq/rubocop)
|
|
@@ -83,6 +83,7 @@ The [Sidekiq-Cleaner](https://github.com/HackingHabits/sidekiq-cleaner) gem was
|
|
|
83
83
|
[Tout](https://github.com/Tout/sidekiq-cleaner) and [TheWudu](https://github.com/TheWudu/sidekiq-cleaner) also contributed to it.
|
|
84
84
|
[Zlatko Rednjak](https://github.com/Rednjak) added the initial version of the `CHANGELOG.md`.
|
|
85
85
|
[Lucas Dell'Isola](https://github.com/ldellisola) added the export/import feature for dead jobs.
|
|
86
|
+
[thoesl](https://github.com/thoesl) added the error message based filter.
|
|
86
87
|
|
|
87
88
|
For the complete list of network members have a look at the [fork overview](https://github.com/ThomasKoppensteiner/sidekiq-undertaker/network/members).
|
|
88
89
|
|
|
@@ -27,7 +27,7 @@ module Sidekiq
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
attr_reader :job_class, :time_elapsed_since_failure, :error_class, :bucket_name, :job
|
|
30
|
+
attr_reader :job_class, :time_elapsed_since_failure, :error_class, :error_msg, :bucket_name, :job
|
|
31
31
|
|
|
32
32
|
def initialize(args)
|
|
33
33
|
@job = args.fetch(:job)
|
|
@@ -35,12 +35,14 @@ module Sidekiq
|
|
|
35
35
|
@bucket_name = args.fetch(:bucket_name)
|
|
36
36
|
@job_class = args.fetch(:job_class, job.item["class"])
|
|
37
37
|
@error_class = args.fetch(:error_class, job.item["error_class"])
|
|
38
|
+
@error_msg = shorten_error_msg(args.fetch(:error_message, job.item["error_message"]).to_s)
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
def ==(other)
|
|
41
42
|
job_class == other.job_class &&
|
|
42
43
|
time_elapsed_since_failure == other.time_elapsed_since_failure &&
|
|
43
44
|
error_class == other.error_class &&
|
|
45
|
+
error_msg == other.error_msg &&
|
|
44
46
|
bucket_name == other.bucket_name &&
|
|
45
47
|
job_eql?(other.job)
|
|
46
48
|
end
|
|
@@ -48,7 +50,13 @@ module Sidekiq
|
|
|
48
50
|
|
|
49
51
|
private
|
|
50
52
|
|
|
51
|
-
attr_writer :job_class, :time_elapsed_since_failure, :error_class, :bucket_name, :job
|
|
53
|
+
attr_writer :job_class, :time_elapsed_since_failure, :error_class, :error_message, :bucket_name, :job
|
|
54
|
+
|
|
55
|
+
def shorten_error_msg(msg)
|
|
56
|
+
max_error_msg_length = Sidekiq::Undertaker.max_error_msg_length
|
|
57
|
+
|
|
58
|
+
msg.length > max_error_msg_length ? "#{msg[0, max_error_msg_length]}..." : msg
|
|
59
|
+
end
|
|
52
60
|
|
|
53
61
|
def job_eql?(other_job) # rubocop:disable Metrics/AbcSize
|
|
54
62
|
job.jid == other_job.jid &&
|
|
@@ -7,7 +7,7 @@ module Sidekiq
|
|
|
7
7
|
class JobFilter
|
|
8
8
|
class << self
|
|
9
9
|
def filter_dead_jobs(filters = {})
|
|
10
|
-
# filters can have keys in (job_class, error_class, bucket_name)
|
|
10
|
+
# filters can have keys in (job_class, error_class, error_msg, bucket_name)
|
|
11
11
|
dead_jobs = []
|
|
12
12
|
Sidekiq::Undertaker::DeadJob.for_each do |dead_job|
|
|
13
13
|
filter_passed = true
|
|
@@ -26,7 +26,8 @@ module Sidekiq
|
|
|
26
26
|
value.nil? ||
|
|
27
27
|
total_dead_bucket?(filter, value) ||
|
|
28
28
|
all_jobs?(filter, value) ||
|
|
29
|
-
all_errors?(filter, value)
|
|
29
|
+
all_errors?(filter, value) ||
|
|
30
|
+
all_error_msgs?(filter, value)
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
def total_dead_bucket?(filter, value)
|
|
@@ -40,6 +41,10 @@ module Sidekiq
|
|
|
40
41
|
def all_errors?(filter, value)
|
|
41
42
|
filter == "error_class" && value == "all"
|
|
42
43
|
end
|
|
44
|
+
|
|
45
|
+
def all_error_msgs?(filter, value)
|
|
46
|
+
filter == "error_msg" && value == "all"
|
|
47
|
+
end
|
|
43
48
|
end
|
|
44
49
|
end
|
|
45
50
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "sidekiq/undertaker/job_distributor"
|
|
4
4
|
require "sidekiq/undertaker/job_filter"
|
|
5
|
+
require "base64"
|
|
5
6
|
require "json"
|
|
6
7
|
require "zip"
|
|
7
8
|
|
|
@@ -15,7 +16,7 @@ module Sidekiq
|
|
|
15
16
|
def show_filter
|
|
16
17
|
store_request_params
|
|
17
18
|
|
|
18
|
-
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(
|
|
19
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
19
20
|
@distribution = Sidekiq::Undertaker::JobDistributor.new(@dead_jobs).group_by_job_class
|
|
20
21
|
@total_dead = @dead_jobs.size
|
|
21
22
|
|
|
@@ -25,17 +26,27 @@ module Sidekiq
|
|
|
25
26
|
def show_filter_by_job_class_bucket_name
|
|
26
27
|
store_request_params
|
|
27
28
|
|
|
28
|
-
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(
|
|
29
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
29
30
|
@distribution = Sidekiq::Undertaker::JobDistributor.new(@dead_jobs).group_by_error_class
|
|
30
31
|
@total_dead = @dead_jobs.size
|
|
31
32
|
|
|
32
33
|
render_result("filter_job_class.erb")
|
|
33
34
|
end
|
|
34
35
|
|
|
35
|
-
def
|
|
36
|
+
def show_filter_by_job_class_error_class_bucket_name
|
|
36
37
|
store_request_params
|
|
37
38
|
|
|
38
|
-
@dead_jobs
|
|
39
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
40
|
+
@distribution = Sidekiq::Undertaker::JobDistributor.new(@dead_jobs).group_by_error_msg
|
|
41
|
+
@total_dead = @dead_jobs.size
|
|
42
|
+
|
|
43
|
+
render_result("filter_job_class_error_class.erb")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def show_undertaker_by_job_class_error_class_error_msg_bucket_name
|
|
47
|
+
store_request_params
|
|
48
|
+
|
|
49
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
39
50
|
|
|
40
51
|
# Display dead jobs as list
|
|
41
52
|
@dead_jobs = @dead_jobs.map(&:job)
|
|
@@ -44,7 +55,7 @@ module Sidekiq
|
|
|
44
55
|
|
|
45
56
|
# Pagination
|
|
46
57
|
@total_dead = @dead_jobs.size
|
|
47
|
-
@current_page = (
|
|
58
|
+
@current_page = (parsed_params[:page] || 1).to_i
|
|
48
59
|
@count = 50 # per page
|
|
49
60
|
@dead_jobs = @dead_jobs[((@current_page - 1) * @count), @count]
|
|
50
61
|
|
|
@@ -57,14 +68,15 @@ module Sidekiq
|
|
|
57
68
|
params.delete("job_class")
|
|
58
69
|
params.delete("bucket_name")
|
|
59
70
|
params.delete("error_class")
|
|
71
|
+
params.delete("error_msg")
|
|
60
72
|
|
|
61
73
|
render_result("morgue.erb")
|
|
62
74
|
end
|
|
63
75
|
|
|
64
76
|
def post_undertaker
|
|
65
|
-
raise ::ArgumentError.new("Key missing") unless
|
|
77
|
+
raise ::ArgumentError.new("Key missing") unless parsed_params["key"]
|
|
66
78
|
|
|
67
|
-
jobs =
|
|
79
|
+
jobs = parsed_params["key"].map { |k| Sidekiq::DeadSet.new.fetch(*parse_params(k)).first }.compact
|
|
68
80
|
|
|
69
81
|
handle_selected_jobs jobs
|
|
70
82
|
rescue ::ArgumentError
|
|
@@ -72,20 +84,20 @@ module Sidekiq
|
|
|
72
84
|
end
|
|
73
85
|
|
|
74
86
|
def handle_selected_jobs(jobs)
|
|
75
|
-
return send_data(*prepare_data(jobs.map(&:item), EXPORT_CHUNK_SIZE)) if
|
|
87
|
+
return send_data(*prepare_data(jobs.map(&:item), EXPORT_CHUNK_SIZE)) if parsed_params["export"]
|
|
76
88
|
|
|
77
|
-
if
|
|
89
|
+
if parsed_params["retry"]
|
|
78
90
|
jobs.each(&:retry)
|
|
79
|
-
elsif
|
|
91
|
+
elsif parsed_params["delete"]
|
|
80
92
|
jobs.each(&:delete)
|
|
81
93
|
end
|
|
82
94
|
|
|
83
95
|
redirect redirect_path(request)
|
|
84
96
|
end
|
|
85
97
|
|
|
86
|
-
def
|
|
98
|
+
def post_undertaker_job_class_error_class_error_msg_bucket_name_delete
|
|
87
99
|
store_request_params
|
|
88
|
-
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(
|
|
100
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
89
101
|
@dead_jobs.each do |dead_job|
|
|
90
102
|
dead_job.job.delete
|
|
91
103
|
end
|
|
@@ -93,10 +105,10 @@ module Sidekiq
|
|
|
93
105
|
redirect redirect_path(request)
|
|
94
106
|
end
|
|
95
107
|
|
|
96
|
-
def
|
|
108
|
+
def post_undertaker_job_class_error_class_error_msg_bucket_name_retry
|
|
97
109
|
store_request_params
|
|
98
110
|
|
|
99
|
-
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(
|
|
111
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
100
112
|
@dead_jobs.each do |dead_job|
|
|
101
113
|
dead_job.job.retry
|
|
102
114
|
end
|
|
@@ -104,18 +116,18 @@ module Sidekiq
|
|
|
104
116
|
redirect redirect_path(request)
|
|
105
117
|
end
|
|
106
118
|
|
|
107
|
-
def
|
|
119
|
+
def post_undertaker_job_class_error_class_error_msg_bucket_name_export
|
|
108
120
|
store_request_params
|
|
109
121
|
|
|
110
|
-
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(
|
|
122
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(parsed_params)
|
|
111
123
|
send_data(*prepare_data(@dead_jobs.map { |j| j.job.item }, EXPORT_CHUNK_SIZE))
|
|
112
124
|
end
|
|
113
125
|
|
|
114
126
|
def post_import_jobs
|
|
115
|
-
file =
|
|
127
|
+
file = parsed_params["upload_file"]
|
|
116
128
|
raise ::ArgumentError.new("The file is not a json") if file.nil? || file[:type] != "application/json"
|
|
117
129
|
|
|
118
|
-
data =
|
|
130
|
+
data = parsed_params["upload_file"][:tempfile].read
|
|
119
131
|
dead_set = Sidekiq::DeadSet.new
|
|
120
132
|
|
|
121
133
|
JSON.parse(data).each do |job|
|
|
@@ -131,9 +143,18 @@ module Sidekiq
|
|
|
131
143
|
end
|
|
132
144
|
|
|
133
145
|
def store_request_params
|
|
134
|
-
@req_job_class =
|
|
135
|
-
@req_bucket_name =
|
|
136
|
-
@req_error_class =
|
|
146
|
+
@req_job_class = parsed_params["job_class"]
|
|
147
|
+
@req_bucket_name = parsed_params["bucket_name"]
|
|
148
|
+
@req_error_class = parsed_params["error_class"]
|
|
149
|
+
@req_error_msg = parsed_params["error_msg"]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def parsed_params
|
|
153
|
+
@parsed_params ||= if params["error_msg"] && params["error_msg"] != "all"
|
|
154
|
+
params.merge("error_msg" => Base64.urlsafe_decode64(params["error_msg"]))
|
|
155
|
+
else
|
|
156
|
+
params
|
|
157
|
+
end
|
|
137
158
|
end
|
|
138
159
|
|
|
139
160
|
def view_path
|
|
@@ -15,25 +15,27 @@ module Sidekiq
|
|
|
15
15
|
app.get "/undertaker/filter/:job_class/:bucket_name" do
|
|
16
16
|
show_filter_by_job_class_bucket_name
|
|
17
17
|
end
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
app.get "/undertaker/filter/:job_class/:error_class/:bucket_name" do
|
|
19
|
+
show_filter_by_job_class_error_class_bucket_name
|
|
20
|
+
end
|
|
21
|
+
app.get "/undertaker/morgue/:job_class/:error_class/:error_msg/:bucket_name" do
|
|
22
|
+
show_undertaker_by_job_class_error_class_error_msg_bucket_name
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
app.post "/undertaker/morgue" do
|
|
24
26
|
post_undertaker
|
|
25
27
|
end
|
|
26
28
|
|
|
27
|
-
app.post "/undertaker/morgue/:job_class/:error_class/:bucket_name/delete" do
|
|
28
|
-
|
|
29
|
+
app.post "/undertaker/morgue/:job_class/:error_class/:error_msg/:bucket_name/delete" do
|
|
30
|
+
post_undertaker_job_class_error_class_error_msg_bucket_name_delete
|
|
29
31
|
end
|
|
30
32
|
|
|
31
|
-
app.post "/undertaker/morgue/:job_class/:error_class/:bucket_name/retry" do
|
|
32
|
-
|
|
33
|
+
app.post "/undertaker/morgue/:job_class/:error_class/:error_msg/:bucket_name/retry" do
|
|
34
|
+
post_undertaker_job_class_error_class_error_msg_bucket_name_retry
|
|
33
35
|
end
|
|
34
36
|
|
|
35
|
-
app.post "/undertaker/morgue/:job_class/:error_class/:bucket_name/export" do
|
|
36
|
-
|
|
37
|
+
app.post "/undertaker/morgue/:job_class/:error_class/:error_msg/:bucket_name/export" do
|
|
38
|
+
post_undertaker_job_class_error_class_error_msg_bucket_name_export
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
app.post "/undertaker/import_jobs" do
|
data/lib/sidekiq/undertaker.rb
CHANGED
|
@@ -14,3 +14,19 @@ if defined?(Sidekiq::Web)
|
|
|
14
14
|
Sidekiq::Web.tabs["Undertaker"] = "undertaker/filter"
|
|
15
15
|
Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "../../web/locales")
|
|
16
16
|
end
|
|
17
|
+
|
|
18
|
+
module Sidekiq
|
|
19
|
+
module Undertaker
|
|
20
|
+
@config = {
|
|
21
|
+
max_error_msg_length: 30
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
def self.max_error_msg_length=(value)
|
|
25
|
+
@config[:max_error_msg_length] = Integer(value)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.max_error_msg_length
|
|
29
|
+
@config[:max_error_msg_length]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
data/sidekiq-undertaker.gemspec
CHANGED
|
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
|
23
23
|
"source_code_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker",
|
|
24
24
|
"changelog_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker/blob/master/CHANGELOG.md",
|
|
25
25
|
"bug_tracker_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker/issues",
|
|
26
|
-
"build_status_uri" => "https://
|
|
26
|
+
"build_status_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker/actions/workflows/ruby-build.yml",
|
|
27
27
|
"rubygems_mfa_required" => "true"
|
|
28
28
|
}
|
|
29
29
|
|
|
@@ -31,7 +31,6 @@ Gem::Specification.new do |spec|
|
|
|
31
31
|
|
|
32
32
|
spec.files = `git ls-files -z`.split("\x0")
|
|
33
33
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
34
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
35
34
|
spec.require_paths = ["lib", "lib/sidekiq/undertaker"]
|
|
36
35
|
|
|
37
36
|
spec.add_development_dependency "bundler", ">= 1.17", "<3"
|
|
@@ -40,21 +39,21 @@ Gem::Specification.new do |spec|
|
|
|
40
39
|
spec.add_development_dependency "approvals", "~> 0.0.25"
|
|
41
40
|
spec.add_development_dependency "mock_redis", "~> 0.19"
|
|
42
41
|
spec.add_development_dependency "pry", "~> 0.12"
|
|
43
|
-
spec.add_development_dependency "rack-test", "~>
|
|
42
|
+
spec.add_development_dependency "rack-test", "~> 2.0"
|
|
44
43
|
spec.add_development_dependency "rb-readline", "~> 0.5"
|
|
45
44
|
spec.add_development_dependency "rspec", "~> 3.8"
|
|
46
45
|
spec.add_development_dependency "rspec-core", "~> 3.8"
|
|
47
46
|
spec.add_development_dependency "rspec-mocks", "~> 3.8"
|
|
48
47
|
spec.add_development_dependency "rspec-sidekiq", "~> 3.0"
|
|
49
48
|
spec.add_development_dependency "rt_rubocop_defaults", "~> 2.3"
|
|
50
|
-
spec.add_development_dependency "rubocop", "~> 1.
|
|
49
|
+
spec.add_development_dependency "rubocop", "~> 1.28"
|
|
51
50
|
spec.add_development_dependency "rubocop-rake", "~> 0.5"
|
|
52
51
|
spec.add_development_dependency "rubocop-rspec", "~> 2.0"
|
|
53
52
|
spec.add_development_dependency "rubocop_runner", "~> 2.1"
|
|
54
|
-
spec.add_development_dependency "simplecov", "~> 0.
|
|
53
|
+
spec.add_development_dependency "simplecov", "~> 0.21"
|
|
55
54
|
spec.add_development_dependency "sinatra", "~> 2.0"
|
|
56
55
|
spec.add_development_dependency "timecop", "~> 0.9"
|
|
57
56
|
|
|
58
|
-
spec.add_runtime_dependency "rubyzip"
|
|
57
|
+
spec.add_runtime_dependency "rubyzip", "~> 2.3"
|
|
59
58
|
spec.add_runtime_dependency "sidekiq", ">= 6.4", "< 7"
|
|
60
59
|
end
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<div class="navbar navbar-default navbar-fixed-top">
|
|
23
23
|
<div class="container-fluid">
|
|
24
24
|
<div class="navbar-header" data-navbar="static">
|
|
25
|
-
<button type="button" class="navbar-toggle collapsed" data-toggle="
|
|
25
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
|
|
26
26
|
<span class="icon-bar"></span>
|
|
27
27
|
<span class="icon-bar"></span>
|
|
28
28
|
<span class="icon-bar"></span>
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
</thead>
|
|
178
178
|
|
|
179
179
|
<tr>
|
|
180
|
-
<td><a href='/sidekiq/undertaker/morgue/all/all/total_dead'> all</a></td>
|
|
180
|
+
<td><a href='/sidekiq/undertaker/morgue/all/all/all/total_dead'> all</a></td>
|
|
181
181
|
<td><a href='/sidekiq/undertaker/filter/all/total_dead'>4</a></td>
|
|
182
182
|
<td><a href='/sidekiq/undertaker/filter/all/1_hour'>4</a></td>
|
|
183
183
|
<td><a href='/sidekiq/undertaker/filter/all/3_hours'>0</a></td>
|
|
@@ -188,7 +188,7 @@
|
|
|
188
188
|
</tr>
|
|
189
189
|
|
|
190
190
|
<tr>
|
|
191
|
-
<td><a href='/sidekiq/undertaker/morgue/HardWorker/all/total_dead'> HardWorker</a></td>
|
|
191
|
+
<td><a href='/sidekiq/undertaker/morgue/HardWorker/all/all/total_dead'> HardWorker</a></td>
|
|
192
192
|
<td><a href='/sidekiq/undertaker/filter/HardWorker/total_dead'>3</a></td>
|
|
193
193
|
<td><a href='/sidekiq/undertaker/filter/HardWorker/1_hour'>3</a></td>
|
|
194
194
|
<td><a href='/sidekiq/undertaker/filter/HardWorker/3_hours'>0</a></td>
|
|
@@ -199,7 +199,7 @@
|
|
|
199
199
|
</tr>
|
|
200
200
|
|
|
201
201
|
<tr>
|
|
202
|
-
<td><a href='/sidekiq/undertaker/morgue/HardWorker1/all/total_dead'> HardWorker1</a></td>
|
|
202
|
+
<td><a href='/sidekiq/undertaker/morgue/HardWorker1/all/all/total_dead'> HardWorker1</a></td>
|
|
203
203
|
<td><a href='/sidekiq/undertaker/filter/HardWorker1/total_dead'>1</a></td>
|
|
204
204
|
<td><a href='/sidekiq/undertaker/filter/HardWorker1/1_hour'>1</a></td>
|
|
205
205
|
<td><a href='/sidekiq/undertaker/filter/HardWorker1/3_hours'>0</a></td>
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
<div class="navbar navbar-default navbar-fixed-top">
|
|
23
23
|
<div class="container-fluid">
|
|
24
24
|
<div class="navbar-header" data-navbar="static">
|
|
25
|
-
<button type="button" class="navbar-toggle collapsed" data-toggle="
|
|
25
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
|
|
26
26
|
<span class="icon-bar"></span>
|
|
27
27
|
<span class="icon-bar"></span>
|
|
28
28
|
<span class="icon-bar"></span>
|
|
@@ -178,36 +178,36 @@
|
|
|
178
178
|
</thead>
|
|
179
179
|
|
|
180
180
|
<tr>
|
|
181
|
-
<td><a href='/sidekiq/undertaker/morgue/HardWorker/all/total_dead'>all</a></td>
|
|
182
|
-
<td><a href='/sidekiq/undertaker/
|
|
183
|
-
<td><a href='/sidekiq/undertaker/
|
|
184
|
-
<td><a href='/sidekiq/undertaker/
|
|
185
|
-
<td><a href='/sidekiq/undertaker/
|
|
186
|
-
<td><a href='/sidekiq/undertaker/
|
|
187
|
-
<td><a href='/sidekiq/undertaker/
|
|
188
|
-
<td><a href='/sidekiq/undertaker/
|
|
181
|
+
<td><a href='/sidekiq/undertaker/morgue/HardWorker/all/all/total_dead'>all</a></td>
|
|
182
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/total_dead'>3</a></td>
|
|
183
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/1_hour'>3</a></td>
|
|
184
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/3_hours'>0</a></td>
|
|
185
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/1_day'>0</a></td>
|
|
186
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/3_days'>0</a></td>
|
|
187
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/1_week'>0</a></td>
|
|
188
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/all/older'>0</a></td>
|
|
189
189
|
</tr>
|
|
190
190
|
|
|
191
191
|
<tr>
|
|
192
|
-
<td><a href='/sidekiq/undertaker/morgue/HardWorker/RuntimeError/total_dead'>RuntimeError</a></td>
|
|
193
|
-
<td><a href='/sidekiq/undertaker/
|
|
194
|
-
<td><a href='/sidekiq/undertaker/
|
|
195
|
-
<td><a href='/sidekiq/undertaker/
|
|
196
|
-
<td><a href='/sidekiq/undertaker/
|
|
197
|
-
<td><a href='/sidekiq/undertaker/
|
|
198
|
-
<td><a href='/sidekiq/undertaker/
|
|
199
|
-
<td><a href='/sidekiq/undertaker/
|
|
192
|
+
<td><a href='/sidekiq/undertaker/morgue/HardWorker/RuntimeError/all/total_dead'>RuntimeError</a></td>
|
|
193
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/total_dead'>2</a></td>
|
|
194
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/1_hour'>2</a></td>
|
|
195
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/3_hours'>0</a></td>
|
|
196
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/1_day'>0</a></td>
|
|
197
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/3_days'>0</a></td>
|
|
198
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/1_week'>0</a></td>
|
|
199
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/RuntimeError/older'>0</a></td>
|
|
200
200
|
</tr>
|
|
201
201
|
|
|
202
202
|
<tr>
|
|
203
|
-
<td><a href='/sidekiq/undertaker/morgue/HardWorker/NoMethodError/total_dead'>NoMethodError</a></td>
|
|
204
|
-
<td><a href='/sidekiq/undertaker/
|
|
205
|
-
<td><a href='/sidekiq/undertaker/
|
|
206
|
-
<td><a href='/sidekiq/undertaker/
|
|
207
|
-
<td><a href='/sidekiq/undertaker/
|
|
208
|
-
<td><a href='/sidekiq/undertaker/
|
|
209
|
-
<td><a href='/sidekiq/undertaker/
|
|
210
|
-
<td><a href='/sidekiq/undertaker/
|
|
203
|
+
<td><a href='/sidekiq/undertaker/morgue/HardWorker/NoMethodError/all/total_dead'>NoMethodError</a></td>
|
|
204
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/total_dead'>1</a></td>
|
|
205
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/1_hour'>1</a></td>
|
|
206
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/3_hours'>0</a></td>
|
|
207
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/1_day'>0</a></td>
|
|
208
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/3_days'>0</a></td>
|
|
209
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/1_week'>0</a></td>
|
|
210
|
+
<td><a href='/sidekiq/undertaker/filter/HardWorker/NoMethodError/older'>0</a></td>
|
|
211
211
|
</tr>
|
|
212
212
|
|
|
213
213
|
</table>
|