◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-03-30上級

Gemini API 本番環境のオブザーバビリティ — ログ・監視・コスト追跡の実践パターン

Gemini APIを本番運用する際に不可欠なオブザーバビリティ基盤を構築する方法を解説。構造化ログ、トークン使用量の追跡、レイテンシ監視、コスト最適化ダッシュボードまで、実装コード付きで網羅します。

gemini-api287observability11monitoring5loggingproduction105cost-optimization22python106

✦ プレミアム記事

Gemini APIを個人プロジェクトから本番サービスへスケールさせるとき、多くの開発者が直面する壁があります。「APIが遅いのはモデルの問題か、ネットワークの問題か」「今月のAPI費用がなぜ急増したのか」「ユーザーからエラー報告があったが、どのリクエストで何が起きたのか」——これらの問いに即座に答えられる仕組みが、オブザーバビリティです。

ここで扱うのはGemini APIを本番運用するために必要なオブザーバビリティ基盤を、構造化ログ設計からコスト追跡ダッシュボードまで、実装コード付きで体系的に解説します。なお、APIのエラーハンドリングやリトライ戦略についてはGemini API エラーハンドリングとリトライパターン、コスト最適化の基本はGemini API コスト最適化ガイドも併せてご覧ください。

オブザーバビリティの3本柱とGemini API

オブザーバビリティは「ログ(Logs)」「メトリクス(Metrics)」「トレース(Traces)」の3本柱で構成されます。Gemini APIの本番運用においては、それぞれ以下の役割を担います。

ログはAPIリクエストとレスポンスの詳細を記録し、問題発生時の原因調査に使います。プロンプトの内容、モデルのレスポンス、エラーメッセージなど、個別のイベントを時系列で追跡できます。

メトリクスはシステムの健全性を数値で示します。レイテンシの中央値・P95・P99、トークン消費量、エラー率、秒間リクエスト数(RPS)など、集約された統計値をモニタリングします。

トレースは1つのユーザーリクエストがシステム内部をどう流れたかを可視化します。特にRAGパイプラインやマルチエージェントシステムでは、Gemini API呼び出しがどのステップで行われ、どこがボトルネックになっているかを特定するために不可欠です。

構造化ログの設計と実装

Gemini APIのログを効果的に活用するには、構造化ログ(Structured Logging)が重要です。プレーンテキストのログではフィルタリングや集計が難しく、大量のリクエストを処理する本番環境では役に立ちません。

以下は、Python の structlog を使った Gemini API 用の構造化ログ設計です。

import structlog
import time
import uuid
from google import genai
from google.genai import types
 
# structlog の設定
structlog.configure(
    processors=[
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.add_log_level,
        structlog.processors.JSONRenderer()
    ]
)
logger = structlog.get_logger()
 
class GeminiObservableClient:
    """オブザーバビリティ機能付きGemini APIクライアント"""
 
    def __init__(self, api_key: str, default_model: str = "gemini-2.5-pro"):
        self.client = genai.Client(api_key=api_key)
        self.default_model = default_model
        self.metrics = MetricsCollector()
 
    def generate(self, prompt: str, model: str = None,
                 config: dict = None, trace_id: str = None):
        """ログ・メトリクス付きでコンテンツを生成する"""
        request_id = str(uuid.uuid4())[:8]
        trace_id = trace_id or str(uuid.uuid4())
        model_name = model or self.default_model
        start_time = time.monotonic()
 
        # リクエストログ
        logger.info("gemini_request_start",
                     request_id=request_id,
                     trace_id=trace_id,
                     model=model_name,
                     prompt_length=len(prompt),
                     config=config)
 
        try:
            response = self.client.models.generate_content(
                model=model_name,
                contents=prompt,
                config=types.GenerateContentConfig(**(config or {}))
            )
 
            elapsed = time.monotonic() - start_time
            input_tokens = response.usage_metadata.prompt_token_count
            output_tokens = response.usage_metadata.candidates_token_count
 
            # 成功ログ
            logger.info("gemini_request_success",
                        request_id=request_id,
                        trace_id=trace_id,
                        model=model_name,
                        latency_ms=round(elapsed * 1000, 2),
                        input_tokens=input_tokens,
                        output_tokens=output_tokens,
                        total_tokens=input_tokens + output_tokens,
                        finish_reason=str(response.candidates[0].finish_reason))
 
            # メトリクス記録
            self.metrics.record_request(
                model=model_name,
                latency=elapsed,
                input_tokens=input_tokens,
                output_tokens=output_tokens,
                success=True
            )
 
            return response
 
        except Exception as e:
            elapsed = time.monotonic() - start_time
            # エラーログ
            logger.error("gemini_request_error",
                         request_id=request_id,
                         trace_id=trace_id,
                         model=model_name,
                         latency_ms=round(elapsed * 1000, 2),
                         error_type=type(e).__name__,
                         error_message=str(e))
 
            self.metrics.record_request(
                model=model_name,
                latency=elapsed,
                input_tokens=0,
                output_tokens=0,
                success=False,
                error_type=type(e).__name__
            )
            raise

このクライアントは、すべてのAPI呼び出しに対して request_id と trace_id を自動付与します。request_id は個々のAPI呼び出しを識別し、trace_id はユーザーリクエスト全体を通して紐づけるための識別子です。

ログ出力は以下のようなJSON形式になります。

# 出力例:
# {"event": "gemini_request_success", "request_id": "a1b2c3d4",
#  "trace_id": "550e8400-...", "model": "gemini-2.5-pro",
#  "latency_ms": 1523.45, "input_tokens": 256,
#  "output_tokens": 1024, "total_tokens": 1280,
#  "finish_reason": "STOP", "timestamp": "2026-03-30T10:15:00Z",
#  "level": "info"}
✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦Gemini API呼び出しの構造化ログ設計とトレーシング実装を習得できる
✦トークン使用量・コストをリアルタイムで追跡するダッシュボードを構築できる
✦レイテンシ異常検知とアラート設定により、障害を未然に防げるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ API / SDK2026-07-04
Gemini API の英語出力に日本語が『たまに』混ざるとき — 混入率を計測して段階的に締める運用メモ
英語出力を指示したGemini APIが、100回に数回だけ日本語を混ぜてくる——この『たまに』を止められない本当の理由と、混入率をSLOとして計測し、段階的リカバリで本番品質まで締める運用パターンを実装コード付きで整理します。
◈ API / SDK2026-04-23
Gemini API × Langfuse — LLM オブザーバビリティの本番実装ガイド
Gemini API を本番運用するチーム向けに、Langfuse を使った LLM オブザーバビリティの実装を体系的に解説します。トレース設計、コスト可視化、プロダクショントレースでの LLM-as-Judge 評価、PII マスキング、サンプリングまで動作コード付きで網羅します。
◈ API / SDK2026-04-19
Gemini API キャッシュ戦略の運用ノート — Context Caching と Implicit Caching を本番で組み合わせて月額費用を抑える
Context Caching と Implicit Caching を個人開発アプリの本番運用で組み合わせた実装メモ。動くコード・実測コスト・運用で気づいた7つの落とし穴を、AdMob 連携アプリの文脈で整理しています。