Skip to content

使用 Cloud Trace 进行智能体可观测性

使用 ADK,你已经能够利用强大的 Web 开发 UI 在本地检查和观察智能体交互,这在这里已有讨论。但是,如果我们的目标是云端部署,我们将需要一个集中式仪表板来观察真实流量。

Cloud Trace 是 Google Cloud Observability 的一个组件。它是一个强大的工具,专门专注于跟踪功能,用于监控、调试和改进应用程序的性能。对于智能体开发套件 (ADK) 应用程序,Cloud Trace 实现了全面的跟踪,帮助你了解请求如何流经智能体的交互,并识别 AI 智能体中的性能瓶颈或错误。

概述

Cloud Trace 基于 OpenTelemetry 构建,这是一个支持多种语言和摄取方法的开源标准,用于生成跟踪数据。这与 ADK 应用程序的可观测性实践保持一致,后者也利用 OpenTelemetry 兼容的工具,允许你:

  • 跟踪智能体交互:Cloud Trace 持续收集和分析项目中的跟踪数据,使你能够快速诊断 ADK 应用程序中的延迟问题和错误。这种自动数据收集简化了识别复杂智能体工作流中问题的过程。
  • 调试问题:通过分析详细跟踪快速诊断延迟问题和错误。对于理解表现为跨不同服务通信延迟增加或特定智能体操作(如工具调用)期间问题的理解至关重要。
  • 深度分析和可视化:Trace Explorer 是分析跟踪的主要工具,提供可视化辅助工具,如跨持续时间的热图和请求/错误率的折线图。它还提供了一个按服务和操作分组的跨度表,提供代表性跟踪的一键访问和瀑布视图,以便轻松识别智能体执行路径中的瓶颈和错误来源

以下示例将假设以下智能体目录结构

working_dir/
├── weather_agent/
│   ├── agent.py
│   └── __init__.py
└── deploy_agent_engine.py
└── deploy_fast_api_app.py
└── agent_runner.py
# weather_agent/agent.py

import os
from google.adk.agents import Agent

os.environ.setdefault("GOOGLE_CLOUD_PROJECT", "{your-project-id}")
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")


# 定义一个工具函数
def get_weather(city: str) -> dict:
    """检索指定城市的当前天气报告。

    Args:
        city (str): 要检索天气报告的城市名称。

    Returns:
        dict: 状态和结果或错误消息。
    """
    if city.lower() == "new york":
        return {
            "status": "success",
            "report": (
                "纽约的天气是晴天,温度为 25 度"
                " 摄氏度(77 华氏度)。"
            ),
        }
    else:
        return {
            "status": "error",
            "error_message": f"'{city}' 的天气信息不可用。",
        }


# 创建一个带有工具的智能体
root_agent = Agent(
    name="weather_agent",
    model="gemini-2.5-flash",
    description="使用天气工具回答问题的智能体。",
    instruction="你必须使用可用的工具来找到答案。",
    tools=[get_weather],
)

Cloud Trace 设置

智能体引擎部署设置

智能体引擎部署 - 从 ADK CLI

你可以通过在部署智能体时添加 --trace_to_cloud 标志来启用云跟踪,使用 adk deploy agent_engine 命令进行智能体引擎部署。

adk deploy agent_engine \
    --project=$GOOGLE_CLOUD_PROJECT \
    --region=$GOOGLE_CLOUD_LOCATION \
    --staging_bucket=$STAGING_BUCKET \
    --trace_to_cloud \
    $AGENT_PATH

智能体引擎部署 - 从 Python SDK

如果你更喜欢使用 Python SDK,你可以在初始化 AdkApp 对象时通过添加 enable_tracing=True 来启用云跟踪

# deploy_agent_engine.py

from vertexai.preview import reasoning_engines
from vertexai import agent_engines
from weather_agent.agent import root_agent

import vertexai

PROJECT_ID = "{your-project-id}"
LOCATION = "{your-preferred-location}"
STAGING_BUCKET = "{your-staging-bucket}"

vertexai.init(
    project=PROJECT_ID,
    location=LOCATION,
    staging_bucket=STAGING_BUCKET,
)

adk_app = reasoning_engines.AdkApp(
    agent=root_agent,
    enable_tracing=True,
)


remote_app = agent_engines.create(
    agent_engine=adk_app,
    extra_packages=[
        "./weather_agent",
    ],
    requirements=[
        "google-cloud-aiplatform[adk,agent_engines]",
    ],
)

Cloud Run 部署设置

Cloud Run 部署 - 从 ADK CLI

你可以通过在部署智能体时添加 --trace_to_cloud 标志来启用云跟踪,使用 adk deploy cloud_run 命令进行 cloud run 部署。

adk deploy cloud_run \
    --project=$GOOGLE_CLOUD_PROJECT \
    --region=$GOOGLE_CLOUD_LOCATION \
    --trace_to_cloud \
    $AGENT_PATH

如果你想启用云跟踪并在 Cloud Run 上使用自定义智能体服务部署,可以参考下面的自定义部署设置部分

自定义部署设置

从内置 get_fast_api_app 模块

如果你想自定义自己的智能体服务,你可以通过使用内置的 get_fast_api_app 模块初始化 FastAPI 应用并设置 trace_to_cloud=True 来启用云跟踪

# deploy_fast_api_app.py

import os
from google.adk.cli.fast_api import get_fast_api_app
from fastapi import FastAPI

# 为云跟踪设置 GOOGLE_CLOUD_PROJECT 环境变量
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", "alvin-exploratory-2")

# 发现当前工作目录中的 `weather_agent` 目录
AGENT_DIR = os.path.dirname(os.path.abspath(__file__))

# 创建启用了云跟踪的 FastAPI 应用
app: FastAPI = get_fast_api_app(
    agents_dir=AGENT_DIR,
    web=True,
    trace_to_cloud=True,
)

app.title = "weather-agent"
app.description = "用于与智能体 weather-agent 交互的 API"


# 主执行
if __name__ == "__main__":
    import uvicorn

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

从自定义智能体运行器

如果你想完全自定义 ADK 智能体运行时,你可以通过使用 Opentelemetry 的 CloudTraceSpanExporter 模块来启用云跟踪。

# agent_runner.py

from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from weather_agent.agent import root_agent as weather_agent
from google.genai.types import Content, Part
from opentelemetry import trace
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.sdk.trace import export
from opentelemetry.sdk.trace import TracerProvider

APP_NAME = "weather_agent"
USER_ID = "u_123"
SESSION_ID = "s_123"

provider = TracerProvider()
processor = export.BatchSpanProcessor(
    CloudTraceSpanExporter(project_id="{your-project-id}")
)
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)

session_service = InMemorySessionService()
runner = Runner(agent=weather_agent, app_name=APP_NAME, session_service=session_service)


async def main():
    session = await session_service.get_session(
        app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID
    )
    if session is None:
        session = await session_service.create_session(
            app_name=APP_NAME, user_id=USER_ID, session_id=SESSION_ID
        )

    user_content = Content(
        role="user", parts=[Part(text="巴黎的天气怎么样?")]
    )

    final_response_content = "没有响应"
    async for event in runner.run_async(
        user_id=USER_ID, session_id=SESSION_ID, new_message=user_content
    ):
        if event.is_final_response() and event.content and event.content.parts:
            final_response_content = event.content.parts[0].text

    print(final_response_content)


if __name__ == "__main__":
    import asyncio

    asyncio.run(main())

检查 Cloud Traces

设置完成后,每当你与智能体交互时,它都会自动将跟踪数据发送到 Cloud Trace。你可以通过访问 console.cloud.google.com 并在配置的 Google Cloud Project 上访问 Trace Explorer 来检查跟踪

cloud-trace

然后你将看到由 ADK 智能体产生的所有可用跟踪,这些跟踪配置在多个跨度名称中,如 invocationagent_runcall_llmexecute_tool

cloud-trace

如果你点击其中一个跟踪,你将看到详细过程的瀑布视图,类似于我们在 Web 开发 UI 中使用 adk web 命令看到的视图。

cloud-trace

资源