PagerDutyのOn-callを一時的に自分にアサインするdutymeというツールを書いた

現在のチームではインシデント管理にPagerDutyを使っている.On-callはPrimaryとSecondaryの2人体勢でそれを1週間ごとにローテーションで回している.On-Callにアサインされている場合は夜中であれ日中であれPrimaryにアラートが飛ぶ(Primaryが反応できなければSecondaryにエスカレートされる).そしてアラートを受けたら何かしらの対応を行う.

これはうまく回っているが問題もある.業務中(日中)はPrimaryやSecondaryに関係なくチームメンバーはどんどんデプロイしたりProduction環境で作業をしたりする.そしてオペレーションやデプロイ対象のコンポーネントによってはアラートが発生してしまうことがある.つまり作業者に関係なくアラートがPrimaryやSecondaryに飛んでしまう(Slackと連携しているので全員がそれをみることにはなるが).

デプロイやオペレーションは各個人の責任でやっているのでまずは本人が対応するべきである.またPrimaryであれインシデントがない場合は自分のタスクに集中しているのでアラートが飛べばDisturbされてしまう(自分がPrimaryの場合は嫌だし自分のオペレーションで誰かをDisturbしたくもない).そもそもスケジュールの粒度をもう少し細かく簡単に変更したい.

この問題を解決するためにdutymeというOn-callを一時的に自分にアサインするツールを書いた.以下ではこのツールの簡単な紹介を行う.なおコードは tcnksm/dutyme に公開している.

Requirement

dutymeを使うにはPagerDuty API v2のTokenが必要になる.TokenはReadとWriteの権限を持っている必要がある.詳しくは“Generating an API Key – PagerDuty Support and Help”を参考.

Usage

使い方は以下.

$ dutyme start

このコマンドを実行し必要な情報(PagerDutyのEmailスケジュール)を入力するだけでアサインが変更される.一度入力した情報はファイルに保存できるので次回からは何も入力することなくアサインを変更できる.

以下は利用の様子.

How it works

dutymeはスケジュールを書き換えているわけではない.PagedutyのOverrideという機能を使ってスケジュールの上書きをしている.なのでベースのスケジュールが壊れる心配はない(Overrideは消すのも簡単).

実装はGo言語でclientには https://github.com/PagerDuty/go-pagerduty を使い(Go言語でPagerDuty関連のツールを作りたい場合はこれを使えば良さそう),tty プロンプトの制御には自分で書いた https://github.com/tcnksm/go-input を使っている.

Install

インストールはgo getもしくはbrewが使える.

$ brew tap tcnksm/dutyme
$ brew install dutyme

Conclusions

要望やBugなどは https://github.com/tcnksm/dutyme/issues までお願いします.現状は最低限使うための機能しかないがもう少し機能の追加はする予定.