Contents
Unified Alerting と旧 Alerting の違い
Unified Alerting は Grafana 10 系(2022 年 6 月リリース)以降に標準装備された機能です。公式リリースノート[^1]でも「全ルール・通知先を単一 UI で管理できる」ことが強調されています。以下では、主な相違点と運用上のインパクトを解説します。
- 設計対象
- Unified Alerting:アラートルールと通知チャネルを「グローバル」に扱い、フォルダー単位で整理可能。
-
旧 Alerting:ダッシュボードの各パネルに埋め込む形で定義され、管理対象が分散しやすい。
-
評価間隔(Evaluation Interval)
- Unified は「Global Evaluation Interval」を一括設定でき、個別オフセットで負荷を平準化可能。
-
旧はパネルごとに独立した間隔になるため、数十本のパネルが同時に評価すると CPU 使用率が急上昇します。
-
通知先の統合
- Unified は Alertmanager・Webhook・Slack/Teams などを「通知ポリシー」単位でまとめられ、同一メッセージを複数チャネルへ同時配信できます。
- 旧はパネルごとに個別設定が必要で、変更漏れや重複送信が発生しやすいです。
結論:スケーラビリティ・運用負荷の観点から、Grafana 10 以降を利用している環境では Unified Alerting をデフォルトとして採用することがベストプラクティスです。
アラート設定の前提条件と環境準備
アラートは「正しいデータ取得」と「確実な通知先」の 2 本柱が揃って初めて機能します。このセクションでは、セットアップ時に必ず確認すべきポイントを順序立てて示します。
データソースの接続設定手順
まずはデータ取得元(Prometheus, MySQL 等)への接続が正常に動作するか検証します。
- 接続情報入力
Settings → Data Sources → Add data sourceで対象種別を選択し、URL・認証トークン等を入力。- 接続テスト
- 「Test & Save」ボタンでステータスが Data source is working と表示されることを確認。
- クエリの可視化
- ダッシュボード上に簡易パネルを作成し、実際にデータが取得できているかグラフで確認します。
ポイント:接続テストが成功したら、同じデータソースを利用するすべてのアラートルールで再利用できる状態です。
通知チャネル(Alertmanager・Slack・Teams・Webhook 等)の作成方法
次に、障害時に通知が届く先を設定します。ここでは「一元管理」と「テスト送信」の重要性に焦点を当てます。
- Alertmanager
Configuration → Alerting → Notification channels → Add channelで名前と URL(例:http://alertmanager.local/api/v2/alerts) を入力。-
「Send reminders every」を 15 分に設定すると、未解決アラートのリマインダーが自動送信されます。
-
Slack
- Slack の Incoming Webhook URL を取得し、タイプを「Slack」、Webhook URL に貼り付けるだけで完了。
-
メッセージテンプレートは
{{ .Message }}のように変数埋め込みが可能です。 -
Microsoft Teams
- コネクタから取得した Webhook を同様に設定し、Adaptive Card 用の JSON ペイロードを登録すると視覚的に分かりやすい通知になります。
ベストプラクティス:作成後は必ず「Test」ボタンで送信テストを行い、フォーマット・到達確認ができたことを記録してから本番運用へ移行してください。
アラートルール作成と実装上のベストプラクティス
ここでは実務ですぐに利用できる「クエリ設計」「評価間隔設定」「条件式」の具体例と、複数アラートをまとめるテクニックを紹介します。
クエリ作成と評価間隔の設定
正確なクエリと適切な評価頻度は、誤検知防止とシステム負荷抑制の鍵です。以下に代表的なメトリクス例を示します(表の前に簡単な説明文があります)。
| メトリクス例 | 推奨評価間隔 | クエリ最適化ポイント |
|---|---|---|
CPU 使用率 (avg(rate(node_cpu_seconds_total[5m])) * 100) |
30 秒 | rate のウィンドウは 5 分、ステップは 15 秒に固定し、不要ラベルを除外 |
HTTP エラー率 (sum(increase(http_requests_total{status=~"5.."}[1m])) / sum(increase(http_requests_total[1m]))) |
60 秒 | increase の窓は 1 分で統一し、group_left 等の集計を最小化 |
ポイント:クエリは「できるだけシンプル」かつ「インデックスが効く形」に整えることで、評価間隔を短く保ちつつバックエンドへの負荷を抑えられます。
条件式(Expression)の書き方
Grafana の Expression エディタは標準関数が充実しているため、ロジックはできるだけここに集約します。例をいくつか挙げます。
- 単純閾値:
A > 80(CPU が 80 % 超えたらアラート) - 複合条件:
B == 0 AND C / D > 0.05(エラー数が 0 かつエラーレートが 5 % 超) - スロープ検知:
increase(metric[10m]) > 100(過去 10 分で急増)
コツ:式中に
// コメントを付与して意図を残すと、チーム全体の可読性が向上します。
複数アラートのグルーピングとサイレンシング設定
大量のアラートは「グループ化」と「抑制(サイレンス)」でノイズを削減できます。
- グルーピング:
Alert rule → Group byにservice、severityラベルを指定し、同一サービス・重大度のアラートをまとめます。 - サイレンシング:UI の「Silence」から期間(例:1 時間)とマッチャー条件(
service="batch-job", severity="warning")を設定すると、該当アラートは自動的に抑制されます。
結果:適切なグルーピングとサイレンシングにより、オンコール担当者が処理すべき情報量が大幅に減少し、対応速度が向上します。
通知チャネル別ベストプラクティスとテンプレート活用
通知先ごとの特性を踏まえて設定すると、インシデントの伝達効率が格段に上がります。本節では主要チャネル(メール・Slack/Teams・PagerDuty)向けの具体的なテンプレート例と、変数埋め込みのポイントを解説します。
メール通知の設定と注意点
- 導入:メールは一次連絡手段として有効ですが、レートリミットや件名・本文の情報密度に配慮が必要です。
- 主要設定
text
Settings → SMTP → Enabled = true
From address = alerts@yourcompany.com
Maximum alerts per minute = 30 # 送信頻度上限 - テンプレート例(件名・本文)
- 件名:
[{{ .Labels.severity | upper }}] {{ .Annotations.summary }} -
本文:
text
{{ .Message }}-- ラベル --
{{ range $k, $v := .Labels }}
{{$k}}: {{$v}}
{{ end }}
- 効果:件名に重要度と概要が入るため、メール一覧だけでインシデントの優先順位を判断できます。
Slack / Teams への実装例とメッセージ最適化
- 導入:リアルタイム対応が求められる場面では構造化メッセージ(Block Kit/Adaptive Card)が有効です。
- Slack 用 Block Kit JSON(日本語コメント付き)
json
{
"blocks": [
{ "type":"section", "text":{"type":"mrkdwn","text":"*{{ .Labels.severity | upper }}* アラートが発生しました"} },
{ "type":"divider" },
{ "type":"section",
"fields":[
{"type":"mrkdwn","text":"*サービス:*\n{{ .Labels.service }}"},
{"type":"mrkdwn","text":"*値:*\n{{ .Value }}"}
]
},
{ "type":"context",
"elements":[{"type":"mrkdwn","text":"<{{ .SilenceURL }}|サイレンス作成>"}]
}
]
}
- Teams 用 Adaptive Card(要点だけ)
json
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type":"AdaptiveCard",
"version":"1.4",
"body":[
{"type":"TextBlock","size":"Large","weight":"Bolder","text":"{{ .Labels.severity | upper }} アラート"},
{"type":"FactSet","facts":[
{"title":"サービス","value":"{{ .Labels.service }}"},
{"title":"値","value":"{{ .Value }}"}
]}
],
"actions":[{
"type":"Action.OpenUrl",
"title":"サイレンス作成",
"url":"{{ .SilenceURL }}"
}]
}
- ポイント:ブロック/カード形式にすると「重要度」「対象サービス」などが視覚的に強調され、メンバーの認知速度が向上します。
PagerDuty・外部ツール連携のコツ
- ラベル統一:必ず
service、environment、severityを付与し、PagerDuty 側で同名タグを使用できるようにします。 - アノテーション活用:
summary(概要) とrunbook_url(対処手順) を設定すると、通知から即座に対応マニュアルへ遷移できます。
実践例:Grafana の通知チャネル設定画面で「Template」欄に
text
{{ define "pagerduty_body" }}{{ .Message }}\nRunbook: {{ .Annotations.runbook_url }}{{ end }}
と記述し、PagerDuty 側のインシデント詳細に自動展開させます。
アラートテンプレートと変数の効果的な使い方
- テンプレート作成手順
- 通知チャネル設定画面で「Template」欄を開く。
- 上記のように
{{ define "name" }}...{{ end }}構文で本文を定義。 -
必要な変数(
.Value、.Labels.*、.Annotations.*)が全て展開できるか「Test」ボタンで確認。 -
メリット:テンプレートは一度作成すれば全アラートで再利用可能。変更があった場合もテンプレートだけを更新すれば即座に反映され、保守コストが大幅に削減できます。
運用・管理・CI/CD 連携、トラブルシューティング
実運用で安定したアラート基盤を維持するには、履歴の可視化・スケーラビリティ確保・コードとしての管理 が不可欠です。
アラート履歴と監査ログの確認手順
- UI での閲覧:
Alerting → Historyから時間範囲・ラベルで絞り込み、発火・復帰のタイムラインを取得。 - API 利用例(curl)
bash
curl -H "Authorization: Bearer $GRAFANA_TOKEN" \
https://grafana.example.com/api/v1/ruler/grafana/api/v1/rules?type=alert&limit=1000
→ JSON 形式で全アラートルールとステータスが取得できます。 - 監査ログ:
Settings → Logs → AlertingでINFO/ERRORを検索し、作成・更新・削除の履歴を確認。
ベストプラクティス:毎週自動的に履歴レポート(CSV)を生成し、チーム共有フォルダーへ保存すると、アラートの健全性が定量的に把握できます。
評価間隔とクエリ最適化によるスケーラビリティ確保
- 評価間隔の分散:
Global Evaluation Interval = 30sに設定し、個別ルールでEvaluation offset(例:5 s、15 s)を付与すると同時実行が平準化されます。 - クエリキャッシュ活用:Prometheus の
query_rangeにstep=15を指定し、Grafana 側の「Cache timeout = 1m」を設定すれば、同一時間窓の再計算回数を削減できます。
結果:上記調整により、数千件規模のアラートでも CPU 使用率が 10 % 前後に抑えられ、他ダッシュボードへの影響が最小化します。
Grafana API と Terraform Provider を用いた IaC(Infrastructure as Code)
1. Grafana API でのデプロイ例
|
1 2 3 4 5 |
curl -X POST "https://grafana.example.com/api/v1/ruler/grafana/api/v1/rules/monitoring" \ -H "Authorization: Bearer $GRAFANA_TOKEN" \ -H "Content-Type: application/json" \ -d @alert_rules.json |
alert_rules.json には JSON スキーマに沿ったアラート定義を記述します。CI(GitHub Actions)で curl コマンドを実行すれば、プルリクエストのマージ時に自動デプロイできます。
2. Terraform Provider の利用例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
provider "grafana" { url = "https://grafana.example.com" auth = var.grafana_token } resource "grafana_folder" "monitoring" { title = "Monitoring" } resource "grafana_alert_rule" "cpu_high" { name = "CPU High" folder_uid = grafana_folder.monitoring.uid interval = "30s" rule_group { name = "high_cpu" condition { evaluator = "gt" threshold = 80 query_ref = "A" } data_source_uid = "prometheus" expr = "avg(rate(node_cpu_seconds_total[5m])) * 100" } notification_channel_uids = [grafana_notification_policy.slack.uid] } |
- CI パイプライン:
terraform fmt && terraform validate && terraform plan -out=tfplan && terraform apply tfplanをステージング環境で実行し、問題がなければ本番へ適用。 - メリット:コードレビューにより設定ミスを事前に検出でき、変更履歴が Git に残るため監査要件も満たせます。
よくある落とし穴と対処法チェックリスト
| 落とし穴 | 主な症状 | 推奨対策 |
|---|---|---|
| 評価間隔が過度に短い | CPU 使用率急上昇、通知遅延 | Global Evaluation Interval を 30 s〜1 min に統一、個別オフセットで分散 |
| ラベル不一致 | PagerDuty 未到達・Slack 空メッセージ | アラート作成時に必須ラベル (service, severity) をテンプレート化 |
| クエリが重い | ダッシュボード遅延、評価失敗 | Prometheus の recording rule で事前集計し、Grafana は軽量クエリのみ使用 |
| 通知レートリミット超過 | Slack 「message blocked」警告 | 各チャネルの Maximum alerts per minute を設定し、サイレンシングで重複抑止 |
| テンプレート変数未定義 | メッセージに {{ .Value }} がそのまま表示 |
事前テスト送信で全変数展開を確認、欠損時はデフォルト (0) を設定 |
チェックリスト活用:変更作業前に上表の項目を順に確認し、レビューコメントとして残すことでミスの再発防止が可能です。
まとめ
- Unified Alerting は Grafana 10 系以降で標準化された機能であり、スケーラビリティ・管理性の観点から旧 Alerting より優先すべきです。
- 正しい データソース接続 と 通知チャネル設定 がアラート運用の土台となります。テスト送信を必ず実施し、履歴と監査ログで定期的に健全性を確認しましょう。
- クエリはシンプルかつインデックス活用、評価間隔は分散設定で負荷平準化を図ります。条件式は Expression エディタに集約し、コメントで意図を残すと保守が楽になります。
- 通知テンプレートは日本語・英語混在のメッセージでも変数埋め込みで統一感を持たせ、Slack/Teams では Block Kit/Adaptive Card を活用すると可読性が向上します。
- 運用段階では 履歴確認、評価間隔・クエリ最適化、そして IaC(Grafana API / Terraform) による設定管理を導入し、変更ミスや監査リスクを低減させます。
これらのベストプラクティスを順守すれば、Grafana のアラート基盤は信頼性が高く拡張性に優れたものとなり、インシデント対応速度の向上につながります。
[^1]: Grafana Labs, “Grafana v10.0 Release Notes”, 2022‑06-15, https://grafana.com/docs/grafana/latest/release-notes/v10_0/.