阿里云CMS OpenClaw升级:实现大模型Agent多轮会话可观测性
1. 项目概述:从单轮“快照”到多轮“电影”的可观测进化
最近在折腾大模型应用,尤其是基于 Agent 的复杂任务编排时,我遇到了一个非常典型且恼人的调试困境。我的 Agent 明明设计得挺“聪明”,能够进行多轮次的“思考-行动-观察”循环(比如先搜索资料,再分析结果,最后生成报告),但当我打开链路追踪(Trace)工具查看时,看到的却是一堆离散的、孤立的“单轮”调用记录。这感觉就像你拍了一部精彩的电影,但观众只能看到一堆杂乱无章的静态剧照,完全无法理解剧情是如何推进、角色是如何互动的。问题的核心在于,传统的可观测体系,尤其是面向 API 或微服务的 Trace,其设计范式是“一次请求,一条链路”,它擅长记录一个请求从发起到结束的完整调用栈。然而,大模型 Agent 的工作流是状态持续、多轮迭代的,一次用户提问可能触发 Agent 内部多次的 LLM 调用、工具执行和逻辑判断,这些活动在时间上是连续的,在逻辑上是强关联的,但传统的 Trace 视图却将它们切割成了独立的片段。
这正是“阿里云 CMS OpenClaw 可观测插件升级”所要解决的核心痛点。CMS(Cloud Monitor Service)是阿里云的应用实时监控服务,而 OpenClaw 是其面向开源生态(如 OpenTelemetry)的可观测套件。这次升级,本质上是将可观测的视角从“单次函数调用”提升到了“多轮智能会话”的维度。它不再仅仅告诉你“某个工具被调用了”,而是能清晰地展示出:为了完成最终任务,你的 Agent 进行了几轮“思考”?每一轮“思考”的输入(Prompt)和输出(Response)是什么?在每一轮中,它调用了哪些工具(Tool),传入的参数和返回的结果又如何?这些轮次之间,Agent 的内部状态(如记忆、目标分解)是如何传递和演变的?这对于 Agent 应用的开发者、运维者乃至业务负责人来说,价值是颠覆性的。它意味着我们终于可以像调试传统软件一样,去直观地、结构化地调试和优化一个具有“自主思考”能力的 AI 应用了。
2. 核心需求解析:为什么我们需要“会话级”Trace?
要理解这次插件升级的必要性,我们得先拆解清楚在开发和运营一个复杂 Agent 时,我们到底被哪些“盲区”所困扰。单轮 Trace 就像汽车的单次点火记录,而我们需要的是整个行程的行车日志。
2.1 调试之痛:迷失在“思考”的迷宫中
假设你构建了一个旅行规划 Agent。用户输入“我想去杭州玩三天,预算5000元”。一个设计良好的 Agent 可能会进行如下多轮操作:
- 第一轮思考:理解用户意图,拆解任务为“查询杭州天气”、“查找景点”、“规划行程”、“估算预算”。
- 第一轮行动:调用“天气查询”工具,获取杭州未来三天天气。
- 第二轮思考:根据天气(比如第三天有雨)调整行程,决定将户外景点安排在前两天。
- 第二轮行动:调用“景点搜索”工具,筛选室内和户外景点。
- 第三轮思考:结合景点信息、天气和预算,开始编排每日行程。
- 第三轮行动:调用“行程生成”工具,输出一个初步的日程表。
- 第四轮思考:检查行程是否超预算,进行优化。
- 最终输出:生成包含天气提醒、景点推荐、详细日程和预算分解的最终方案。
在单轮 Trace 视图下,你只会看到4个独立的工具调用记录(天气、景点、行程生成,可能还有个计算工具)。你完全看不到这4次调用之间的因果逻辑和状态流转。如果最终生成的行程不合理,你根本无法快速定位问题出在哪一环:是第一次搜索的关键词不对?还是第二轮思考时对天气的推理逻辑有误?或是第三轮行程编排的 Prompt 设计有问题?你只能像无头苍蝇一样,逐一检查每个孤立的调用日志,效率极低。
2.2 成本与性能优化:钱和速度花在了哪里?
大模型调用是按 Token 收费的,复杂的 Agent 一次任务可能进行十几次甚至几十次 LLM 交互。单轮 Trace 只能告诉你每次调用的耗时和 Token 消耗,但回答不了更关键的业务问题:
- 任务级别的总成本是多少?完成一次用户查询,总共消耗了多少 Token?这直接关系到你的运营成本。
- 瓶颈在哪里?是整个“思考”环节慢,还是某个特定的“工具调用”(如一个慢速的第三方 API)拖慢了整体响应?在多轮流程中,是第几轮思考最耗时?
- 有没有无效或冗余的“思考”?Agent 是否陷入了循环思考?或者某轮思考的产出根本没有被后续轮次使用,造成了计算资源的浪费?单轮视图无法揭示这种跨轮次的冗余。
2.3 效果评估与持续迭代:Agent 真的在进步吗?
当你对 Agent 的 Prompt 或工具集进行了一次优化后,如何量化评估其效果?单轮指标(如单个工具调用成功率)是片面的。你需要的是会话级的成功率、任务完成度和用户满意度。新的可观测能力需要能记录一次完整会话的轨迹,让你可以对比优化前后,Agent 完成任务所需的“思考”轮次是否减少、路径是否更优、最终输出质量是否更高。这是实现 Agent 应用持续迭代优化的数据基础。
3. 阿里云 CMS OpenClaw 的解决方案架构
阿里云 CMS OpenClaw 此次升级,可以理解为在现有的、强大的基础设施监控和分布式追踪能力之上,新增了一个专为“Agent 工作流”设计的观测层。它并没有推翻 OpenTelemetry 的标准,而是巧妙地扩展和利用了其体系。
3.1 核心概念:会话(Session)作为新的可观测实体
这是本次升级最根本的范式转变。OpenClaw 插件引入了一个顶层的Session概念。一个 Session 对应一次完整的、端到端的用户与 Agent 的交互过程,通常由一条用户输入发起,以 Agent 返回最终结果结束。这个 Session 拥有唯一的 ID,并贯穿整个多轮交互的生命周期。
在这个 Session 之下,传统的 Trace 和 Span 概念被赋予了新的含义和关联关系:
- Session:根实体,包含会话元数据(如用户ID、会话开始时间、最终状态)。
- Turn (轮次):在 Session 之下,每个 Agent 的“思考-行动”循环被记录为一个
Turn。一个 Turn 可以看作一个更高层级的 Span,它有自己的开始、结束、状态和属性。例如,Turn 1: 任务分解与天气查询。 - LLM Call Span:在每个 Turn 内部,对大型语言模型的一次调用被记录为一个标准的 Span。这包含了详细的 Prompt 内容、响应内容、Token 使用量、模型名称和耗时。
- Tool Call Span:同样在 Turn 内部,每次工具的执行也被记录为一个 Span。这包含了工具名称、输入参数、执行结果、成功与否和耗时。
- Internal State Span (可选但重要):高级的 Agent 框架(如 LangChain, Dify, CrewAI)会有内部的状态管理(如工作记忆、子任务列表)。插件可以通过埋点,将这些状态的快照或变更记录为特殊的 Span,从而揭示 Agent “思考”的逻辑依据。
通过这种Session -> Turn -> Span的层次结构,一次复杂的多轮交互就被完整地、结构化地记录了下来。
3.2 数据采集与埋点策略
实现上述架构,需要在你的 Agent 应用代码中进行适当的埋点。OpenClaw 插件通常提供与主流 Agent 开发框架(如 LangChain, LlamaIndex, Dify)的集成SDK或装饰器。
实操要点:
- Session 初始化:在接收到用户请求,创建 Agent 执行实例时,立即初始化一个 Session。将 Session ID 注入到 Agent 的上下文或自定义字段中,确保该 Session 内所有后续操作都能携带这个 ID。
- Turn 边界标记:在 Agent 的执行循环中,在每一轮“思考”开始前,显式地开始一个新的 Turn Span。在这一轮所有操作(LLM调用、工具执行)结束时,结束这个 Turn Span。这需要你理解所用 Agent 框架的执行生命周期钩子(Hooks)。
- LLM 与 Tool 的自动埋点:利用插件提供的集成,通常以中间件(Middleware)或回调(Callback)的形式,自动为 LLM 调用和工具调用创建子 Span。这些 Span 会自动关联到当前活跃的 Turn Span 和 Session。
- 自定义属性的记录:除了自动采集的耗时、状态等信息,务必在 Turn 和关键 Span 上记录业务属性。例如,在 Turn 上记录“本轮目标”,在 LLM Span 上记录“使用的提示词模板名称”,在 Tool Span 上记录“查询的关键词”。这些属性是后期分析和搜索的黄金信息。
注意:埋点会带来轻微的性能开销,主要在于日志的序列化和传输。建议在非关键路径(如工具调用的网络I/O)旁进行异步埋点,并确保生产环境有采样率配置,对高频会话进行采样,平衡可观测性和系统负载。
3.3 数据存储与关联:Trace 的“增强”
采集到的数据通过 OpenTelemetry Protocol (OTLP) 发送到阿里云 CMS 后端。后端的关键处理在于建立并维护 Session、Turn、Span 之间的关联关系。这通常通过以下字段实现:
trace_id: 传统 Trace ID,现在可以映射到session_id,或者一个 Session 包含一个唯一的trace_id。span_id: 每个操作单元的唯一 ID。parent_span_id: 明确指明当前 Span 属于哪个 Turn 或哪个上级 Span。这是构建树状结构的关键。attributes: 一个键值对集合,用于存储session_id,turn_index,agent_goal,tool_input等丰富的自定义属性。
通过这种强关联,后端存储的就不再是扁平的 Span 列表,而是一棵棵以 Session 为根、以 Turn 为主干、以各种操作为枝叶的“会话树”。
4. 可视化与诊断:从数据到洞察
拥有了结构化的“会话树”数据,可视化和分析能力就迎来了飞跃。阿里云 CMS 控制台预计会提供全新的“Agent 会话追踪”视图。
4.1 会话列表与全局视图
首先,你会看到一个所有 Agent 会话的列表,类似于微服务的调用链列表,但每一行代表一次完整的用户会话。你可以看到会话的起止时间、状态(成功/失败/中断)、总耗时、总 Token 消耗、经过的 Turn 轮次等核心聚合指标。这让你对 Agent 的整体运行情况一目了然。
4.2 会话详情与时序甘特图
点击进入一个会话,核心视图是一个增强版的时序甘特图(Gantt Chart)。它与传统 Trace 视图的最大区别在于层次:
- 第一层:Session 时间线,显示整个会话的持续时间。
- 第二层:Turn 序列,在 Session 时间线下,水平排列着一个个 Turn 块,清晰展示了“思考”的轮次和顺序。每个 Turn 块上可能标注着该轮的核心目标或摘要。
- 第三层:操作详情,展开每个 Turn,你会看到其内部详细的 LLM Call 和 Tool Call 的序列,包括它们的耗时、依赖关系(如果有)。
这个视图让你瞬间把握任务执行的宏观流程:Agent 思考了几轮?哪一轮最耗时?是在调用哪个工具时卡住了?
4.3 深度钻取与上下文查看
对于任何一个 Turn 或 Span,都可以进行深度钻取:
- 查看完整 Prompt 和 Response:点击一个 LLM Span,可以直接看到发送给模型的完整提示词和模型返回的完整内容。这是调试 Prompt 效果的终极利器。
- 查看工具输入输出:点击一个 Tool Span,可以查看调用参数和返回的原始数据或错误信息。
- 查看 Agent 内部状态:如果记录了状态 Span,可以查看在该决策点,Agent 的记忆体里有什么、它的任务列表是什么,从而理解其决策逻辑。
- 日志关联:与该 Session 或 Span 相关的应用日志(如通过
trace_id关联)会被集中展示,提供更底层的诊断信息。
4.4 搜索、筛选与聚合分析
强大的可观测能力离不开灵活的查询。你可以通过以下维度进行搜索和筛选:
- 属性搜索:
session_id: "xxx",turn_index: 3,tool_name: "web_search",agent_goal: "预算评估"。 - 错误诊断:快速过滤出所有失败的会话,或所有包含特定工具错误的会话。
- 性能分析:按总耗时、总 Token 消耗排序,找出最昂贵或最慢的会话。进一步下钻分析这些会话的 Turn 分布,定位瓶颈。
- 对比分析:选择两个时间段(比如优化前后),对比会话平均轮次、平均耗时、成功率等核心指标的变化,量化迭代效果。
5. 实战:为 LangChain Agent 集成 OpenClaw 可观测
让我们以一个基于 LangChain 的 Agent 为例,看看如何具体实施。假设我们有一个使用 ReAct 框架的 Agent。
5.1 环境准备与依赖安装
首先,确保你的环境已安装阿里云 CMS OpenClaw 的 Python SDK(通常是一个类似alibabacloud_cms_opentelemetry的包)。同时,你需要配置好 OpenTelemetry 的导出器,将数据发送到阿里云 CMS 的采集端点。
# 示例安装命令(请以官方文档为准) pip install langchain openai pip install alibabacloud_cms_opentelemetry pip install opentelemetry-sdk opentelemetry-exporter-otlp接下来,在你的应用初始化代码中,设置 OpenTelemetry 和 OpenClaw 插件。
import os 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 # 假设 OpenClaw 提供了增强的 Processor 或 Instrumentor from cms_opentelemetry.extensions.langchain import LangChainInstrumentor from cms_opentelemetry.sessions import SessionManager # 1. 设置 OTLP 导出器(指向阿里云 CMS 端点) otlp_exporter = OTLPSpanExporter( endpoint="your-cms-otlp-endpoint", headers={"Authentication": "your-token"} ) # 2. 设置 Trace 提供者 trace.set_tracer_provider(TracerProvider()) tracer_provider = trace.get_tracer_provider() # 3. 添加批处理处理器 span_processor = BatchSpanProcessor(otlp_exporter) tracer_provider.add_span_processor(span_processor) # 4. 初始化 OpenClaw Session 管理器 session_manager = SessionManager() # 5. 自动装载 LangChain 插桩器,它会自动为 LLM 调用和工具调用创建 Span LangChainInstrumentor().instrument(tracer_provider=tracer_provider, session_manager=session_manager)5.2 在 Agent 执行流中嵌入 Session 和 Turn
自动插桩可以处理 LLM 和 Tool,但 Session 和 Turn 的边界需要我们在业务代码中手动定义。
from langchain.agents import AgentExecutor, create_react_agent from langchain_openai import ChatOpenAI from langchain.tools import Tool # 假设我们有一个搜索工具 from my_tools import web_search_tool def run_agent_with_observability(user_query: str): # 1. 创建 Session session = session_manager.create_session( attributes={ "user_query": user_query, "agent_type": "ReAct", "user_id": "12345" } ) # 获取该 Session 的 tracer tracer = session.get_tracer() llm = ChatOpenAI(model="gpt-4", temperature=0) tools = [web_search_tool] agent = create_react_agent(llm, tools, prompt) agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) try: # 2. 在 Agent 执行循环外,我们手动控制 Turn。 # 注意:LangChain 的 AgentExecutor 内部是一个循环,我们需要在其循环钩子中处理。 # 这里使用一个简化示例,在实际中你可能需要使用 Callbacks 或自定义执行器。 turn_index = 0 final_answer = None # 一个简化版的循环,模拟 Turn 记录 with tracer.start_as_current_span("AgentSession", attributes=session.attributes) as session_span: while not final_answer: turn_index += 1 # 3. 开始一个新的 Turn Span with tracer.start_as_current_span(f"Turn-{turn_index}", attributes={"turn_index": turn_index}) as turn_span: # 这里需要一种方式驱动 Agent 执行一步,并获取其思考过程。 # 为简化,我们直接执行并假设能获取中间步骤。 # 实际中,你需要使用 AgentExecutor 的 `return_intermediate_steps=True` 并结合 Callbacks。 result = agent_executor.invoke({"input": user_query, "intermediate_steps": []}) # 记录本轮的关键信息到 Turn Span turn_span.set_attribute("agent_scratchpad", result.get("intermediate_steps", [])) # 检查是否结束 if "output" in result: final_answer = result["output"] session_span.set_attribute("final_answer", final_answer) session_span.set_status(Status(StatusCode.OK)) session_manager.end_session(session, status="success") except Exception as e: session_span.record_exception(e) session_span.set_status(Status(StatusCode.ERROR)) session_manager.end_session(session, status="failed", error=str(e)) raise return final_answer实操心得:与 LangChain 的深度集成可能需要利用其CallbackHandler系统。你可以创建一个自定义的OpenClawCallbackHandler,在on_agent_action(开始工具调用)、on_agent_finish(结束一轮思考)、on_tool_end(工具调用结束)等关键生命周期事件中,去开始或结束相应的 Span,并建立正确的父子关系。这是最精准也是相对复杂的方式。另一种更简单但粒度较粗的方式是,直接在你调用agent_executor.invoke()的外层包裹 Turn Span。
5.3 配置与数据验证
部署应用后,需要在阿里云 CMS 控制台确认数据接收是否正常。
- 检查采集状态:在 CMS 的“接入中心”或“数据状态”页面,查看 OTLP 数据源是否有数据流入。
- 验证 Trace 数据:在“链路追踪”或“应用监控”中,尝试搜索包含
agent_type、tool_name等自定义属性的 Span,看是否能找到。 - 寻找 Session 视图:升级后的功能可能会在“智能运维”或“业务监控”下提供一个独立的“Agent 会话”或“AI 工作流”视图。在这里你应该能看到以 Session 为维度的列表。
重要提示:在开发测试阶段,务必使用一个独立的测试环境或为测试数据打上特殊标签(如
env: "test"),避免污染生产环境的可观测数据,影响监控告警的准确性。
6. 常见问题与排查技巧实录
在实际集成和使用过程中,你肯定会遇到各种问题。以下是我根据经验总结的一些典型场景和解决思路。
6.1 数据采集类问题
问题1:控制台看不到任何 Session 或自定义属性。
- 排查步骤:
- 检查端点与鉴权:确认 OTLP exporter 配置的 endpoint 和 headers(如 token)完全正确。网络是否通畅?可以使用
curl或telnet测试端口连通性。 - 验证 SDK 版本:确保安装的
alibabacloud_cms_opentelemetrySDK 版本支持 Agent 可观测特性,并且与阿里云 CMS 后端版本兼容。 - 检查插桩是否生效:在代码中手动创建一个简单的 Span 并记录一个属性,看是否能收到。这可以排除 Agent 框架集成的问题。
- 查看原始日志:开启 OpenTelemetry SDK 的调试日志,查看 Span 是否被生成和导出。检查是否有导出错误。
- 确认属性命名:确保自定义属性的 Key 是字符串,且 Value 是字符串、数字、布尔值等基本类型,避免复杂的对象。
- 检查端点与鉴权:确认 OTLP exporter 配置的 endpoint 和 headers(如 token)完全正确。网络是否通畅?可以使用
问题2:Session、Turn、Span 的父子关系错乱,在甘特图上显示不正确。
- 排查步骤:
- 检查上下文传播:在异步或并发执行的 Agent 中,确保 OpenTelemetry 的上下文(Context)被正确地在不同线程、任务或回调函数之间传递。使用
contextvars或框架提供的上下文管理机制。 - 审视 Turn 边界逻辑:确认你开始和结束 Turn Span 的代码位置是否准确对应了 Agent 的一轮完整“思考-行动”循环。一个常见的错误是在一个工具调用循环内错误地开始了多个 Turn。
- 使用
parent参数:在手动创建 Span 时,明确指定parent参数为当前活跃的 Span 或 Context,确保层级关系正确。
- 检查上下文传播:在异步或并发执行的 Agent 中,确保 OpenTelemetry 的上下文(Context)被正确地在不同线程、任务或回调函数之间传递。使用
6.2 性能与成本类问题
问题3:开启可观测后,Agent 响应明显变慢。
- 优化策略:
- 启用采样:在生产环境,务必配置采样率。例如,只对 10% 的会话进行全量 Trace 采集,或者只对耗时超过 5 秒的会话进行采集。这可以在 OpenTelemetry TracerProvider 级别配置。
- 异步导出:确保使用
BatchSpanProcessor,它会将多个 Span 批量打包后发送,减少网络 I/O 次数。调整其参数(如最大批大小、延迟时间)以平衡实时性和性能。 - 精简属性:避免在 Span 上记录过于庞大或冗长的属性值(如把整个网页内容作为属性)。对于大文本,考虑记录其摘要或哈希值,或将详细内容记录到专门的日志系统,通过 Trace ID 关联。
- 评估插件开销:测试并对比开启和关闭 OpenClaw 插桩时的性能差异,量化开销。如果某个框架的插桩器开销过大,考虑是否采用更轻量级的手动埋点方式。
问题4:如何准确计算并监控每次会话的 Token 消耗总成本?
- 实现方案:
- 依赖 LLM SDK 的回调:大多数 LLM SDK(如 OpenAI)会在响应中返回
usage字段。在你的 LLM 调用回调函数或插桩器中,捕获这个信息,并将其记录为对应 LLM Span 的属性,如input_tokens,output_tokens,total_tokens。 - 在 Turn 和 Session 级别聚合:OpenClaw 插件或你的自定义逻辑,需要在每个 Turn 结束时,汇总其下所有 LLM Span 的 Token 数。在 Session 结束时,汇总所有 Turn 的 Token 数。这个聚合后的总 Token 数可以作为 Session 的一个核心属性。
- 配置成本告警:在阿里云 CMS 中,基于
session.total_tokens这个指标,可以设置告警规则。例如,“当单次会话消耗 Token 超过 10,000 时触发告警”,以便及时发现异常昂贵或可能陷入循环的查询。
- 依赖 LLM SDK 的回调:大多数 LLM SDK(如 OpenAI)会在响应中返回
6.3 分析与使用类问题
问题5:如何快速定位导致 Agent 任务失败的“问题轮次”?
- 诊断流程:
- 筛选失败会话:在会话列表视图中,首先筛选出状态为“失败”或“错误”的会话。
- 查看会话详情:进入一个失败会话,快速浏览其 Turn 序列甘特图。通常,失败的会话会在最后一个或某几个 Turn 显示错误状态(红色)。
- 钻取错误 Turn:点击那个红色的 Turn Span,查看其详情。检查其内部的子 Span:
- 如果某个Tool Call Span失败,查看其错误信息和输入参数,可能是工具 API 异常、网络超时或参数错误。
- 如果LLM Call Span返回了错误(如 content filter 触发),查看其 Prompt 和 Response。
- 查看该 Turn 开始时的Agent 内部状态(如果有记录),理解 Agent 在失败前“想”做什么。
- 对比成功会话:找到一个处理类似任务的成功会话,进行对比分析。看看在关键的决策点上,成功和失败的会话在 Prompt、工具调用顺序或参数上有何不同。
问题6:如何利用这些 Trace 数据来优化 Prompt 和 Agent 工作流?
- 优化方法:
- 识别无效轮次:分析大量成功会话的 Turn 数量分布。如果平均需要 5 轮完成的任务,某些会话却花了 10 轮,就值得深入分析。多出来的轮次在做什么?是否是冗余的确认或循环思考?优化 Prompt 的指令清晰度或工具的准确性,可以减少这些轮次。
- 分析工具调用模式:统计各个工具的使用频率和成功率。如果一个工具频繁失败或返回空结果,可能需要改进该工具的封装,或者在调用前让 Agent 增加校验逻辑。
- 优化耗时环节:找出平均耗时最长的 Turn 或 Tool。如果是某个外部 API 工具慢,考虑为其增加缓存、设置更合理的超时或寻找替代方案。如果是某一轮 LLM 思考慢,可以尝试优化 Prompt 结构,或者使用更快的模型(如从 GPT-4 降级到 GPT-3.5 Turbo 进行简单思考)。
- A/B 测试验证:当你修改了 Prompt 或工作流后,可以为新版本打上一个不同的属性标签(如
prompt_version: "v2")。然后通过 CMS 的查询分析功能,对比两个版本在相同时间段内的会话平均轮次、成功率和平均耗时,用数据驱动决策。
这次阿里云 CMS OpenClaw 的升级,本质上是将可观测性的最佳实践引入到了 AI 应用开发这个新兴领域。它解决的不是一个简单的技术问题,而是一个开发范式和运维理念的问题。当你的 Agent 学会“多轮思考”时,你的监控视野也必须从“单点快照”切换到“全局电影”。这不仅仅是多了几个图表,而是为你提供了一套理解、调试和优化智能体“思维过程”的手术刀,让原本黑盒的 AI 推理过程变得透明、可分析、可优化。对于任何正在或计划将大模型 Agent 投入生产环境的企业和开发者来说,构建这样的可观测能力,不是可选项,而是必选项。
