こんにちは、研究開発部 Architectグループ ML Platformチームに所属の宮地です。
23卒の新卒として入社し、少しづつ業務に慣れてきた今日このごろです。
業務内では主に研究開発部のKubernetes基盤であるcircuitと向き合いながら、研究開発部のDevOpsを推進しています。
以下、circuitの詳細ブログです。
buildersbox.corp-sansan.com
本ブログは、circuitの監視用Datadogの改善を行った際の一部です。
アラート整理の一環として、同一モニタ内でのSlackチャンネル通知先の振り分け設定を行ったため紹介します。
運用のイメージは以下の通りです。
当初のDatadog運用方法
Kubernetes内で発生したアラートをすべて同一Slackチャンネル(alerts-default)に通知する状態でした。
課題
この運用では、 同一Slackチャンネルへのアラート流入量が多いため以下のような課題がありました。
- アラート担当者の判断コストが高い
- アラートの見落としリスクが高い
- 認知負荷が高いため精神衛生的に良くない
対策として、適切な粒度でチャンネルを振り分けることで、認知負荷を下げることとしました。
設定
まず、適切な粒度を決める必要があります。
粒度は機能単位が妥当であると判断し、Kubernetesの名前空間ごとに振り分ける運用となりました。
次に、これを実現するための手法を検討し、以下の機能が提供されているので利用しました。
- 条件付き変数
- モニタ状態などに応じて、異なるメッセージの表示を可能にする機能
- ダイナミックハンドル
- タグ変数を利用して、通知ハンドルを動的に生成可能にする機能
詳細はDatadogドキュメントを御覧ください。
最後に設定です。実際の設定を例に紹介します。
以下は、5分間のpodの再起動回数が一定値を上回った場合に通知するものです。
名前空間としてA、B、Cが存在していることを想定しています。
Pod {{pod_name.name}} restarted multiple times in the last five minutes. {{#is_exact_match "kube_namespace.name" "A" "B" "C"}} @slack-alerts-{{kube_namespace.name}} {{/is_exact_match}} {{^is_exact_match "kube_namespace.name" "A" "B" "C"}} @slack-alerts-default {{/is_exact_match}}
まず、注目して欲しい部分は、#is_exact_matchです。これは変数と指定文字列の比較を行い完全一致ならば、その内部をメッセージ内容に反映します。なお、^is_exact_matchは反対に完全一致しない場合となります。
本設定例では、kube_namespace.nameに対して、3種(A,B,C)の比較を行っています。kube_namespace.nameがA,B,Cのどれかと一致した場合に内部のメッセージ内容を反映しています。また、内部ではダイナミックハンドルにより、名前空間に従ったチャンネル名に通知しています。
以上で、同一モニタ内でのSlackチャンネル通知先の振り分け設定は完了となります。
おわりに
Datadogは機能が多い分「これどうやるんだっけ?」と悩むことも多いと思います。
本ブログで少しでも参考になれば幸いです。
次のブログでまた、お会いしましょう!