Cloud Run で ADK エージェントをデプロイ、管理、オブザーバビングする

1. はじめに

このチュートリアルでは、Google Cloud Run で Agent Development Kit(ADK)を使用して構築された強力なエージェントをデプロイ、管理、モニタリングする方法について説明します。ADK を使用すると、複雑なマルチエージェント ワークフローに対応できるエージェントを作成できます。フルマネージド サーバーレス プラットフォームである Cloud Run を活用することで、基盤となるインフラストラクチャを気にすることなく、エージェントをスケーラブルなコンテナ化アプリケーションとしてデプロイできます。この強力な組み合わせにより、Google Cloud の堅牢でスケーラブルな環境のメリットを享受しながら、エージェントのコアロジックに集中できます。

このチュートリアルでは、ADK と Cloud Run のシームレスな統合について説明します。エージェントのデプロイ方法を学習し、本番環境のような設定でアプリケーションを管理する際の実際的な側面について詳しく説明します。トラフィックを管理してエージェントの新しいバージョンを安全にロールアウトする方法について説明します。これにより、完全なリリース前に一部のユーザーで新機能をテストできます。

さらに、エージェントのパフォーマンスをモニタリングする実践的な経験を積むことができます。ロードテストを実施して、Cloud Run の自動スケーリング機能を実際に確認することで、実際のシナリオをシミュレートします。エージェントの動作とパフォーマンスに関する詳細な分析情報を得るために、Cloud Trace を使用してトレースを有効にします。これにより、エージェントを通過するリクエストの詳細なエンドツーエンドのビューが提供され、パフォーマンスのボトルネックを特定して対処できます。このチュートリアルを修了すると、Cloud Run で ADK を搭載したエージェントを効果的にデプロイ、管理、モニタリングする方法を包括的に理解できます。

この Codelab では、次の手順でアプローチします。

  1. ADK エージェント データベース セッション サービスで使用する CloudSQL に PostgreSQL データベースを作成する
  2. 基本的な ADK エージェントを設定する
  3. ADK ランナーで使用されるデータベース セッション サービスを設定
  4. エージェントを Cloud Run に初回デプロイする
  5. 負荷テストと Cloud Run の自動スケーリングの検査
  6. 新しいエージェント リビジョンをデプロイし、新しいリビジョンへのトラフィックを徐々に増やす
  7. クラウド トレースを設定し、エージェントの実行トレースを検査する

アーキテクチャの概要

5e38fc5607fb4543.jpeg

前提条件

  • Python の操作に慣れている
  • HTTP サービスを使用した基本的なフルスタック アーキテクチャの理解

学習内容

  • ADK の構造とローカル ユーティリティ
  • データベース セッション サービスで ADK エージェントを設定する
  • Database セッション サービスで使用される CloudSQL で PostgreSQL を設定する
  • Dockerfile を使用してアプリケーションを Cloud Run にデプロイし、初期環境変数を設定する
  • ロードテストで Cloud Run の自動スケーリングを構成してテストする
  • Cloud Run を使用した段階的リリースの戦略
  • Cloud Trace への ADK エージェントのトレースを設定する

必要なもの

  • Chrome ウェブブラウザ
  • Gmail アカウント
  • 課金が有効になっている Cloud プロジェクト

この Codelab は、初心者を含むあらゆるレベルのデベロッパーを対象としており、サンプル アプリケーションで Python を使用します。ただし、ここで説明するコンセプトを理解するために Python の知識は必要ありません。

2. 始める前に

Cloud コンソールでアクティブなプロジェクトを選択する

この Codelab では、課金が有効になっている Google Cloud プロジェクトがすでにあることを前提としています。まだお持ちでない場合は、以下の手順に沿って開始してください。

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

c714d4741fc97644.png

Cloud SQL データベースを準備する

ADK エージェントが後で使用するデータベースが必要です。Cloud SQL に PostgreSQL データベースを作成しましょう。まず、Cloud コンソールの上部にある検索バーに移動し、「cloud sql」と入力します。[Cloud SQL] プロダクトをクリックします。

1005cb65520eb3fc.png

その後、新しいデータベース インスタンスを作成する必要があります。[インスタンスを作成] をクリックして、[PostgreSQL] を選択します。

7f2ad19bc246895d.png

ead4a98e7a8d8a39.png

新しいプロジェクトから始める場合は、Compute Engine API を有効にする必要がある場合もあります。このプロンプトが表示されたら、[API を有効にする] をクリックします。

724cf67681535679.png

次に、データベースの仕様を選択します。サンドボックス エディションのプリセットで Enterprise エディションを選択します。

24aa9defed93a3ef.png

その後、ここでインスタンス名とユーザー postgres のデフォルト パスワードを設定します。任意の認証情報で設定できますが、このチュートリアルでは、インスタンス名とパスワードの両方に「adk-deployment」を使用します。

573719a4582f541c.png

このチュートリアルでは、単一ゾーンの us-central1 を使用します。データベースの作成を完了し、[インスタンスを作成] ボタンをクリックして必要な設定をすべて完了します。

773e2ea11d97369d.png

完了を待機している間に、次のセクションに進みます。

Cloud Shell ターミナルで Cloud プロジェクトを設定する

  1. Google Cloud 上で動作するコマンドライン環境の Cloud Shell を使用します。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。

1829c3759227c19b.png

  1. Cloud Shell に接続したら、次のコマンドを使用して、すでに認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されていることを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>

また、コンソールで PROJECT_ID ID を確認することもできます。

4032c45803813f30.jpeg

クリックすると、右側にすべてのプロジェクトとプロジェクト ID が表示されます。

8dc17eb4271de6b5.jpeg

  1. 次のコマンドを使用して、必要な API を有効にします。これには数分かかることがあります。
gcloud services enable aiplatform.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       sqladmin.googleapis.com

コマンドが正常に実行されると、次のようなメッセージが表示されます。

Operation "operations/..." finished successfully.

gcloud コマンドの代わりに、コンソールで各プロダクトを検索するか、こちらのリンクを使用します。

API が見つからない場合は、実装中にいつでも有効にできます。

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

Cloud Shell エディタに移動してアプリケーションの作業ディレクトリを設定する

これで、コーディング作業を行うようにコードエディタを設定できます。これには Cloud Shell エディタを使用します。

  1. [エディタを開く] ボタンをクリックすると、Cloud Shell エディタが開きます。ここにコードを記述できます。b16d56e4979ec951.png
  2. 下の図でハイライト表示されているように、Cloud Shell エディタの左下(ステータスバー)に Cloud Code プロジェクトが設定され、請求が有効になっているアクティブな Google Cloud プロジェクトに設定されていることを確認します。プロンプトが表示されたら、[Authorize] をクリックします。前のコマンドをすでに実行している場合、ボタンはログイン ボタンではなく、有効化されたプロジェクトを直接指していることもあります。

f5003b9c38b43262.png

  1. 次に、GitHub からこの Codelab のテンプレート作業ディレクトリのクローンを作成します。次のコマンドを実行します。作業ディレクトリは deploy_and_manage_adk ディレクトリに作成されます。
git clone https://github.com/alphinside/deploy-and-manage-adk-service.git deploy_and_manage_adk
  1. 次に、Cloud Shell エディタの上部のセクションに移動し、[File->Open Folder] をクリックして、ユーザー名ディレクトリを見つけ、deploy_and_manage_adk ディレクトリを見つけて、[OK] ボタンをクリックします。これにより、選択したディレクトリがメインの作業ディレクトリになります。この例では、ユーザー名は alvinprayuda であるため、ディレクトリ パスは次のようになります。

2c53696f81d805cc.png

a51615f22ba1690f.png

Cloud Shell エディタは次のようになります。

228d4c1844790573.png

次に、Python 環境のセットアップを構成します。

環境の設定

Python 仮想環境を準備する

次のステップは、開発環境を準備することです。現在のアクティブなターミナルの作業ディレクトリは、deploy_and_manage_adk 作業ディレクトリ内にある必要があります。この Codelab では Python 3.12 を使用し、uv Python プロジェクト マネージャーを使用して、Python バージョンと仮想環境の作成と管理の必要性を簡素化します。

  1. ターミナルをまだ開いていない場合は、[ターミナル] -> [新しいターミナル] をクリックして開くか、Ctrl+Shift+C を使用します。ブラウザの下部にターミナル ウィンドウが開きます。

f8457daf0bed059e.jpeg

  1. uv をダウンロードし、次のコマンドで Python 3.12 をインストールします。
curl -LsSf https://astral.sh/uv/0.6.16/install.sh | sh && \
source $HOME/.local/bin/env && \
uv python install 3.12
  1. uv を使用して仮想環境を初期化します。次のコマンドを実行します。
uv sync --frozen

これにより、.venv ディレクトリが作成され、依存関係がインストールされます。pyproject.toml を簡単に確認すると、次のように依存関係に関する情報が表示されます。

dependencies = [
    "google-adk==1.3.0",
    "locust==2.37.10",
    "pg8000==1.31.2",
    "python-dotenv==1.1.0",
]
  1. 仮想環境をテストするには、新しいファイル main.py を作成し、次のコードをコピーします。
def main():
   print("Hello from deploy_and_manage_adk!")

if __name__ == "__main__":
   main()
  1. その後、次のコマンドを実行します。
uv run main.py

次のような出力が表示されます。

Using CPython 3.12
Creating virtual environment at: .venv
Hello from deploy_and_manage_adk!

これは、Python プロジェクトが正しく設定されていることを示しています。

設定構成ファイル

次に、このプロジェクトの構成ファイルを設定する必要があります。

.env.example ファイルの名前を .env に変更すると、次の値が表示されます。GOOGLE_CLOUD_PROJECT の値をプロジェクト ID に更新します。

# Google Cloud and Vertex AI configuration
GOOGLE_CLOUD_PROJECT=your-project-id
GOOGLE_CLOUD_LOCATION=global
GOOGLE_GENAI_USE_VERTEXAI=True

# Database connection for session service
# SESSION_SERVICE_URI=postgresql+pg8000://<username>:<password>@/<database>?unix_sock=/cloudsql/<instance_connection_name>/.s.PGSQL.5432

この Codelab では、GOOGLE_CLOUD_LOCATIONGOOGLE_GENAI_USE_VERTEXAI. の事前構成済みの値を使用します。今のところ、SESSION_SERVICE_URI はコメントアウトしたままにします。

これで、次のステップに進み、エージェント ロジックを調べてデプロイできます。

3. ADK と Gemini 2.5 を使用して天気エージェントを構築する

ADK のディレクトリ構造の概要

まず、ADK の機能とエージェントの構築方法について説明します。ADK の完全なドキュメントは、こちらの URL からアクセスできます。ADK には、CLI コマンド実行内で多くのユーティリティが用意されています。以下に例を示します。

  • エージェント ディレクトリ構造を設定する
  • CLI の入出力でインタラクションをすばやく試す
  • ローカル開発 UI ウェブ インターフェースをすばやく設定する

次に、weather_agent ディレクトリでエージェントの構造を確認します。

weather_agent/
├── __init__.py
├── agent.py

init.pyagent.py を調べると、次のコードが表示されます。

# __init__.py

from weather_agent.agent import root_agent

__all__ = ["root_agent"]
# agent.py

import os
from pathlib import Path

import google.auth
from dotenv import load_dotenv
from google.adk.agents import Agent
from google.cloud import logging as google_cloud_logging

# Load environment variables from .env file in root directory
root_dir = Path(__file__).parent.parent
dotenv_path = root_dir / ".env"
load_dotenv(dotenv_path=dotenv_path)

# Use default project from credentials if not in .env
_, project_id = google.auth.default()
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")

logging_client = google_cloud_logging.Client()
logger = logging_client.logger("weather-agent")


def get_weather(city: str) -> dict:
    """Retrieves the current weather report for a specified city.

    Args:
        city (str): The name of the city (e.g., "New York", "London", "Tokyo").

    Returns:
        dict: A dictionary containing the weather information.
              Includes a 'status' key ('success' or 'error').
              If 'success', includes a 'report' key with weather details.
              If 'error', includes an 'error_message' key.
    """
    logger.log_text(
        f"--- Tool: get_weather called for city: {city} ---", severity="INFO"
    )  # Log tool execution
    city_normalized = city.lower().replace(" ", "")  # Basic normalization

    # Mock weather data
    mock_weather_db = {
        "newyork": {
            "status": "success",
            "report": "The weather in New York is sunny with a temperature of 25°C.",
        },
        "london": {
            "status": "success",
            "report": "It's cloudy in London with a temperature of 15°C.",
        },
        "tokyo": {
            "status": "success",
            "report": "Tokyo is experiencing light rain and a temperature of 18°C.",
        },
    }

    if city_normalized in mock_weather_db:
        return mock_weather_db[city_normalized]
    else:
        return {
            "status": "error",
            "error_message": f"Sorry, I don't have weather information for '{city}'.",
        }


root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    instruction="You are a helpful AI assistant designed to provide accurate and useful information.",
    tools=[get_weather],
)

ADK コードの説明

このスクリプトには、次のものを初期化するエージェントの初期化が含まれています。

  • 使用するモデルを gemini-2.5-flash に設定する
  • 天気エージェントとしてエージェント機能をサポートするツール get_weather を提供

ウェブ UI を実行する

これで、エージェントを操作して、その動作をローカルで検査できます。ADK を使用すると、開発用ウェブ UI を使用して、インタラクション中に何が行われているかを操作して確認できます。次のコマンドを実行して、ローカル開発 UI サーバーを起動します。

uv run adk web --port 8080

次の例のような出力が生成されます。これは、ウェブ インターフェースにすでにアクセスできることを意味します。

INFO:     Started server process [xxxx]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8080.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

確認するには、Cloud Shell エディタの上部にある [ウェブでプレビュー] ボタンをクリックし、[ポート 8080 でプレビュー] を選択します。

e7c9f56c2463164.png

次のウェブページが表示されます。左上のプルダウン ボタン(この例では weather_agent)で利用可能なエージェントを選択し、ボットとやり取りできます。左側のウィンドウには、エージェントの実行時のログの詳細に関する多くの情報が表示されます。

d95b1e057315fee2.png

では、操作してみましょう。左側のバーでは、各入力のトレースを検査できます。これにより、エージェントが最終的な回答を生成するまでに各アクションにかかる時間を把握できます。

39c0a06ace937683.png

これは ADK に組み込まれているオブザーバビリティ機能の 1 つで、現在はローカルで検査しています。後で、これが Cloud Tracing に統合され、すべてのリクエストのトレースが一元化される方法について説明します。

4. バックエンド サーバー スクリプト

エージェントをサービスとしてアクセスできるようにするために、エージェントを FastAPI アプリ内にラップします。ここでは、エージェントをサポートするために必要なサービス(本番環境用の SessionMemoryArtifact サービスなど)を構成できます。使用する server.py のコードは次のとおりです。

import os

from dotenv import load_dotenv
from fastapi import FastAPI
from google.adk.cli.fast_api import get_fast_api_app
from pydantic import BaseModel
from typing import Literal
from google.cloud import logging as google_cloud_logging
from tracing import CloudTraceLoggingSpanExporter
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider, export


# Load environment variables from .env file
load_dotenv()

logging_client = google_cloud_logging.Client()
logger = logging_client.logger(__name__)

AGENT_DIR = os.path.dirname(os.path.abspath(__file__))

# Get session service URI from environment variables
session_uri = os.getenv("SESSION_SERVICE_URI", None)

# Prepare arguments for get_fast_api_app
app_args = {"agents_dir": AGENT_DIR, "web": True}

# Only include session_service_uri if it's provided
if session_uri:
    app_args["session_service_uri"] = session_uri
else:
    logger.log_text(
        "SESSION_SERVICE_URI not provided. Using in-memory session service instead. "
        "All sessions will be lost when the server restarts.",
        severity="WARNING",
    )

provider = TracerProvider()
processor = export.BatchSpanProcessor(CloudTraceLoggingSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

# Create FastAPI app with appropriate arguments
app: FastAPI = get_fast_api_app(**app_args)

app.title = "weather-agent"
app.description = "API for interacting with the Agent weather-agent"


class Feedback(BaseModel):
    """Represents feedback for a conversation."""

    score: int | float
    text: str | None = ""
    invocation_id: str
    log_type: Literal["feedback"] = "feedback"
    service_name: Literal["weather-agent"] = "weather-agent"
    user_id: str = ""


@app.post("/feedback")
def collect_feedback(feedback: Feedback) -> dict[str, str]:
    """Collect and log feedback.

    Args:
        feedback: The feedback data to log

    Returns:
        Success message
    """
    logger.log_struct(feedback.model_dump(), severity="INFO")
    return {"status": "success"}


# Main execution
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8080)

サーバーコードの説明

server.py スクリプトで定義されている内容は次のとおりです。

  1. get_fast_api_app メソッドを使用して、エージェントを FastAPI アプリに変換します。これにより、ウェブ開発 UI で使用されるルート定義を継承できます。
  2. get_fast_api_app メソッドにキーワード引数を追加して、必要なセッション、メモリ、アーティファクト サービスを構成します。このチュートリアルでは、SESSION_SERVICE_URI 環境変数を構成すると、セッション サービスはその変数を使用します。それ以外の場合は、インメモリ セッションを使用します。
  3. カスタムルートを追加して、他のバックエンド ビジネス ロジックをサポートできます。スクリプトでは、フィードバック機能のルートの例を追加します。
  4. クラウド トレースを有効にして、トレースを Google Cloud Trace に送信する

5. Cloud Run へのデプロイ

次に、このエージェント サービスを Cloud Run にデプロイします。このデモでは、このサービスは他のユーザーがアクセスできるパブリック サービスとして公開されます。ただし、これは安全ではないため、ベスト プラクティスではありません。

5e38fc5607fb4543.jpeg

この Codelab では、Dockerfile を使用してエージェントを Cloud Run にデプロイします。使用する Dockerfile の内容は次のとおりです。

FROM python:3.12-slim

RUN pip install --no-cache-dir uv==0.7.13

WORKDIR /app

COPY . .

RUN uv sync --frozen

EXPOSE 8080

CMD ["uv", "run", "uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8080"]

この時点で、Cloud Run にアプリケーションをデプロイするために必要なファイルはすべて揃っています。デプロイしましょう。Cloud Shell ターミナルに移動し、現在のプロジェクトがアクティブなプロジェクトに構成されていることを確認します。構成されていない場合は、gcloud configure コマンドを使用してプロジェクト ID を設定します。

gcloud config set project [PROJECT_ID]

次のコマンドを実行して、Cloud Run にデプロイします。

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --add-cloudsql-instances {YOUR_DB_CONNECTION_NAME} \
                  --update-env-vars SESSION_SERVICE_URI="postgresql+pg8000://postgres:{YOUR_DEFAULT_USER_PASS}@postgres/?unix_sock=/cloudsql/{YOUR_DB_CONNECTION_NAME}/.s.PGSQL.5432",GOOGLE_CLOUD_PROJECT={YOUR_PROJECT_ID} \
                  --region us-central1

{YOUR_DB_CONNECTION_NAME} の値を取得するには、Cloud SQL に再度移動して、作成したインスタンスをクリックします。インスタンス ページで、[このインスタンスに接続] セクションまでスクロールし、接続名をコピーして {YOUR_DB_CONNECTION_NAME} の値を置き換えます。たとえば、次の画像をご覧ください。

5d7d6c6f17e559c1.png

Docker リポジトリのアーティファクト レジストリの作成を確認するよう求められたら、Y と答えます。これはデモ アプリケーションであるため、ここでは未認証のアクセスを許可しています。エンタープライズ アプリケーションと本番環境アプリケーションには適切な認証を使用することをおすすめします。

デプロイが完了すると、次のようなリンクが表示されます。

https://weather-agent-*******.us-central1.run.app

シークレット ウィンドウまたはモバイル デバイスからアプリケーションを使用します。すでに公開されているはずです。

6. ロードテストによる Cloud Run 自動スケーリングの検査

ここでは、Cloud Run の自動スケーリング機能について説明します。このシナリオでは、インスタンスあたりの最大同時実行数を有効にして、新しいリビジョンをデプロイします。次のコマンドを実行します。

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --concurrency 10

次に、load_test.py ファイルを調べます。これは、locust フレームワークを使用して負荷テストを行うために使用するスクリプトです。このスクリプトは、次の処理を行います。

  1. ランダム化された user_id と session_id
  2. user_id の session_id を作成する
  3. 作成した user_id と session_id を使用してエンドポイント「/run_sse」にアクセスします。

デプロイされたサービスの URL が必要になります。Cloud Run コンソールに移動し、weather-agent サービスをクリックします。

f5cc953cc422de6d.png

次に、weather-agent サービスを見つけてクリックします。

ddd0df8544aa2bfb.png

サービス URL は、リージョン情報のすぐ横に表示されます。例:

41b1276616379ee8.png

次のコマンドを実行して、ロードテストを行います。

uv run locust -f load_test.py \
              -H {YOUR_SERVICE_URL} \
              -u 60 \
              -r 5 \
              -t 120 \
              --headless

実行すると、次のような指標が表示されます。(この例では、すべてのリクエストが成功しています)。

Type     Name                                  # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
POST     /run_sse end                             813     0(0.00%) |   5817    2217   26421   5000 |    6.79        0.00
POST     /run_sse message                         813     0(0.00%) |   2678    1107   17195   2200 |    6.79        0.00
--------|------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                              1626     0(0.00%) |   4247    1107   26421   3500 |   13.59        0.00  

次に、Cloud Run で何が起こったかを確認します。デプロイしたサービスに再度アクセスして、ダッシュボードを確認します。これにより、Cloud Run が受信リクエストを処理するためにインスタンスを自動的にスケーリングする方法を確認できます。インスタンスあたりの最大同時実行数を 10 に制限しているため、Cloud Run インスタンスは、この条件を満たすようにコンテナの数を自動的に調整しようとします。

1ad41143eb9d95df.png

7. 新しいリビジョンを段階的にリリースする

次のシナリオを考えてみましょう。エージェントのプロンプトを次のように更新します。

# agent.py

...

root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash-preview-05-20",
    instruction="You are a helpful AI assistant designed to provide accurate and useful information. You only answer inquiries about the weather. Refuse all other user query",
    tools=[get_weather],
)

次に、新しいリビジョンをリリースするが、すべてのリクエスト トラフィックが新しいバージョンに直接送信されないようにします。Cloud Run を使用して段階的なリリースを行うことができます。まず、–no-traffic フラグを使用して新しいリビジョンをデプロイする必要があります。以前のエージェント スクリプトを保存して、次のコマンドを実行します。

gcloud run deploy weather-agent \
                  --source . \
                  --port 8080 \
                  --project {YOUR_PROJECT_ID} \
                  --allow-unauthenticated \
                  --region us-central1 \
                  --no-traffic

完了すると、以前のデプロイ プロセスと同様のログが届きます。ただし、処理されたトラフィックの数が異なります。配信されたトラフィックが 0% と表示されます。

次に、Cloud Run のプロダクト ページに移動して、デプロイしたインスタンスを見つけます。検索バーに「Cloud Run」と入力し、Cloud Run プロダクトをクリックします。

f5cc953cc422de6d.png

次に、weather-agent サービスを見つけてクリックします。

ddd0df8544aa2bfb.png

[リビジョン] タブに移動すると、デプロイされたリビジョンのリストが表示されます。

8519c5a59bc7efa6.png

新しくデプロイされたリビジョンが 0% を提供していることがわかります。ここから、ケバブボタン(⋮)をクリックして [トラフィックの管理] を選択します。

d4d224e20813c303.png

新しくポップアップ表示されたウィンドウで、各リビジョンに送信されるトラフィックの割合を編集できます。

6df497c3d5847f14.png

しばらく待つと、トラフィックは割合の構成に基づいて比例的に転送されます。これにより、新しいリリースで問題が発生した場合に、以前のリビジョンに簡単にロールバックできます。

8. ADK トレース

ADK で構築されたエージェントは、OpenTelemetry を埋め込むことでトレースをすでにサポートしています。Cloud Trace を使用して、トレースをキャプチャして可視化します。以前にデプロイしたサービスで有効にする方法について、server.py を確認してみましょう。

# server.py

from tracing import CloudTraceLoggingSpanExporter
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider, export

...

provider = TracerProvider()
processor = export.BatchSpanProcessor(CloudTraceLoggingSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

...

ここでは、トレーサーとエクスポータを初期化します。エクスポータの詳細は tracing.py で確認できます。ここでは、クラウド トレースにエクスポートできるトレースデータに上限があるため、カスタム エクスポータを作成します。このトレース機能には、https://googlecloudplatform.github.io/agent-starter-pack/guide/observability.html の実装を使用しています。

サービス ウェブ開発 UI にアクセスして、エージェントとチャットしてみます。その後、Cloud コンソールの検索バーに「Trace エクスプローラ」と入力し、[Trace エクスプローラ] プロダクトを選択します。

4353c0f8982361ab.png

トレース エクスプローラ ページに、エージェントとの会話のトレースが送信されたことが表示されます。[スパン名] セクションで確認し、エージェント固有のスパン(agent_run [weather_agent] という名前)をフィルタで除外できます。

c4336d117a3d2f6a.png

スパンがすでにフィルタされている場合は、各トレースを直接検査することもできます。エージェントが実行した各アクションの詳細な所要時間が表示されます。たとえば、以下の画像をご覧ください。

76a56dff77979037.png

1a3ce0a803d6061a.png

各セクションで、以下のように属性の詳細を確認できます。

2c87b6d67b0164a8.png

これで、エージェントとユーザーのやり取りに関するオブザーバビリティと情報が充実し、問題のデバッグに役立つようになりました。さまざまなツールやワークフローを試してみてください。

9. 課題

マルチエージェント ワークフローまたはエージェント ワークフローを試して、負荷がかかった場合のパフォーマンスとトレースを確認する

10. クリーンアップ

この Codelab で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
  4. コンソールで [Cloud Run] に移動し、デプロイしたサービスを選択して削除することもできます。