見出し画像

Jenkinsジョブのエラー通知を見落とさないようにする改善

これはSupership株式会社の 「データソリューションスタジオ」における社内勉強会の発表資料を外部公開向けに再編したものになります。

アジェンダ

・どのような問題があったのか
・なぜエラー通知を見落とすのか
・どのようにして見落としを防ぐか
・「本当にまずい状態」とはなにか
・「本当にまずい状態を通知」するようにした結果
・「本当にまずい状態の通知」をどのように実装したか

どのような問題があったのか

今回の改善を行ったログ転送・集計基盤では、Jenkinsを用いてログのプレ集計や運用担当者が見るレポートの集計、予算消化状況の管理などビジネスに直結する様々なジョブが実行されていました。

しかし、日々拡大していくビジネスに運用が追いついておらず、ジョブが増え続け、Slackやメールに通知されるJenkinsのエラーを見落とすというケースがありました。

そこで、「本当にまずい状態の通知」を「ステートレス」で通知することでこの状況を改善しました。

なぜエラー通知を見落とすのか

ジョブの数が多いというのは前述していますが、なぜエラー通知を見落とすのかを整理してみたいと思います。

・Jenkinsジョブの数が250個ほどありとても数が多い

・様々な理由でジョブが失敗してしまうことがある
 ・短期的には解決不可能な事由によるエラー
 ・クラウドサービスの一時的なエラー

・通知しているアラートがステートフルで確認が難しい
 ・Slackにビルドの「失敗」と「リカバリー」を通知している
 ・Slackを見るだけではどのビルドが「失敗」のままかわからない

・ジョブの実行時間が10分程度から数時間まである 
 ・Slackのアラート部屋のログの間隔が開くため見落としやすい

・失敗したジョブは自動で再実行されるロジックがある
 ・クラウドサービスのリソース不足起因など、放置していても自動で回復するケースが多々ありそのような運用に慣れてしまっている

まとめると実行時間がマチマチのジョブが外部要因で失敗することがあり、連続で複数のジョブが失敗した際にどのジョブが失敗したままかを見落とすということが起きていた。
またエラーから自動で回復するケースもありエラーが発生したからといって即座に対応をすべきものとは限らないケースがあった。

改善前のSlack通知の様子

スクリーンショット 2021-03-29 19.00.48

どのようにして見落としを防ぐか

私がこのログ転送・集計基盤の担当となったときは当初はJenkinsのWebページを開きステータスを確認するというフローで行っていました。

しかし、ながいこと人力で確認をしていると見落としが発生したり、休日に休んだ気がしなかったりとネガティブな面が目立ちつつありました。

今すぐに半日程度で実現できる範囲で根本的な通知の解決を試みました。

試みた解決方法として今ある通知とは別に「本当にまずい状態」のときだけ通知を行うということを考えました。

本来であれば、今ある通知も見直しを行うべきですが、私がこのログ転送・集計基盤の担当となった経緯が少々特殊で、どのジョブがどうなっているのが正しいかということを正確に把握している人はいない状態だったため、今あるものには手を加えず改善を行うことにしました。

「本当にまずい状態」とはなにか

ここではジョブの実行の失敗はすべてサービスやビジネスに影響があるものとして仮定します。

「本当にまずい状態のジョブ」は以下としました。(OR条件)
・最新のジョブの実行で失敗したまま、1時間以上再実行されていないもの
もしくは
・再実行でリカバリーできないエラーが発生しているジョブ

通知の対象とするジョブは以下としました。(AND条件)
・Jenkinsで有効化されているジョブ
・前述の「本当にまずい状態のジョブ」となっているジョブ
・今現在、実行中のジョブがないもの

通知対象についての整理

スクリーンショット 2021-03-29 18.49.43

「本当にまずい状態を通知」するようにした結果

年明け初日の勤務日に「今年こそ通知で消耗したくない」という思いから半日で実装し試験運用を開始しました。

導入後の結果として、試験運用開始からエラーの見落としがなくなりました。

またSlackのアラートチャンネルに、今落ち続けているジョブがなにかが通知されるので、認知負荷も下がったと思います。

改善後のSlack通知の例

スクリーンショット 2021-03-29 19.14.19

「本当にまずい状態の通知」をどのように実装したか

Go言語で生成したバイナリからJenkins API を叩いています。
Go言語を選んだ理由としては、自分が最近一番書きなれている言語であることと、環境依存での動作不良を防ぎたくシングルバイナリが書き出せるためです。
Jenkins API 周りは gojenkins を採用

以下が「本当にまずい状態を通知するやつ」ことjenkins_consecutive_fail_detector のリポジトリです。

書き捨てる予定だったのでテストコードがないですが、そのうち...そのうち...

この記事が気に入ったらサポートをしてみませんか?