PythonでのPrometheusモニタリングとPrometheusの仕組み
Takashi Yamamoto
Infrastructure Engineer · Leapcell

Prometheusのデータ型と原則
1. はじめに
Prometheusは、元々SoundCloudで開発されたオープンソースのシステム監視およびアラートツールキットです。Prometheusの中核コンポーネントは、監視対象のメトリックを表すために使用されるさまざまなデータ型を定義するデータモデルです。これらのデータ型を理解することは、Prometheusを効果的に使用して監視データを収集、保存、およびクエリするために不可欠です。この記事では、Prometheusのデータ型を掘り下げ、それらの使用法を示すPythonコードの例を提供し、時間の経過に伴うそれらの変化(1分と5分以内)を分析し、根本的な変化の原則を説明し、最後に英語のbashボックス図を使用してPrometheusのフローチャートを示します。
2. Prometheusのデータ型
2.1 カウンター
Prometheusのカウンターは、単調増加する単一の数値を表す累積メトリックです。これは通常、処理されたリクエスト数、完了したタスク数、または発生したエラー数などのイベントをカウントするために使用されます。
Pythonコード例
from prometheus_client import Counter # カウンターメトリックの作成 request_counter = Counter('http_requests_total', 'HTTPリクエストの総数') # いくつかのHTTPリクエストをシミュレート for _ in range(10): request_counter.inc() print(request_counter._value.get())
説明:
prometheus_client
ライブラリからCounter
クラスをインポートします。- ヘルプ文字列を持つ
http_requests_total
という名前のカウンターを作成します。 - カウンターをインクリメントして、10個のHTTPリクエストをシミュレートします。
- 現在のカウンター値を出力します。
時間の経過に伴うデータの変化
- 1分: Webサーバーが1分あたり10個のリクエストを受信すると仮定します。初期カウンター値が50の場合、1分後に60に増加します。
- 5分: 1分あたり10個のリクエストという一定のレートで、カウンターは5分で50増加し、初期値50から100に達します。
変化の原則: カウンターは、追跡されたイベントが発生するたびに1ずつインクリメントされます。Prometheusは時間の経過に伴う累積合計を保存し、値は自然には減少しないため、長期的なイベントの傾向を追跡するのに理想的です。
2.2 ゲージ
ゲージは、任意に増減できる単一の数値を表すメトリックです。これは、温度、メモリ使用量、または同時接続数などの値を測定するために使用されます。
Pythonコード例
from prometheus_client import Gauge # ゲージメトリックの作成 memory_usage_gauge = Gauge('memory_usage_bytes', 'メモリ使用量(バイト単位)') # メモリ使用量の変化をシミュレート memory_usage_gauge.set(1024) memory_usage_gauge.inc(512) memory_usage_gauge.dec(256) print(memory_usage_gauge._value.get())
説明:
Gauge
クラスをインポートし、memory_usage_bytes
という名前のゲージを作成します。- 初期値を1024バイトに設定し、512ずつインクリメントし、256ずつデクリメントします。
- 最終的なゲージ値(1280バイト)を出力します。
時間の経過に伴うデータの変化
- 1分: メモリ使用量は急速に変動する可能性があります。たとえば、初期値が1024バイトで、プロセスが追加の300バイトを消費すると、ゲージは1324バイトに上昇します。プロセスが100バイトを解放すると、1224バイトに低下します。
- 5分: 値は複数の変化を受ける可能性があります(例:5分で1024 → 1324 → 1200 → 1500 → 1400 → 1600バイト)。
変化の原則: ゲージは明示的に設定、インクリメント、またはデクリメントできます。Prometheusは各サンプリング間隔で現在の値を記録し、監視対象エンティティのリアルタイムの状態を反映します。
2.3 ヒストグラム
ヒストグラムは、観測値(例:リクエストの期間または応答サイズ)をサンプリングし、設定可能なバケットでそれらをカウントすると同時に、すべての値の合計を提供します。
Pythonコード例
from prometheus_client import Histogram import random # 指定されたバケットを持つヒストグラムメトリックの作成 request_duration_histogram = Histogram( 'http_request_duration_seconds', 'HTTPリクエストの期間(秒単位)', buckets=(0.1, 0.2, 0.3, 0.4, 0.5) ) # 20個のリクエスト期間をシミュレート for _ in range(20): duration = random.uniform(0, 0.6) request_duration_histogram.observe(duration) # 結果の出力 print(f"Sum: {request_duration_histogram._sum.get()}") print(f"Count: {request_duration_histogram._count.get()}") for bucket, count in request_duration_histogram._buckets.items(): print(f"Bucket {bucket}: {count.get()}")
説明:
- 0.1〜0.5秒のバケットを持つヒストグラムを定義します。
- 20個のリクエスト期間をシミュレートし、
observe()
を使用してそれらを記録します。 - 合計、カウント、およびバケットの分布を出力します。
時間の経過に伴うデータの変化
- 1分: 新しい観測値(例:1分で25個のリクエスト)は、カウントと合計を増加させ、バケットのカウントは実際の期間に基づいて更新されます。
- 5分: 蓄積された観測値は、カウントと合計を大きくし、より長い期間のリクエストが発生した場合、バケットの分布が変化します。
変化の原則: 各観測値はバケットに割り当てられ、合計が更新されます。ヒストグラムは時間の経過とともにデータ分布を構築し、値の範囲と大きさを分析できるようにします。
2.4 サマリー
サマリーは、固定バケットを使用するヒストグラムとは異なり、観測値をサンプリングし、分位数(例:中央値、90パーセンタイル)を計算してデータ分布を要約します。
Pythonコード例
from prometheus_client import Summary # エンドポイントのラベルを持つサマリーの作成 response_size_summary = Summary( 'http_response_size_bytes', 'HTTP応答サイズ(バイト単位)', labelnames=['endpoint'] ) # さまざまなエンドポイントの観測値を記録 response_size_summary.labels(endpoint='/api/v1/users').observe(1024) response_size_summary.labels(endpoint='/api/v1/posts').observe(2048) # 結果の出力 print(f"Sum: {response_size_summary._sum.get()}") print(f"Count: {response_size_summary._count.get()}") for quantile, sum_val in response_size_summary._quantile_sum.items(): print(f"Quantile {quantile}: {sum_val.get()}")
説明:
- APIルートを区別するための
endpoint
ラベルを持つサマリーを作成します。 - 2つのエンドポイントの応答サイズを記録し、合計、カウント、および分位データを出力します。
時間の経過に伴うデータの変化
- 1分: 新しいリクエストは、カウント、合計、および分位数を更新します。たとえば、より大きな応答は、90パーセンタイルの値を増加させる可能性があります。
- 5分: 蓄積されたデータは分位数の精度を向上させ、カウントと合計が増加し、分布が長期的な傾向を反映します。
変化の原則: 観測値は、実行中の合計、カウント、および分位数計算(移動ウィンドウなどのアルゴリズムを使用)を更新します。分位数は、最新のデータ分布を反映するように動的に調整されます。
3. Prometheusのフローチャート(英語のBashボックス図)
+-------------------+
| Prometheus Server |
+-------------------+
| |
| Data Collection |
| (Pull Model) |
| |
| Targets |<---+
| (Exporters) | |
| | |
+-------------------+ |
|
+-------------------+ |
| Exporter | |
| (e.g., Node | |
| Exporter) | |
+-------------------+ |
|
| Metrics | |
| (Counter, Gauge, | |
| Histogram, | |
| Summary) | |
+-------------------+ |
|
| Push Metrics |<---+
| to Prometheus |
+-------------------+
| |
| Data Storage |
| (TSDB - Time - |
| Series Database) |
| |
+-------------------+
| |
| Querying |
| (PromQL) |
| |
+-------------------+
| |
| Visualization |
| (e.g., Grafana) |
| |
+-------------------+
フローチャートの説明:
- Prometheus Serverは、プルベースのモデルを使用して、ターゲット(エクスポーター)からメトリックをプルします。
- エクスポーター(例:Node Exporter)は、システムからメトリックを収集し、Prometheus互換の形式で公開します。
- メトリック(カウンター、ゲージ、ヒストグラム、サマリー)は、Prometheus Serverにプッシュされます。
- サーバーは、メトリックをTime-Series Database(TSDB)に保存します。
- ユーザーはPromQLを使用してメトリックをクエリします。
- クエリされたデータは、Grafanaなどのツールを介して視覚化されます。
4. 結論
Prometheusのデータ型を理解することは、効果的なシステム監視に不可欠です。
- カウンターは、累積イベントを追跡します。
- ゲージは、変動する値を監視します。
- ヒストグラムは、バケット内のデータ分布を分析します。
- サマリーは、分位数ベースの洞察を提供します。
Pythonの例は、実装と時間的な変化を示し、フローチャートは、収集から視覚化までのPrometheusのデータフローを概説します。この知識により、ユーザーはPrometheusを活用してシステムを効率的に監視および管理できます。
Leapcell: 最高のサーバーレスWebホスティング
Leapcellは、Pythonサービスをデプロイするための理想的なプラットフォームです。
🚀 お気に入りの言語で構築
JavaScript、Python、Go、またはRustで簡単に開発できます。
🌍 無制限のプロジェクトを無料でデプロイ
リソースの使用量に対してのみ支払い—リクエストも料金もありません。
⚡ 従量課金制、隠れたコストなし
アイドル料金はなく、シームレスなスケーラビリティのみです。
📖 ドキュメントをご覧ください 🔹 Twitterでフォローしてください:@LeapcellHQ