Flaskでメトリクス収集!Prometheus連携でアプリの健康状態を可視化する入門ガイド
生徒
「先生、Flaskで作ったアプリが今どれくらい忙しいのか、数字で知る方法はありますか?」
先生
「それなら『メトリクス』を収集しましょう。人間でいう血圧や体温のように、アプリの健康状態を数値で測る仕組みのことですよ。」
生徒
「数値でわかるのは便利そうですね!どうやって集めるんですか?」
先生
「『Prometheus(プロメテウス)』という有名な道具を使います。Flaskと連携させる方法を、初心者の方にも分かりやすく解説しますね。」
1. メトリクス収集と可観測性(オブザーバビリティ)の基本
プログラミングの世界で「メトリクス」とは、システムの活動を数値化したデータのことを指します。例えば、「1秒間に何回アクセスがあったか」「今のメモリ使用量は何パーセントか」「エラーが何回発生したか」といった情報です。これらの数字を定期的に記録することを「メトリクス収集」と呼びます。
なぜこれをやるのかというと、アプリが動かなくなる前に「最近少し動作が重くなってきたな」とか「アクセスが急増しているな」といった変化に気づくためです。このように、外側から中身の健康状態を正しく把握できる状態を「可観測性(オブザーバビリティ)」と呼び、システム運用において非常に重要な考え方となります。パソコンを触ったことがない方でも、車のスピードメーターや燃料計をイメージすれば分かりやすいでしょう。メーターがあるからこそ、安心して運転できるのと同じです。
2. Prometheus(プロメテウス)とは?アプリの健康診断機
Prometheusは、世界中で使われているオープンソースの「監視ツール」です。役割は大きく分けて2つあります。1つは、Flaskなどのアプリから数値データを集めてくること。もう1つは、集めたデータを貯金箱のように保存しておくことです。
Prometheusの最大の特徴は「プル(Pull)方式」という仕組みです。これは、Prometheusの方から定期的にアプリに対して「今の調子はどうだい?」と数値を書き出しにいくスタイルです。アプリ側は、聞かれたときに答えられるように「専用の窓口(エンドポイント)」を作っておくだけでOKです。この「窓口」を作る作業を、これからFlaskで行っていきます。
3. Flaskでメトリクスを公開するための準備
FlaskでPrometheusと連携するには、「prometheus-flask-exporter」という便利な拡張道具を使うのが一番簡単です。これを使うと、難しい設定を抜きにして、アプリの基本的な情報(アクセスの合計数や処理時間など)を自動で集計してくれるようになります。
まずは、パソコンのターミナル(黒い画面)で以下の命令を入力して、必要な部品をインストールしましょう。コマンド操作が初めての人も、魔法の呪文を唱えるような感覚で大丈夫です。
pip install prometheus-flask-exporter
これで、Flaskアプリに「健康状態を数値化する能力」を授ける準備が整いました。
4. Flaskアプリにメトリクス機能を追加するコード
では、実際にプログラムを書いてみましょう。以下のコードは、普通のFlaskアプリにPrometheus用の窓口を追加する最もシンプルな例です。
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
# PrometheusMetricsをアプリに登録します
# これだけで、自動的に「/metrics」という窓口が作られます
metrics = PrometheusMetrics(app)
@app.route('/')
def main_page():
return "メインページを表示しました"
@app.route('/test')
def test_page():
return "テストページを表示しました"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
このプログラムを動かして、ブラウザで http://localhost:5000/metrics にアクセスしてみてください。意味不明な英数字が並んだ画面が出てきたら大成功です!それが、Prometheusが読み取るための「アプリの健康診断書」です。
5. 特定の動作を数える「カウンター」の使い方
自動で集計されるデータだけでなく、「特定のボタンが何回押されたか」など、自分で決めた項目を数えたい場合もあります。その時に使うのが「Counter(カウンター)」という仕組みです。カウンターは、一度増えたら減ることのない、ひたすら積み上がっていく数字を扱います。
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
# 「特別なイベント」を数えるためのカウンターを作ります
special_event_counter = metrics.counter(
'special_events_total', '特別なイベントが発生した合計回数'
)
@app.route('/special')
def special():
# このルートにアクセスされるたびに数字を1増やします
special_event_counter.inc()
return "特別なイベントを記録しました!"
if __name__ == '__main__':
app.run(port=5000)
inc() は「インクリメント(1増やす)」という意味です。このように、自分の好きなタイミングで数値をカウントアップできるようになります。
6. 処理時間を計測する「ヒストグラム」で重さを知る
アプリが「何回動いたか」だけでなく、「どれくらい時間がかかったか」を知ることも重要です。例えば、データの処理に1秒かかったのか、10秒かかったのかを分布として記録するのが「Histogram(ヒストグラム)」です。
これを活用すると、「アクセスの90%はすぐ終わっているけれど、残りの10%がすごく重い」といった詳細な分析ができるようになります。
import time
import random
from flask import Flask
from prometheus_flask_exporter import PrometheusMetrics
app = Flask(__name__)
metrics = PrometheusMetrics(app)
@app.route('/slow-process')
@metrics.summary('slow_process_seconds', '処理にかかった時間の要約')
def slow_process():
# 0.1秒から0.5秒の間、わざと処理を遅らせます
wait_time = random.uniform(0.1, 0.5)
time.sleep(wait_time)
return f"{wait_time}秒かけて処理が終わりました"
if __name__ == '__main__':
app.run(port=5000)
@metrics.summary という「デコレータ(関数の上に付ける飾り)」を置くだけで、その関数の実行時間を自動で測ってくれるようになります。プログラミング初心者の方でも、これなら簡単に導入できますね。
7. Prometheus設定ファイル(prometheus.yml)の書き方
Flask側で「診断書(/metrics)」が公開できたら、次はPrometheus側に「その診断書を読みに行け!」という命令を出します。これには prometheus.yml という設定ファイルを使います。
設定ファイルと言っても、中身はシンプルです。どこにある、何のアプリを見に行けばいいかをリストアップするだけです。
global:
scrape_interval: 15s # 15秒ごとにデータを取りに行く設定
scrape_configs:
- job_name: 'flask-app' # 監視する名前に「flask-app」と付けます
static_configs:
- targets: ['localhost:5000'] # Flaskが動いている場所を指定
このファイルをPrometheusに読み込ませて起動すれば、15秒ごとにPrometheusがFlaskへ「今の状態を教えて!」と聞きに来てくれるようになります。
8. 収集したデータを活用して「通知」を送る
メトリクスを集める最終的な目標は、異常があった時にすぐに対処することです。Prometheusには「アラートルール」という設定があり、「もしエラー率が5%を超えたら、チャットやメールで通知する」といった指示を出せます。
ずっと数字を眺めていなくても、機械が24時間体制で「血圧(サーバー負荷)が高すぎるよ!」と教えてくれるので、私たちは安心して眠ることができます。これが、現代のウェブサービスを支える「自動化された監視」の仕組みです。まずはFlaskに /metrics 窓口を作るところから、一歩ずつ進んでいきましょう。
9. 複数のアプリをまとめて監視するメリット
今は1つのFlaskアプリだけですが、将来的にアプリが2つ、3つと増えても、Prometheusは1箇所で全てのデータをまとめて管理できます。それぞれのアプリに背番号を付けるように「ラベル」を設定すれば、「Aというアプリは元気だけど、Bというアプリだけお腹を壊している(エラーが出ている)」といった比較も簡単です。
このように、全体を俯瞰して見ることができる能力こそが、大規模なシステムを開発するエンジニアにとっての必須スキルとなります。FlaskとPrometheusの連携は、その第一歩として最適です。まずは手元のパソコンで、数字が動く楽しさを味わってみてください。