Amazon Managed Service for Prometheus Alert Manager
はじめに
Amazon Managed Service for Prometheus (AMP) は、「Recording rules」と「Alerting rules」という 2 種類のルールをサポートしています。これらのルールは既存の Prometheus サーバーからインポートでき、定期的に評価されます。
Alerting rules を使用すると、PromQL としきい値に基づいてアラート条件を定義できます。アラートルールの値がしきい値を超えると、Amazon Managed Service for Prometheus の Alert manager に通知が送信されます。これは、スタンドアロンの Prometheus のアラートマネージャーと同様の機能を提供します。アラートは、Prometheus のアラートルールがアクティブになったときの結果です。
アラートルールファイル
Amazon Managed Service for Prometheus のアラートルールは、スタンドアロンの Prometheus と同じ形式の YAML 形式のルールファイルで定義されます。 お客様は Amazon Managed Service for Prometheus ワークスペースに複数のルールファイルを持つことができます。 ワークスペー スは、Prometheus メトリクスの保存とクエリに専用の論理的な空間です。
ルールファイルは通常、以下のフィールドを持ちます:
groups:
- name:
rules:
- alert:
expr:
for:
labels:
annotations:
Groups: 一定の間隔で順次実行されるルールのコレクション
Name: グループの名前
Rules: グループ内のルール
Alert: アラートの名前
Expr: アラートをトリガーする式
For: アラートのステータスが発火状態に更新される前に、アラートの式が閾値を超えている必要がある最小期間
Labels: アラートに付加される追加のラベル
Annotations: 説明やリンクなどのコンテキスト情報
以下はサンプルルールファイルの例です
groups:
- name: test
rules:
- record: metric:recording_rule
expr: avg(rate(container_cpu_usage_seconds_total[5m]))
- name: alert-test
rules:
- alert: metric:alerting_rule
expr: avg(rate(container_cpu_usage_seconds_total[5m])) > 0
for: 2m
Alert Manager 設定ファイル
Amazon Managed Service for Prometheus の Alert Manager は、YAML 形式の設定ファイルを使用してアラート(受信サービス用)を設定します。これは、スタンドアロンの Prometheus のアラートマネージャー設定ファイルと同じ構造を持っています。設定ファイルには、アラートマネージャーとテンプレート用の 2 つの主要なセクションがあります。
-
template_files には、
$value
、$labels
、$externalLabels
、$externalURL
変数として公開されるアラートのアノテーションとラベルのテンプレートが含まれています。$labels
変数は、アラートインスタンスのラベルのキー/値ペアを保持します。設定された外部ラベルには$externalLabels
変数を通じてアクセスできます。$value
変数は、アラートインスタンスの評価された値を保持します。.Value
、.Labels
、.ExternalLabels
、.ExternalURL
には、それぞれアラート値、アラートラベル、グローバルに設定された外部ラベル、外部 URL(--web.external-url
で設定)が含まれています。 -
alertmanager_config には、スタンドアロンの Prometheus のアラートマネージャー設定ファイルと同じ構造を使用するアラートマネージャーの設定が含まれています。
template_files と alertmanager_config の両方を含むサンプルのアラートマネージャー設定ファイルは以下のようになります。
template_files:
default_template: |
{{ define "sns.default.subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]{{ end }}
{{ define "__alertmanager" }}AlertManager{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver | urlquery }}{{ end }}
alertmanager_config: |
global:
templates:
- 'default_template'
route:
receiver: default
receivers:
- name: 'default'
sns_configs:
- topic_arn: arn:aws:sns:us-east-2:accountid:My-Topic
sigv4:
region: us-east-2
attributes:
key: severity
value: SEV2
アラートの重要な側面
Amazon Managed Service for Prometheus の Alert Manager 設定ファイル を作成する際に注意すべき 3 つの重要な側面があります。
- グルーピング: 類似したアラートを 1 つの通知にまとめることができます。これは、障害や停止の Blast Radius が大きく、多くのシステムに影響を与え、複数のアラートが同時に発生する場合に役立ちます。また、カテゴリー(ノードアラート、Pod アラートなど)でグループ化するためにも使用できます。アラートマネージャー設定ファイルの route ブロックを使用して、このグルーピングを設定できます。
- 抑制: すでにアクティブで発生している類似のアラートのスパムを避けるために、特定の通知を抑制する方法です。inhibit_rules ブロックを使用して抑制ルールを記述できます。
- サイレンシング: メンテナンスウィンドウや計画的な停止時など、指定した期間中アラートをミュートできます。受信したアラートは、サイレンシングする前に、すべての等価性または正規表現に一致するかどうかが確認されます。PutAlertManagerSilences API を使用してサイレンシングを作成できます。
Amazon Simple Notification Service (SNS) を通じたアラートのルーティング
現在、Amazon Managed Service for Prometheus Alert Manager は Amazon SNS を唯一の Receiver としてサポートしています。alertmanager_config ブロックの重要なセクションは Receivers で、アラートを受信するための Amazon SNS の設定が可能です。以下のセクションは、Receivers ブロックのテンプレートとして使用できます。
- name: name_of_receiver
sns_configs:
- sigv4:
region: <AWS_Region>
topic_arn: <ARN_of_SNS_topic>
subject: somesubject
attributes:
key: <somekey>
value: <somevalue>
Amazon SNS の設定は、明示的に上書きされない限り、以下のテンプレートをデフォルトとして使用します。
{{ define "sns.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join " " }}
{{ if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{- end }}
{{- end }}
追加参考資料: 通知テンプレートの例
Amazon SNS 以外の宛先へのアラートのルーティング
Amazon Managed Service for Prometheus Alert Manager は、Amazon SNS を使用して他の宛先に接続することができます。メール、Webhook (HTTP)、Slack、PageDuty、OpsGenie などが含まれます。
- メール 通知が成功すると、Amazon SNS トピックを介して Amazon Managed Service for Prometheus Alert Manager からアラートの詳細を含むメールが送信されます。
- Amazon Managed Service for Prometheus Alert Manager は、アラートを JSON 形式で送信できます。これにより、Amazon SNS から AWS Lambda やウェブフック受信エンドポイントでダウンストリーム処理が可能になります。
- Webhook 既存の Amazon SNS トピックは、Webhook エンドポイントにメッセージを出力するように設定できます。Webhook は、イベント駆動型のトリガーに基づいてアプリケーション間で HTTP を介して交換される、シリアル化された JSON または XML 形式のメッセージです。これは、アラート、チケット発行、インシデント管理システムのために、既存の SIEM やコラボレーションツールと連携するために使用できます。
- Slack お客様は、Slack のメールからチャンネルへの統合機能を利用できます。Slack はメールを受け取り、Slack チャンネルに転送することができます。または、Lambda 関数を使用して SNS 通知を Slack 用に書き換えることもできます。
- PagerDuty
alertmanager_config
定義のtemplate_files
ブロックで使用されるテンプレートをカスタマイズして、PagerDuty に Amazon SNS の宛先としてペイロードを送信できます。
追加参考資料: カスタム Alert Manager テンプレート
アラートのステータス
アラートルールは、設定されたしきい値を超えた場合に任意の通知サービスにアラートを送信するための、式に基づいたアラート条件を定義します。 以下にルールとその式の例を示します。
rules:
- alert: metric:alerting_rule
expr: avg(rate(container_cpu_usage_seconds_total[5m])) > 0
for: 2m
アラート式が特定の時点で 1 つ以上のベクトル要素を生成する場合、そのアラートはアクティブとみなされます。 アラートは、アクティブ (保留中 | 発火中) または解決済みのステータスを取ります。
- 保留中: しきい値超過からの経過時間が記録間隔より短い場合
- 発火中: しきい値超過からの経過時間が記録間隔より長く、Alert Manager がアラートをルーティングしている場合
- 解決済み: しきい値を超過しなくなったため、アラートが発火していない状態
これは、awscurl コマンドを使用 して ListAlerts API で Amazon Managed Service for Prometheus の Alert Manager エンドポイントにクエリを実行することで手動で確認できます。 以下にリクエストの例を示します。
awscurl https://aps-workspaces.us-east-1.amazonaws.com/workspaces/$WORKSPACE_ID/alertmanager/api/v2/alerts --service="aps" -H "Content-Type: application/json"