Prometheus アラート

DockerBeginner
オンラインで実践に進む

はじめに

効果的なモニタリングとは、単にメトリクスを収集するだけでなく、問題が発生した際に通知を受け取れるようにすることです。Prometheus には強力な組み込みアラートシステムがあり、グラフ作成に使用するのと同じ PromQL クエリ言語を使ってアラート条件を定義できます。アラートの条件が満たされると、そのアラートは「Firing(発報)」状態になります。

このラボでは、Prometheus アラートの基礎を学びます。あらかじめ Prometheus と Node Exporter が実行されている環境からスタートし、独自のアラートルールファイルを作成して CPU 高負荷を検知するルールを定義します。さらに、Prometheus にそのファイルを読み込ませ、実際に CPU 負荷をかけて Prometheus UI 上でアラートがトリガーされる様子を確認します。

アラート環境の確認

このステップでは、ラボ環境を確認します。セットアップスクリプトによって、Prometheus と Node Exporter の2つの Docker コンテナがすでに起動しています。

まず、両方のコンテナが実行されていることを確認しましょう。ターミナルを開き、docker ps コマンドを実行します。

docker ps

以下のような出力が表示され、prometheusnode-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 を確認します。アクセス手順は以下の通りです。

  1. LabEx インターフェースの上部ナビゲーションバーにある +(新しいタブ)ボタンをクリックします。
  2. ドロップダウンメニューから Web Service を選択します。
  3. ポート番号に 9090 を入力します。
  4. Open をクリックして Prometheus Web インターフェースを起動します。

新しいタブが開くと、Prometheus Expression Browser のトップページが表示されます。上部ナビゲーションメニューから Status -> Targets に移動してください。node_exporter ジョブが緑色の「UP」状態になっていれば、Prometheus が正常にデータを収集できています。この接続がアラートルールの基盤となります。

Prometheus Targets UI

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: アラートに人間が読みやすい情報を追加します。summarydescription は標準的なアノテーションです。{{ $labels.instance }}{{ $value }} のようなテンプレート変数を使用して、アラートメッセージに動的なデータを含めることができます。

貼り付けが終わったら、Ctrl+XYEnter の順に押してファイルを保存し、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+XYEnter)。

設定が更新されたので、変更を適用するために 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)が偽と評価され、期待通りの状態となっています。

Prometheus Inactive Alert

アラートの3つの状態を理解しておくことが重要です。

  • Inactive (緑): アラート条件が偽の状態。
  • Pending (黄): アラート条件が真になったが、for で指定した期間がまだ経過していない状態。Prometheus は条件が継続するかどうかを確認しています。
  • Firing (赤): アラート条件が for 期間中ずっと真であった状態。本番環境では、このタイミングで Prometheus が Alertmanager にアラートを送信します。

現在のアラートは Inactive ですが、これで正常です。次のステップで、実際にアラートを発報させます。

負荷シミュレーションによるアラート発報のテスト

最後のステップでは、意図的にシステムに CPU 負荷をかけて、アラートが正しくトリガーされるかテストします。

単純な無限シェルループを使用して CPU 負荷を生成できます。ターミナルで以下のコマンドを実行してください。末尾の & はプロセスをバックグラウンドで実行するため、ターミナルを引き続き使用できます。

while true; do true; done &

このコマンドは、CPU コアを 1 つ 100% 消費するプロセスを開始します。すぐに Prometheus UI の Alerts ページに戻ってください。

HighCpuLoad アラートの状態が変化する様子が観察できます。

  1. 15〜30秒以内にアラートの式が真になります。アラートは Pending セクションに移動し、黄色に変わります。これは Prometheus が高負荷を検知しましたが、for 句で指定された 1m の期間を待機していることを意味します。
  2. Pending 状態で1分間経過すると、アラートは Firing セクションに移動し、赤色に変わります。これでアラートルールが期待通りに動作していることが確認できました!アラートを展開すると、定義したアノテーションと現在の値を確認できます。

Prometheus Firing Alert

アラートの発報を確認したら、負荷生成を停止します。ターミナルに戻り、以下のコマンドを実行してバックグラウンドのループプロセスを終了させます。

重要: LabEx VM サーバーのリソースを節約するため、必ず以下のコマンドを実行して負荷生成を停止してください。

kill $!

負荷を停止した後、再び Prometheus UI を確認してください。アラートはすぐに Inactive(緑)状態に戻り、テストサイクルが完了します。

まとめ

おめでとうございます!Prometheus アラートの設定とテストに成功しました。

このラボでは、以下のことを学びました。

  • アラートルールを別の YAML ファイルに構造化する方法。
  • CPU 高負荷のアラート条件を定義する PromQL 式の記述方法。
  • アノテーションを使用して、人間が理解しやすいアラートメッセージを作成する方法。
  • Prometheus にルールファイルを読み込ませ、設定を反映させるために再起動する方法。
  • Prometheus UI でアラートのライフサイクル(Inactive -> Pending -> Firing)を観察する方法。
  • 条件をシミュレートしてアラートをトリガーし、テストする方法。

これはアラート機能の半分に過ぎません。次の論理的なステップは、このラボの範囲外となりますが、Alertmanager インスタンスをセットアップすることです。Prometheus は発報したアラートを Alertmanager に送信し、Alertmanager がそれらを重複排除、グループ化し、電子メール、Slack、PagerDuty などの実際の通知チャネルにルーティングする役割を担います。