Prometheus & Grafana で OpenAI/Claude のコストとレート制限を徹底監視

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

API 請求額による「アカウント破産」の恐怖

GPT-4 や Claude 3 をプロダクション環境に導入する際、エンジニアは 2 つの恐ろしいシナリオに直面します。それは、突然の資金枯渇、またはレート制限(429 エラー)によるシステム停止です。

OpenAI のウェブダッシュボードを確認するのは非常に受動的です。閾値に達するのを 24 時間画面の前で監視し続けるわけにはいません。実際、私が以前関わったプロジェクトでは、1 日 5 万件以上のリクエストを処理していました。モニタリングがなければ、たった 1 つのボットが「暴走」するだけで、一晩で数百ドルが吹き飛ぶ可能性があります。

監視データはどこから取得すべきか?

Prometheus にデータを取り込むには主に 3 つの方法があり、それぞれメリットとデメリットがあります。

1. Billing API を直接呼び出す

  • メリット: 1 セント単位で正確な数値が得られる。
  • デメリット: OpenAI のデータは通常 5 〜 15 分の遅延があります。そのため、即時のボトルネック解消には向きません。

2. アプリケーションログのパース

  • メリット: 既存のログを活用するため、追加のリクエストが発生しない。
  • デメリット: ログフォーマットが変わるとメンテナンスが非常に大変です。正規表現(Regex)の更新に常に追われることになります。

3. ミドルウェア/プロキシの使用(推奨)

鍵となるのは x-ratelimit-remaining-tokens などの HTTP ヘッダーです。中間プロキシを立てることで、リクエスト完了直後にこれらの指標をキャッチできます。これがリアルタイムデータを取得する唯一の方法です。

なぜ Prometheus と Grafana を使うのか?

即時アラート: Alertmanager を設定すれば、1 時間のコストが 10 ドルを超えた瞬間に Telegram などへ通知を飛ばせます。

可視化: グラフを見れば、どのモデルが最もコストを消費しているか一目瞭然です(例:GPT-3.5 よりリクエストが少なくても、GPT-4o が予算の 80% を占めているなど)。

一元管理: データをバラバラに見るのではなく、ユーザーのアクセス数とトークン消費量の相関を同じ画面で比較できます。

クイック導入ガイド

以下は、OpenAI から Prometheus へデータを「吸い上げる」ためのシンプルな Python Exporter の書き方です。

ステップ 1: Python Exporter の作成

prometheus_client ライブラリを使用して、Prometheus がデータをスクレイピングするためのエンドポイントを作成します。

import time
from prometheus_client import start_http_server, Gauge
import requests

# 基本的なメトリクスの定義
OPENAI_USAGE = Gauge('openai_usage_usd', '消費金額 (USD)')
RATE_LIMIT_REMAINING = Gauge('openai_ratelimit_remaining', 'クォータ内の残トークン数')

def fetch_metrics():
    # 実際には、これらの数値を API レスポンスのヘッダーから取得します
    # または OpenAI の usage エンドポイントを呼び出します(注意:管理者権限の API キーが必要)
    try:
        # 1回のリクエスト後にデータを取得できたと仮定します
        current_usage = 15.5  # 例:15.5ドル消費済み
        OPENAI_USAGE.set(current_usage)
    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == '__main__':
    start_http_server(8000)
    print("Exporter がポート 8000 で動作中...")
    while True:
        fetch_metrics()
        time.sleep(60)

ステップ 2: Prometheus の設定

上記の Python スクリプトから自動的にデータを取得するように、prometheus.yml ファイルに数行の設定を追加します。

scrape_configs:
  - job_name: 'openai_monitor'
    static_configs:
      - targets: ['localhost:8000']

プロのヒント:LiteLLM をゲートウェイとして使用する

Exporter を自作するのが面倒な場合は、LiteLLM Proxy を使いましょう。これは DevOps エンジニアにとっての「強力な武器」です。すべてのリクエストの中継地点として機能します。

prometheus: true フラグを有効にするだけで、LiteLLM はコスト、レイテンシ、ユーザーごとのトークン数など、あらゆる指標を自動的に出力します。あとは Grafana にサンプルダッシュボードをインポートするだけで完了し、少なくとも 2 日分のコーディング時間を節約できます。

実体験から学んだ教訓

以前、データクローリングスクリプトが無限ループに陥ったことがありました。2 時間にわたって GPT-4 を連続で呼び出し続けたのです。幸いなことに、Alertmanager のおかげで、コストが 50 ドルに達した時点で Telegram の通知を受け取ることができました。

もしこのシステムがなかったら、月末に数千ドルの請求書を支払うために給料を充てなければならなかったでしょう。また、x-ratelimit-reset を監視することは非常に重要です。システムがいつ「回復」するかを正確に把握でき、コード側のリトライロジックをスムーズに調整できるようになります。

おわりに

「高額」な請求書が届くまで監視を後回しにしないでください。しっかりとしたモニタリングシステムは、財布を守るだけでなく、プロジェクトをスケールさせる際の自信にもつながります。皆さんの実装の成功を祈っています!

Share: