ThousandEyes と Webex Teams をカスタム Webhook で連携してアラートをつぶやいてみた

この記事はシスコの有志による Cisco Systems Japan Advent Calendar 2022 の 9 日目として投稿しています。
2022年版: https://qiita.com/advent-calendar/2022/cisco

# はじめに
ThousandEyes を使うと、ネットワークの品質をリアルタイムに監視し、問題があるとアラートをあげることができます。これまではメール通知などが主な方法でしたが、2022 年 9 月にアナウンスされた Custom Webhooks 機能で柔軟な外部連携ができるようになりました。

:::note info
新機能の詳細は、下記をご参照ください。
- New Features: Custom Webhooks (https://youtu.be/sTzHjjsvt04)
:::

この記事では、新機能の Custom Webhooks を使い、ThousandEyes と Webex Teams を連携し、アラートを Webext Teams の bot でつぶやく方法をまとめます。イメージとしては以下のようになります。

![Screen Shot 2022-11-21 at 13.33.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/f576a921-e201-5d46-8ab8-83b7d85fc3dd.png)


# 1. 準備
Webex Teams の Bot を使うために、下記の 2 つの情報を準備しておく必要があります。
- Bot access token
- Room ID

:::note info
すでにこれらの情報をお持ちの方は、[2. Custom Webhook の設定](#2-custom-webhook-の設定) へお進みください。
:::



## Bot access token の入手
まず Webex Teams でつぶやく bot を作成します。下記にログインし、右上のアイコンから "My Webex Apps" を選択します。
https://developer.webex.com/
その後 Create a New App をクリックすると、下記の画面になります。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/65d4bea9-2bb0-ff5c-a529-29f6afc2d4c4.png)


右上の Create a Bot で Bot を作成します。最後に表示される Bot access token をメモしておいてください。

:::note info
Bot 作成の詳細な手順については、下記の blog などでも公開されていますので、必要に応じてご参照ください（『「Bot access token」の確保』までの参照で大丈夫です）。

- 初めての WebexAPI 活用③（bot を作成して Webex Messaging で動かす）
https://gblogs.cisco.com/jp/2021/08/make-meeting-reservation-system-by-webex-api-3/
:::

## Room ID の入手
次に、つぶやく Webex Teams の Room ID を入手します。上記で作成した bot を適当な Webex Teams のルームに入れます。その後、下記にアクセスします。

https://developer.webex.com/docs/api/v1/rooms/list-rooms

右側の "Try it" にある Use personal access token のチェックを外し、Bot access token をコピペします（下図赤枠）。その後、最下部にあるオレンジの Run ボタンを押すと Bot が入っているルームの一覧が得られます。

![Screen Shot 2022-11-18 at 20.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/51cfde76-1a68-bdb8-56f4-175233f128f6.png)

下記に Run 応答で得られるサンプルの json を示します。ここから、通知先となるルームの ID をメモします（"id" や各値はもっと長いですが、見やすくするために短くしています）。

```json
{
    {
      "id": "Y2lzYyazoS9hYWQzOGEcJllMjR",    << これをメモします（本当はもっと長いです）
      "title": "Test Room",
      "type": "group",
      "isLocked": false,
      "lastActivity": "2022-01-17T05:13:19.399Z",
      "creatorId": "Y2lzY29zL1BF02tOWMxZC1jOSVkZi05C1hOGRT1BM4NC",
      "created": "2021-10-20T06:20:14.989Z",
      "ownerId": "Y2lzY29zcG0PTGF0Nj3NzvL3VzL0Nj3NVkZi05FZDcGY",
      "isPublic": false
    }
}
```

# 2. Custom Webhook の設定
ThousandEyes にログインし、左のメニューから Alerts > Integrations 選択します。その後、右上にある "New Integration" ボタンを押します。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/a1c0b899-e4ed-0b8e-46d9-6aa3da7faad0.png)


すると下記のような画面になりますので、Custom Webhook を選択します。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/e0df1ed6-d626-bebc-0827-b925e7abf363.png)


その後、カスタム画面になりますので、Preset Configurations を Cisco Webex にします。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/0e575b68-28a5-0b6a-8f8e-d61b16784a9c.png)


この Preset を使うと、Body に必要な情報が自動的に埋められるので便利です。

![Screen Shot 2022-11-18 at 20.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/3ad5a417-04fa-e5eb-325c-551c62cc30e6.png)

あとは、各フィールドを埋めます。下記のような感じです。

- Name: 適当な名前を入力します（例: Webex Alert）
- URL: https://webexapis.com/v1/messages
- Auth Type: None
- Headers:
  - Content-Type: application/json
  - Authorization: Bearer [Bot access token]
- Body: 下記参照

Body は以下のようになります。markdown は Preset そのままなので、roomId だけを追加します（最後のコンマを忘れないように気をつけます）。

```json
{
"roomId": "Y2lzYyazoS9hYWQzOGEcJllMjR",
"markdown" : "<strong>ThousandEyes Alert{{#eq type.id 2}} Triggered{{else}} Cleared{{/eq}}{{#if alert.test}} for {{alert.test.name}}{{/if}}</strong>\n<strong>Alert ID:</strong> {{alert.id}}{{#if alert.test}}\n<strong>Test Name:</strong> {{alert.test.name}}\n<strong>Target/s:</strong> {{#each alert.targets}}{{description}}{{#unless @last}} {{/unless}}{{/each}}{{/if}}\n<strong>Alert Rule:</strong> {{alert.rule.name}} - {{formatExpression alert.rule.expression}}{{#if alert.details}}\n<strong>Details:</strong> {{alert.details.size}}{{/if}}\n<strong>Severity:</strong> {{alert.severity.display}}\n<strong>Alerts Link:</strong> https://app.thousandeyes.com/alerts/list/active"
}
```

最終的には下記のようになります。

![Screen Shot 2022-11-18 at 21.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/9c63bdb2-605f-570f-8186-6bc9f4103578.png)

# 3. 動作確認
Test ボタンを押して、動作を確認します。Webex teams ルームに Bot のメッセージが投稿されたら成功です！Save して完了になります。

![Screen Shot 2022-11-18 at 21.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/796a748b-f433-a687-9cde-f91223f15b67.png)

実際のテストと紐づけるには、Alert Rules の Notifications にある、INTEGRATIONS のメニューから紐づけます。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156216/5bc3440e-1086-f294-7b0a-001b489a95d1.png)

:::note info
ThousandEyes の Alert 生成方法については、下記の YouTube 動画でも説明されていますので、必要に応じてご参照ください。

- 「CCIE 5 冠が語る！ThousandEyes 障害時のアラート生成」
 https://youtu.be/ppKAelqpQu4
:::

# 最後に
ThousandEyes の Custom Webhook を使うと、このように簡単にインテグレーションができます。皆様、良い年末年始をお過ごしください。