バージョン
- sidekiq 5.2.8
sidekiqで引数を省略しないで表示してほしい
Sidekiq::Web
を使った時の実行中ジョブの一覧(/sidekiq/busy)で、実行中のジョブの引数を見れる。
見れるんだけど、この引数の部分に表示されるのって、truncateされてて、途中で切れてるんだよね・・。
全部みたい。全部見せてくれって思って、Sidekiq::Webの画面を色々見ていたのだけど、いまいち見つからない。見つからないので、どうやって表示するかを調べてみた。
どうやらこのジョブ一覧のviewはここ。
https://github.com/mperham/sidekiq/blob/v5.2.8/web/views/busy.erb#L81
<% workers.each do |process, thread, msg| %> <% job = Sidekiq::Job.new(msg['payload']) %> <tr> <td><%= process %></td> <td><%= thread %></td> <td><%= job.jid %></td> <td> <a href="<%= root_path %>queues/<%= msg['queue'] %>"><%= msg['queue'] %></a> </td> <td><%= job.display_class %></td> <td> <div class="args"><%= display_args(job.display_args) %></div> </td> <td><%= relative_time(Time.at(msg['run_at'])) %></td> </tr> <% end %>
display_argsヘルパがやっていることは、2000文字でのtruncateだった。
https://github.com/mperham/sidekiq/blob/v5.2.8/lib/sidekiq/web/helpers.rb#L209-L220
def display_args(args, truncate_after_chars = 2000) return "Invalid job payload, args is nil" if args == nil return "Invalid job payload, args must be an Array, not #{args.class.name}" if !args.is_a?(Array) begin args.map do |arg| h(truncate(to_display(arg), truncate_after_chars)) end.join(", ") rescue "Illegal job arguments: #{h args.inspect}" end end
なので、job.display_args
を直接取得できれば良さそう。
そのためには、workersが何なのかを知る必要がある。
workersは何を指しているかというと、これ
https://github.com/mperham/sidekiq/blob/v5.2.8/lib/sidekiq/web/helpers.rb#L133
def workers @workers ||= Sidekiq::Workers.new end
つまり、コンソールで次の用にすればsidekiqの引数全てを取得できるっぽい。
Sidekiq::Workers.new.each do |_process, _thread, msg|
job = Sidekiq::Job.new(msg['payload'])
p job['display_args']
end
2000文字以上表示したいケースということで、この出力結果はめっちゃ長くなる。
よしなに加工して表示しよう。