Google ADK
Google ADK
Google ADK(Agent Development Kit)로 AI 에이전트를 만들고 있다면, 그 실행도 추적하고 싶겠죠. 통합은 OpenTelemetry를 통해 동작합니다. ADK가 이미 호출·에이전트·모델·도구에 대한 자체 OpenTelemetry 스팬을 만들어 내기 때문에, confident-trace가 그 스팬을 받아 프레임워크를 감싸지 않고도 Confident AI로 내보내 줘요.
출처: 문서
본문
개요
Google ADK(Agent Development Kit)는 AI 에이전트를 빌드·평가·배포하기 위한 Google의 오픈소스 프레임워크입니다.
이 통합은 OpenTelemetry로 동작해요. ADK는 이미 호출·에이전트·모델·도구에 대한 자체 OpenTelemetry 스팬을 만듭니다. Confident AI의 OpenTelemetry 네이티브 추적 SDK인 confident-trace가 그 스팬을 받아, 프레임워크를 감싸지 않고도 Confident AI로 내보내요.
ADK는 스팬을 공유 전역 OpenTelemetry tracer 프로바이더에 쓰는데,
init()이 Confident AI exporter를 설치하는 곳이 바로 그 프로바이더예요. 앱이 자체 프로바이더를 구성한다면, ADK가 초기화되기 전에 그 프로바이더를 전역으로 등록하세요 — 기존 OpenTelemetry 프로바이더를 참고하세요.
ADK 밖에서(또는 도구 함수 안에서)
google-genai를 직접 호출하고 있나요? 그 호출은 Google GenAI 프로바이더 통합이 추적해 Confident AI LLM 스팬으로 보여줘요. ADK를 통해 한 호출은 ADK 자체의 모델 스팬에 한 번만 기록되므로, 중복은 볼 수 없어요.
| Runtime | Requirements | Setup |
|---|---|---|
| Python | Python 3.10+, google-adk (tested with 2.8.0) |
Call init() before running the runner |
| TypeScript | Not supported | — |
자동 계측
EU 리전 사용자는 OTEL 엔드포인트를 EU 버전으로 설정하세요. 그렇지 않으면 트레이스가 우리 US 서버로 보내집니다.
export CONFIDENT_OTEL_ENDPOINT="https://eu.otel.confident-ai.com/v1/traces"
의존성 설치
필요한 패키지를 설치하는 명령을 실행하세요.
pip install confident-trace google-adk
Confident AI 키 설정
Confident AI Project API key를 받아 환경 변수로 설정하거나, init()에 직접 전달하세요.
export CONFIDENT_API_KEY="<your-confident-api-key>"
export GOOGLE_API_KEY="<your-google-key>"
from confident_trace import init
init(api_key="<your-confident-api-key>")
Google ADK 계측
시작 시, 러너가 실행되기 전에 init()을 한 번 호출하세요. ADK 에이전트, 러너, 세션은 평소처럼 만들면 돼요.
import asyncio
from confident_trace import init, shutdown
from google.adk.agents import LlmAgent
from google.adk.runners import InMemoryRunner
from google.genai import types
async def main():
init()
runner = InMemoryRunner(
app_name="my_app",
agent=LlmAgent(
name="my_agent",
model="gemini-2.5-flash",
description="A helpful assistant.",
instruction="Answer questions concisely.",
),
)
session = await runner.session_service.create_session(
app_name="my_app", user_id="user-42"
)
try:
async for event in runner.run_async(
user_id="user-42",
session_id=session.id,
new_message=types.Content(
role="user", parts=[types.Part(text="What is OpenTelemetry?")]
),
):
if event.content and event.content.parts:
print(event.content.parts[0].text or "", end="")
print()
finally:
shutdown()
asyncio.run(main())
한 번 초기화하고, 한 번 종료하세요. 장기 실행 서버에서는 시작 시
init()을, 정상 종료 시 활성 호출이 끝난 뒤shutdown()을 호출하세요 — 요청마다 하지 마세요. 한 번 초기화를 참고하세요.
에이전트 실행
스크립트를 실행해 에이전트를 호출하세요.
python main.py
완료 ✅. Confident AI 프로젝트에서 Observatory를 열어 트레이스를 확인하세요.
트레이스가 안 보이면, 거의 항상 프로그램이 트레이스를 보낼 기회가 생기기 전에 종료됐기 때문이에요. 종료 전에 반드시
shutdown()(장기 실행 프로세스에선flush())을 호출하세요 — 트러블슈팅 페이지를 참고하세요.
무엇이 포착되나
Google ADK 실행은 계층이 그대로 보존된 채 내보내져서, 각 호출을 에이전트·모델 호출·도구를 따라갈 수 있어요.
- 호출 수명 주기 — 각 실행의 작업 이름, 타이밍, 상태, 세션 컨텍스트
- 에이전트 실행 — 어떤 에이전트가 참여했고 어떤 순서로 실행됐는지
- 모델 호출 — 요청·응답 콘텐츠, 모델 상세, 완료 사유, 토큰 사용량
- 도구 호출 — 도구 이름과 그 입출력
- 오류 — 실패한 작업이 트레이스에 오류 상태를 유지
ADK는 일부 메시지 콘텐츠를 스팬이 아니라 OpenTelemetry 로그 에 넣어요.
confident-trace는 트레이스만 내보내므로, 콘텐츠가 예상보다 빈약해 보이면ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS가false로 설정되지 않았는지 확인하세요 — 그 변수(와 ADK 자체 텔레메트리 구성)가 ADK가 스팬에 무엇을 넣을지 제어하거든요.
트레이스 스팬 속성 설정
호출이 시작되기 전에 아는 속성을 추가하려면 트레이스 컨텍스트를 사용하세요. 추가 스팬은 만들지 않아요. runner.run_async()이 시작한 트레이스가 태그, 메타데이터, 사용자 ID, 고객 ID를 상속받습니다.
from confident_trace import init, trace_context
from google.genai import types
init()
message = types.Content(role="user", parts=[types.Part(text="Explain OpenTelemetry.")])
async with trace_context(
tags=["support"],
metadata={"release": "2026-09"},
user_id="user-42",
customer_id="customer-7",
):
async for event in runner.run_async(
user_id="user-42", session_id=session.id, new_message=message
):
pass
각 ID와 함께 선택적 표시 이름을 설정하려면 사용자와 고객을, 지원되는 모든 트레이스 속성과 갱신 동작은 트레이스 컨텍스트를 참고하세요.
다중 턴 계측
Google ADK 엔트리포인트 호출 하나가 이미 하나의 대화 턴일 때는 turn()이 필요 없어요 — 통합이 그 턴의 트레이스를 자동으로 만들어 주거든요. 경계를 직접 정의하고 싶을 때, 예를 들어 두 번의 연속 Google ADK 호출을 하나의 턴으로 묶고 싶을 때 turn()을 사용하세요. 이후 턴에서 같은 스레드 ID를 재사용해 하나의 대화로 묶으면 돼요.
from confident_trace import init, turn
from google.genai import types
init()
async with turn("support-turn", thread_id="chat-42"):
for prompt in ("Find the relevant account details.", "Summarize those details."):
message = types.Content(role="user", parts=[types.Part(text=prompt)])
async for event in runner.run_async(
user_id="user-42", session_id=session.id, new_message=message
):
pass
스레드 입출력, 턴 ID, 사용자 ID는 스레드를 참고하세요.
Google ADK 계측 비활성화
특정 통합만 활성화하려면 init()에 통합 식별자 목록을 전달하세요. Google ADK의 식별자는 Python에서 "google_adk"이고, 이를 빼면 이 통합이 비활성화돼요. 빈 목록은 모든 자동 계측을 비활성화합니다.
from confident_trace import init
init(instrumentations=())
# Use ("google_adk",) to opt in; omit "google_adk" to disable it.
이렇게 하면 Confident AI의 자동 instrumentor가 꺼져요. Google ADK는 여전히 자체 네이티브 OpenTelemetry 스팬을 만들 수 있습니다.
다음 단계
에이전트를 추적했으니, 더 깊이 들어가 볼까요.
Online Evals
트레이스와 스팬이 Confident AI로 수집되는 실시간으로 평가를 돌려 에이전트 품질을 모니터링하세요.
Threads
같은 ADK 세션의 호출을 스레드로 묶고, 전체 대화를 하나의 단위로 평가하세요.
더 알아보기
- OpenInference — OpenInference 계측기로 스팬 만들기
- Online Evals — 수집되는 트레이스·스팬을 실시간으로 평가