こんにちは。よっしーです(^^)
今日は、dockerで構築した開発環境において、php-fom-exporterを導入した手順をご紹介します。
実行環境
この記事は、特定の開発環境を前提として書かれています。もし興味がある場合は、その開発環境を構築するための説明が書かれている記事を参考にしてください。該当記事は下記になります。
ただ、この記事で紹介している修正内容がたくさんあるので、その修正を反映した最新版のプログラムをダウンロードして、参照することをおすすめします。該当のプログラムの詳細については、下記のページで確認できます。
背景
Dockerで構築したphp-fpmにprometheusのphp-fpm-explorerを導入することで、PHP-FPMプールの状態を監視し、メトリクスを収集できます。これにより、アプリケーションのパフォーマンスを可視化し、問題が発生した場合に早期に対処することができます。また、php-fpm-explorerによって、PHP-FPMプールのリソース使用状況や負荷に関する詳細な情報を取得することができます。
ディレクトリ構造
ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。
.
├── LICENSE
├── Makefile
├── README.md
└── app
├── apache-exporter
├── compose.yml
├── flyway
├── grafana
│ ├── dashboard.yml
│ └── dashboards
│ └── php-fpm.json
├── influxdb
├── k6
├── memcached
├── memcached-exporter
├── php-fpm
│ └── www.conf
├── php-fpm-exporter
│ └── Dockerfile
├── mongo
├── mysql
├── mysqld-exporter
├── prometheus
│ └── prometheus.yml
├── schemaspy
├── web
└── xhgui
compose.yml
下記の赤字内容でファイル(compose.yml) 76 行目に追加します。
php-fpm:
build: ./php-fpm
container_name: php-fpm
volumes:
- ./php-fpm/CodeIgniter-3.1.13/application:/var/www/application
- ./php-fpm/CodeIgniter-3.1.13/system:/var/www/system
- ./php-fpm/index.php:/var/www/html/index.php
- ./php-fpm/info.php:/var/www/html/info.php
- ./php-fpm/xdebug.ini:/etc/opt/remi/php74/php.d/xdebug.ini
- ./php-fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf
networks:
- net
下記の内容をファイル(compose.yml) 213-224 行目に追加します。
php-fpm-exporter:
build: ./php-fpm-exporter
container_name: php-fpm-exporter
restart: unless-stopped
environment:
PHP_FPM_SCRAPE_URI: "tcp://php-fpm:9000/status"
PHP_FPM_LOG_LEVEL: "debug"
ports:
- 9253:9253
networks:
- net
php-fpm/www.conf
下記の手順で新規ファイル(php-fpm/www.conf) を作成します。
make setup
cd app
docker compose cp php-fpm:/usr/local/etc/php-fpm.d/www.conf ./php-fpm/www.conf
下記の赤字内容でファイル(php-fpm/www.conf) 239行目を更新します。
pm.status_path = /status
php-fpm-exporter/Dockerfile
下記の内容でファイル(web/Dockerfile) を更新します。
FROM hipages/php-fpm_exporter:latest
prometheus/prometheus.yml
下記の赤字内容でファイル(prometheus/prometheus.yml) を更新します。
global:
scrape_interval: 5s
scrape_configs:
- job_name: 'docker-for-mac'
static_configs:
- targets: ['docker.for.mac.host.internal:9323']
- job_name: 'apache'
static_configs:
- targets: ['apache-exporter:9117']
- job_name: 'php-fpm'
static_configs:
- targets: ['php-fpm-exporter:9253']
- job_name: 'memcached'
static_configs:
- targets: ['memcached-exporter:9150']
- job_name: 'mysql'
static_configs:
- targets: ['mysqld-exporter:9104']
grafana/dashboard.yml
下記の赤字内容をファイル(grafana/dashboard.yml) 26-36行目に追記します。
- name: 'php-fpm'
orgId: 1
folder: 'Service'
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: false
options:
path: /var/lib/grafana/dashboards/php-fpm.json
foldersFromFilesStructure: false
grafana/dashboards/php-fpm.json
jsonファイルは行数が多いので、ここでの掲載は割愛します。
作成方法は、grafanaのdashboardで4912をインポートして、JSON出力したものになります。詳細は、GitHUBのコードをご参照ください。
動作確認
下記のコマンドを実行して、サービスを起動します。
make setup
ブラウザで「http://localhost:3000/dashboards」にアクセスして、php-fpmのダッシュボードが表示されていて、ダッシュボードを開いたときに、メトリクス情報が取得できていれば、成功です。
解説
php-fpm-exporterについて
php-fpm-exporterは、PHP-FPMのメトリクスをPrometheus形式で公開するためのツールです。以下は、php-fpm-exporterが収集できる主な情報です。
- プロセス数(現在の起動中のプロセス数、空きプロセス数、使用中のプロセス数)
- リクエスト数(ステータス別のリクエスト数、処理時間別のリクエスト数)
- メモリ使用量(メモリ使用量、最大メモリ使用量、オーバーフロー数)
- コネクション数(アクティブなコネクション数、最大同時接続数、接続数の合計)
- ワーカープールの状態(ワーカープールサイズ、最小ワーカープールサイズ、最大ワーカープールサイズ)
また、php-fpm-exporterは、PHP-FPMのポート番号やソケットファイルのパスなど、PHP-FPMへの接続情報も収集できます。これらの情報を用いることで、PHP-FPMの状態をリアルタイムにモニタリングすることが可能になります。
おわりに
今日は、dockerで構築した開発環境にphp-fpm-exporterを導入し、grafanaでメトリクス情報を可視化しました。ぜひ、性能改善等に使用してみてください。
今回使用したファイルは下記のGitHubにタグ付けしています。
もし、質問等あればコメントください。確認後、ご連絡いたします。随時、エンジニア案件も相談可能ですので、よろしくお願いいたします。
また明日お会いしましょう!
コメント