mei_13のPython講座 ロゴ

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




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を導入し、システムの健康状態を常に把握できるようにしましょう。



< Terraform
コラム一覧に戻る
ELK Stack >

レッスン概要

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