当前,Sentry 虽能捕获线上错误,但根因定位仍依赖人工查日志、翻代码,效率低下。通用 AI 因缺乏项目上下文,无法精准诊断。
我们的目标是:开发一个 OpenClaw Skill,在本地工程环境中直接分析 Sentry 错误,实现以下能力:
✅ 精准定位: 利用 Sentry 堆栈中的 文件路径 + 行号,直接读取本地对应源文件,避免基于提交历史的模糊推测。
✅ 上下文感知: 提取错误行前后 5-10 行代码作为上下文,让 LLM 理解变量状态、控制流与业务逻辑。
✅ 智能诊断: 基于完整代码上下文,分析空指针、类型错误、逻辑漏洞等常见问题,输出根因。
✅ 一键修复: 生成标准 diff 格式的修复补丁,开发者可直接应用,大幅缩短 MTTR(平均修复时间)。
✅ 安全合规: 所有源码分析在本地完成,Sentry Token 通过环境变量注入,敏感数据零外泄。
最终效果:当 Sentry 告警响起,运行一条命令,AI 即返回:“问题在
views/order.py第 88 行,因未校验coupon是否过期,建议增加if coupon.is_expired(): raise ...”。
在 OpenClaw 的用户技能目录下新建专属 Skill:
bash编辑
# 创建目录
mkdir -p ~/.openclaw/skills/sentry_local_analyzer
# 进入目录
cd ~/.openclaw/skills/sentry_local_analyzer
此目录将包含 Skill 的全部逻辑,OpenClaw 会自动加载。
__init__.py)创建 __init__.py 文件,实现 “Sentry API 调用 → 本地源码读取 → LLM 智能诊断” 流程:
python编辑
# ~/.openclaw/skills/sentry_local_analyzer/__init__.py
from openclaw import Skill, tools
import requests
import os
class SentryLocalAnalyzer(Skill):
name = "sentry_local_analyzer"
description = "Analyze Sentry errors with direct access to local source code."
def run(self, event_id: str, sentry_org: str, sentry_project: str, project_root: str = "."):
# 1. 安全获取 Sentry Token
auth_token = tools.get_env("SENTRY_AUTH_TOKEN")
if not auth_token:
return {"error": "Missing SENTRY_AUTH_TOKEN in environment"}
# 2. 调用 Sentry API 获取事件详情
url = f"https://sentry.io/api/0/projects/{sentry_org}/{sentry_project}/events/{event_id}/"
headers = {"Authorization": f"Bearer {auth_token}"}
response = requests.get(url, headers=headers)
event_data = response.json()
# 3. 提取最相关的应用代码帧(优先 in_app=True)
frame = self._extract_app_frame(event_data)
if not frame:
return {"error": "No relevant application frame found"}
file_path = frame["filename"]
line_num = frame["lineno"]
# 4. 【核心】映射到本地源码并读取上下文
local_path = os.path.join(project_root, file_path.lstrip("/"))
try:
with open(local_path, 'r') as f:
all_lines = f.readlines()
# 提取错误行前后各5行(共11行)
start = max(0, line_num - 6)
end = min(len(all_lines), line_num + 5)
code_snippet = ''.join(all_lines[start:end])
error_line = all_lines[line_num - 1].strip()
except FileNotFoundError:
return {"error": f"Source file not found: {local_path}"}
# 5. 构建精准诊断 Prompt
prompt = f"""
Analyze this production error using the LOCAL source code below.
Sentry Event: {event_id}
File: {file_path} | Line: {line_num}
Error Line: `{error_line}`
Code Context:
```python
{code_snippet}
```
Tasks:
1. Root cause of the error on line {line_num}?
2. Missing checks or invalid assumptions?
3. Provide a minimal fix as a unified diff.
4. Critical for production? (Yes/No)
Respond in JSON.
"""
# 6. 调用 LLM 并返回结构化结果
analysis = self.llm.ask(prompt, json=True)
return {
"event_id": event_id,
"file": local_path,
"line": line_num,
"analysis": analysis,
"sentry_url": f"https://sentry.io/.../{event_id}"
}
def _extract_app_frame(self, event_data):
"""从 Sentry 堆栈中提取最深的应用代码帧"""
try:
frames = event_data["entries"][0]["data"]["exception"]["values"][0]["stacktrace"]["frames"]
# 优先返回标记为 in_app 的最深帧
for frame in reversed(frames):
if frame.get("in_app", False):
return frame
return frames[-1] # 退化到最后一帧
except (KeyError, IndexError):
return None
为确保安全与正确性,需配置两项:
Sentry API Token(仅需 event:read 权限)
在项目根目录创建 .env 文件:
env编辑
SENTRY_AUTH_TOKEN=your-sentry-auth-token
💡 OpenClaw 的
tools.get_env()会自动加载此文件。
(可选)指定项目根目录
如果 Skill 不在项目根目录运行,通过 --project-root 参数指定:
bash编辑
openclaw run sentry_local_analyzer --project-root /path/to/your/project ...
在项目根目录执行:
bash编辑
openclaw run sentry_local_analyzer \
--event-id "SENTRY_EVENT_ID" \
--sentry-org "your-org" \
--sentry-project "your-project"
通过以上四步,你已将 Sentry 从一个“错误记录仪”,升级为一个具备源码理解能力的智能诊断引擎。这不仅是效率的提升,更是质量保障范式的进化——让每一次线上问题,都成为系统自我修复的契机。
现在,就去创建你的 sentry_local_analyzer,让 AI 成为你最得力的“本地调试搭档”!