mackerel-plugin-sidekiqでキューのlatencyを計測できるようにした話


はじめに

Sidekiqのキューのlatencyをmackerelで監視できるようにしたので、その実装と経緯について紹介します。

背景

私たちのサービスではジョブキューとしてSidekiqを使用しています。Sidekiqのジョブ処理の監視のため、mackerel-plugin-sidekiqを利用していました。

しかし、この既存のプラグインには次のような課題がありました:

  1. キューのlatency(遅延時間)を計測できない
  2. リトライキューのメトリックを取得できない

特にlatencyは重要で、キューにジョブが溜まっているかどうかを示す指標として監視が必要でした。

latencyとは

Sidekiqでのlatencyとは、ジョブがキューに入れられてから実際に処理が開始されるまでの時間を指します。これが増加すると、ジョブの処理が遅延していることを意味します。

Sidekiqの管理画面では各キューのlatencyが表示されており、これをmackerelでも監視できるようにすることが今回の目標でした。

実装

mackerel-plugin-sidekiqに対して以下の機能追加を行いました:

  1. キューごとのlatencyの計測
  2. リトライキューのメトリックの取得

Sidekiq APIの利用

Sidekiqは内部的にRedisを使用しており、キュー情報へのアクセスにはSidekiq APIを使用します。

stats = Sidekiq::Stats.new
queues = stats.queues

キューのlatencyを取得するには、以下のようにします:

queues.each do |queue_name, queue_size|
  latency = Sidekiq::Queue.new(queue_name).latency
  # latencyを記録する処理
end

プラグインの改良

プラグインでは以下のように実装しました:

  1. 新しいメトリック「sidekiq.queue_latency.#キュー名#」を追加
  2. リトライキューのサイズも取得できるよう「sidekiq.retry_size」メトリックを追加

結果

改良したプラグインにより、以下のことが可能になりました:

  • キューごとのlatencyをグラフ化して監視
  • しきい値を設定してアラートを発生させる
  • リトライキューの状態も監視

これにより、Sidekiqのジョブ処理の健全性をより詳細に把握できるようになりました。

まとめ

今回の実装により、Sidekiqのキューのlatencyを監視できるようになり、ジョブ処理の遅延を早期に発見できるようになりました。

プラグインのソースコードはGitHubで公開されています。

特にRubyやSidekiqを使ったサービスを運用している方に、ぜひ活用していただければ幸いです。