はじめに
こんにちは、SREグループの山下(@task2021)です。
kubellでは、 オンコールの仕組みとして、 Datadog On-Callを利用しています。
本記事では、Datadog Workflow Automationを活用して、毎日自動的にオンコール当番情報をチャットツール通知するWorkflowの構築方法をご紹介します。
Datadog Workflow Automationの詳細は以下を参照してください!
作成するワークフロー
Datadog Workflow Automationを使って、以下のようなワークフローを構築しました。
- 毎朝定時(例:10時)に、当日と翌日のオンコール当番情報をチャットツールに通知する
以下は、実際に組んだワークフローになります。
以降では、各Stepについて順に解説していきます。
必要な前提条件
- Datadogアカウント(Workflow Automation機能が利用可能なプラン)
- オンコールスケジュール機能の設定済み
実装手順
新規Workflowを作成する
https://app.datadoghq.com/workflow にアクセスして、New Workflow
をクリックします。
トリガーを選択する
最初に下記のようなウインドウが表示されます。今回は定時実行が目的なので、Schedule
を選択します。
パラメーターを準備する
最初はSchedule Step
にフォーカスが当たっていますが、他のところをクリックすると、右側に以下のようなウインドウが表示されます。
Input Parameters
の+
をクリックして、後続処理で必要なパラメーターを準備します。
各Step毎にハードコーディングしても良いのですが、パラメーターに展開しておくと、「他チームへの展開(workflowをコピーして差分だけ調整するなど)」や「動作確認(テスト用のチャットに流してみるなど)」がしやすくなるため、おすすめです。
以下では、私たちが設定している3つのパラメーターを紹介します。
1. scheduleId
どのOnCall Scheduleから担当者情報を取得するかの処理で必要になります。 https://app.datadoghq.com/on-call/schedulesからスケジュールを選択して詳細を開いた時のURLのパスから取得できます。
Data Type
はstringに設定します。
Default Value
に設定しておくことで、定時実行時に利用されます。
2. notificationTarget
通知するルームやチャンネルであったり、お使いのツールによって変動します。 例えば、私たちは「Chatwork」を利用しているので、チャットルームIDをここで指定しています。
Data Type
はstringに設定します。
Default Value
に設定しておくことで、定時実行時に利用されます。
3. onCallMembers
DatadogのUser IDと通知先のツールのアカウント情報のマップを定義します。Data Type
はobjectに設定します。
以下のように、キーは「Datadog User ID」とし、ユーザーごとに通知先のツールの対応する情報を値に入れておきます。値の要件は、どのような通知をしたいかによって変動します。 例えば、「通知先のツールのaccountIdがわかれば良い」のであれば、以下のような設定になります。
{ <Datadog User ID 1>: { "accountId": <通知先のツールのアカウントID1> }, <Datadog User ID 2>: { "accountId": <通知先のツールのアカウントID2> }, <Datadog User ID 3>: { "accountId": <通知先のツールのアカウントID3> } }
Datadog User IDは、https://app.datadoghq.com/organization-settings/usersからユーザーを選択して詳細を開いたときのクエリパラメータ(user_id)の値から取得できます。
Default Value
に設定しておくことで、定時実行時に使用されます。
スケジューラーの設定
ワークフローを定期実行するためのスケジューラーを設定します。 例えば、毎日日本時間の10時であれば、以下のようになります。
時刻情報の取得と整形
当日と翌日の当番情報を取得するため、必要な時刻データを準備します。
Schedule Step
から繋げる形で+ボタンを押すと、以下のようなダイアグラムが表示されるので、Function
を選択します。JavaScriptで処理が記述できます。
Script
欄に以下を貼り付けます。ここでreturn
した値が後続のStepで参照できるようになります。
function getCurrentAndFutureTimeFormatted() { const now = new Date(); // 24時間後 const future = new Date(now.getTime() + 24 * 60 * 60 * 1000); const toUTC = (date) => { return date.toISOString().slice(0, 16) + ":00Z"; }; return { currentTimeIsoUtc: toUTC(now), nextDayTimeIsoUtc: toUTC(future), }; } return getCurrentAndFutureTimeFormatted();
Test
から実行結果を確認することができます。
{ data: { currentTimeIsoUtc: "2025-05-16T01:00:00Z", nextDayTimeIsoUtc: "2025-05-17T01:00:00Z", } }
Datadog APIを使用した当番情報の取得
オンコールスケジュールAPIを呼び出して、当日と翌日の当番者情報を取得します。
Function Step
から繋げる形で+ボタンを押すと、以下のようなダイアグラムが表示されるので、Make Request
を選択します。
以下では「当日のオンコール担当情報」の取得を例に解説します。「翌日のオンコール担当情報」も取得する場合は、Function
から取得するデータが変わるため、適宜読み替えてください。
Connection
Datadog APIを叩くために使う接続情報を設定します。詳細は以下を参照してください。以下のURLから作成可能です。Base URLにはhttps://api.datadoghq.com
を指定しておきます。
https://app.datadoghq.com/actions/connections
Inputs>URL
Base URLはConnection設定時に指定しているため、defaultで値が入っている状態になっています。メソッドはGet
を指定し、pathには/api/v2/on-call/schedules/{{ Trigger.scheduleId }}/on-call
を入力します。
{{ Trigger.scheduleId }}
には、実行時のinput parameterが動的に展開されます。
Inputs>URL Params
URL Paramsには以下の二つを設定します。
- include
user
を指定します
- filter[at_ts]
{{ Steps.Get_formatted_times.data.currentTimeIsoUtc }}
を指定します- これは、前段の手順で
Function
で作成した値になります。Get_formatted_times
と言うのは、その時に設定したFunction名を_
で繋いだものになるので、設定に応じて読み替えてください。
通知用のデータを準備する
Datadog APIで取得した担当者のデータはあくまで、Datadog上での情報になるため、後続のチャットツールでの通知に必要なデータに変換する必要があります。
$.Trigger.onCallMembers
は最初の行程で用意したInput Parameterになります。
ここでもFunction
を作成し、Script欄に以下を貼り付けます。Stepの名前などが異なる場合は、$.Steps....
で指定する値が異なるため、適宜読み替えてください。
const onCallMembers = $.Trigger.onCallMembers // 当日のオンコール担当の情報を取得 const { included: currentOnCallUserInfo } = JSON.parse($.Steps.Fetch_current_oncall_assignee.body); // 翌日のオンコール担当の情報を取得 const { included: nextOnCallUserInfo } = JSON.parse($.Steps.Fetch_oncall_assignee_in_24_hours.body); // onCallMembersに各日程の担当者のDatadog User IDをキーに、チャットツールでのIDを取得して返す return { current: onCallMembers[currentOnCallUserInfo[0].id], next: onCallMembers[nextOnCallUserInfo[0].id] }
通知メッセージの生成と送信
前段で取得した情報を元に、読みやすい形式でメッセージを生成し、チャットツールに送信します。 例えば、以下は私たちが「Chatwork」に通知している本文です。
[info][title]今日のオンコール担当[/title] [To:{{Steps.Get_oncall_assignee.data.current.accountId}}] {{Steps.Get_oncall_assignee.data.current.name}}さん 今日の当番です。よろしくお願いします(bow) [hr] [To:{{Steps.Get_oncall_assignee.data.next.accountId}}] {{Steps.Get_oncall_assignee.data.next.name}}さん 次は{{ Steps.Get_formatted_times.data.nextDayDateJp }} から交代予定です(please)[/info]
動作確認の方法
実装が完了したら、以下の手順でテストを行います。
- ワークフローの画面で「Run」ボタンをクリック
- テスト用のパラメータ(テスト用チャンネルなど)を入力
- 実行結果を確認
まとめ
以上、Datadog Workflow Automationを活用してオンコール当番情報を自動でチャットツールに通知する仕組みの構築手順を解説しました。何かのお役に立てれば幸いです!