監視

ロードバランサーや Kubernetes 向けのヘルスプローブ、Prometheus メトリクス、ステータスページ

  1. ヘルスプローブ
  2. Prometheus メトリクス
  3. ステータスページ
    1. チェック
    2. 情報

ヘルスプローブ

二つのエンドポイントが、ロードバランサー、コンテナーのヘルスチェック、Kubernetes に、プロセスがトラフィックを受け付けられるかどうかを伝えます。 どちらもログインは不要で、構成に関する情報は何も返しません。

エンドポイント 応答 用途
/api/v2/live プロセスが動作している限り {"status":"live"} とともに 200 Liveness プローブ。応答しなくなったらプロセスを再起動します
/api/v2/ready {"status":"ready"} とともに 200 、または {"status":"not ready","reason":"..."} とともに 503 Readiness プローブ。準備ができたプロセスにだけトラフィックを送ります

次のすべてが成り立つとき、プロセスは準備ができています。

  • シャットダウン中でない( stopping )
  • データベースが応答する( database unreachable )
  • スキーマが存在し( schema not provisioned )、このバージョンのすべてのテーブル、列、インデックスがそろっている ( schema not upgraded )。この最後のチェックは 30 秒間キャッシュされるので、数秒ごとのプローブでも負荷はわずかです

BASE_URL の下では、パスはその値で始まります。たとえば /ansibleforms/api/v2/ready です。ランタイム環境(RTE)は同じプローブに /live と /ready で応答しますが、 スキーマがそろっているかのチェックはありません。シャットダウン時にジョブを処理し終えるまでの間は準備ができていない状態になるので、新しいジョブは送られません。アウトバウンドの RTE も、アプリへのソケットが開くまでは準備ができていません( not connected to the app )。 AF_ROLE=worker で起動したプロセスには Web インターフェースがなく、コンテナーのヘルスチェック用に /api/v2/version と /health にだけ応答します。 ロールについては スケーリング を参照してください。


Prometheus メトリクス

Prometheus メトリクスを提供するには、 METRICS_TOKEN に長いランダムな文字列を設定します。 Web アプリケーションを提供するプロセスは /api/v2/metrics で、RTE は /metrics で応答します。

scrape_configs:
  - job_name: ansibleforms
    metrics_path: /api/v2/metrics
    authorization:
      type: Bearer
      credentials: <METRICS_TOKEN>
    static_configs:
      - targets: ['forms01.example.com:8000']

METRICS_TOKEN がない場合、エンドポイントは存在しないかのように 404 を返し、正しい Authorization: Bearer <token> ヘッダーのないリクエストには 401 が返ります。各プロセスは自分の値を報告するので、それぞれをスクレイプしてください。

メトリクス 測定するもの
af_process_* 、 af_nodejs_* プロセス。CPU、メモリ、イベントループの遅延、ガベージコレクション
af_http_requests_total{route,method,status} 処理したリクエスト
af_http_request_duration_seconds{route} それらにかかった時間
af_jobs{status} 現在実行中( running )または承認待ち( approve )のジョブ
af_jobs_ended_24h{status} 過去 24 時間に終了したジョブ。ステータス別
af_nodes{role,alive} データベースに登録されたプロセス。ロール別、稼働中かどうか
af_login_failures_total 、 af_login_lockouts_total 失敗したサインインとアカウントのロックアウト
af_rte_running_jobs 、 af_rte_max_jobs RTE の場合:現在実行中のプレイブックと、同時に実行できる数
af_rte_socket_connected ソケットモードの RTE の場合:アプリへのソケットが開いている間は 1 、開いていないときは 0

ジョブとノードの値は、スクレイプのたびにデータベースから読み込まれます。データベースが応答しない場合はそれらが省かれ、 ほかのメトリクスでスクレイプは成功します。


ステータスページ

設定 > システム の ステータス ページは、ロールオプション showSettings を持つユーザーにインスタンスの状態を表示します。 読み取るだけなので、更新してもメールが送られたりジョブが起動されたりすることはありません。タブは二つあり、問題の数が チェック タブのラベルに表示されます。

チェック

各チェックは緑(正常)、黄(要確認)、赤(問題あり)のいずれかで、行を展開すると詳細が表示されます。

チェック 確認するもの
データベース接続 データベースが応答するか
データベースユーザー ユーザーが AnsibleForms.* だけでなく、 root のようにすべてのデータベースに対する権限を持っていると黄
データベーススキーマ このバージョンのすべてのテーブル、列、インデックスが存在するか。存在しない場合はどのパッチが失敗したか
スケジューラー ワーカーがシステムタスクを実行しており、どれもスケジュールが止まっていないか
ノード データベース上のプロセス。異なるバージョンが動作していると黄
ジョブ 実行中のジョブと承認待ちのジョブ。24 時間を超えて実行されているジョブがあると黄
バックアップツール MYSQLDUMP_COMMAND のダンプコマンドが存在するか、そのバージョン
最終バックアップ バックアップがないか最新のものが 2 日より古いと黄、使用可能なダンプがないと赤
デザイナーのロック デザイナーのロックを持っている人。8 時間を超えて保持されていると黄
リポジトリ リポジトリが失敗しているか、ディスク上に作業ツリーがないと赤
Config seed 構成シード ファイルが読み取れて解析でき、最後の再読み込みが成功したか
シークレットストア すべてのシークレットストアが応答するか。HashiCorp Vault のトークンがまもなく期限切れになると黄
ランナー すべてのランナーが応答するか。ランナーがないか既定の RTE がないと黄
サーバー式 EXPRESSION_SANITIZER が legacy だと黄
シークレット ENCRYPTION_SECRET が公開されている既定値であるか、 ACCESS_TOKEN_SECRET が設定されていないと黄
LDAP サインインせずに、LDAP サーバーに到達でき、その TLS 証明書が有効か
ジョブストレージ ジョブのテーブルのサイズ。ジョブの保持期間が設定されておらず 1 GB を超えると黄
書き込み可能なフォルダー 設定されたすべてのフォルダーに書き込めるか
ディスク容量 バックアップを保持するディスク。使用率 85% から黄、95% から赤

情報

判定のない、インスタンスに関する事実です。サポートとのやり取りで最初に求められるものです。AnsibleForms の バージョン、ベース URL、データベースのバージョンとホスト、設定のソース、構成シード、保持期間の 設定、認証方法、有効な メールチャネル のサーバー、ログの レベルとパス、稼働時間、タイムゾーン、Node.js のバージョン、プラットフォーム。

ページは /api/v2/health を読み込みます。これには showSettings を持つサインイン済みのユーザーが必要です。監視システムには、 代わりに上のプローブとメトリクスを使ってください。