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のレッスンを受けたいという方、お待ちしています!
https://coconala.com/services/3190048
Xアカウントはこちら
レッスン概要
◯完全オンライン
◯翌日までには必ず返信
◯挫折しない独自の学習メソッド
◯圧倒的高評価!!
◯テキストベースで時間を選ばない
◯高品質なサンプルコード
詳細はこちら
興味がある方はまず質問だけでもどうぞ!
