移転しました。

約3秒後に自動的にリダイレクトします。

Delayed::JobのQueueをRedashのAlert機能で監視する

こんにちわ。開発部のdaikichi_3です。

弊社、一部システムにバックグラウンドで非同期処理を行うDelayed::Jobを導入しています。 バックエンドにActieRecordを選択しており、queueをMySQLで管理しています。 大量にqueueが溜まってしまうと、後続のqueueに影響を与えかねないので、監視したいという話になりました。

今回はqueueの溜まり具合をredashのAlerts機能で監視、通知を試した内容を記事にしたいと思います。

Redash とは

多様なデータソースとの連携が可能で、データ分析、可視化を行う為のツールで、オープンソースで提供されています。 2019年11月現在でサポートしているデータソースは40種程度です。

Redashには大きく分類して3つの機能があります。 連携したデータソースからデータを取得する「Query」、取得した結果の可視化を行う「Dashbord」、「Alert」です。 「Query」の結果を元にして「Dashbord」「Alert」の作成が可能です。

それでは早速Alertの作成をしたいと思います。

Query の作成

まずはAlertを作成する前に、Queryを作成します。 Queryの内容はDelayed::Jobのqueueが保存されるテーブル(delayed_jobs)のデータ件数を取得する簡易的なSQLです。

SELECT count(id) FROM delayed_jobs WHERE failed_at is NULL;

Queryの定期実行の為に、併せてスケジュール設定を行う必要があります。 スケジュール設定はQuery作成画面の左下にあります。

f:id:daikichi_3:20191127095207p:plain
スケジュール設定導線

Queryを5分毎に実行されるように設定します。

f:id:daikichi_3:20191127095302p:plain
スケジュール設定

設定が完了したらQueryをsaveします。

Alert の作成

作成したQuery結果の閾値、通知タイミング、通知内容、通知先の設定を行います。

f:id:daikichi_3:20191127095333p:plain
Alert作成

通知タイミング(When triggered, send notification)

3種類あります。実用性を考えると、「At most every」で任意の時間を設定するのが良いと思います。

  • Just Once : 閾値を超えた場合に一回通知される。
  • Each time alert is evaluated : 閾値を超えるたびに通知される。
  • At most every : 閾値を超えた場合に設定した通知間隔内に一回通知される。大量通知を防ぎ、計画的に通知したい場合。

通知内容(Template)

default,customの2種類あります。 custom templateだとRedashが用意している組み込みのテンプレート変数を使用できるので、ある程度の詳細はメッセージに設定可能です。 ここでは通知時にqueue数を知らせたいので、QUERY_RESULT_VALUE 変数を使用しています。

通知先(Destinations)

通知先にSlackのチャンネルを設定します。

f:id:daikichi_3:20191127095553p:plain
Destination設定

※ここで設定する通知先は事前に以下のように「Alerts Desitinations」から登録しておく必要があります。

f:id:daikichi_3:20191127095912p:plain
Alert Destinations

結果

Alert発生後、解消後のSlackへの通知結果です。 通知までの確認が簡単にできました。

f:id:daikichi_3:20191127100016p:plain
Alert 通知結果

弊社監視ツールにDatadogを使用していることもあり、当初はqueueの件数を取得するクエリを定期実行してDatadog側に送信することを考えたのですが、もっと手軽に実現したいという事でRedashのAlert機能を試してみました。
一度slackと連携しておけば、RedashのGUI上で完結できるので、手軽さという点だけであれば使えそうな気はしました。

参考