💬

AzureでCPU使用率やメモリ使用率のアラートをslackに通知する。

2021/08/27に公開

はじめに

Slack通知まではできていますが、実際に欲しい情報が取得するところまではできてないので、分かる方がいたら教えて下さい。
自分の環境がKubernetesを使ってるので、VMとか他のサービスを使ってる方は普通にできるかもしれないので問題なくできる可能性あります。

基本的な流れはこちらの記事(Azure Monitorのメトリックアラートをロジックアプリを使ってSlack通知)を見ていただければ大体のことは分かると思います。
詰まったところ等をこの記事では残しておきます。

シンプルなSlack通知

基本的な手順としてはアラートを作成し、通知方法を設定するだけです。

VMなどのリソースを選択すると左側のペーンに「警告」という項目があると思いますので、こちらをクリックします。
さらに、そこで「アラート ルールの作成」を選択すると、いくつか項目がでてきますが、「条件」を設定し、「アクション」を決めるだけです。

要はこういう条件のときに、こういうアクションをとるというのを決めます。

※以下自分の環境なので、AKS環境の話になるのでVMとかの場合と若干違うと思いますが、大体同じだと思います。

条件

まずは条件をテキトーに決めます。ここではノードのCPU使用率をトラッキングしてみます。
「cpuUsagePercentage」を選択します。ちなみcpuUsagePercentageが2つありますが、一つはノード(プラットフォーム)、一つはコンテナ(insights.container)内での使用率です。(多分)

さらにAKSの場合通知をノードごとやノードプールごとに設定できます。
ディメンジョン名をノード名にしておけばノードごとに設定されます。

アクション

次にアクションを設定します。
アクショングループの追加→アクショングループの作成を選択してください。
ここで通知方法としてEmailを選べたり、アクション内でAzure Functionを選択したり色々できます。
Slack通知を設定したことある人はとりあえずWebhookを選択して、Slcakのincoming webhookのURLを選択したくなると思います。

この設定はうまくいきません。
これはSlackのWebhookが欲しいJsonのスキーマが入ってないことによるものらしいです。(参考

ということで別の方法をとります。

ロジックアプリで通知する

ロジックアプリは簡単にいうと、AWSでいうStep FunctionsやGCPでいうWorkflowのようなものです。(どっちも使ったことないですが、、、)
あとはよく使われてるところでいうとZapierみたいに基本的にノーコードでこういう処理がきたら次はこの処理を投げる的なものを定義するものです。

なので、こちらを使って、Alertが発生したらSlackに通知するというワークフローを定義します。

ここからは最初に示した記事を見て頂くとして、大きな流れだけ残しておきます。

HTTP要求の受信時を選択

Slackに投稿を選択

これだけです。

ただ、ちょっとつまった点があったので残しておきます

サンプルペイロード

HTTP要求の受信を設定する際にペイロードの形式を設定します。
その際に以下のようなサンプル(Azure公式より)を設定するのですが、AKSでこれを使うと、dimensionsのところでエラーがおきました。

このjsonの中身を全て理解しているわけではないのですが、元のリソースごとに参照できる値が異なるせいだと思います。(自分の環境だとconditionの項目は全て削除しました)

ノード自体に名前がついてるので、そのノード名を取得したいのですがどうやって取得して良いかよく分からなかったので、分かる方いたら教えて下さい笑

ノードごとにアラートを設定する際にディメンジョン名としてノードが選べたので、ここのdimensionsにnodeNameとかあればいけるのかなぁとはうっすら思ってます。

一旦は通知だけ出して、Azureのダッシュボードを見に行くという方式にしています。

{
  "schemaId": "AzureMonitorMetricAlert",
  "data": {
    "version": "2.0",
    "status": "Activated",
    "context": {
      "timestamp": "2018-02-28T10:44:10.1714014Z",
      "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Contoso/providers/microsoft.insights/metricAlerts/StorageCheck",
      "name": "StorageCheck",
      "description": "",
      "conditionType": "SingleResourceMultipleMetricCriteria",
      "severity":"3",
      "condition": {
        "windowSize": "PT5M",
        "allOf": [
          {
            "metricName": "Transactions",
            "metricNamespace":"microsoft.storage/storageAccounts",
            "dimensions": [
              {
                "name": "AccountResourceId",
                "value": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Contoso/providers/Microsoft.Storage/storageAccounts/diag500"
              },
              {
                "name": "GeoType",
                "value": "Primary"
              }
            ],
            "operator": "GreaterThan",
            "threshold": "0",
            "timeAggregation": "PT5M",
            "metricValue": 1
          }
        ]
      },
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "resourceGroupName": "Contoso",
      "resourceName": "diag500",
      "resourceType": "Microsoft.Storage/storageAccounts",
      "resourceId": "/subscriptions/1e3ff1c0-771a-4119-a03b-be82a51e232d/resourceGroups/Contoso/providers/Microsoft.Storage/storageAccounts/diag500",
      "portalLink": "https://portal.azure.com/#resource//subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/Contoso/providers/Microsoft.Storage/storageAccounts/diag500"
    },
    "properties": {
      "key1": "value1",
      "key2": "value2"
    }
  }
}

ここで設定した値が渡ってくるので、例えばどんなアラートに引っかかったのかとか、そのアラート内容とかです。これを次のSlack通知のところで動的にテキストに埋め込めます。

Slack通知

次にSlack通知の設定です。
メッセージの送信を選択し、Slackログイン後チャンネルを選びます。
そして下記のようにメッセージを入力します。

これだけでSlack通知は完了です。

通知

ロジックアプリの設定は完了したので、最初に行ったアラートの設定のアクショングループの作成でこの作成したロジックアプリを選択すれば無事通知されます。

補足

自分の環境だとSlack通知のメッセージを作成する際に、allOf内の項目を選ぶと勝手にfor eachっていうモードに切り替わってなんかうまくいかなくなりました。この辺は配列になってるので個別に項目を取得できるのかもしれません。その辺も分からないので調べてみます。(あまり補足になってなかった笑)

Discussion