「Prometheus Client Library」のコラム

Prometheus Client Libraryで始めるメトリクス収集入門:Pythonでシステムを可視化しよう

皆さんは、自分の書いたPythonプログラムがどのように動いているか、詳しく把握したいと思ったことはありませんか?どれくらいの頻度で特定の関数が呼ばれているか、処理に時間がかかりすぎている箇所はないか、メモリの使用量は適切か…。これらの情報を知ることは、プログラムの改善やトラブルシューティングに不可欠です。

そこで役立つのが、メトリクスという考え方です。メトリクスとは、システムの状態を数値で表したもので、例えば「リクエスト数」「処理時間」「CPU使用率」などが挙げられます。これらのメトリクスを収集し、可視化することで、システムの健康状態をリアルタイムで把握し、問題発生を未然に防ぐことができます。

そして、Pythonでメトリクスを収集する上で非常に便利なのが、Prometheus Client Libraryです。Prometheusは、メトリクスを収集・蓄積・可視化するためのオープンソースの監視ツールであり、このライブラリを使うことで、Pythonプログラムから簡単にPrometheus形式のメトリクスを公開できます。

Prometheus Client Libraryの基本

まず、ライブラリをインストールしましょう。

pip install prometheus_client

インストールが終わったら、基本的な使い方を見ていきましょう。

1. メトリクスの定義

prometheus_clientには、様々な種類のメトリクスが用意されています。代表的なものをいくつか紹介します。

  • Counter: 単純なカウントアップに使われます。例えば、リクエスト数を数えるのに最適です。
  • Gauge: 現在の値を示します。CPU使用率やメモリ使用量など、時間とともに変化する値に適しています。
  • Histogram: 値の分布を記録します。処理時間を記録し、平均値だけでなく、中央値や95パーセンタイル値などを知りたい場合に便利です。
  • Summary: Histogramと似ていますが、クライアント側でパーセンタイル値を計算するため、リソース消費を抑えられます。

これらのメトリクスは、prometheus_client.Counter(), prometheus_client.Gauge(), prometheus_client.Histogram(), prometheus_client.Summary()のようにして定義します。それぞれのコンストラクタには、メトリクスの名前と説明を渡します。

from prometheus_client import Counter, Gauge, Histogram

# リクエスト数をカウントするCounter
REQUESTS = Counter('my_app_requests_total', 'Total number of requests.')

# CPU使用率を測定するGauge
CPU_USAGE = Gauge('my_app_cpu_usage_percent', 'CPU usage percentage.')

# 処理時間を記録するHistogram
PROCESSING_TIME = Histogram('my_app_processing_time_seconds', 'Processing time in seconds.')

2. メトリクスの更新

定義したメトリクスは、それぞれに対応するメソッドを使って更新します。

  • Counter: inc()で値を1つ増やします。
  • Gauge: set()で値を設定します。inc()dec()で増減も可能です。
  • Histogram: observe()で値を記録します。
  • Summary: observe()で値を記録します。
import time

# リクエストを受け取るたびにカウントを増やす
REQUESTS.inc()

# CPU使用率を更新する
CPU_USAGE.set(50.5)

# 処理時間を記録する
start_time = time.time()
# ここに処理を記述
time.sleep(1) # 例として1秒待機
end_time = time.time()
PROCESSING_TIME.observe(end_time - start_time)

3. メトリクスの公開

Prometheusは、HTTPエンドポイントを通じてメトリクスを収集します。prometheus_clientは、start_http_server()関数を提供しており、これを使うことで簡単にHTTPサーバーを立ち上げ、メトリクスを公開できます。

from prometheus_client import start_http_server

# HTTPサーバーをポート8000で起動
start_http_server(8000)

# アプリケーションのメインループ
while True:
    # 何らかの処理
    pass

この状態で、ブラウザでhttp://localhost:8000にアクセスすると、Prometheus形式のメトリクスを確認できます。

実践例:簡単なWebアプリケーション

以下は、Flaskを使った簡単なWebアプリケーションでPrometheus Client Libraryを使う例です。

from flask import Flask
from prometheus_client import Counter, Histogram, start_http_server
import random
import time

app = Flask(__name__)

# メトリクスの定義
REQUEST_COUNT = Counter('app_request_count', 'Total number of requests.')
REQUEST_LATENCY = Histogram('app_request_latency_seconds', 'Request latency.')

@app.route('/')
def hello():
    start = time.time()
    REQUEST_COUNT.inc()
    # ランダムな時間処理をシミュレート
    time.sleep(random.random())
    end = time.time()
    REQUEST_LATENCY.observe(end - start)
    return 'Hello, World!'

if __name__ == '__main__':
    # Prometheusメトリクスを公開するHTTPサーバーを起動
    start_http_server(8000)
    # Flaskアプリケーションを起動
    app.run(debug=True, host='0.0.0.0')

この例では、リクエスト数と処理時間をメトリクスとして収集し、Prometheusで可視化できます。

まとめ

Prometheus Client Libraryを使うことで、Pythonプログラムの内部状態を簡単に可視化し、より深く理解することができます。今回紹介した基本的な使い方をマスターすれば、より複雑なシステムでも効果的な監視体制を構築できるでしょう。ぜひ、あなたのプロジェクトにもPrometheus Client Libraryを導入し、システムの健康状態を常に把握できるようにしましょう。








自己紹介

フリーランスエンジニア/Python講師をしているmei_13です。
Pythonのレッスンを受けたいという方、お待ちしています!
https://coconala.com/services/3190048
Xアカウントはこちら


レッスン概要

◯月額4,000円で質問し放題!!
◯完全オンライン
◯翌日までには必ず返信
◯挫折しない独自の学習メソッド
◯圧倒的高評価!!
◯テキストベースで時間を選ばない
◯高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!




< Terraform
ELK Stack >







コラム一覧

if文
for文
関数
配列
文字列
正規表現
ファイル入出力
openpyxl
Numpy
Matplotlib
Pandas
scikit-learn
seaborn
beautifulsoup
tkinter
OpenCV
pygame
メイン関数
自作ライブラリ
画像処理
機械学習
スクレイピング
データ分析
グラフ作成
API
可読性
デバッグ
例外処理
コメント
組み込み関数
flask
学び方
ビット演算
マルチスレッドプログラミング
参照渡し
pyenv
エディタ
生成AI
画像認識
Streamlit
lambda式
物理演算シミュレーション
命名規則
遺伝的アルゴリズム
関数型プログラミング
オブジェクト指向
ツリー図
Anaconda
Google Colaboratory
PyTorch
NLTK
音声処理
yt-dlp
組み込み開発
データベース操作
iclawler
PyCaret
pickle
plotly
polars
Mecab
乱数
PyInstaller
MySQL
Pip
sys.argv
データ型
secrets
MediaPipe
YOLO
ソート
主成分分析 (PCA)
多層パーセプトロン (MLP)
Convolutional Neural Network (CNN)
ランダムフォレスト
LightGBM
Ansible
Boto3
Terraform
Prometheus Client Library
ELK Stack
Fabric
Netmiko
Gemini
Scipy
SymPy
Numba
Dask
MLflow
LangSmith
LangChain
LlamaIndex
Biopython
Graphviz