通过 Live-Debug Agent Skill 诊断 Python 应用

更新时间:
复制 MD 格式

对已接入 ARMS 的 Python 应用做运行时诊断时,通常需要构造探针配置、调用 CMS ServiceTask API,再到 SLS 查询采集结果。Live-Debug Agent Skill 将这一流程封装为 AI Agent 可执行的结构化工作流——安装到 QoderWork、Cursor、Claude Code 或其他支持 Agent Skill 的工具后,只需用自然语言描述诊断需求,Agent 即可自动编排:创建探针、查询结果、删除清理。无需改业务代码、无需发版、无需重启进程,即可在目标方法被调用时采集动态日志、方法快照、临时指标与链路信息。

重要

AI Agent 由大语言模型驱动,可能存在目标模块/方法识别偏差、表达式写错等风险。创建探针前请仔细核对 Agent 展示的配置与目标资源;建议先在测试环境验证探针对性能与稳定性的影响,再在生产环境使用。诊断结束后请及时删除探针,避免残留。

适用场景

诊断诉求

推荐能力

确认函数是否被调用、入参是否符合预期

动态日志(LOG)

看清参数、返回值、局部变量、调用栈

方法快照(SNAPSHOT)

异常时自动抓现场

方法快照(exception)

临时观察业务量/耗时分布

动态指标(METRIC)

临时补链路或给现有 Span 打业务标

SPAN/SPAN_TAG

方案架构

Skill 将 CMS ServiceTask 与 SLS 查询封装为 Agent 可执行工作流,核心能力包括:

  • 自然语言驱动:用一句话描述诊断意图,无需记忆 API 与脚本参数。

  • 场景感知:根据“日志/快照/指标/Span”自动选择探针类型并生成配置。

  • 自动编排:读取 .arms-info、创建任务、查询 SLS 状态与采集结果、按需删除探针。

  • 结果可核对:创建时返回 taskId,并可用本文参考配置对照 Agent 生成的 taskConfig

典型工作流程:描述需求 → Agent 自动创建探针 → 触发业务流量 → 查看采集结果 → 清理探针。

支持的诊断能力

能力

探针类型

taskType

说明

动态日志

LOG

live_debug_log_probe

按模板输出诊断日志;不采对象图与调用栈

方法快照

SNAPSHOT

live_debug_snapshot_probe

采集 ARGS/RETURN /LOCALS/STACK 等

动态指标

METRIC

live_debug_metric_probe

COUNTER/GAUGE/HISTOGRAM/SUMMARY

动态 Span

SPAN

live_debug_span_probe

函数级新建 OTel Span

Span 打标

SPAN_TAG

live_debug_span_tag_probe

给当前活跃 Span 追加属性

前提条件

条件

说明

阿里云账号

对目标 Workspace/应用具备 Live-Debug(CMS ServiceTask)与 SLS 查询权限

目标应用

Python 应用已接入 ARMS,并开启 Live-Debug

阿里云 CLI

已安装并可通过 aliyun configure 完成鉴权;需可调用 cms2(CMS CLI 插件 aliyuncms2)与 sls。安装方式见下方步骤一

AI Agent

已安装 QoderWork、Cursor、Claude Code 或其他支持 Agent Skill 的工具。Skill 安装方式见下方步骤二

应用接入信息

已准备 workspaceserviceIdregionIdslsProject 等(见步骤三

步骤一:安装并配置阿里云 CLI

Live-Debug Skill 通过 aliyun CLI 调用 CMS(aliyun cms2 apm service-task,创建/列举/删除任务)与 SLS(查询采集结果)。请先完成 CLI 安装与凭证配置。需具备对目标 Workspace/应用的 Live-Debug(CMS ServiceTask)与 SLS 查询权限。

安装 CLI

若尚未安装,请参考安装阿里云 CLI(按本机操作系统选择 Linux/macOS/Windows 安装方式)。

安装完成后确认可用:

aliyun version

配置访问凭证

aliyun configure

按提示填写 AccessKey ID、AccessKey Secret 与默认地域。建议使用 RAM 子账号,并授予 CMS ServiceTask 与目标 SLS Project 的读写/查询权限。详细说明请参考配置与管理身份凭证

说明

Live-Debug 查询结果时会显式指定 regionId(来自 .arms-info),不要依赖本机 aliyun configure 的默认地域作为唯一来源——默认地域与 SLS Project 不一致时,可能报 ProjectNotExist

安装 CMS CLI(aliyuncms2)并验证 cms2 与 SLS 可用

CMS ServiceTask 能力由 aliyuncms2 插件二进制提供:获取 aliyuncms2 后放入 ~/.aliyun/ 目录(或 PATH),即可通过 aliyun cms2 调用,凭证复用 aliyun configure 的配置。

# 验证 CMS ServiceTask 相关能力
aliyun cms2 apm service-task --help

# 验证 SLS 查询可用
aliyun sls --help

cms2 不可用,请确认 aliyuncms2 二进制已放入 ~/.aliyun/(或 PATH)且具有可执行权限:

ls -l ~/.aliyun/aliyuncms2
chmod +x ~/.aliyun/aliyuncms2
aliyun cms2 apm service-task --help

仍失败时,请升级阿里云 CLI 后重试:

aliyun upgrade -y

步骤二:安装 Live-Debug Agent Skill

  1. 获取 Live-Debug Agent Skill,通过 alibabacloud-livedebug 一键安装到你的 AI Agent 中。

  2. 按所用 AI 工具的指引,将 Skill 安装到 QoderWork、Cursor、Claude Code 等环境。

  3. 安装完成后,重启 AI 助手,或通过对话确认 Skill 已加载(例如询问“是否已加载 Live-Debug Skill?”)。

下文用 ${LIVE_DEBUG_SKILL_ROOT} 表示 Skill 安装根目录;配套脚本位于 ${LIVE_DEBUG_SKILL_ROOT}/scripts/

步骤三:准备应用接入信息

Python 应用须已接入 ARMS,并开启 Live-Debug。

待诊断项目根目录创建 .arms-infokey=value),供 Agent 自动读取;也可直接通过对话告知同等信息。

workspace=default-cms-xxxxxxxxxxxxxxxxxx-cn-hangzhou
serviceId=ggxw4lnjuz@f2fd3a6265a254a052afb
regionId=cn-hangzhou
targetIp=*
slsProject=proj-xtrace-xxxxxxxxxxxxxxxxxxxxxx-cn-hangzhou

参数

是否必填

说明

workspace

ARMS 工作空间 ID

serviceId

应用/服务 ID

regionId

接入地域,如 cn-hangzhou

slsProject

存放 Live-Debug 结果的 SLS Project

targetIp

目标实例 IP;缺省为 *(全部实例)

步骤四:使用自然语言发起诊断

建议用 Qoder 等 AI Coding 工具打开你的项目代码,并切换到线上应用对应的分支,之后在 AI Coding 工具中使用自然语言发起诊断。描述诊断需求时,建议包含以下信息(缺失时 Agent 会询问):

信息

是否必填

示例

目标位置

app.service.order 中的 OrderService.create_order,或某文件第 N 行

观察时机

建议

入口/出口/抛异常时/某一行(默认多在出口)

想看到的内容

入参、返回值、耗时、局部变量、调用栈等

过滤条件

仅当 amount > 10000

持续时间/次数

半小时/采满 50 次就停

创建成功后,Agent 会返回 taskId。请对照下文参考配置核对目标模块、方法、location、模板或 capture 等关键字段,再触发业务流量。

1. 动态日志(LOG)

可以这样说:

请使用 /alibabacloud-livedebug 技能,给 app.service.order 模块的 OrderService.create_order 出口打一条动态日志,打印 order_id、amount、返回值和耗时,保留半小时。

参考配置:taskType = live_debug_log_probe

{
  "probeType": "LOG",
  "language": "python",
  "target": {
    "typeName": "app.service.order",
    "methodName": "OrderService.create_order",
    "location": "exit",
    "instanceIds": ["*"]
  },
  "action": {
    "type": "LOG",
    "template": "create_order id={order_id} amount={amount} ret={@return} cost={@duration}ms"
  },
  "ttl": "30m",
  "captureCount": 100
}

行级、带条件:

在 app/service/order.py 第 42 行打日志,只有 amount >= 1000 时才输出订单号和金额。

参考配置:taskType = live_debug_log_probe

{
  "probeType": "LOG",
  "language": "python",
  "target": {
    "sourceFile": "app/service/order.py",
    "location": "line:42",
    "instanceIds": ["*"]
  },
  "trigger": {
    "condition": "amount >= 1000"
  },
  "action": {
    "type": "LOG",
    "template": "big order id={order_id} amount={amount}"
  },
  "ttl": "30m"
}

2. 方法快照(SNAPSHOT)

可以这样说:

请使用 /alibabacloud-livedebug 技能,对 OrderService.create_order 出口做一次快照,采集入参、局部变量、返回值和调用栈,最多采 20 次。

参考配置:taskType = live_debug_snapshot_probe

{
  "probeType": "SNAPSHOT",
  "language": "python",
  "target": {
    "typeName": "app.service.order",
    "methodName": "OrderService.create_order",
    "location": "exit",
    "instanceIds": ["*"]
  },
  "action": {
    "type": "SNAPSHOT",
    "capture": ["ARGS", "LOCALS", "RETURN", "STACK"],
    "captureConfig": {
      "maxDepth": 3,
      "maxCollectionSize": 100,
      "maxStringLength": 1024
    }
  },
  "ttl": "30m",
  "captureCount": 20
}

条件过滤 + 自定义字段:

create_order 出口做快照:仅当返回值为空或金额大于 10000 时触发;重点看 order_id、amount * count、self.user_id 和返回值。

参考配置:taskType = live_debug_snapshot_probe

{
  "probeType": "SNAPSHOT",
  "language": "python",
  "target": {
    "typeName": "app.service.order",
    "methodName": "OrderService.create_order",
    "location": "exit",
    "instanceIds": ["*"]
  },
  "trigger": {
    "condition": "@return is None or amount > 10000"
  },
  "action": {
    "type": "SNAPSHOT",
    "capture": ["ARGS"],
    "captureExpressions": [
      "order_id",
      "amount * count",
      "self.user_id",
      "@return"
    ]
  },
  "ttl": "30m",
  "captureCount": 50
}

异常现场:

PaymentService.process_payment 一旦抛异常就抓快照,带上入参、异常信息和调用栈,保留 2 小时。

参考配置:taskType = live_debug_snapshot_probe

{
  "probeType": "SNAPSHOT",
  "language": "python",
  "target": {
    "typeName": "app.service.payment",
    "methodName": "PaymentService.process_payment",
    "location": "exception",
    "instanceIds": ["*"]
  },
  "action": {
    "type": "SNAPSHOT",
    "capture": ["ARGS", "EXCEPTION", "STACK", "LOCALS"]
  },
  "ttl": "2h",
  "captureCount": 100
}

3. 动态指标(METRIC)

可以这样说:

请使用 /alibabacloud-livedebug 技能,给 create_order 挂一个金额直方图指标,标签里标一下是不是 vip 用户,持续 1 小时。

参考配置:taskType = live_debug_metric_probe

{
  "probeType": "METRIC",
  "language": "python",
  "target": {
    "typeName": "app.service.order",
    "methodName": "OrderService.create_order",
    "location": "exit",
    "instanceIds": ["*"]
  },
  "action": {
    "type": "METRIC",
    "metricName": "livedebug.order.amount",
    "metricType": "HISTOGRAM",
    "valueExpression": "amount",
    "tags": {
      "is_vip": "str(user_id == 'vip')"
    }
  },
  "ttl": "1h"
}

4. 动态 Span(SPAN)

可以这样说:

请使用 /alibabacloud-livedebug 技能,在 OrderService.create_order 上临时加一个 Span,名叫 dyn.create_order,把订单号和金额打到属性里。

参考配置:taskType = live_debug_span_probe

{
  "probeType": "SPAN",
  "language": "python",
  "target": {
    "typeName": "app.service.order",
    "methodName": "OrderService.create_order",
    "location": "enter",
    "instanceIds": ["*"]
  },
  "action": {
    "type": "SPAN",
    "spanName": "dyn.create_order",
    "spanTags": {
      "order.id": "str(order_id)",
      "order.amount": "str(amount)"
    }
  },
  "ttl": "1h"
}

5. Span 打标(SPAN_TAG)

可以这样说:

create_order 出口时,请使用 /alibabacloud-livedebug 技能,给当前 Span 打上 order.id 和 order.result(用返回值),不要新建 Span。

参考配置:taskType = live_debug_span_tag_probe

{
  "probeType": "SPAN_TAG",
  "language": "python",
  "target": {
    "typeName": "app.service.order",
    "methodName": "OrderService.create_order",
    "location": "exit",
    "instanceIds": ["*"]
  },
  "action": {
    "type": "SPAN_TAG",
    "tags": [
      {"key": "order.id", "value": "str(order_id)"},
      {"key": "order.result", "value": "str(@return)"}
    ]
  },
  "ttl": "1h"
}

步骤五:触发流量、验证结果并收尾

  1. 核对配置:确认 Agent 下发的 taskConfig 与上文参考配置在目标定位、采集内容上一致。

  2. 触发流量:对会走到目标代码路径的接口发起一次(或若干次)请求。

  3. 查询结果:对 Agent 说:

    查一下刚才那个 taskId 的采集结果,并帮我解读有没有装上、采到了什么。
    • Task Status:探针是否安装成功、漏斗指标等。

    • Capture Results:实际采集到的日志/快照等内容。

  4. 收尾清理(务必执行):

    把刚才的探针删掉。
    清空当前服务下全部 Live-Debug 探针。
    看一下当前服务还挂着哪些 Live-Debug 探针。

场景速查

诊断诉求

可以这样说

对应 taskType

快速打点确认调用

“给某某函数出口打动态日志,打印 …”

live_debug_log_probe

深看参数/返回值/栈

“对某某函数做快照,采集 …”

live_debug_snapshot_probe

只在异常时抓现场

“某某函数抛异常时抓快照”

live_debug_snapshot_probe

看某一行附近的变量

“在某某文件第 N 行打日志/做快照”

live_debug_log_probe/live_debug_snapshot_probe

临时指标

“给某某函数挂一个 … 指标”

live_debug_metric_probe

临时补链路/打标

“给某某函数加 Span/给当前 Span 打上 …”

live_debug_span_probe/live_debug_span_tag_probe

看结果

“查 taskId=… 的结果并解读”

—(查 SLS)

收尾

“删掉这个探针”或“清空全部探针”

—(Delete)

常见问题

Agent 提示 cms2/aliyun 命令不可用

原因: 未安装阿里云 CLI、版本过低,或 aliyuncms2 插件二进制未就绪。

解决方法:

aliyun version
aliyun upgrade -y
ls -l ~/.aliyun/aliyuncms2   # 确认 CMS CLI 插件二进制存在且可执行
aliyun cms2 apm service-task --help
aliyun sls --help

并确认已执行 aliyun configure 配置 AccessKey。

创建成功但一直没有 Capture Results

请依次排查:

  1. 让 Agent 先看 Task Status,确认探针是否安装成功。

  2. 核对 typeName/methodName 是否与运行时模块名、__qualname__ 一致;主模块是否应填 __main__

  3. 确认已触发会走到目标函数的业务请求;过滤条件是否过严。

  4. 确认 .arms-info 中的 regionIdslsProject 地域一致。

  5. 适当加大查询时间窗口后再查一次。

也可直接对 Agent 说:“一直没采到数据,帮我看状态和目标定位是否正确。”

SLS 报 ProjectNotExist

原因: 查询使用的地域与 SLS Project 所在地域不一致。

解决方法: 打开 .arms-info,填写正确的 regionId,并确保 Agent 导出了 LIVE_DEBUG_REGION_ID,不要只依赖 CLI 默认地域。

如何确认探针已清理干净

看一下当前服务还挂着哪些 Live-Debug 探针;如果还有,全部删掉。

Python 应用能否做线程/内存/反编译诊断?

不能。这些属于 Command 能力,仅 Java/JVM 支持。Python 请改用日志、快照、指标或 Span 类诉求。

相关文档