LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログです。

PagerDutyでJOBの異常終了を通知する

Webエンジニアの森脇です。

LCLでは、以下の記事でご紹介したように、PagerDutyを利用して障害通知を行っています。

techblog.lclco.com

Webサービスの障害通知だけではなく、JOBが異常終了した場合の通知も行っているので、簡単に紹介します。

背景

LCLでは、ジョブスケジューラとしてKuroko2を利用しており、JOBが異常終了した場合にはSlackへ通知しています。

techblog.lclco.com

JOBが異常終了するケースとして、

  • 連携先のシステム側で一時的に問題が発生し、次のスケジュールで正常実行されれば問題ないもの
  • 必ず手動でリカバリ必要なもの

に分類できますが、後者の重要なエラー通知はSlackだと見逃す恐れや、対応が遅れる恐れがあるので、PagerDutyへ通知するようにしました。

実現方法

Integration Keyの取得

PagerDutyでJOB通知用のSerivceを作成して、Integration Keyを取得します。Integration Keyは後述のAPI呼び出しのために必要です。

f:id:lcl-engineer:20190122150832p:plain

PagerDuty APIの呼び出し

PagerDutyには各種のAPIが用意されており、APIを利用することで任意にIncidentを作成できます。今回は、PagerDutyのAPIを呼び出すための、Ruby Gemを利用して実現しました。

GitHub - envato/pagerduty: A gem for talking to the pagerduty API

こんな感じで簡単に呼び出せます。

  INTEGRTION_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
  pagerduty = Pagerduty.new(INTEGRTION_KEY)
  pagerduty.trigger(
        description,
        client:   "[任意]",
        client_url:   [任意url],
        details:      { error: [任意メッセージ] }
    )
  end

このコードをKuroko2から呼び出せるように、社内用のWebAPI化しています。

Kuroko2のWebhook設定

Kuroko2のwebhookに、上記で作成したWeb APIのURLを指定します。

設定は以上です。JOBが失敗すると、以下のような通知が来ます。

f:id:lcl-engineer:20190120165516p:plain

まとめ

PagerDutyを利用することで、今まで属人化しつつあったJOBのエラー対応も明確な担当制で対応することが可能になりました。