jpskill.com
🛠️ 開発・MCP コミュニティ

🛠️ SlsTrace分析

sls-trace-analysis

阿里云SLSログとARMSトレースを分析し、ソースコードやデータベースと組み合わせて、サービスやAPIの障害、ユーザーリクエストのエラーなどを特定し、解決策を提案するためのSkillです。

📜 元の英語説明(参考)

查询阿里云SLS日志和ARMS调用链,结合源码和数据库进行全链路问题排查。 完整流程:查日志 → 画调用链 → 定位源码 → 排查数据库 → 给出修复方案。 Use when: 用户说「分析sls」「分析问题」或想排查业务服务/线上接口/用户请求的报错或异常。 触发示例:「分析sls」「帮我查一下这个trace_id」「分析一下这个trace_id」 「查一下这个用户的请求」「wusid 是 xxx」「uid xxx」 「查一下 /path/to/api 这个接口的报错」「帮我排查一下这个业务报错」「线上有个接口挂了」 「帮我分析一下这个报错的代码」「数据库报错了」「SQL超时」「查一下这个接口为什么慢」。 IMPORTANT: trace_id = 染色ID = 业务调用链ID = requestId,这些都是同一个东西, 统一用 trace_id 表述。用户提供的 trace_id 是业务系统的外部 trace,不是 OpenClaw 内部 session ID, 不要自行分析 trace_id 的来源或归属,必须调用此 skill 去 SLS/ARMS 查询。 NOT for: 查询OpenClaw自身状态、分析OpenClaw系统问题、搜索本地文件、openclaw内置命令。

🇯🇵 日本人クリエイター向け解説

一言でいうと

阿里云SLSログとARMSトレースを分析し、ソースコードやデータベースと組み合わせて、サービスやAPIの障害、ユーザーリクエストのエラーなどを特定し、解決策を提案するためのSkillです。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o sls-trace-analysis.zip https://jpskill.com/download/5403.zip && unzip -o sls-trace-analysis.zip && rm sls-trace-analysis.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/5403.zip -OutFile "$d\sls-trace-analysis.zip"; Expand-Archive "$d\sls-trace-analysis.zip" -DestinationPath $d -Force; ri "$d\sls-trace-analysis.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して sls-trace-analysis.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → sls-trace-analysis フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-18
同梱ファイル
5

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

[Skill 名] sls-trace-analysis

SLS + ARMS + コード + データベース 全リンク問題調査

Alibaba Cloud SLS ログと ARMS 呼び出しチェーンを照会し、ソースコードの問題を特定し、データベースの異常を調査し、完全な修正案を提示します。

⚠️ 重要なルール(厳守必須)

  1. 以下の Python コマンドを実行してのみ照会し、ローカル検索や組み込みのログコマンドの使用は禁止されています。
  2. ユーザーが提供する trace_id は外部ビジネスシステムの ID であり、その出所、帰属、または意味を推測することは禁止されています。直接クエリスクリプトを実行してください。
  3. 各 logstore のログは個別にグループ化して表示する必要があり、結合または重複排除は厳禁です。
  4. 複数のログが同じサービス、同じ時間からのものであっても、各ログを完全に表示する必要があります。
  5. 出力レポートには、sls.logs_by_logstore 内の各 logstore のすべてのログを含める必要があります。
  6. すべての対話プロンプトは、以下のテンプレートに厳密に従って出力する必要があり、自由に表現したり、自分の言葉で書き換えたり、感嘆詞や追加の説明を追加したりすることは禁止されています。ユーザーが見るプロンプトはテンプレートと一字一句同じでなければなりません。
  7. Step 5 のコード検索と Step 6 のデータベース調査は自動的に実行する必要があり、「xxx の検索を推奨します」のようなテキストのみを出力することは禁止されています。異常を発見した場合は、直ちに Grep/Glob/Read ツールを使用してコードリポジトリを実際に検索する必要があります。
  8. オプションを提供するすべてのプロンプトには番号(1 2 3 …)を付ける必要があり、ユーザーは番号で直接操作できます。番号のないオプションリストを出力することは禁止されています。「続行する」「次へ」など、テンプレートにないプロンプトテキストを自作することは禁止されています。ユーザーが選択する必要がある各シナリオには対応するテンプレートがあり、そのテンプレートを使用する必要があります。

実行ステップ

Step 1:クエリパラメータの収集(インタラクティブ)

このスキルに入ったら、すぐにユーザーメッセージをスキャンしてパラメータを抽出します。既存のものはそのまま使用し、不足しているものだけを尋ねます。


1.1 ユーザーメッセージのスキャン

ユーザーメッセージにクエリパラメータ(TraceID / wusid / path / 時間)が既に含まれているかを確認します。

  • 既存のパラメータがある場合(例:「trace_id f1b37e05... を調べてください」とユーザーが言った場合)→ 直接抽出して Step 1.3 にスキップします。
  • パラメータがない場合(例:「sls を分析してください」とユーザーが言った場合)→ Step 1.2 に進んで尋ねます。

1.2 クエリ条件の問い合わせ

あなたの返信は、以下のテキストのみでなければなりません。「🔍」から「逐項入力。」まで、一字一句増減させたり、感嘆詞を追加したり、挨拶を追加したり、自分の言葉で書き換えたりすることはできません。出力後、直ちにユーザーの返信を待って停止します。

🔍 クエリ条件を入力してください。形式:キーワード 値、複数項目は ; で区切ります。

trace_id xxx; wusid xxx; path xxx

① trace_id — 染色ID / ビジネス呼び出しチェーンID(32桁の16進数文字列) ② wusid — ユーザースペースID(数字、uid も使用可能) ③ path — リクエストパス(例:/ny.apps_pb.xxx/Method

少なくとも1項目を入力し、番号 1 2 3 で逐項入力できます。

ユーザー返信の解析ルール:

概念の統一:trace_id = 染色ID = ビジネス呼び出しチェーンID = requestId はすべて同じものです。

ケース A:ユーザーがパラメータ値(; またはキーワードを含む)を入力した場合

  1. ; または改行で各項目を分割します。
  2. 各項目内でスペースで区切ります。前がパラメータ名、後ろが値です。
    • trace_id / tid / trace / 染色id / requestid → trace_id
    • wusid / uid / 用户id → wusid
    • path / 接口 / api → path
  3. パラメータ名がない場合、自動的に識別します:32桁の16進数→trace_id、純粋な数字→wusid、/ で始まる→path
  4. いずれかのパラメータが抽出された場合 → Step 1.3 に進みます。

ケース B:ユーザーが番号で返信した場合

  • 1 → 「trace_id を入力してください:」と返信 → ユーザーが値を入力するのを待つ → 記録 → Step 1.3 に進みます。
  • 2 → 「wusid を入力してください:」と返信 → ユーザーが値を入力するのを待つ → 記録 → Step 1.3 に進みます。
  • 3 → 「path を入力してください:」と返信 → ユーザーが値を入力するのを待つ → 記録 → Step 1.3 に進みます。

ケース C:識別できない場合

  • 「パラメータが識別できませんでした。形式に従って入力してください(例:trace_id xxx)または番号 1 2 3 で返信してください」と返信します。
  • ユーザーが「ない」「わからない」と言った場合 → 順に wusid → path を尋ね、どちらもなければ停止します。

1.3 時間範囲の確認

ユーザーが時間情報を提供しているかを確認します。

  • 時間が言及されている場合(例:「今日の午後」、「昨日」、「最近2時間」)→ 自動変換し、直接 Step 1.4 にスキップします。
  • 時間が言及されていない場合 → あなたの返信は、以下のテキストのみでなければなりません。書き換えはできません。

⏰ 時間範囲は?デフォルトは 最近 1 週間 ですが、指定することもできます:

デフォルト           →  最近 1 週間(直接エンター)
1時間 / 3日 / 2週間 / 1ヶ月  →  相対時間
今日 / 昨日    →  当日範囲
2024-03-15 14:00 ~ 16:00   →  正確な時間帯
  • ユーザーがエンターを押す / 「デフォルト」「いいえ」「はい」と言う → デフォルトの1週間を使用します。
  • ユーザーが時間を指定する → --duration または --start/--end に渡します。
  • ユーザーが「今日」「昨日」などと言う → --start/--end を自分で計算します。

時間変換の参考:

ユーザーの言葉 変換
今日 --start "今日00:00:00" --end "現在時間"
昨日 --start "昨日00:00:00" --end "昨日23:59:59"
今日の午後 --start "今日12:00:00" --end "現在時間"
最近N時間/日/週/月 --duration "N時間/日/週/月"
先週 --start "先週月曜日00:00:00" --end "先週日曜日23:59:59"
3月15日 --start "3月15日00:00:00" --end "3月15日23:59:59"

1.4 クエリ概要の出力と実行

📋 クエリパラメータ:

条件:trace_id = xxx  /  wusid = xxx  /  path = xxx
時間:最近 1 週間(2026-03-12 ~ 2026-03-19)
ソース:SLS + ARMS

🚀 照会中です。しばらくお待ちください…

高度なオプション(積極的に尋ねない、ユーザーが言及した場合のみ追加):

  • 「SLSのみを照会」 / 「ARMSを照会しない」 → --skip-arms
  • 「ARMSのみを照会」 / 「SLSを照会しない」 → --skip-sls
  • 「xxx logstore を照会」 → --logstores "xxx"

Step 2:クエリスクリプトの実行(必須実行)

デフォルトでは最近1週間を照会します。時間パラメータを指定する必要はありません。 --duration は自然言語の時間(1時間、2日、1週間、1ヶ月、半日、30m、6h、3d、1w など)をサポートしています。 --minutes N で直接分数、または --start/--end で正確な時間帯を渡すこともできます。

モード A:TraceID が既知の場合(直接分析)

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID"

カスタム時間範囲(自然言語):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --duration "3天"

正確な時間範囲:

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --start "2024-01-15 14:00:00" --end "2024-01-15 15:00:00"

ARMS のみを照会(SLS をスキップ):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --skip-sls

SLS のみを照会(ARMS をスキップ):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --skip-arms

モード B:TraceID が不明な場合、wusid / path で最初に検索

ユーザー ID で検索:

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --wusid "76149226" --no-interactive

リクエストパスで検索:

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --path "/ny.apps_pb.promote_pb.PromotePB/UpdateRelation" --no-interactive

両方を組み合わせる(範囲を正確に絞り込む):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --wusid "76149226" --path "/ny.apps_pb.promote_pb.PromotePB/UpdateRelation" --no-interactive

モード B の説明--no-interactive は、スクリプトが最初の TraceID を自動的に選択して分析するようにします。JSON 出力の discovered_traces に複数の項目がある場合、リストを表示してユーザーに選択させ、選択された trace_id を使用してモード A で再照会できます。

Step 3:スクリプト出力の解析

スクリプトは JSON を返します。以下のフィールドを読み取る必要があります。

クエリ情報(query):

query.trace_id               → 今回使用された TraceID(モード A)
query.wusid                  → 今回使用された wusid(モード B)
query.path                   → 今回使用されたパス(モード B)

モード B 専用(discovered_traces):

discovered_traces[].trace_id      → 見つかった TraceID
discovered_traces[].first_time    → 最初のログの時間
discovered_traces[].service       → サービス名
discovered_traces[].path          → リクエストパス
discovered_traces[].response_code → レスポンスコード
discovered_traces[].response_msg  → レスポンスメッセージ
discovered_traces[].has_error     → ERROR ログがあるかどうか
discovered_traces[].log_count     → 一致したログの数

ARMS 呼び出しチェーン(call_chain):

call_chain.tree              → インデント付きの呼び出しリンク図(テキスト)、異常 ID と完全なスタックを含む
call_chain.error_spans       → 異常 Span のリスト(exception_id、full_stack フィールドを含む)
call_chain.services          → 関係するサービスリスト
call_chain.total_duration_ms → 総所要時間

メソッドレベルのスタック(stack_details):

stack_details.{key}.trace_id       → TraceID
stack_details.{key}.rpc_id         → RpcID
stack_details.{key}.service        → サービス名
stack_details.{key}.operation      → 操作名
stack_details.{key}.exception_id   → 異常 ID
stack_details.{key}.stack_entries  → メソッドレベルのスタックリスト(api、duration、exception、line)
stack_details.{key}.formatted      → フォーマットされたスタックテキスト

SLS ログ(sls):

sls.store_stats              → 各 logstore のクエリ統計(すべて表示必須)
sls.logs_by_logstore         → logstore ごとにグループ化されたログ(グループごとに表示必須、結合不可)
sls.err
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

SLS + ARMS + 代码 + 数据库 全链路问题排查

查询阿里云SLS日志和ARMS调用链 → 定位源码问题 → 排查数据库异常 → 给出完整修复方案。

⚠️ 关键规则(必须严格遵守)

  1. 必须且只能通过执行下方 python 命令查询,禁止使用本地搜索或内置日志命令。
  2. 用户给出的 trace_id 是外部业务系统的 ID,禁止自行推断其来源、归属或意义,直接执行查询脚本。
  3. 每个 logstore 的日志必须单独分组展示,严禁合并或去重。
  4. 即使多条日志来自同一服务、同一时间,也必须逐条完整输出。
  5. 输出报告中必须包含 sls.logs_by_logstore 里每个 logstore 的所有日志。
  6. 所有交互提示必须严格按照下方模板输出,禁止自由发挥、禁止用自己的话改写、禁止添加语气词或额外解释。用户看到的提示必须和模板一字不差。
  7. Step 5 代码搜索和 Step 6 数据库排查必须自动执行,禁止只输出"建议搜索xxx"之类的文字。发现异常后必须立即用 Grep/Glob/Read 工具实际搜索代码仓库。
  8. 所有提供选项的提示必须带序号(1 2 3 …),用户可以直接回复序号操作。禁止输出不带序号的选项列表。禁止自编"继续操作"/"接下来"等不在模板中的提示文字。每个需要用户选择的场景都有对应模板,必须使用模板。

执行步骤

Step 1:收集查询参数(交互式)

进入此 skill 后,立即扫描用户消息提取参数。已有的直接用,缺的才问。


1.1 扫描用户消息

检查用户消息中是否已包含查询参数(TraceID / wusid / path / 时间):

  • 已有参数(如用户说"帮我查 trace_id f1b37e05...")→ 直接提取,跳到 Step 1.3
  • 没有参数(如用户只说"分析sls")→ 进入 Step 1.2 询问

1.2 询问查询条件

你的回复必须且只能是下面这段文字,从「🔍」开始到「逐项输入。」结束,不能多一个字也不能少一个字,不能加语气词、不能加问候、不能用自己的话改写,输出后立即停止等待用户回复:

🔍 请输入查询条件,格式:关键词 值,多项用 ; 分隔:

trace_id xxx; wusid xxx; path xxx

① trace_id — 染色ID / 业务调用链ID(32位十六进制字符串) ② wusid — 用户空间ID(数字,也可以用 uid) ③ path — 请求路径(如 /ny.apps_pb.xxx/Method

至少输入一项,回复序号 1 2 3 可逐项输入。

解析用户回复规则:

概念统一:trace_id = 染色ID = 业务调用链ID = requestId,都是同一个东西。

情况 A:用户输入了参数值(含 ; 或关键词)

  1. ; 或换行拆分每项
  2. 每项内按空格分隔:前面是参数名,后面是值
    • trace_id / tid / trace / 染色id / requestid → trace_id
    • wusid / uid / 用户id → wusid
    • path / 接口 / api → path
  3. 不带参数名时自动识别:32位十六进制→trace_id,纯数字→wusid,/开头→path
  4. 提取到任意参数 → 进入 Step 1.3

情况 B:用户回复了序号

  • 1 → 回复「请输入 trace_id:」→ 等用户输入值 → 记录 → 进入 Step 1.3
  • 2 → 回复「请输入 wusid:」→ 等用户输入值 → 记录 → 进入 Step 1.3
  • 3 → 回复「请输入 path:」→ 等用户输入值 → 记录 → 进入 Step 1.3

情况 C:无法识别

  • 回复「未识别到参数,请按格式输入(如 trace_id xxx)或回复序号 1 2 3
  • 用户说"没有"/"不知道" → 依次追问 wusid → path → 都没有则停止

1.3 确认时间范围

检查用户是否已提供时间信息:

  • 已提及时间(如"今天下午"、"昨天"、"最近2小时")→ 自动转换,直接跳到 Step 1.4
  • 未提及时间 → 你的回复必须且只能是下面这段文字,不能改写:

⏰ 时间范围?默认 最近 1 周,也可以指定:

默认           →  最近 1 周(直接回车)
1小时 / 3天 / 2周 / 1个月  →  相对时间
今天 / 昨天    →  当天范围
2024-03-15 14:00 ~ 16:00   →  精确时间段
  • 用户回车 / 说"默认"/"可以"/"行" → 使用默认 1 周
  • 用户给出时间 → 传给 --duration--start/--end
  • 用户说"今天"/"昨天"等 → 自行计算 --start/--end

时间转换参考:

用户说的 转换
今天 --start "今天00:00:00" --end "当前时间"
昨天 --start "昨天00:00:00" --end "昨天23:59:59"
今天下午 --start "今天12:00:00" --end "当前时间"
最近N小时/天/周/月 --duration "N小时/天/周/月"
上周 --start "上周一00:00:00" --end "上周日23:59:59"
3月15号 --start "3月15日00:00:00" --end "3月15日23:59:59"

1.4 输出查询摘要并执行

📋 查询参数:

条件:trace_id = xxx  /  wusid = xxx  /  path = xxx
时间:最近 1 周(2026-03-12 ~ 2026-03-19)
来源:SLS + ARMS

🚀 正在查询,请稍候…

高级选项(不主动询问,仅用户提到时才加):

  • "只查SLS" / "不查ARMS" → --skip-arms
  • "只查ARMS" / "不查SLS" → --skip-sls
  • "查 xxx logstore" → --logstores "xxx"

Step 2:执行查询脚本(必须执行)

默认查最近 1 周,无需指定时间参数。 支持 --duration 自然语言时间:1小时、2天、1周、1星期、1个月、半天、30m、6h、3d、1w 等。 也支持 --minutes N 直接传分钟数,或 --start/--end 精确时间段。

模式 A:已知 TraceID(直接分析)

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID"

自定义时间范围(自然语言):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --duration "3天"

精确时间范围:

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --start "2024-01-15 14:00:00" --end "2024-01-15 15:00:00"

只查 ARMS(跳过 SLS):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --skip-sls

只查 SLS(跳过 ARMS):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --trace-id "TraceID" --skip-arms

模式 B:未知 TraceID,通过 wusid / path 先检索

按用户 ID 检索:

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --wusid "76149226" --no-interactive

按请求路径检索:

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --path "/ny.apps_pb.promote_pb.PromotePB/UpdateRelation" --no-interactive

两者组合(精确缩小范围):

python "%USERPROFILE%\.openclaw\workspace\skills\sls-trace-analysis\scripts\query_trace.py" --wusid "76149226" --path "/ny.apps_pb.promote_pb.PromotePB/UpdateRelation" --no-interactive

模式 B 说明--no-interactive 让脚本自动选择第一条 TraceID 进行分析。如果 JSON 输出的 discovered_traces 有多条,可展示列表让用户选择,然后用选中的 trace_id 以模式 A 重新查询。

Step 3:解析脚本输出

脚本返回 JSON,必须读取以下字段:

查询信息(query):

query.trace_id               → 本次使用的 TraceID(模式 A)
query.wusid                  → 本次使用的 wusid(模式 B)
query.path                   → 本次使用的路径(模式 B)

模式 B 专属(discovered_traces):

discovered_traces[].trace_id      → 找到的 TraceID
discovered_traces[].first_time    → 首条日志时间
discovered_traces[].service       → 服务名
discovered_traces[].path          → 请求路径
discovered_traces[].response_code → 响应码
discovered_traces[].response_msg  → 响应消息
discovered_traces[].has_error     → 是否有 ERROR 日志
discovered_traces[].log_count     → 匹配日志条数

ARMS 调用链(call_chain):

call_chain.tree              → 带缩进的调用链路图(文本),含异常 ID 和完整堆栈
call_chain.error_spans       → 异常 Span 列表(含 exception_id、full_stack 字段)
call_chain.services          → 涉及的服务列表
call_chain.total_duration_ms → 总耗时

方法级堆栈(stack_details):

stack_details.{key}.trace_id       → TraceID
stack_details.{key}.rpc_id         → RpcID
stack_details.{key}.service        → 服务名
stack_details.{key}.operation      → 操作名
stack_details.{key}.exception_id   → 异常 ID
stack_details.{key}.stack_entries  → 方法级堆栈列表(api、duration、exception、line)
stack_details.{key}.formatted      → 格式化后的堆栈文本

SLS 日志(sls):

sls.store_stats              → 每个 logstore 的查询统计(必须全部展示)
sls.logs_by_logstore         → 按 logstore 分组的日志(必须按组展示,不能合并)
sls.error_logs               → ERROR 级别日志

根因分析(analysis):

analysis.root_cause          → 根本原因结论
analysis.findings            → 关键发现列表
analysis.suggestions         → 排查建议列表

Step 3.5:无数据时循环询问时间范围(必须严格遵守)

核心规则:查不到数据就问用户,用户给了新时间就重查,如此循环直到查到数据或用户放弃。绝对不能自动重试,绝对不能输出空报告。

如果 JSON 输出中 no_datatrue(SLS 和 ARMS 均无数据):

第一次无数据 → 输出以下提示,等待用户回复:

⚠️ 在最近 {当前查询范围,如"1周"} 内({time_range})未查到任何数据。

回复序号或直接输入时间范围:

1 换时间重查 — 输入自然语言(如 1个月2周3天2 精确时间段 — 输入起止时间(如 2024-03-10 00:00 ~ 2024-03-15 23:593 换条件重查 — 输入新的 trace_id / wusid / path 4 不用了 — 停止查询

收到用户回复后:

  • 1 或直接输入时间(如"1个月"、"2周"、"3天")→ 用 --duration 重新执行 Step 2,然后回到 Step 3
  • 2 或输入精确时间段(如"3月10号到3月15号")→ 计算为 --start/--end 重新执行
  • 3 → 回到 Step 1.2 重新收集参数
  • 4 或"不用了"、"算了"、"停" → 停止,输出简短结论:「在所有尝试的时间范围内均未查到该 TraceID 的数据,可能原因:1) TraceID 不正确 2) 日志已过期被清理 3) 该请求未经过当前 SLS 项目」

再次无数据(第二次、第三次…) → 继续循环询问:

⚠️ 在 {本次时间范围} 内仍未查到数据。

1 换时间继续 — 输入新的时间范围 2 换条件重查 — 输入新的 trace_id / wusid / path 3 不用了 — 停止查询

循环规则:

  1. 每次查不到数据 → 必须停下来问用户 → 等用户回复 → 按用户指示执行
  2. 绝不跳过询问直接输出报告
  3. 绝不自行决定用什么时间重试
  4. 用户在此上下文中说的任何时间表述,一律视为新的查询时间范围
  5. 只有 no_datafalse(查到数据了)才进入 Step 4 输出完整报告

Step 4:输出分析报告(格式严格按下方执行)


📋 问题定位报告

项目 内容
TraceID {query.trace_id 或 discovered_traces 中用户选择的 trace_id}
WSUID {query.wusid,无则省略此行}
请求路径 {query.path,无则省略此行}
时间范围 {time_range}
涉及服务 {call_chain.services}
总耗时 {call_chain.total_duration_ms}ms

🗺️ ARMS 调用链路图(此段必须输出,不可跳过)

判断条件:call_chain.total_spans > 0 表示有数据,== 0 表示无数据。 call_chain.tree 始终有值(无数据时也有提示文本),必须原样输出

{call_chain.tree 的完整内容,一字不改直接输出}

示例(有数据时):

● [rpc-ny] gRPC → /PromotePB/UpdateRelation 156ms ❌
  └─ [promote-service] MySQL → SELECT 12ms ✅
      ⚡ 错误: record not found
      🔗 异常ID: 811073848360427400

示例(无数据时,脚本输出的 tree 已包含提示):

⚠️ ARMS 未采样到此 TraceID 的调用链

❌ 异常 Span(此段必须输出,不可跳过)

判断条件:call_chain.error_spans 列表是否非空。

有异常 Span(call_chain.error_count > 0)时,逐个输出:

服务 操作 异常 ID 耗时 错误信息
{service} {operation} {exception_id} {duration_ms}ms {tags.error.message 或 tags.exception.message}

每个异常 Span 下方,如果有 full_stack,必须输出完整堆栈:

🔗 异常ID: {exception_id}
⚡ 堆栈:
{full_stack 完整内容,不截断,逐行输出}

无异常 Span(call_chain.error_count == 0)时,输出:

无异常 Span(ARMS 未采样或调用链无错误)


🔬 方法级堆栈详情(GetStack)

判断条件:stack_details 不为 null 且非空对象。

stack_details 数据时,逐个输出:

── [{service}] {operation} → 异常ID: {exception_id} ──
{formatted 的完整内容,一字不改直接输出}

示例:

── [rpc-ny] UpdateRelation → 异常ID: 811073848360427400 ──
  [ 1] com.ny.service.PromoteService.updateRelation (服务: rpc-ny) 156ms L212
       ⚡ 异常: record not found
  [ 2] com.ny.dao.PromoterDAO.getByWusId (服务: rpc-ny) 12ms L89

stack_details 数据时,输出:

无方法级堆栈(ARMS 未采样或无异常 Span)


📄 SLS 日志 — 按 LogStore 分组

⚠️ 以下每个 LogStore 单独展示,不合并,不去重

查询统计:

LogStore 状态 日志条数
{logstore1} {status} {count}
{logstore2} {status} {count}

【LogStore: {logstore名称1}】(共 {count} 条)

逐条输出该 logstore 的每条日志:

[1] 时间:{time}
    级别:{level}
    服务:{service}
    文件:{file}
    消息:{message}
    附加:{raw 中的 attach / request / response 等关键字段}

【LogStore: {logstore名称2}】(共 {count} 条)

逐条输出该 logstore 的每条日志(同上格式):

[1] 时间:{time}
    级别:{level}
    服务:{service}
    文件:{file}
    消息:{message}
    附加:{raw 中的关键字段}

🔍 根因分析

  • 直接原因:{结合 ARMS error_spans 和 SLS error_logs 的错误信息}
  • 触发位置:{service} → {operation}(来自哪个 logstore 第几条)
  • 关联日志:{指明是哪个 logstore 的第几条}
  • 根本原因:{综合分析}

🛠️ 建议修复方向

{修复建议}


Step 4.5:报告输出后的后续操作提示(必须严格按模板)

⚠️ 核心规则:输出完 Step 4 报告后,必须且只能输出下面的统一模板,禁止自由发挥任何后续操作文字。 禁止行为:

  • 输出不带序号的选项,如"继续操作:新 trace_id / 用 wusid 查 / 不用了"
  • 省略"查看代码"选项
  • 自编任何不在模板中的提示文字

无论查询结果如何(成功/部分失败/有异常/无异常),Step 4 报告末尾统一输出以下模板:

回复序号选择下一步:

1 排查代码 — 搜索 {operation} 方法源码,定位问题 2 换条件重查 — 输入新的 trace_id / wusid / path 3 换时间重查 — 输入新的时间范围(如 1个月3天4 用 wusid 查用户请求 — 输入 wusid 查该用户的所有请求 5 不用了 — 结束排查

其中 {operation} 替换为 ARMS error_spans 中的操作名(如 UpdateRelation),无 ARMS 数据时替换为请求路径中的方法名。

用户回复处理:

  • 1 → 直接进入 Step 5 代码排查
  • 2 → 回到 Step 1.2 重新收集参数
  • 3 → 用新时间范围重新执行 Step 2
  • 4 → 用户提供 wusid 后,以模式 B 重新执行 Step 2
  • 5 → 输出简短结论,结束

Step 5:代码级排查(必须自动执行,不能只建议)

⚠️ 核心规则:输出完 Step 4 报告后,如果存在 ERROR 日志或异常 Span,必须立即自动执行代码搜索,不能只输出"建议搜索 xxx 方法"之类的文字。 如果日志和调用链均无异常,跳过此步。

禁止行为:输出类似"建议:在代码仓库搜索 UpdateRelation 方法"的文字而不实际执行搜索。必须直接使用 Grep/Glob/Read 工具去搜索代码。

5.1 提取代码线索

从 Step 3/4 的结果中提取以下信息,作为代码搜索的关键词:

来源 提取内容 用途
SLS 日志 file 字段 文件名和行号(如 handler.go:156 直接定位源码位置
SLS 日志 message 字段 错误消息关键词(如 record not foundnil pointer 搜索错误产生位置
ARMS error_spans 服务名 + 操作名(如 promote-serviceUpdateRelation 定位入口函数
ARMS tags exception.typeerror.messagedb.statement 定位异常类型和 SQL
ARMS stack_details 方法级堆栈中的类名、方法名、行号 精确定位异常代码位置
SLS 日志 raw data.requestdata.response 中的业务字段 理解请求上下文

5.2 搜索源码

按优先级依次搜索(找到即停):

  1. 有明确文件名+行号(如 caller: service/handler.go:156

    • 直接用 Grep 搜索该文件名,用 Read 读取对应代码段(前后各 30 行)
  2. 有函数/方法名(如 ARMS 的 operation: UpdateRelation

    • 用 Grep 搜索函数定义:func.*UpdateRelationdef UpdateRelation
    • 读取函数完整实现
  3. 有错误消息(如 record not foundduplicate key

    • 用 Grep 在项目中搜索该错误消息字符串
    • 找到错误产生的代码位置
  4. 有请求路径(如 /ny.apps_pb.promote_pb.PromotePB/UpdateRelation

    • 路径中提取服务名和方法名(PromotePB / UpdateRelation
    • 搜索 proto 定义和对应的 handler 实现
  5. 有 GetStack 方法级堆栈stack_details 不为空)

    • 从堆栈条目的 api 字段提取类名.方法名(如 com.xxx.service.UpdateRelation
    • 用 Grep 搜索对应的类定义和方法实现
    • 堆栈中有 exception 字段的条目优先搜索

搜索范围与代码仓库定位规则:

  1. 先在当前工作目录用 Grep 搜索关键方法/类名
  2. 如果当前目录搜不到(0 个结果),输出以下提示(严格按模板)
💻 需要搜索代码仓库来定位问题源码。

当前目录未找到相关代码,请提供业务代码仓库路径:
- 示例:`C:\projects\promote-service` 或 `/home/user/go/src/promote`
- 如果有多个服务,可提供多个路径,用 `;` 分隔
  1. 用户提供路径后 → 在该路径下用 Grep 搜索,然后继续 5.3 分析
  2. 必须实际执行搜索:使用 Grep 工具搜索代码,不能只输出文字建议

5.3 分析代码问题

找到相关代码后,分析以下内容:

  • 错误触发路径:从入口函数到报错位置的调用链路
  • 错误原因:参数校验缺失?空指针?异常未捕获?逻辑错误?
  • 上下文数据:结合 SLS 日志中的 request/response 数据,还原触发条件

5.4 输出代码分析

**💻 代码排查**

**定位文件:** `{file_path}:{line_number}`

**关键代码段:**
​```{language}
// 标注问题所在行
{code snippet with comments}
​```

**问题分析:**
- 错误路径:{入口} → {中间调用} → {报错位置}
- 直接原因:{具体代码问题,如"第 156 行未检查 err 返回值"}
- 触发条件:{结合日志中的 request 数据说明什么情况下会触发}

> ⚠️ 仅指出代码问题,不直接修改代码。由用户自行决定如何修复。

Step 6:数据库排查(当错误涉及数据库时)

触发条件:仅当以下任一条件满足时才执行此步骤:

  • ARMS tags 中有 db.statementdb.type 字段
  • 错误消息包含 SQL/数据库相关关键词(duplicate keydeadlockrecord not foundforeign keytable doesn't existcolumn not foundtimeout + sql/db/mysql/redis
  • SLS 日志中出现 SQL 语句或数据库错误
  • 代码排查中发现 ORM 操作或 SQL 拼接

不满足以上条件则跳过此步骤。

6.1 提取数据库线索

来源 提取内容
ARMS tags.db.statement 完整 SQL 语句
ARMS tags.db.type 数据库类型(MySQL/Redis/ES)
SLS 日志 SQL 相关错误消息
Step 5 代码 ORM 模型定义、SQL 拼接逻辑、表名/字段名

6.2 分析数据库问题

根据错误类型进行针对性分析:

错误类型 排查方向
record not found 查询条件是否正确?数据是否存在?是否有软删除过滤?
duplicate key 唯一索引冲突,检查插入逻辑是否有并发问题或重试机制
deadlock 事务中的锁顺序,是否有交叉更新
timeout 慢 SQL,检查是否缺少索引、全表扫描、大事务
foreign key 外键约束失败,检查关联数据是否存在
connection refused 数据库连接池耗尽或实例宕机

6.3 搜索相关代码中的数据库操作

  • 在 Step 5 定位到的代码文件中,搜索 ORM 操作(如 db.Wheredb.CreateModel.objects
  • 查找表结构定义(model/schema)
  • 查找 SQL 拼接或 Raw SQL

6.4 输出数据库分析

**🗄️ 数据库排查**

**涉及表/操作:** `{table_name}` — `{SELECT/INSERT/UPDATE/DELETE}`

**问题 SQL:**
​```sql
{SQL 语句,标注问题部分}
​```

**分析:**
- 错误类型:{如 duplicate key on index `idx_xxx`}
- 原因:{如并发插入同一唯一键}
- 对应代码:`{file}:{line}` — {代码描述}

**🔎 建议检查的数据库配置项:**
- 表:`{table_name}`
- 字段/索引:`{需要检查的字段或索引名}`
- 检查内容:{如"确认该用户的 xxx 字段值是否为 null"、"检查 idx_xxx 索引是否存在"、"核实 xxx 配置表中 key=yyy 的记录是否正确"}
- 参考 SQL:`SELECT ... FROM {table} WHERE {condition}`

⚠️ 仅指出应该检查哪些数据库配置项和数据,不直接执行 SQL。由用户或 DBA 自行查询确认。


Step 7:综合结论与修复建议

在完成所有排查后(Step 4 报告 + Step 5 代码 + Step 6 数据库),输出最终综合结论。

**📝 综合结论**

**问题链路:**
{用户请求} → {入口服务} → {中间调用} → {出错位置}

**根本原因:**
{一句话总结,结合日志 + 代码 + 数据库的分析}

**代码问题:**
1. {文件:行号} — {问题描述}
2. {文件:行号} — {问题描述}

**需要检查的数据库配置:**
1. 表 `{table}` — {检查什么,附参考 SQL}
2. 配置项 `{key}` — {检查什么}

**修复方向(按优先级):**
1. 【紧急】{问题描述 + 修复思路}
2. 【建议】{预防性改进}
3. 【优化】{长期优化方向}

**影响范围:**
- 受影响接口:{path}
- 受影响用户:{wusid 相关信息}
- 影响程度:{根据 error_logs 数量和 error_spans 判断}

⚠️ 本报告仅指出问题和排查方向,不直接修改代码或执行数据库操作。


Step 8:询问用户是否需要进一步操作

输出综合结论后,严格按以下模板输出

🔧 需要进一步操作吗?回复序号:

1 查看更多代码 — 深入分析相关文件或上下游调用 2 查看更多日志 — 换条件 / 换时间范围重新查询 3 分析其他 TraceID — 输入新的查询条件 4 不用了 — 结束排查


注意事项

  • 每个 logstore 的日志必须独立展示,哪怕内容高度相似也不能合并
  • ARMS 未采样到时(call_chain 为 null),只展示 SLS 日志,注明"未采样到调用链"
  • TraceID 长度为 30 位时 ARMS 不需要时间范围;其他长度需要 --start/--end
  • SLS 和 ARMS 可以用不同的 AK/SK
  • 模式 B 使用 --no-interactive,脚本自动选第一条 TraceID;如需让用户选择,展示 discovered_traces 列表后用模式 A 重跑
  • --wusid 同时匹配 wechat_user_space_idpromoter_wechat_user_space_id 两个字段
  • --path 匹配 data.request.path 字段,支持完整路径或路径片段

同梱ファイル

※ ZIPに含まれるファイル一覧。`SKILL.md` 本体に加え、参考資料・サンプル・スクリプトが入っている場合があります。