AI Agent可观测性:企业级智能体运行监控与故障诊断实践
一、黑盒困境:AI Agent为何需要全新的可观测性范式
2025年,AI Agent从实验室走向规模化生产落地。从开发者日常使用的代码助手到企业服务场景下的智能客服,再到复杂度持续升级的多智能体协同系统,AI Agent正在以前所未有的速度渗透企业核心业务。
然而,与传统的确定性软件不同,AI Agent的本质是非确定性的。一个AI Agent通过重复的决策步骤解决问题,而非单次响应——在每一步中,它可以选择直接从内部模型知识回答,也可以委托给外部工具,观察结果后继续。这种动态生成的执行路径,使得每一轮执行都可能不同。
传统监控工具面临一个根本性的语义鸿沟(semantic gap):现有工具要么观察Agent的高层意图(通过LLM提示词),要么观察其底层系统动作(如系统调用),但无法将这两个视角关联起来。这种盲目性使得区分良性操作、恶意攻击和代价高昂的故障变得极其困难。
正因如此,可观测性必须从一开始就成为AI Agent系统的基础设施,而非事后补救。IBM在其watsonx.governance中引入的智能体监控功能,正是为了解决企业提出的两个核心问题:“我能精确查看我的AI智能体在生产环境中的实际行为吗?”“我能否获得关于AI治理与AI安全状况的统一视图?”
AgentOps作为一种DevOps/MLOps式的端到端平台应运而生,涵盖智能体系统的开发、评估、测试、部署和生产运维的全生命周期。本文将从追踪(Tracing)、日志(Logging)、评估(Evaluation)和故障恢复(Recovery)四个维度,系统阐述企业级AI Agent可观测性体系的设计与实践。
二、追踪(Tracing):让Agent的执行路径完全可见
2.1 Trace与Span模型
Agent调试的本质是“让不可见变得可见”。OpenTelemetry提供了核心的Trace和Span模型:
Trace = 一次任务执行的完整故事(从开始到结束)
Span = 故事中的每个章节(一步操作)
一个Trace包含多个Span,形成一棵执行树:
Trace: "分析代码质量" (总耗时 5分32秒)
├── Span: 读取 README.md (耗时 0.2秒)
├── Span: 遍历 src/ 目录 (耗时 0.5秒)
│ ├── Span: 分析 main.py (耗时 1.2秒)
│ ├── Span: 分析 utils.py (耗时 0.8秒)
│ └── Span: 分析 config.py (耗时 0.3秒)
├── Span: 调用 LLM 分析代码结构 (耗时 45秒, 3200 tokens)
├── Span: 调用 LLM 生成报告 (耗时 38秒, 2800 tokens)
└── Span: 工具调用 git log (耗时 2.1秒)
2.2 基于OpenTelemetry的标准化追踪
OpenTelemetry已成为AI Agent可观测性的事实标准。AWS Bedrock AgentCore Observability、阿里云LoongSuite等主流方案均基于OpenTelemetry构建。
OpenTelemetry GenAI语义规范定义了追踪智能体系统所需的标准属性,包括任务(task)、动作(action)、智能体(agent)、团队(team)、工件(artifact)和记忆(memory)。Datadog等厂商已原生支持OTel GenAI语义规范,实现对提示词、模型响应、Token用量、工具/智能体调用和提供商元数据的标准化追踪。
以下是一个基于OpenTelemetry的Agent追踪 instrumentation实现示例:
# agent_tracing.py - 基于OpenTelemetry的AI Agent追踪装饰器
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.semconv.gen_ai import GenAIAttributes
from functools import wraps
import json
from typing import Dict, Any, Optional
# 初始化TracerProvider
tracer_provider = TracerProvider()
span_processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://jaeger:4317"))
tracer_provider.add_span_processor(span_processor)
trace.set_tracer_provider(tracer_provider)
tracer = trace.get_tracer(__name__)
def agent_trace(agent_name: str, operation: str):
"""装饰器:为Agent的每个步骤自动生成追踪Span"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 从上下文中提取trace_id用于关联
ctx = trace.get_current_span().get_span_context() if trace.get_current_span() else None
with tracer.start_as_current_span(
f"{agent_name}.{operation}",
attributes={
"gen_ai.agent.name": agent_name,
"gen_ai.agent.operation": operation,
"gen_ai.agent.version": "1.0.0",
# OpenTelemetry GenAI语义规范属性
"gen_ai.conversation.id": kwargs.get("conversation_id", ""),
"gen_ai.request.model": kwargs.get("model", "unknown"),
}
) as span:
try:
result = func(*args, **kwargs)
# 记录Token用量(OpenTelemetry GenAI规范)
if isinstance(result, dict) and "usage" in result:
span.set_attribute("gen_ai.usage.input_tokens", result["usage"].get("prompt_tokens", 0))
span.set_attribute("gen_ai.usage.output_tokens", result["usage"].get("completion_tokens", 0))
span.set_attribute("gen_ai.usage.total_tokens", result["usage"].get("total_tokens", 0))
span.set_status(trace.StatusCode.OK)
return result
except Exception as e:
span.record_exception(e)
span.set_status(trace.StatusCode.ERROR, str(e))
raise
return wrapper
return decorator
# 使用示例:为Agent的LLM调用步骤添加追踪
class ResearchAgent:
def __init__(self, model: str = "gpt-4"):
self.model = model
self.tools = []
@agent_trace(agent_name="ResearchAgent", operation="llm_call")
def call_llm(self, prompt: str, conversation_id: Optional[str] = None, **kwargs):
"""调用LLM,自动生成追踪Span"""
# 实际的LLM调用逻辑
response = self._execute_llm_call(prompt)
# 返回包含Token用量的结果
return {
"content": response["content"],
"usage": response.get("usage", {}),
"model": self.model
}
@agent_trace(agent_name="ResearchAgent", operation="tool_invoke")
def invoke_tool(self, tool_name: str, tool_args: Dict[str, Any], conversation_id: Optional[str] = None):
"""调用工具,自动生成追踪Span"""
# 工具调用逻辑
result = self._execute_tool(tool_name, tool_args)
return result
2.3 无侵入追踪:eBPF技术的新路径
传统的SDK插桩方式要求修改应用代码,这在快速迭代的Agent开发中可能成为瓶颈。边界追踪(boundary tracing)提供了一种新的思路——在稳定的系统接口处从外部监控Agent,无需修改应用代码。
AgentSight框架利用eBPF技术,在无需插桩的情况下拦截TLS加密的LLM流量以提取语义意图,同时监控内核事件以观察系统级影响。这种技术具有以下优势:
框架无关:适用于任何Agent框架(LangChain、AutoGPT、Claude Code等)
对API变化弹性高:不依赖于特定SDK版本
性能开销低:<3%的性能损耗
可检测:提示注入攻击、资源浪费的推理循环、多Agent系统中的隐藏协调瓶颈
# AgentSight eBPF追踪配置示例(概念性)
# 使用eBPF程序挂载到系统调用和TLS库函数上
# 以下为eBPF C代码片段示意(实际部署需编译为BPF字节码)
"""
SEC("uprobe//usr/lib/x86_64-linux-gnu/libssl.so.3/SSL_write")
int trace_ssl_write(struct pt_regs *ctx) {
// 拦截LLM请求的TLS加密流量
void *ssl = (void *)PT_REGS_PARM1(ctx);
void *buf = (void *)PT_REGS_PARM2(ctx);
int len = (int)PT_REGS_PARM3(ctx);
// 提取请求内容(在TLS加密前捕获)
char payload[4096];
bpf_probe_read_user(payload, sizeof(payload), buf);
// 将payload发送到用户态处理程序进行语义分析
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, payload, len);
return 0;
}
SEC("kprobe/do_sys_openat2")
int trace_file_open(struct pt_regs *ctx) {
// 监控Agent的文件系统操作(系统调用层面)
// 与TLS层的事件关联,建立“意图-动作”映射
return 0;
}
"""
三、日志(Logging):结构化、可检索的执行记录
3.1 三层日志模型
AgentTrace框架提出了一个关键洞察:传统的日志系统不足以满足Agent系统的可观测性需求。它定义了三层结构化日志表面:
层级 | 内容 | 用途 |
|---|---|---|
操作层(Operational) | 系统调用、API请求、工具执行、网络I/O | 性能监控、资源追踪、故障定位 |
认知层(Cognitive) | LLM推理步骤、思维链(CoT)、决策依据 | 理解Agent行为、检测对齐偏差 |
上下文层(Contextual) | 会话状态、记忆内容、环境变量、任务目标 | 状态恢复、行为复现、审计溯源 |
AgentTrace强调持续的、可内省的追踪捕获,不仅服务于调试或基准测试,更作为Agent安全、责任归属和实时监控的基础层。
3.2 结构化日志实现
# agent_logging.py - 结构化日志系统
import structlog
import json
from datetime import datetime
from typing import Any, Dict, Optional
import uuid
# 配置structlog
structlog.configure(
processors=[
structlog.processors.TimeStamper(fmt="iso"),
structlog.processors.JSONRenderer()
]
)
logger = structlog.get_logger()
class AgentLogger:
"""Agent三层结构化日志记录器"""
def __init__(self, agent_name: str, session_id: Optional[str] = None):
self.agent_name = agent_name
self.session_id = session_id or str(uuid.uuid4())
self.trace_id = None
def _log(self, level: str, layer: str, event: str, **kwargs):
"""核心日志记录方法"""
log_entry = {
"timestamp": datetime.utcnow().isoformat(),
"agent": self.agent_name,
"session_id": self.session_id,
"trace_id": self.trace_id,
"layer": layer, # "operational" | "cognitive" | "contextual"
"event": event,
"level": level,
**kwargs
}
# 输出JSON格式日志,便于检索和回放
print(json.dumps(log_entry))
return log_entry
# ---- 操作层日志 ----
def log_tool_call(self, tool_name: str, args: Dict, result: Any, duration_ms: float):
return self._log(
"INFO", "operational", "tool_execution",
tool_name=tool_name,
args=args,
result_preview=str(result)[:500],
duration_ms=duration_ms
)
def log_llm_call(self, model: str, prompt: str, response: str,
prompt_tokens: int, completion_tokens: int, latency_ms: float):
return self._log(
"INFO", "operational", "llm_inference",
model=model,
prompt_preview=prompt[:200],
response_preview=response[:200],
prompt_tokens=prompt_tokens,
completion_tokens=completion_tokens,
total_tokens=prompt_tokens + completion_tokens,
latency_ms=latency_ms,
cost_estimate=self._estimate_cost(model, prompt_tokens, completion_tokens)
)
# ---- 认知层日志 ----
def log_reasoning_step(self, step_number: int, thought: str, action: str, action_input: str):
return self._log(
"DEBUG", "cognitive", "reasoning_step",
step_number=step_number,
thought=thought[:500],
action=action,
action_input=action_input[:200]
)
def log_decision(self, decision: str, alternatives: list, confidence: float):
return self._log(
"INFO", "cognitive", "decision_made",
decision=decision,
alternatives=alternatives,
confidence=confidence
)
# ---- 上下文层日志 ----
def log_state_snapshot(self, state: Dict, checkpoint_id: str):
return self._log(
"INFO", "contextual", "state_snapshot",
checkpoint_id=checkpoint_id,
state=state
)
def log_memory_update(self, memory_type: str, key: str, value_preview: str):
return self._log(
"DEBUG", "contextual", "memory_update",
memory_type=memory_type, # "short_term" | "long_term" | "episodic"
key=key,
value_preview=value_preview[:200]
)
def set_trace_id(self, trace_id: str):
self.trace_id = trace_id
@staticmethod
def _estimate_cost(model: str, prompt_tokens: int, completion_tokens: int) -> float:
"""估算LLM调用成本(示例)"""
rates = {
"gpt-4": {"prompt": 0.03, "completion": 0.06}, # 每1K tokens
"gpt-3.5-turbo": {"prompt": 0.001, "completion": 0.002},
"claude-3-opus": {"prompt": 0.015, "completion": 0.075},
}
rate = rates.get(model, {"prompt": 0.01, "completion": 0.03})
return (prompt_tokens / 1000 * rate["prompt"]) + (completion_tokens / 1000 * rate["completion"])
3.3 日志关联与检索
在生产环境中,日志需要与追踪(Trace)和指标(Metrics)关联。通过统一的trace_id、session_id和span_id,可以实现从用户请求到每一次LLM调用、工具执行的完整链路追溯。
# 日志与追踪关联示例
{
"timestamp": "2026-08-03T14:32:18.456Z",
"agent": "CustomerSupportAgent",
"session_id": "sess_abc123",
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
"span_id": "00f067aa0ba902b7",
"layer": "operational",
"event": "llm_inference",
"model": "gpt-4",
"prompt_tokens": 245,
"completion_tokens": 187,
"latency_ms": 1234,
"cost_estimate": 0.0186
}
四、评估(Evaluation):从“跑起来了”到“知道好不好”
4.1 评估的必要性
大多数团队仍停留在“散落的日志、临时的评估脚本、对模型排行榜的截图、对特定Agent或模型为何失败的零理解”阶段。生产环境中的Agent评估需要系统化的方法论。
Amazon CloudWatch现已支持通过AgentCore Evaluations对AI Agent进行自动化质量评估,开发者可以持续监控Agent质量,并在CloudWatch仪表板中查看统一的质量指标和Agent遥测数据。
4.2 多维度评估指标体系
AWS在其Agentic AI基础设施实践中,构建了包含以下维度的评估指标体系:
维度 | 关键指标 | 测量方式 |
|---|---|---|
任务完成率 | 任务成功率、步骤完成率 | 端到端任务验证 |
决策准确性 | 工具选择准确率、推理正确率 | 人工标注/LLM-as-Judge |
效率 | 执行步数、Token消耗、端到端延迟 | 追踪数据分析 |
安全性 | 违规操作率、提示注入检测率 | 策略引擎审计 |
成本 | 每任务成本、模型调用成本 | Token用量×单价 |
主流评估框架包括:
AgentBench:多维度Agent能力基准测试
AgentBoard:可视化Agent评估平台
τ-bench:面向工具使用场景的评估框架
MCPEval:基于模型上下文协议(MCP)的自动化端到端评估框架
4.3 自动化评估流水线
TraceVerse生态系统提供了一个完整的Agent评估流水线参考实现:
┌─────────────────────────────────────────────────────────────┐
│ TraceVerse 评估流水线 │
├─────────────────────────────────────────────────────────────┤
│ TraceVerde → 零代码OTel插桩,捕获所有LLM调用、 │
│ (genai_otel_instrument) 工具调用、向量检索 │
│ ↓ │
│ SMOLTRACE → 运行Agent评估,生成4类HF数据集 │
│ (Evaluation Engine) (排行榜/结果/追踪/指标) │
│ ↓ │
│ TraceMind MCP Server → AI驱动的分析(11个工具+3个资源) │
│ ↓ │
│ TraceMind-AI → Gradio交互界面,自然语言查询 │
│ (Gradio App) "为什么这个任务失败了?" │
└─────────────────────────────────────────────────────────────┘
# agent_evaluation.py - Agent评估框架示例
from typing import List, Dict, Any, Optional
from dataclasses import dataclass, field
import json
import asyncio
@dataclass
class EvaluationResult:
"""单次评估结果"""
task_id: str
success: bool
steps_taken: int
total_tokens: int
total_latency_ms: float
tool_calls: int
error: Optional[str] = None
metrics: Dict[str, float] = field(default_factory=dict)
@dataclass
class EvaluationSuite:
"""评估套件"""
name: str
tasks: List[Dict[str, Any]]
results: List[EvaluationResult] = field(default_factory=list)
def add_result(self, result: EvaluationResult):
self.results.append(result)
def summary(self) -> Dict[str, float]:
"""生成评估摘要"""
total = len(self.results)
if total == 0:
return {}
successes = sum(1 for r in self.results if r.success)
return {
"success_rate": successes / total,
"avg_steps": sum(r.steps_taken for r in self.results) / total,
"avg_tokens": sum(r.total_tokens for r in self.results) / total,
"avg_latency_ms": sum(r.total_latency_ms for r in self.results) / total,
"avg_tool_calls": sum(r.tool_calls for r in self.results) / total,
}
class AgentEvaluator:
"""Agent评估引擎"""
def __init__(self, agent, logger):
self.agent = agent
self.logger = logger
self.suites: Dict[str, EvaluationSuite] = {}
def create_suite(self, name: str, tasks: List[Dict]) -> EvaluationSuite:
"""创建评估套件"""
suite = EvaluationSuite(name=name, tasks=tasks)
self.suites[name] = suite
return suite
async def run_suite(self, suite_name: str) -> EvaluationSuite:
"""运行评估套件"""
suite = self.suites.get(suite_name)
if not suite:
raise ValueError(f"Suite {suite_name} not found")
for task in suite.tasks:
self.logger.info(f"Running eval task: {task.get('name', 'unnamed')}")
try:
# 执行任务并收集追踪数据
result = await self._execute_task(task)
suite.add_result(result)
except Exception as e:
self.logger.error(f"Task failed: {e}")
suite.add_result(EvaluationResult(
task_id=task.get("id", "unknown"),
success=False,
steps_taken=0,
total_tokens=0,
total_latency_ms=0,
tool_calls=0,
error=str(e)
))
# 输出评估摘要
summary = suite.summary()
self.logger.info(f"Suite {suite_name} summary: {json.dumps(summary)}")
return suite
async def _execute_task(self, task: Dict) -> EvaluationResult:
"""执行单个评估任务(带追踪)"""
# 实际实现中会调用Agent并收集追踪数据
# 此处为示意结构
pass
五、故障恢复(Recovery):从“崩溃重启”到“自愈闭环”
5.1 Agent故障的特殊性
AI Agent的故障与传统软件有本质区别。传统监控无法捕捉的故障模式包括:
推理退化:Agent陷入无效的推理循环
工具误用:选择了错误的工具或传入了错误的参数
幻觉传播:早期的轻微幻觉在后续步骤中被放大
上下文溢出:对话历史超过模型上下文窗口
VIGIL(自省式运行时)展示了一种从“LLM驱动的脚本”向自愈Agent运行时的转变——系统能够在严格的结构和语义护栏下观察、诊断和修复自身行为。
5.2 检查点与断点续跑
检查点机制是实现Agent故障恢复的基础。核心思路是在每个执行步骤后保存Agent的状态快照,当故障发生时从最近的检查点恢复。
# agent_checkpoint.py - Agent检查点与恢复机制
import pickle
import hashlib
import json
from datetime import datetime
from typing import Any, Dict, Optional, List
from pathlib import Path
import redis
import zlib
class AgentCheckpointManager:
"""Agent检查点管理器"""
def __init__(self, redis_client: Optional[redis.Redis] = None, local_dir: str = "./checkpoints"):
self.redis = redis_client
self.local_dir = Path(local_dir)
self.local_dir.mkdir(parents=True, exist_ok=True)
def save_checkpoint(self, agent_id: str, step_id: str, state: Dict[str, Any]) -> str:
"""保存Agent状态检查点"""
checkpoint = {
"agent_id": agent_id,
"step_id": step_id,
"timestamp": datetime.utcnow().isoformat(),
"state": state,
"checksum": self._compute_checksum(state)
}
# 序列化并压缩
serialized = pickle.dumps(checkpoint)
compressed = zlib.compress(serialized)
# 生成检查点ID
checkpoint_id = hashlib.sha256(f"{agent_id}:{step_id}:{datetime.utcnow().isoformat()}".encode()).hexdigest()[:16]
# 存储到Redis(热数据)和本地(持久化)
if self.redis:
self.redis.setex(f"checkpoint:{checkpoint_id}", 86400 * 7, compressed) # 7天TTL
# 本地持久化
checkpoint_path = self.local_dir / f"{checkpoint_id}.cp"
with open(checkpoint_path, "wb") as f:
f.write(compressed)
return checkpoint_id
def load_checkpoint(self, checkpoint_id: str) -> Optional[Dict[str, Any]]:
"""加载检查点"""
# 尝试从Redis加载
if self.redis:
data = self.redis.get(f"checkpoint:{checkpoint_id}")
if data:
return self._deserialize_checkpoint(data)
# 回退到本地
checkpoint_path = self.local_dir / f"{checkpoint_id}.cp"
if checkpoint_path.exists():
with open(checkpoint_path, "rb") as f:
return self._deserialize_checkpoint(f.read())
return None
def list_checkpoints(self, agent_id: str, limit: int = 10) -> List[Dict]:
"""列出Agent的所有检查点"""
# 实际实现中需要维护索引
checkpoints = []
for cp_file in sorted(self.local_dir.glob("*.cp"), key=lambda x: x.stat().st_mtime, reverse=True)[:limit]:
data = self._deserialize_checkpoint(cp_file.read_bytes())
if data and data.get("agent_id") == agent_id:
checkpoints.append({
"id": cp_file.stem,
"timestamp": data.get("timestamp"),
"step_id": data.get("step_id")
})
return checkpoints
def _compute_checksum(self, state: Dict) -> str:
"""计算状态校验和"""
state_str = json.dumps(state, sort_keys=True)
return hashlib.sha256(state_str.encode()).hexdigest()[:16]
def _deserialize_checkpoint(self, data: bytes) -> Optional[Dict]:
"""反序列化检查点"""
try:
decompressed = zlib.decompress(data)
return pickle.loads(decompressed)
except Exception:
return None
class DurableAgent:
"""支持断点续跑的Agent包装器"""
def __init__(self, agent, checkpoint_manager: AgentCheckpointManager):
self.agent = agent
self.checkpoint_manager = checkpoint_manager
self.agent_id = id(agent) # 实际应使用唯一标识
async def run_with_recovery(self, task: str, max_retries: int = 3) -> Any:
"""带故障恢复的Agent执行"""
retry_count = 0
checkpoint_id = None
restored_state = None
while retry_count < max_retries:
try:
if checkpoint_id:
# 从检查点恢复执行
restored_state = self.checkpoint_manager.load_checkpoint(checkpoint_id)
if restored_state:
print(f"Resuming from checkpoint {checkpoint_id}")
# 恢复Agent状态
self._restore_agent_state(restored_state["state"])
# 执行Agent任务
result = await self._run_agent(task, checkpoint_id)
# 成功完成,清理检查点
if checkpoint_id:
self.checkpoint_manager.redis.delete(f"checkpoint:{checkpoint_id}")
return result
except Exception as e:
retry_count += 1
print(f"Agent failed (attempt {retry_count}/{max_retries}): {e}")
# 保存检查点以便恢复
current_state = self._capture_agent_state()
checkpoint_id = self.checkpoint_manager.save_checkpoint(
self.agent_id,
f"step_{retry_count}",
current_state
)
print(f"Saved checkpoint {checkpoint_id} for recovery")
if retry_count >= max_retries:
raise RuntimeError(f"Agent failed after {max_retries} retries") from e
return None
async def _run_agent(self, task: str, checkpoint_id: Optional[str] = None):
"""实际Agent执行逻辑"""
pass
def _capture_agent_state(self) -> Dict:
"""捕获Agent当前状态"""
# 实际实现中需捕获:对话历史、记忆、任务队列、中间结果等
pass
def _restore_agent_state(self, state: Dict):
"""恢复Agent状态"""
pass
5.3 三层自愈架构
基于生产环境中运行多个Agent的经验,自愈架构可分为三个层次:
第一层:瞬时故障恢复(毫秒级)
网络超时、API限流、临时服务不可用
策略:指数退避重试、熔断器、超时控制
第二层:执行故障恢复(秒到分钟级)
工具调用失败、LLM输出格式错误、上下文溢出
策略:检查点恢复、替代路径执行、降级策略
第三层:系统性自愈(分钟到小时级)
Agent行为退化、模型漂移、安全违规
策略:自动回滚到已知良好版本、触发人工审核、模型切换
# self_healing.py - 三层自愈架构示例
import asyncio
from typing import Optional, Callable, Any
from enum import Enum
import time
class FailureLevel(Enum):
TRANSIENT = 1 # 瞬时故障
EXECUTION = 2 # 执行故障
SYSTEMIC = 3 # 系统性故障
class HealingStrategy:
"""自愈策略"""
@staticmethod
def retry_with_backoff(func: Callable, max_retries: int = 3, base_delay: float = 1.0):
"""策略1:指数退避重试"""
async def wrapper(*args, **kwargs):
for attempt in range(max_retries):
try:
return await func(*args, **kwargs)
except Exception as e:
if attempt == max_retries - 1:
raise
delay = base_delay * (2 ** attempt)
await asyncio.sleep(delay)
return None
return wrapper
@staticmethod
def checkpoint_recovery(checkpoint_manager, agent_id: str):
"""策略2:检查点恢复"""
def decorator(func: Callable):
async def wrapper(*args, **kwargs):
# 尝试从最新检查点恢复
checkpoints = checkpoint_manager.list_checkpoints(agent_id, limit=1)
if checkpoints:
checkpoint = checkpoint_manager.load_checkpoint(checkpoints[0]["id"])
if checkpoint:
# 恢复状态后继续执行
pass
return await func(*args, **kwargs)
return wrapper
return decorator
@staticmethod
def fallback_to_safe_mode(primary_func: Callable, fallback_func: Callable):
"""策略3:降级到安全模式"""
async def wrapper(*args, **kwargs):
try:
return await primary_func(*args, **kwargs)
except Exception:
# 记录降级事件
return await fallback_func(*args, **kwargs)
return wrapper
class SelfHealingAgent:
"""具备自愈能力的Agent"""
def __init__(self, agent, checkpoint_manager):
self.agent = agent
self.checkpoint_manager = checkpoint_manager
self.health_status = "healthy"
self.failure_history = []
async def execute_with_healing(self, task: str) -> Any:
"""带自愈机制的Agent执行"""
# 第一层:瞬时故障重试
try:
result = await HealingStrategy.retry_with_backoff(
self._execute_primary,
max_retries=3
)(task)
return result
except Exception as e:
self._record_failure(FailureLevel.TRANSIENT, e)
# 第二层:检查点恢复
try:
result = await self._execute_with_checkpoint_recovery(task)
return result
except Exception as e:
self._record_failure(FailureLevel.EXECUTION, e)
# 第三层:降级与告警
self.health_status = "degraded"
result = await HealingStrategy.fallback_to_safe_mode(
self._execute_primary,
self._execute_safe_mode
)(task)
# 触发人工介入告警
self._trigger_escalation()
return result
async def _execute_primary(self, task: str) -> Any:
"""主要执行路径"""
pass
async def _execute_with_checkpoint_recovery(self, task: str) -> Any:
"""带检查点恢复的执行"""
pass
async def _execute_safe_mode(self, task: str) -> Any:
"""安全模式执行(有限功能)"""
pass
def _record_failure(self, level: FailureLevel, error: Exception):
self.failure_history.append({
"timestamp": time.time(),
"level": level.value,
"error": str(error)
})
def _trigger_escalation(self):
"""触发人工介入告警"""
# 发送告警到Ops团队
pass
六、体系架构全景
综合以上四个维度,企业级AI Agent可观测性体系的完整架构如下:
┌─────────────────────────────────────────────────────────────────────────┐
│ AI Agent 可观测性体系全景 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据采集层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ OTel SDK │ │ eBPF无侵入│ │ 结构化日志│ │ 自定义埋点 │ │ │
│ │ │ (插桩) │ │ (边界追踪)│ │ (JSON) │ │ (业务指标) │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │ │
│ └───────┼─────────────┼─────────────┼─────────────────┼──────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 数据存储与处理层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ Jaeger │ │ Loki │ │Prometheus│ │ 检查点存储 │ │ │
│ │ │ (Traces) │ │ (Logs) │ │(Metrics) │ │ (Redis/S3) │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │ │
│ └───────┼─────────────┼─────────────┼─────────────────┼──────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 分析引擎层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │ 关联分析 │ │ 异常检测 │ │ 成本分析 │ │ 根因定位 │ │ │
│ │ │(TraceID) │ │(UEBA) │ │(Token/$$)│ │(因果推断) │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │ │
│ └───────┼─────────────┼─────────────┼─────────────────┼──────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 评估与决策层 │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
│ │ │自动化评估│ │ 质量门禁 │ │ 自愈决策 │ │ 人工审核 │ │ │
│ │ │(Evals) │ │(CI/CD) │ │(Healing) │ │(HITL) │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ │ │
│ └───────┼─────────────┼─────────────┼─────────────────┼──────────┘ │
│ │ │ │ │ │
│ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 可视化层 │ │
│ │ ┌──────────────────────────────────────────────────────────┐ │ │
│ │ │ Grafana / LangSmith / 自研控制台 │ │ │
│ │ │ - 执行追踪时间线 - 评估仪表板 - 告警中心 - 成本看板 │ │ │
│ │ └──────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
七、总结与展望
AI Agent的可观测性不是传统APM的简单延伸,而是一次范式级的重构。它要求我们在以下层面做出根本性改变:
从“黑盒”到“透明” :通过Trace/Span模型和eBPF边界追踪,让Agent的每一步推理和行动都可见、可追溯
从“散落日志”到“三层结构化” :将日志分为操作层、认知层和上下文层,满足不同角色的可观测需求
从“跑起来就行”到“可评估、可比较” :建立标准化的评估体系和自动化流水线
从“崩溃重启”到“自愈闭环” :通过检查点、断点续跑和多层自愈策略,实现Agent系统的韧性
正如IBM在watsonx Orchestrate中所实践的那样,AgentOps通过实时监控和基于策略的控制,确保智能体的行为可靠且安全。Agent可观测性为智能体构建者提供了智能体环境的整体视图。
随着OpenTelemetry GenAI语义规范的成熟和eBPF等无侵入技术的普及,AI Agent可观测性将从“锦上添花”变为“不可或缺”的生产环境标配。企业应当从现在开始,将可观测性作为Agent开发的第一优先级,而非事后补救。
参考资料
Zheng Y, Hu Y, Yu T, et al. AgentSight: System-Level Observability for AI Agents Using eBPF[C]. Proceedings of the 4th Workshop on Practical Adoption Challenges of ML for Systems, 2025.
AlSayyad A, Huang K Y, Pal R. AgentTrace: A Structured Logging Framework for Agent System Observability[J]. arXiv preprint arXiv:2602.10133, 2026.
Amazon Web Services. Build trustworthy AI agents with Amazon Bedrock AgentCore Observability[EB/OL]. AWS Machine Learning Blog, 2025.