PrometheusでPHP-FPMを監視する方法

By 清水 孝郎 - JULY 21, 2022

SHARE:

本文の内容は、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分間隔にすることで、サービスで遅延上昇が起こっているかどうかを確認することができます。

おさらいをしましょう!

この記事では、PHP-FPMをサイドカーとしてインストールし、アプリケーションからメトリクスを収集する方法について学びました。また、これらのメトリクスを分析し、ダッシュボード用の便利なパネルを作成し、瞬きする間にすべての情報を取得し、プラットフォームが得る可能性のあるあらゆるエラーのトラブルシューティングを行う方法についても学びました。