我希望在运行我的任务时了解执行时间。似乎有一个叫做sidekiq-statistic的宝石可以满足我的要求,甚至还有图形用户界面,但不幸的是它不支持sidekiq 5。我能否从 perform 方法内部获取此类信息?我更喜欢避免手动编写基准测试代码,而是将我的方法包装在Benchmark块中。
我希望在运行我的任务时了解执行时间。似乎有一个叫做sidekiq-statistic的宝石可以满足我的要求,甚至还有图形用户界面,但不幸的是它不支持sidekiq 5。我能否从 perform 方法内部获取此类信息?我更喜欢避免手动编写基准测试代码,而是将我的方法包装在Benchmark块中。
我曾经遇到一个问题,就是无法确定哪个任务花费的时间最长,所以我编写了一个小工具来分析日志。
好消息是:我找到了答案,现在我要分享我的代码 :-)
希望它没有任何bug。
desc "sidekiq run statistics"
task sidekiq_run_statistics: :environment do
# 2021-02-19T06:04:23.088Z 20240 TID-ov75i75aw Importer::PriceJob JID-95245ccf3933fe1f5897d52b INFO: done: 193.952 sec
file = File.open( Rails.root.join("log","sidekiq.log"))
job_stats = {}
file.each_line do |line|
job_stat = line.split(" ")
if job_stat[8] == "sec"
time = job_stat[7].to_f
job_stats[ job_stat[3] ] ||= {longest_run_time: 0, total_run_time:0, total_runs: 0 }
job_stats[ job_stat[3] ][:longest_run_time] = time if job_stats[ job_stat[3] ][:longest_run_time] < time
job_stats[ job_stat[3] ][:total_run_time]+=time
job_stats[ job_stat[3] ][:total_runs]+=1
end
end
file.close
puts %w(total_runs total_run_time longest_run_time job ).collect{|i| i.rjust(16) }.join(" ")
puts "="*80
job_stats.keys.each do |key|
puts( [job_stats[key][:total_runs],job_stats[key][:total_run_time].round(3), job_stats[key][:longest_run_time].round(3), key ].collect{|i| i.to_s.rjust(16) }.join(" "))
end
end
样例输出
total_runs total_run_time longest_run_time job
==================================================================
56 68.909 7.641 Job1
56 98.9 11.599 Job2
47 193.909 13.795 Job3
234 1806.76 20.644 Job4
正如Mike 所说,它已经记录在日志中。
要快速查看昨天工人的平均完成时间:
rg MyWorker sidekiq.log.1 |rg done| awk '{ total += $8; count++ } END { print total/count }'
def preform(task,*params)
...start metric times...
... do your computations ...
...end metric times...
Rails.logger.info "Your Metrics..."
end
rg
是ripgrep
。 - weston