やりたいこと
- ActiveJob でジョブのメモリ使用量がしきい値以上だった場合に通知したい。
- 僕の具体的なユースケース: Sidekiq で大量にメモリを使用して、かつ解放されない場合が結構ある。そこで、具体的にどのジョブが関係しているのかを調べたい。
方法
-
around_perform メソッドを使う。
- 今回は Rollbar というエラーモニタリングサービスで警告を通知する。
- Rollbar.warning の部分は、環境に応じて任意の通知方法に置き換えること。
app/jobs/application_job.rb
class ApplicationJob < ActiveJob::Base
around_perform do |job, block|
MonitorMemoryUsage.call(job, &block)
end
end
app/jobs/monitor_memory_usage.rb
module MonitorMemoryUsage
extend ActionView::Helpers::NumberHelper
class HighMemoryUsage < StandardError; end
THRESHOLD = 100.megabytes
def self.call(job)
before_memsize = ObjectSpace.memsize_of_all
results = yield
after_memsize = ObjectSpace.memsize_of_all
usage = after_memsize - before_memsize
if usage > THRESHOLD
message = "#{job.class.name} が #{number_to_human_size(usage, locale: :en)} のメモリを消費しました。"
Rollbar.warning(HighMemoryUsage.new(message), arguments: job.arguments)
end
results
end
end
こんな感じ