29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# File 'lib/sidekiq-status/web.rb', line 29
def self.registered(app)
app.helpers Helpers
app.get '/statuses' do
jids = Sidekiq::Status.redis_adapter do |conn|
conn.scan(match: 'sidekiq:status:*', count: 100).map do |key|
key.split(':').last
end.uniq
end
@statuses = []
jids.each do |jid|
status = Sidekiq::Status::get_all jid
next if !status || status.count < 2
status = add_details_to_status(status)
@statuses << status
end
sort_by = has_sort_by?(safe_url_params("sort_by")) ? safe_url_params("sort_by") : "updated_at"
sort_dir = "asc"
if safe_url_params("sort_dir") == "asc"
@statuses = @statuses.sort { |x,y| (x[sort_by] <=> y[sort_by]) || -1 }
else
sort_dir = "desc"
@statuses = @statuses.sort { |y,x| (x[sort_by] <=> y[sort_by]) || 1 }
end
if safe_url_params("status") && safe_url_params("status") != "all"
@statuses = @statuses.select {|job_status| job_status["status"] == safe_url_params("status") }
end
@total_size = @statuses.count
@count = safe_url_params("per_page") ? safe_url_params("per_page").to_i : Sidekiq::Status::Web.default_per_page
@count = @total_size if safe_url_params("per_page") == 'all'
@current_page = safe_url_params("page").to_i < 1 ? 1 : safe_url_params("page").to_i
@statuses = @statuses.slice((@current_page - 1) * @count, @count)
@headers = [
{id: "worker", name: "Worker / JID", class: nil, url: nil},
{id: "args", name: "Arguments", class: nil, url: nil},
{id: "status", name: "Status", class: nil, url: nil},
{id: "updated_at", name: "Last Updated", class: nil, url: nil},
{id: "pct_complete", name: "Progress", class: nil, url: nil},
{id: "elapsed", name: "Time Elapsed", class: nil, url: nil},
{id: "eta", name: "ETA", class: nil, url: nil},
]
args = request.params
@headers.each do |h|
h[:url] = "statuses?" + args.merge("sort_by" => h[:id], "sort_dir" => (sort_by == h[:id] && sort_dir == "asc") ? "desc" : "asc").map{|k, v| "#{k}=#{CGI.escape v.to_s}"}.join("&")
h[:class] = "sorted_#{sort_dir}" if sort_by == h[:id]
end
erb(sidekiq_status_template(:statuses))
end
app.get '/statuses/:jid' do
job = Sidekiq::Status::get_all safe_route_params(:jid)
if job.empty?
throw :halt, [404, {"Content-Type" => "text/html"}, [erb(sidekiq_status_template(:status_not_found))]]
else
@status = add_details_to_status(job)
erb(sidekiq_status_template(:status))
end
end
app.post '/statuses' do
case safe_url_params("_method")
when 'put'
retry_job_action
when 'delete'
delete_job_action
else
throw :halt, [405, {"Content-Type" => "text/html"}, ["Method not allowed"]]
end
end
app.put '/statuses' do
retry_job_action
end
app.delete '/statuses' do
delete_job_action
end
end
|