はじめに
効果的なモニタリングとは、単にメトリクスを収集するだけでなく、問題が発生した際に通知を受け取れるようにすることです。Prometheus には強力な組み込みアラートシステムがあり、グラフ作成に使用するのと同じ PromQL クエリ言語を使ってアラート条件を定義できます。アラートの条件が満たされると、そのアラートは「Firing(発報)」状態になります。
このラボでは、Prometheus アラートの基礎を学びます。あらかじめ Prometheus と Node Exporter が実行されている環境からスタートし、独自のアラートルールファイルを作成して CPU 高負荷を検知するルールを定義します。さらに、Prometheus にそのファイルを読み込ませ、実際に CPU 負荷をかけて Prometheus UI 上でアラートがトリガーされる様子を確認します。
アラート環境の確認
このステップでは、ラボ環境を確認します。セットアップスクリプトによって、Prometheus と Node Exporter の2つの Docker コンテナがすでに起動しています。
まず、両方のコンテナが実行されていることを確認しましょう。ターミナルを開き、docker ps コマンドを実行します。
docker ps
以下のような出力が表示され、prometheus と node-exporter コンテナが「Up」状態であれば正常です。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
... prom/prometheus "/bin/prometheus --c…" 15 seconds ago Up 14 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
... prom/node-exporter "/bin/node_exporter …" 16 seconds ago Up 15 seconds 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp node-exporter
node-exporter コンテナはホストシステム(ラボの VM)に関するメトリクスを公開しており、prometheus コンテナはそのメトリクスをスクレイプ(収集)するように設定されています。
次に、Prometheus UI を確認します。アクセス手順は以下の通りです。
- LabEx インターフェースの上部ナビゲーションバーにある
+(新しいタブ)ボタンをクリックします。 - ドロップダウンメニューから Web Service を選択します。
- ポート番号に
9090を入力します。 - Open をクリックして Prometheus Web インターフェースを起動します。
新しいタブが開くと、Prometheus Expression Browser のトップページが表示されます。上部ナビゲーションメニューから Status -> Targets に移動してください。node_exporter ジョブが緑色の「UP」状態になっていれば、Prometheus が正常にデータを収集できています。この接続がアラートルールの基盤となります。

CPU高負荷アラート用の alert-rules.yml の作成
このステップでは、アラートルール専用のファイルを作成します。ルールをメインの Prometheus 設定から分離しておくことは、管理を容易にするためのベストプラクティスです。
プロジェクトディレクトリ内に alert-rules.yml という名前のファイルを作成します。nano エディタを使用してファイルを作成・編集します。
nano ~/project/alert-rules.yml
次に、以下の YAML コンテンツをコピーして nano エディタに貼り付けます。これは、CPU 使用率が高いときにトリガーされる単一のアラートを含むルールグループを定義するものです。
groups:
- name: node_alerts
rules:
- alert: HighCpuLoad
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 10
for: 1m
labels:
severity: warning
annotations:
summary: "High CPU load on {{ $labels.instance }}"
description: "CPU load is > 10% (current value: {{ $value }}%)"
このルールの詳細を解説します。
groups: ルールはグループ単位で整理されます。グループ内のすべてのルールは順番に評価されます。alert: アラートの名前です。ここではHighCpuLoadとしています。expr: 評価される PromQL 式です。値が返されるとアラートがトリガーされます。ここでは、過去1分間のアイドル状態ではない CPU 時間の割合を計算しています。これが 10% を超えると条件が満たされます。for: この句は、アラートが「Firing」状態になる前に、条件が継続して真である必要がある期間(1分間)を指定します。これにより、一時的なスパイクによる誤検知を防ぎます。annotations: アラートに人間が読みやすい情報を追加します。summaryとdescriptionは標準的なアノテーションです。{{ $labels.instance }}や{{ $value }}のようなテンプレート変数を使用して、アラートメッセージに動的なデータを含めることができます。
貼り付けが終わったら、Ctrl+X、Y、Enter の順に押してファイルを保存し、nano を終了します。
ルールファイルをマウントした Prometheus コンテナの実行
このステップでは、作成したルールファイルを読み込むように Prometheus を設定し、設定を反映させてコンテナを再起動します。
まず、メイン設定ファイルである prometheus.yml を編集して、ルールファイルへの参照を追加します。nano で開きます。
nano ~/project/prometheus.yml
ファイルのトップレベル(global ブロックの外)に rule_files ディレクティブを追加します。変更後のファイルは以下のようになります。
global:
scrape_interval: 15s
rule_files:
- "alert-rules.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "node_exporter"
static_configs:
- targets: ["node-exporter:9100"]
ファイルを保存して nano を終了します(Ctrl+X、Y、Enter)。
設定が更新されたので、変更を適用するために Prometheus コンテナを再起動する必要があります。まず、古いコンテナを停止して削除します。
docker stop prometheus
docker rm prometheus
最後に、新しい Prometheus コンテナを実行します。このコマンドはセットアップスクリプトのものと似ていますが、alert-rules.yml ファイルをコンテナ内にマウントするための2つ目の -v フラグが含まれています。
docker run -d --name prometheus -p 9090:9090 \
--network monitoring \
-v /home/labex/project/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /home/labex/project/alert-rules.yml:/etc/prometheus/alert-rules.yml \
prom/prometheus
このコマンドにより、メイン設定とアラートルールの両方が Prometheus コンテナ内で利用可能になります。
Prometheus UI でのアラートルール読み込み確認
このステップでは、Prometheus が新しいアラートルールを正常に読み込んだことを確認します。
ブラウザの Prometheus UI タブに戻ります(必要であれば、ポート 9090 で新しい Web Service タブを開いてください)。ページが読み込まれない場合は、新しいコンテナが起動するまで数秒待ってからページを更新してください。
上部ナビゲーションバーから Alerts メニュー項目をクリックします。
HighCpuLoad アラートが表示されているはずです。アラートは緑色の背景で Inactive セクションに表示されます。システム上の CPU 負荷は現在低いため、アラートの式(expr)が偽と評価され、期待通りの状態となっています。

アラートの3つの状態を理解しておくことが重要です。
- Inactive (緑): アラート条件が偽の状態。
- Pending (黄): アラート条件が真になったが、
forで指定した期間がまだ経過していない状態。Prometheus は条件が継続するかどうかを確認しています。 - Firing (赤): アラート条件が
for期間中ずっと真であった状態。本番環境では、このタイミングで Prometheus が Alertmanager にアラートを送信します。
現在のアラートは Inactive ですが、これで正常です。次のステップで、実際にアラートを発報させます。
負荷シミュレーションによるアラート発報のテスト
最後のステップでは、意図的にシステムに CPU 負荷をかけて、アラートが正しくトリガーされるかテストします。
単純な無限シェルループを使用して CPU 負荷を生成できます。ターミナルで以下のコマンドを実行してください。末尾の & はプロセスをバックグラウンドで実行するため、ターミナルを引き続き使用できます。
while true; do true; done &
このコマンドは、CPU コアを 1 つ 100% 消費するプロセスを開始します。すぐに Prometheus UI の Alerts ページに戻ってください。
HighCpuLoad アラートの状態が変化する様子が観察できます。
- 15〜30秒以内にアラートの式が真になります。アラートは Pending セクションに移動し、黄色に変わります。これは Prometheus が高負荷を検知しましたが、
for句で指定された1mの期間を待機していることを意味します。 - Pending 状態で1分間経過すると、アラートは Firing セクションに移動し、赤色に変わります。これでアラートルールが期待通りに動作していることが確認できました!アラートを展開すると、定義したアノテーションと現在の値を確認できます。

アラートの発報を確認したら、負荷生成を停止します。ターミナルに戻り、以下のコマンドを実行してバックグラウンドのループプロセスを終了させます。
重要: LabEx VM サーバーのリソースを節約するため、必ず以下のコマンドを実行して負荷生成を停止してください。
kill $!
負荷を停止した後、再び Prometheus UI を確認してください。アラートはすぐに Inactive(緑)状態に戻り、テストサイクルが完了します。
まとめ
おめでとうございます!Prometheus アラートの設定とテストに成功しました。
このラボでは、以下のことを学びました。
- アラートルールを別の YAML ファイルに構造化する方法。
- CPU 高負荷のアラート条件を定義する PromQL 式の記述方法。
- アノテーションを使用して、人間が理解しやすいアラートメッセージを作成する方法。
- Prometheus にルールファイルを読み込ませ、設定を反映させるために再起動する方法。
- Prometheus UI でアラートのライフサイクル(Inactive -> Pending -> Firing)を観察する方法。
- 条件をシミュレートしてアラートをトリガーし、テストする方法。
これはアラート機能の半分に過ぎません。次の論理的なステップは、このラボの範囲外となりますが、Alertmanager インスタンスをセットアップすることです。Prometheus は発報したアラートを Alertmanager に送信し、Alertmanager がそれらを重複排除、グループ化し、電子メール、Slack、PagerDuty などの実際の通知チャネルにルーティングする役割を担います。



