Server

PrometheusとNode ExporterでLinuxサーバーの特定のプロセス数を監視する方法

はじめに

Linuxサーバーの運用では、Webサーバー(Apache)やアプリケーションサーバー(PHP-FPM)といった特定のプロセスの稼働状況を把握することが非常に重要です。
この記事では、PrometheusとNode Exporterが既に稼働している環境で、Node ExporterのTextfile Collector機能を利用し、カスタムスクリプトを使って特定のプロセス数をPrometheusで監視する手順を解説します。

1. 監視対象サーバーの準備 🛠️

カスタムスクリプトを実行し、Prometheus向けのメトリクスファイルを出力するために、いくつかの準備が必要です。

まず、Pythonスクリプトでプロセス情報を効率的に取得するために、psutil ライブラリをインストールします。
お使いのLinuxディストリビューションに応じて、以下のコマンドを実行してください。

# CentOS/RHEL の場合
sudo yum install python3-pip -y
pip3 install psutil

# Ubuntu/Debian の場合
sudo apt update
sudo apt install python3-pip -y
pip3 install psutil


次に、Node Exporterがカスタムメトリクスファイルを読み込むディレクトリを確認します。
これは通常 /var/lib/node_exporter/textfile_collector ですが、Node Exporterの起動オプション --collector.textfile.directory で設定されているパスに合わせてください。
例えば、Node Exporterのサービスファイルを確認するには、次のコマンドを実行します。

grep "collector.textfile.directory" /etc/systemd/system/node_exporter.service


このディレクトリが prometheus ユーザーに書き込み可能であることを確認しましょう。
以下のコマンドでディレクトリの権限を確認できます。

ls -ld /var/lib/node_exporter/textfile_collector


出力が drwxr-xr-x 2 prometheus prometheus ... のようであれば、所有者である prometheus ユーザーは書き込み可能です。

2. 特定のプロセス数を取得するカスタムスクリプトの作成 📜

Apache (httpd) と PHP-FPM (php-fpm) のプロセス数をカウントし、Prometheusが読み取れる形式でファイルに出力するPythonスクリプトを作成します。

以下の内容を /usr/local/bin/apache_phpfpm_collector.py として保存してください。

import psutil
import os
import sys

# Node Exporter の Textfile Collector ディレクトリ
# Node Exporter の起動オプション --collector.textfile.directory で指定したパスに合わせてください
# デフォルトは /var/lib/node_exporter/textfile_collector です
OUTPUT_DIR = "/var/lib/node_exporter/textfile_collector"
OUTPUT_FILE = os.path.join(OUTPUT_DIR, "web_process_counts.prom")

def get_process_count(process_name):
"""特定のプロセス名に一致するプロセス数をカウントする"""
count = 0
for proc in psutil.process_iter(['name']):
if proc.info['name'] == process_name:
count += 1
return count

def main():
try:
# 出力ディレクトリが存在しない場合は作成
os.makedirs(OUTPUT_DIR, exist_ok=True)

# Apache (httpd) のプロセス数を取得
apache_count = get_process_count("httpd")

# PHP-FPM のプロセス数を取得
phpfpm_count = get_process_count("php-fpm")

# Prometheus exposition format でファイルに書き出し
with open(OUTPUT_FILE, "w") as f:
f.write("# HELP custom_apache_process_count Total number of Apache (httpd) processes.\n")
f.write("# TYPE custom_apache_process_count gauge\n")
f.write(f"custom_apache_process_count {apache_count}\n")

f.write("# HELP custom_phpfpm_process_count Total number of PHP-FPM processes.\n")
f.write("# TYPE custom_phpfpm_process_count gauge\n")
f.write(f"custom_phpfpm_process_count {phpfpm_count}\n")

print(f"Successfully exported Apache: {apache_count}, PHP-FPM: {phpfpm_count} to {OUTPUT_FILE}")

except Exception as e:
sys.stderr.write(f"Error: {e}\n")
sys.exit(1)

if __name__ == "__main__":
main()


スクリプトを保存したら、実行権限を付与します。

sudo chmod +x /usr/local/bin/apache_phpfpm_collector.py


3. スクリプトの定期実行設定(Cronジョブ)⏰

スクリプトを定期的に実行し、常に最新のプロセス数をファイルに書き出すために、prometheus ユーザーのCronジョブを設定します。

prometheus ユーザーのcrontabを編集し、スクリプトを1分ごとに実行するように設定します。

sudo -u prometheus crontab -e


開いたファイルに以下の行を追加して保存します。

* * * * * /usr/bin/python3 /usr/local/bin/apache_phpfpm_collector.py


この設定により、スクリプトは毎分 prometheus ユーザーの権限で実行されます。
Pythonインタープリタのフルパス(/usr/bin/python3)を明示的に指定することで、Cron環境のPATH設定に依存しない安定した実行を保証します。
お使いの環境でPython3のパスが異なる場合は、which python3 コマンドで正しいパスを確認し、適宜修正してください。

4. メトリクスの最終確認 📊

スクリプトとCronジョブの設定が完了したら、メトリクスが正しく公開されているかを確認します。

スクリプトが自動で実行されるのを待つか、手動で次のコマンドを実行して、エラーが出ないことを確認します。

sudo -u prometheus /usr/bin/python3 /usr/local/bin/apache_phpfpm_collector.py


その後、/var/lib/node_exporter/textfile_collector/web_process_counts.prom ファイルが作成され、内容が更新されていることを確認してください。

ls -l /var/lib/node_exporter/textfile_collector/web_process_counts.prom
cat /var/lib/node_exporter/textfile_collector/web_process_counts.prom


ファイルの所有者が prometheus になっていることも確認できます。

最後に、Node Exporterの/metricsエンドポイントでカスタムメトリクスが表示されるか確認します。監視対象サーバーで次のコマンドを実行してください。

curl http://localhost:9100/metrics | grep custom_


以下のような出力があれば成功です。

# HELP custom_apache_process_count Total number of Apache (httpd) processes.
# TYPE custom_apache_process_count gauge
custom_apache_process_count 8
# HELP custom_phpfpm_process_count Total number of PHP-FPM processes.
# TYPE custom_phpfpm_process_count gauge
custom_phpfpm_process_count 5


PrometheusのUIでこれらのメトリクスが取得されていることを確認し、Grafanaなどでダッシュボードを作成して可視化することで、ApacheとPHP-FPMのプロセス数を詳細に監視できるようになります。

まとめ

Node ExporterのTextfile Collector機能と簡単なPythonスクリプトを組み合わせることで、デフォルトのメトリクスでは取得できない特定のアプリケーションの稼働情報をPrometheusで効果的に監視できます。
この柔軟なアプローチは、より詳細なシステム監視を実現し、問題発生時の早期発見に役立つでしょう。

-Server
-, ,