可観測性のラボ:Prometheus と Grafana、アラートルールを書く

このラボは、各生徒に、監視する小さな Web サーバーと、それを監視する道具を渡します。サーバーのステータスページをメトリクスに変えるエクスポーター、5秒ごとにそれを集める Prometheus、そしてサインイン済みで Prometheus にも接続済みの Grafana です。生徒は PromQL で問い合わせ、パネルを描き、アラートルールを書き、わざとサーバーを止めて、アラートが「pending」から「firing」になるのを見ます。

4つの公開イメージだけを使って私たちが設計したので、攻撃する脆弱なものはなく、監視する仕組みがあるだけです。攻撃のラボではありません。ラボのコピーにはインターネットへの経路も、ほかの生徒への経路もありません。

生徒が学ぶこと

監視の目的と、その部品のつながりです。数値を公開するプログラム、公開しないソフトのためのエクスポーター、それを一定の間隔で集めて保存するコレクター、そして描くダッシュボード。nginx_up や1分あたりのリクエスト数のような問い合わせを、Prometheus のページと API への curl の両方で PromQL で行い、同じクエリから Grafana のパネルを作ります。ラボの中心はアラートルールです。ルールファイルに書き、Prometheus を再読み込みして、非アクティブとして一覧に出るのを確かめ、サーバーを止めて、アラートが「pending」から「firing」になり、サーバーを戻すと消えるのを見ます。DevOps、運用、クラウド、システムの単元に向いています。正確な文言は、お使いの認定団体の単元でご確認ください。

ブラウザーで動かす

Web サーバーは app というサービス、そのエクスポーターは exporter で、ラボのターミナルからPrometheus は prometheus、Grafana は grafana という名前で届きます。ターミナルの docker コマンドは、ラボのサービスを見る、中に入る、停止する、起動する、再起動する、ログを読む、ことができ、作成、取得、削除はできません。Prometheus の設定とルール、生徒の Grafana のダッシュボードは名前付きボリュームにあるので、ラボを止めてもう一度起動しても残ります。測定値は保存されないので、再起動したラボはグラフが空の状態から始まります。

  1. コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
  2. ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。Observability: Prometheus and Grafanaを探します。
  3. 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
  4. 開く. ラボのページのラボバーには、Prometheus と Grafana の2つのリンクがあり、Grafana はサインイン済みで Prometheus に接続済みです。Prometheus で nginx_up を実行します。ラボの横のターミナルでは、curl http://prometheus:9090/api/v1/query?query=nginx_up が同じ問いをします。ルールを書くには docker exec -it prometheus sh を実行し、/etc/prometheus/rules に .yml で終わるファイルを作り、curl -X POST http://prometheus:9090/-/reload で再読み込みして、docker stop app を実行し、Alerts のページを見ます。docker start app でサーバーが戻ります。

何を提出させるか

ルールそのもの、Prometheus の Alerts ページで発火している画面のスクリーンショット、同じシグナルを示す Grafana のパネルです。理解を確かめるには、ルールが何を問うているか、なぜ発火まで10秒待つのか、当番の人がそれを見たら何をするかを、1〜2文で書かせます。さらに力をつけるには、リクエスト数のような別のシグナルで2つ目のルールを求めます。

自動採点はされません。ラボの限界は口に出して伝える価値があります。アラートは見られますが、誰にも通知されません。届く先のメールもチャットもないからです。

このラボの基本レッスン

Observability Basics は、このラボで進める小さなレッスンで、各手順に説明と、生徒のターミナルにコマンドを入力する「実行」ボタンが付いています。Prometheus に1つ問い合わせ、ターミナルからアラートルールを1つ書き、Web サーバーを止めてアラートが「pending」から「firing」になるのを見て、サーバーをもう一度起動します。パネルを描くのは生徒に任せます。

無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるためのもので、残りはラボが担います。変更したい場合は、自分のモジュールにコピーしてください。

GitHub のコード

compose ファイルは4つの公開イメージを、それぞれバージョンに固定し、手を加えずに実行します。nginx(BSD-2-Clause)、NGINX Prometheus エクスポーターと Prometheus(どちらも Apache-2.0)、Grafana(AGPL-3.0)です。どれも私たちは配布していません。それぞれの設定は各自のエントリーポイントが書き、Prometheus の設定は最初の起動でだけ書かれるので、生徒が変えた内容は元に戻りません。リポジトリのテストは、発火するルールと停止・起動を含めて、生徒としてラボを通し、プラットフォームと同じ制限の下で行います。ラボにはインターネットへの出口がないので、Grafana のプラグインカタログと更新の確認は無効にしてあります。

課題として出す

課題には、どんなルールを書くか、何を提出するかを書いてください。

  1. ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-observability とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
  2. 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
  3. 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
  4. 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。

よくある質問

アラートでメールやメッセージを送れますか?
いいえ。ラボにはインターネットへの出口もメールの仕組みもないので、アラートは Alerts ページと API で見られますが、どこにも送られません。授業で伝える価値があります。ルールは生徒が書く部分で、送り先は別の部品である Alertmanager が担い、このラボには含まれません。
生徒が Prometheus の設定を壊したらどうなりますか?
ファイルは最初の起動で1度だけ書かれ、その後は生徒のものなので、再起動しても元には戻りません。ルールファイルの間違いなどで再読み込みが失敗すると、再読み込みのコマンドが理由を表示し、Prometheus は以前のルールを保ちます。元から始めたいときは、/etc/prometheus の .lab-seeded ファイルを削除してサービスを再起動するか、新しいコピーを始めてください。
オブザーバビリティのラボは、アラートルールを自動で採点しますか?
いいえ。自動では何も採点されないので、生徒にはルール、Prometheus の Alerts ページで発火している画面のスクリーンショット、同じ信号を示す Grafana のパネルを提出してもらってください。ルールが発火まで10秒待つ理由を1文で書かせると、理解しているかどうかが分かります。