Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

【R&D DevOps通信】DatadogでKubernetesのNamespaceごとに通知先を振り分る


こんにちは、研究開発部 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は機能が多い分「これどうやるんだっけ?」と悩むことも多いと思います。
本ブログで少しでも参考になれば幸いです。

次のブログでまた、お会いしましょう!

求人

私の所属するML Platformチームを含む、研究開発部Architectグループでは一緒に働く仲間を募集しています。

R&D MLOps/DevOpsエンジニア / Sansan株式会社

© Sansan, Inc.