kubell Creator's Note

ビジネスチャット「Chatwork」のエンジニアのブログです。

ビジネスチャット「Chatwork」のエンジニアのブログです。

読者になる

Datadog Workflow Automationを使って「当日」と「翌日」のオンコール当番をチャットツールに通知する

はじめに

こんにちは、SREグループの山下(@task2021)です。

kubellでは、 オンコールの仕組みとして、 Datadog On-Callを利用しています。
本記事では、Datadog Workflow Automationを活用して、毎日自動的にオンコール当番情報をチャットツール通知するWorkflowの構築方法をご紹介します。

Datadog Workflow Automationの詳細は以下を参照してください!

www.datadoghq.com

作成するワークフロー

Datadog Workflow Automationを使って、以下のようなワークフローを構築しました。

  • 毎朝定時(例:10時)に、当日と翌日のオンコール当番情報をチャットツールに通知する

以下は、実際に組んだワークフローになります。

以降では、各Stepについて順に解説していきます。

必要な前提条件

  • Datadogアカウント(Workflow Automation機能が利用可能なプラン)
  • オンコールスケジュール機能の設定済み

実装手順

新規Workflowを作成する

https://app.datadoghq.com/workflow にアクセスして、New Workflowをクリックします。

トリガーを選択する

最初に下記のようなウインドウが表示されます。今回は定時実行が目的なので、Scheduleを選択します。

パラメーターを準備する

最初はSchedule Stepにフォーカスが当たっていますが、他のところをクリックすると、右側に以下のようなウインドウが表示されます。

inputバー
Input Parameters+をクリックして、後続処理で必要なパラメーターを準備します。

inputの例

各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を選択します。

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が動的に展開されます。

url

Inputs>URL Params

URL Paramsには以下の二つを設定します。

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]

通知例

動作確認の方法

実装が完了したら、以下の手順でテストを行います。

  1. ワークフローの画面で「Run」ボタンをクリック
  2. テスト用のパラメータ(テスト用チャンネルなど)を入力
  3. 実行結果を確認

まとめ

以上、Datadog Workflow Automationを活用してオンコール当番情報を自動でチャットツールに通知する仕組みの構築手順を解説しました。何かのお役に立てれば幸いです!