本文の内容は、2022年7月21日にJesus Ángel Samitierが投稿したブログ(https://sysdig.com/blog/monitor-php/)を元に日本語に翻訳・再構成した内容となっております。
PHP はインターネット上で最も人気のあるオープンソースプログラミング言語の一つで、 Magento、WordPress、Drupal などの Web 開発プラットフォームで使用されています。すべてのPHPのベースに加えて、PHP-FPMはPHP FastCGIの最も人気のある代替実装です。これは、高トラフィックウェブサイトのために本当に便利な追加機能を備えています。
この記事では、Prometheusを使用してPHP-FPMを監視する方法を学びます。Prometheus のクエリーを作成して、サーバーの状態、子プロセスの状態、平均的なリクエスト処理、リクエストごとの CPU とメモリの使用量などを監視します。また、将来直面する可能性のあるすべての状況のトラブルシューティングを行います。
最初のステップ
Prometheusを使ったPHP-FPMモニタリングツールに必要なコンポーネントは以下の通りです。- Kubernetes クラスター。すでに動作していることでしょう。
- そのクラスターにデプロイされた PHP-FPM サービス。
- Kubernetes のモニタリングのデファクトスタンダードである Prometheus。
- サイドカーとして動作する PHP-FPM exporter。
PHP-FPM exporter のインストール方法
PrometheusでPHP-FPMを監視するには、サイドカーとしてexporterをインストールする必要があり、exporterのエンドポイントからPHP-FPMのメトリクスをスクレイピングします。ここでは、exporter を PHP-FPM サービスと一緒にデプロイするためのdeployment.yaml
の例を示しています。このふたつのオプションを見てみましょう。
- exporter の Listen エンドポイント
- exporterのエンドポイントパス
これらのオプションは、PHP-FPM アプリケーションで exporter の設定と一致するように適切に設定しなければなりません。
apiVersion: v1 kind: ConfigMap metadata: labels: app: php-fpm name: php-fpm-config namespace: php-fpm data: www.conf: | [www] listen=127.0.0.1:9000 pm.status_path=/status
最後に、PrometheusにPHP-FPMエクスポーターをスクレイピングさせるために、環境変数を確認する必要があります。
PHP_FPM_WEB_LISTEN_ADDRESS
PHP_FPM_WEB_TELEMETRY_PATH
PHP_FPM_SCRAPE_URI
最初の2つの変数で、インストールが完了したときにエクスポーターからすべてのメトリクスを取得したいポートおよびパスを設定することができます。3番目の変数は、PHP-FPMの設定ファイルで設定したものと同じエンドポイントになります。
これらのパラメータを設定すると、PHP-FPM エクスポーターがデプロイされ、有用なメトリクスをすべて提供できるようになります。試してみたいですか? やってみましょう!
Prometheus で PHP-FPM を監視するための主要メトリクス
まず、エクスポーターを適切に設定することを確認しましょう。Prometheusのコンソールでphpfpm_up
と入力してください。非常にシンプルなメトリクスですが、問題が発生したときにアラートを出すには非常に重要なメトリクスです。sum(phpfpm_up)
この方法では、エクスポーターが正しく接続できるすべてのPHP-FPMアプリケーションを数えることができます。この場合、3つのレプリカがアップしているシナリオです。
次に、さらに一歩進んで、トラフィックや サチュレーション のような他のゴールデンメトリックスをチェックすることができます。
PrometheusでPHP-FPMのトラフィックを監視する方法
すべてのアプリケーションのトラフィックをリアルタイムで確認できるダッシュボードを作成してみましょう。以下のメトリクスを使用して、各プロセスの子プロセスごとの現在のリクエストトラフィックを表示することができます。この方法で、アプリケーションの負荷のアンバランスを見ることができます。sum by (child) (rate(phpfpm_process_requests [1h]))
このケースでは、リクエストのノーマライザーとして1時間間隔を使いました。インターバルの値は環境ごとに変化します。負荷が高い環境では、短時間で変化を確認できるように、より小さなインターバルが必要になります。負荷が低い環境では、長いインターバルで完璧に動作し、リクエスト量のスパイクを簡単に見ることができます。
このメトリクスで、すべてのアプリケーションの子プロセスで消費されるトラフィックを見ることができます。
PrometheusでPHP-FPMのサチュレーションを監視する方法
サチュレーションを測定するには、以下の2つのメトリクスを使用します。phpfpm_listen_queue
phpfpm_listen_queue_length
最初のものは、アプリケーションのキュー内のプロセスの実際の状態についての情報を提供し、 2番目のものはそのキューの実際のリミットを提供します。これらを組み合わせると、アプリケーションのボトルネックになりそうな箇所を簡単に回避することができます。このようにして、アプリケーションのサチュレーションに気づくことができるのです。
PrometheusでPHP-FPMのレイテンシーを監視する方法
レイテンシーメトリクスは、サービスのボトルネックに起因するリクエストの遅さを表します。そのため、リクエストの時間経過を追跡し、ある特定の値に達したときにアラートを発します。以下のメトリクスをアコモデーションで使用し、有用な情報を取得することができます。sum (rate (phpfpm_slow_requests[5m])
phpfpm_slow_requests
メトリクスは、あらかじめ定義されたタイムアウト値に到達したリクエストの数を数えます。そのため、5分間隔にすることで、サービスで遅延上昇が起こっているかどうかを確認することができます。