Arthas Agent:用AI赋能Java诊断,让Arthas更易用

Arthas Agent让Java诊断更简单!用自然语言,AI帮你把线上问题查个底朝天,告别复杂命令,一键生成诊断报告。

原文标题:我们做了比你更懂 Java 的 AI-Agent -- Arthas Agent

原文作者:阿里云开发者

冷月清谈:

本文介绍了阿里云开发者推出的Arthas Agent,旨在降低Arthas的使用门槛。Arthas本身是一款强大的Java诊断工具,但需要用户掌握复杂的命令和排障经验。Arthas Agent通过自然语言交互,将用户的意图转化为Arthas命令,并生成诊断报告。它内置了多种排障技能(Skills),能够自动生成安全可控的命令序列,并根据证据逐步收敛问题。文章通过多个实例展示了Arthas Agent在问题诊断、JVM信息获取、Spring配置读取以及CPU飙高等场景下的应用,强调其核心价值在于将专家的排障经验工程化、流程化,使更多工程师能够高效地使用Arthas。

怜星夜思:

1、Arthas Agent 如何保证在生产环境中的安全性,避免误操作导致服务不稳定?
2、Arthas Agent 目前内置的 Skills(排障技能)有哪些局限性?在哪些场景下仍然需要人工介入?
3、如果我想为 Arthas Agent 贡献新的 Skills(排障技能),需要具备哪些知识和技能?

原文内容

Arthas 是 alibaba/arthas 开源的 Java 诊断工具。它能在不重启应用的前提下,动态查看线程/CPU、反编译类、追踪方法耗时、观察入参返回值、执行 OGNL、查看类加载器、线上取证定位问题——几乎是 Java 线上排障的“瑞士军刀”。

地址:https://github.com/alibaba/arthas

但现实也很直白:Arthas 很强,门槛也很高。

  • 你得知道该用哪个命令(thread/dashboard/trace/watch/tt/vmtool/ognl/jad…);

  • 你得知道参数怎么写、OGNL 怎么拼、如何限量,避免线上刷屏或增加开销;

  • 你还得会“排障路径”:先拿证据,再收敛,再验证——而不是一通乱跑;

我们做的 Arthas Agent,就是把这件事反过来:让你用自然语言表达意图,让 Agent 负责把意图翻译成安全、可控、循证的 Arthas 操作,并把结果组织成一份“像 SRE 写的诊断报告”。

0. TL;DR(30 秒版)

  • 没有 AI:你需要会 Arthas 的“语法”,更需要会“排障套路”;一件事往往要跑 5~15 条命令,并且每一步都要读懂输出才能继续收敛。

  • 有 Arthas Agent:你只要描述“现象/目标”,它会

  • 自动匹配内置 Skills(排障技能)

  • 自动生成限量、安全的命令序列(每轮只推进 1~2 步,避免线上冲击)

  • 在拿到证据后“像资深同学一样”继续收敛

  • 最后输出结构化诊断报告(结论/证据/原因/建议)

一个例子 - 直接询问正在运行的Spring的版本号:

整个过程不到30秒。

1. 没有 AI 的 Arthas:

你需要记住“命令”,而不是“问题”

传统方式里,你的大脑会被迫切换成“命令思维”:

  • “CPU 高”要先 dashboard 还是 thread -n

  • “启动卡住”要看 main 线程,还是先扫 Spring Context?

  • “我只想看某种参数类型的调用”——watch 条件怎么写?

  • “我想拿 traceId 去查日志”——应该 watch 哪个点、怎么限量?

这些问题不难,但它们很耗时,而且常常发生在你最紧张的线上时刻。

更要命的是:真正耗时的不是“敲命令”,而是这些经验成本

  • 你要把问题先翻译成“下一条命令是什么”;

  • 你要读懂输出,再翻译成“下一条命令是什么”;

  • 你要持续约束风险(限量、避免宽泛匹配、避免刷屏);

  • 你要在脑子里维护上下文(关键证据、时间点、线程 ID、类名、配置项);

于是排障变成了同时需要“会命令的人”,和“理解问题的人”。缺少一项都无法排查。

2. 有了 Arthas Agent:

你只需要说“现象/目标”,剩下交给它

Arthas Agent 的核心不是“把 Arthas 包装成 ChatBot”,而是把线上诊断变成一种工程化的、可复用的能力

  • Skill-first(技能优先):内置一套“排障剧本”,先匹配最相关的技能,再按剧本推进;

  • 例如:arthas-cpu-high(CPU 飙高)、arthas-springcontext-issues-resolve(Spring Context/Bean)、arthas-eagleeye-traceid(获取 traceId);

  • 安全优先(Safety First):默认只做低风险、高信息量的动作;需要更深的操作会先做最少澄清或限量执行;

  • 例如:每轮只推进 1–2 个低风险步骤;对 OGNL 强制单引号;禁止无锚点全量枚举类;内置权限隔离;

  • 循证闭环(Evidence-based):所有结论必须引用工具返回的真实证据,不凭空“猜”;

  • 多 Agent 协作:把“长文本/日志/堆栈分析”交给专门的 log_reader 子 Agent,形成上下文隔离;

  • 你可以把它理解为:一个 Agent 负责“跑工具拿证据”,另一个 Agent 负责“读证据写结论”;

  • 工具自发现:先从 MCP 侧拿到“当前可用工具清单”,再决定怎么做(更适配不同环境/权限);

最终体验是:你用一句话描述问题,它按步骤推进,并且每一步都会告诉你:

  • 为什么要跑这条命令

  • 期待看到什么

  • 如果结果 A/B/C,下一步分别怎么走

一个例子 -- 应用启动不成功怎么办?

2.1 “AI 的方便”到底方便在哪:把长流程变成一句话

我们最想强调的,不是“AI 会背命令”,而是它能把下面这种长流程自动跑通:

  • 先做低风险的“体检”拿方向感

  • 再抓关键证据(线程堆栈/调用链/配置生效值)

  • 再按证据收敛到更精确的观察点(trace/watch/tt

  • 最后把证据整理成“能交付给团队”的报告

你只需要说“现象/目标”,它负责把“专家脑内流程”显式化,并且每一步都把为什么要这么做讲清楚。

3. 真实案例:一句话完成复杂诊断

下面的例子来自我们在日常环境下的历史记录(已隐藏工具调用),重点看“诊断路径”和“证据收敛”。

3.1 一句话:诊断“应用启动卡住/无法正常启动”

你说:诊断一下应用无法正常启动的原因。

3.1.1 没有 AI 时,资深同学怎么跑这条长流程

作为有经验的人,通常不会直接上来就 trace 或 watch,因为那样要么太宽、要么风险不可控。一个更“稳”的套路是:

  • 先确认问题类型:是“没启动/退出了”,还是“进程在但卡住了”?

  • 这一步会决定你后续是去看日志/退出码,还是去看线程堆栈/锁/远程依赖

  • 先跑低风险体检(高信息量、低扰动):

  • 看 JVM 基本信息、dashboard 的 CPU/线程/GC 概况,快速判断是否存在“资源异常/线程暴涨/GC 异常”

  • 再抓关键线程证据:

  • 若是“卡住”,优先看 main 线程堆栈(很多启动卡住的根因就藏在这里)

  • 若是“忙”,则先找最忙线程,再从堆栈提取“可疑方法名”

  • 把堆栈里的方法翻译成“系统组件”:

  • Spring refresh?卡在 Spring 生命周期步骤了?RPC/服务发现?数据库连接池?类初始化?锁等待?

  • 必要时进一步确认(但仍要控制风险):

  • 反编译关键类确认“它在初始化阶段做了什么”

  • 查 Spring Context/配置生效值确认“是不是某个配置导致等待/超时过长”

  • 最后产出可执行建议:

  • 临时止血(依赖服务、网络、注册中心、超时)

  • 长期治理(避免静态初始化块做远程依赖初始化、改为懒加载/异步、合理重试)

这条链路“每一步都不难”,难的是:你要在压力下把下一步想清楚,还要保证每一步都可控。

3.1.2 来看看 AI 能不能做到:它是如何自动跑通并写出报告的

Agent 的推进路径(摘要):

  • 先拿 JVM 基本面(JVM/线程/GC 概况、dashboard);

  • 再检查是否存在死锁/异常阻塞;

  • 锚定 main 线程堆栈,发现卡在某个服务依赖初始化的等待点;

  • 进一步定位到某业务类的静态初始化块:启动期创建 Spring Context 并触发远程依赖初始化;

  • 给出“根因 + 证据 + 解决建议”:例如把启动期强依赖改成懒加载/异步,或缩短超时、检查注册中心/网络等;

为什么这类问题适合 Agent:

启动卡住往往是“线程堆栈 + 配置 + 初始化时序”的组合题。Agent 的价值在于能把“你脑中隐含的排障套路”显式化,并用最短路径把证据补齐。

3.2 一句话:获取 JVM 信息并做健康摘要

你说:现在可以获取 jvm 信息不

Agent 输出(摘要化展示):

  • 运行时环境:JDK 版本、启动时间、CPU 核数与负载;

  • 内存:-Xms/-Xmx、堆/非堆使用、Metaspace 指标;

  • GC:G1GC 的 Young/Concurrent/Old 次数与耗时、GC 日志路径;

  • 线程:线程数、守护线程、死锁检查结论;

没有 AI 时你可能也能跑出 jvm,但“读懂它、总结成可行动结论”往往要再花 10 分钟。Agent 把这 10 分钟省掉,并告诉你下一步应该把火力用在哪个方向。

图片

3.3 一句话:在线读取 Spring 配置 server.port

(不改代码、不重启)

你说:获取 spring 配置 server.port 值

3.3.1 没有 AI 时,你很容易绕路

这件事看起来简单,但经常会踩坑:

  • 你去翻配置文件:application.yml/application.properties,但线上可能来自配置中心/环境变量/启动参数覆盖;

  • 你去看启动参数:-Dserver.port=...,但容器/启动脚本可能又做了二次注入;

  • 你去看监听端口:netstat/ss,但应用可能有多个 connector,或者端口被 sidecar/代理转发;

换句话说:你想要的不是“文件里写了什么”,而是运行时 Spring Environment 里最终生效的值。

3.3.2 来看看 AI 能不能做到:Skill-first 的标准剧本

在真实历史记录里,Agent 的推进是:

  • 识别这是 Spring 上下文配置排查;

  • 匹配到内置 Skill(排障剧本),并先读取 skill 文档再行动(保证安全与正确性);

  • 使用 vmtool 获取 ApplicationContext,调用 getEnvironment().getProperty("server.port") 拿到最终生效值;

  • 解释“这个值可能来自哪些配置源”;如果你要追溯来源,它会给出下一步(查来源)的命令建议;

3.4 一句话:

getstatic 读取“静态字段/嵌套字段”,并做对比分析

你说:getstatic com.example.ConfigRepo configuration 'defaultRatio'(示例)

Agent 的处理要点:

  • 识别这是“明确指令型(模式 A)”,可以直接执行

  • 当你访问嵌套字段时,自动提醒/采用 OGNL 方式读取

  • 同一配置重复查询时,会提醒“结果发生变化”,提示可能存在动态刷新/热更新,并给出下一步建议(比如追踪是谁改的)

这类需求在排查“开关/灰度/采样比例/动态配置”时非常常见:你只要说出类与字段,Agent 帮你把结果读出来并解释它意味着什么。

3.5 一句话:watch 只观察“特定类型/特定场景”的调用(OGNL 条件过滤)

你说:watch 方法怎么限制只针对特定类型使用?

Agent 给出:

  • 核心机制:-c/--condition 写 OGNL 条件,只输出满足条件的调用

  • 典型写法:按参数类型、接口/父类、返回值类型过滤

  • 强提醒:OGNL 必须使用英文单引号包裹 '...'

示例:

# 只看第一个参数是某个类型的调用
watch com.example.Service doSomething '{params, returnObj}' -c 'params[0].class.name == "com.example.User"' -n 5

只看参数实现某接口

watch com.example.Handler handle ‘{params}’ -c ‘params[0] instanceof @com.example.MyInterface@class’ -n 5

你不再需要记住 OGNL 语法细节,告诉它你想“过滤什么”,它给你一条能直接复制执行的命令。

3.6 长流程示例:CPU 飙高排查

(从“哪个线程”到“哪段代码”)

我们构造了一个由于正则表达式递归导致的CPU增高场景。看看Arthas能不能找到原因。

你说:现在 CPU 使用率很高,帮我查查是哪个线程导致的?

3.6.1 没有 AI 时,资深同学会怎么推进(典型 10~20 分钟链路)

CPU 高的排查,真正难的不是“找到 CPU 高”,而是从“现象”收敛到“能改的代码点”。常见的专家流程是:

  • Step 0:先确认是不是误报/外因

  • 系统负载、容器限额、是否有压测/流量激增、是否是 GC 频繁导致 CPU 被 GC 吃掉;

  • Step 1:看整体面(低风险)

  • dashboard:CPU/线程/GC 概况,先判断是“忙”还是“堵”;

  • Step 2:定位最忙线程(关键)

  • thread -n 3 或 thread -n 5:拿到最忙线程的堆栈;

  • Step 3:读堆栈,把方法归类

  • 如果堆栈在序列化/正则/日志格式化 → 计算型热点;

  • 如果堆栈大量 BLOCKED → 锁竞争/排队型热点;

  • 如果堆栈看起来“很正常但 CPU 仍高” → 可能是热点在 native/或采样点没踩中,需要更精确观察;

  • Step 4:收敛到目标方法(按需)

  • 选一个堆栈里最像业务关键路径的方法,进一步用 trace 验证调用链与耗时分布;

  • 如果需要看入参/返回值,再用 watch/tt,但必须限量,避免线上刷屏;

  • Step 5:产出结论

  • 证据:dashboard 摘要 + top 线程堆栈关键片段 + trace 的慢点;

  • 建议:缓存/限流/降级/修算法/减少日志/拆锁/优化序列化等;

3.6.2 来看看 AI 能不能做到:一条问题触发 arthas-cpu-high 剧本

Arthas Agent 会把这类问题自动匹配到内置 Skill:arthas-cpu-high,并按Skill内容推进:

  • 先 dashboard 拿整体面

  • 再 thread 找 topN 热点线程并抓堆栈

  • 再把堆栈里的方法提炼成“下一步最值得 trace/watch 的候选点”

  • 最终输出结构化报告(并且在每一步提醒限量与风险)

先读取了技能。

4. 我们为什么说:这是“最懂 Java”的诊断 Agent

不是因为它会背命令,而是因为它把 Java 线上诊断里的关键难点做成了“产品能力”。

  • 懂排障节奏:先低风险取证(dashboard/thread/jvm),再逐步收敛到 trace/watch/tt

  • 懂工程边界:默认限量、避免刷屏;高影响命令必须明确授权

  • 懂 Spring 体系:优先只读验证(contains/beanNames/type/environment),避免 getBean() 触发副作用

  • 懂链路定位:把“拿 traceId + 看慢点在哪”合并成一条可执行路径(Skill 剧本)

  • 懂上下文管理: log_reader 子 Agent 专门做“长日志/堆栈”分析,避免主对话被噪声淹没

再补一句“工程同学最关心的”:它不会上来就乱跑。

信息不足时它会先问清楚;需要高影响操作时会先解释风险并要求明确授权;默认每轮只推进 1~2 个低风险步骤,避免线上被“刷屏式诊断”二次伤害。

5. 使用帮助

那么这么好用的AI Agent在哪里可以用到呢?

打开Arthas在线诊断网页,再选择IP,Attach 之后就可以直接提问。

5.1 怎么开始

一般推荐两段式:

  • 第 1 段:先 Attach / 确认目标 JVM(可由启动/Attach Agent 协助完成,输出 PID 与摘要)

  • 第 2 段:把具体问题交给 Arthas Agent 诊断

5.2 如何提问(Prompt 指南)

你可以像与同事交谈一样与 Copilot 对话。以下是几种典型的提问模式:

A. 明确指令型

当你清楚知道要做什么,但记不住具体命令参数时:

  • “反编译 com.example.UserController 类。”

  • “帮我查看 com.service.OrderService 的 createOrder 方法的入参和返回值。”

  • “检测一下现在的 JVM 线程情况。”

B. 现象咨询型(推荐)

当你遇到线上问题,需要排查思路时:

  • CPU 问题:“现在 CPU 使用率很高,帮我查查是哪个线程导致的?”

  • 性能问题:“queryUserInfo 这个接口偶尔特别慢,怎么排查是卡在哪里了?”

  • 死锁问题:“服务好像卡住了,没反应,是不是死锁了?”

  • 逻辑问题:“代码里的 if (user.vip) 分支好像一直没进去,帮我看看运行时的变量值。”

C. 模糊查询型

当你不知道具体的类全名时:

  • “帮我找一下类似 OrderController 的类有哪些?”

  • “我想看下 redis 相关的配置类。”

(注:Agent 会先尝试通过安全的方式探测类名,然后引导你进一步操作)

5.3 交互流程

  • 提出需求:在输入框描述你的问题。

  • 方案生成:Agent 会分析意图,给出一组推荐的 Arthas 命令,并解释每一步的用途。

  • 执行与反馈:

  • Agent 可能会询问:“是否授权我执行?”

  • 或建议你:“请执行以下命令,并将结果贴给我。”

  • 多轮诊断:对于复杂问题(如性能优化),Agent 会根据第一步的输出结果(如线程栈),动态调整下一步的命令(如 trace 具体方法),逐步收敛直到找到根因。

6. 小建议:让 Agent 更快更准的 4 条信息

如果你愿意多给一点点上下文,排障速度会明显提升:

  • 目标范围:应用主包名(例如 com.mycompany)、模块名、接口名;

  • 现象时间:大概从什么时候开始、是否持续、是否能复现;

  • 影响面:影响的接口/用户比例、是否伴随错误码/异常栈;

  • 你最关心的结论:要根因、临时止血方案、还是长期治理建议;

7. 结语:把“会用 Arthas”变成“每个人都能用好 Arthas”

Arthas 让我们能在生产环境里“看见运行中的 Java”。

Arthas Agent 则让这种能力从“少数专家的手艺”变成“每个工程师都能复用的流程”:

  • 你说现象,它给路径

  • 你给线索,它补证据

  • 你要结论,它写报告

如果你愿意,把你最常见的排障场景告诉我们:我们会把它们沉淀成新的 Skills,让下一次“一句话排障”覆盖更多问题。

楼上正解!补充一下,Agent在设计上就考虑到了生产环境的特殊性。比如,它会限制ognl表达式的使用,避免全量枚举类,防止刷屏;采用多Agent协作,隔离风险操作。此外,Agent还会记录操作日志,方便审计和回溯,最大程度降低误操作风险。

大胆一点,直接说能替代80%的工作!有了Agent,再也不用对着Arthas命令发呆了。手动狗头.jpg。当然,前提是Agent给出的建议靠谱。

根据官方文档,Agent的技能是可扩展的。这意味着未来很有可能支持自定义技能。不过,自定义技能的开发和管理可能会比较复杂,需要考虑安全性、兼容性等问题。希望官方能提供完善的开发文档和示例,方便开发者快速上手。

从技术角度来看,我认为权限控制和操作审计是关键。Agent 需要严格控制可以执行的 Arthas 命令,并对所有操作进行详细记录。此外,应该提供完善的回滚机制,以便在出现问题时能够及时恢复。

从架构设计角度来看,Agent 的安全性应该体现在多个层面。首先,Skill 剧本的设计需要经过充分的安全评审,确保每条命令的执行都在可控范围内。其次,Agent 本身需要具备强大的异常处理能力,能够及时发现并阻止潜在的风险操作。最后,完善的监控和审计机制也是必不可少的,可以及时发现和追踪潜在的安全性问题。总之,生产环境的安全性是需要持续关注和改进的,没有一劳永逸的方案。

OGNL表达式强制单引号是为了避免字符串逃逸吧?这个限制我觉得可以接受,毕竟安全第一。更重要的是,Agent应该在用户输入OGNL表达式时,进行一些安全检查,例如限制访问的类和方法,避免执行恶意代码。感觉可以参考一些Web安全领域的做法,例如输入验证、权限控制等。

专家经验确实很难完全复制,但可以尝试提取一些通用的“模式”。比如,遇到某个异常,专家通常会先看哪些日志,然后会检查哪些配置。把这些“套路”沉淀下来,即使Agent不能完全解决问题,也能给用户提供一些有价值的线索。关键在于不断收集和整理专家的经验,并将其转化为可复用的“知识”.

Arthas Agent 的安全性设计考虑得还是比较周全的:

* 最小权限原则:Agent 默认只执行低风险操作,比如读取 JVM 信息、线程状态等,避免直接修改或影响应用状态。
* 人工授权:对于高风险操作,例如执行 OGNL 表达式、修改配置等,Agent 会先请求用户授权,并解释潜在风险,确保用户知情并同意。
* 命令限制:Agent 会限制 Arthas 命令的范围和参数,例如限制 OGNL 表达式的复杂度、避免全量枚举类等,防止误操作或恶意攻击。
* 操作审计:Agent 会记录所有执行的命令和操作,方便问题追踪和责任认定。

如果 Agent 出现 bug,导致误操作,也有一些补救措施:

* 回滚操作:对于一些可逆的操作,例如修改配置,可以尝试回滚到之前的状态。
* 紧急停止:如果误操作造成严重影响,可以立即停止 Agent,防止进一步损害。
* 隔离问题:通过隔离受影响的 JVM 或应用,限制问题扩散。
* 联系支持:及时联系阿里云技术支持,寻求专业帮助和解决方案。

当然,最重要的是在生产环境使用 Agent 前,务必进行充分测试和验证,确保其稳定性和安全性。

安全性是线上诊断工具的生命线啊!印象里 Arthas Agent 似乎做了不少限制,比如 OGNL 表达式必须用单引号包起来,避免执行恶意代码。Agent 还会对一些高危操作进行二次确认,避免误操作。

万一真出了问题,我觉得可以参考以下步骤:

1. 立即停止 Agent:避免进一步扩大影响。
2. 分析日志:看看 Agent 执行了哪些操作,有没有留下什么线索。
3. 尝试回滚:如果 Agent 修改了某些配置或状态,尝试恢复到之前的状态。
4. 寻求支持:联系 Arthas 官方或阿里云技术支持,寻求帮助。

当然,最好的办法还是防患于未然,上线前做好充分测试,并密切关注 Agent 的运行状态。

Skill 的维护更新,猜测官方会建立一个类似应用商店的平台,方便用户浏览、下载和更新 Skill。同时,官方应该也会提供 Skill 开发的 SDK 和文档,方便开发者贡献自己的 Skill。

开发者贡献 Skill 的流程,我觉得可以参考以下步骤:

1. 设计 Skill:明确 Skill 的功能、适用场景和使用方法。
2. 开发 Skill:按照官方提供的 SDK 和文档,编写 Skill 代码。
3. 测试 Skill:对 Skill 进行充分的测试,确保其功能和性能符合要求。
4. 提交 Skill:将 Skill 提交到官方平台,等待审核。
5. 发布 Skill:如果 Skill 通过审核,将被发布到平台上,供用户下载和使用。

期待 Arthas Agent 能够提供一个开放的 Skill 平台,让更多的开发者参与进来,共同打造一个强大的 Java 诊断生态。

可以考虑使用“影子模式”或者“沙箱模式”,将高风险的操作在隔离的环境中执行,避免对生产环境造成影响。例如,可以先在测试环境中模拟生产环境,然后使用Agent进行诊断和排查,找到解决方案后再应用到生产环境。

可以从以下几个方面考虑:1. 是否会修改应用状态;2. 是否会占用大量 CPU 或内存资源;3. 是否会产生大量的日志输出;4. 是否有可能泄露敏感信息。如果四个问题的答案都是“否”,那应该可以认为是低风险操作。高风险操作则需要谨慎授权。

同楼上,我也觉得自定义 Skill 这块很有潜力。不同公司、不同团队的应用场景差异很大,如果能把一些常用的排查流程固化成 Skill,效率肯定能提升不少。期待官方能提供更详细的 Skill 开发文档和示例。

数据库连接池问题必须安排上!连接泄漏、连接耗尽,这些都是常见的数据库问题。Agent 可以自动检测连接池的状态,比如空闲连接数、活跃连接数,如果发现异常,就报警或者自动调整连接池大小。

文章里提到了log_reader子 Agent,它专门负责“长文本/日志/堆栈”分析,主Agent负责“跑工具拿证据”。这种分工避免了主对话被噪声淹没,保持了界面的整洁和可读性。我觉得这种设计思路很棒!

多Agent协作,本质上是一种任务分解的思想。一个Agent负责采集数据,另一个Agent负责分析数据,我觉得还可以有专门负责“风险评估”的Agent,在执行高风险操作前,评估操作可能带来的影响,并给出建议。

除了log_reader,我觉得还可以有“数据库Agent”、“外部服务Agent”。比如,数据库Agent可以负责执行SQL查询,外部服务Agent可以负责调用外部API,这样排查问题的时候就不用自己去查数据库、调接口了,直接交给Agent就好了。