@fx-data/ai-diagnostics 0.1.20261111112203 → 0.1.20261113121222
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_SETUP.md +3 -3
- package/README.md +2 -2
- package/bin/core-ai.mjs +40 -44
- package/content/AGENTS.md +49 -34
- package/content/README.md +25 -23
- package/content/docs/architecture.md +44 -49
- package/content/docs/diagnostic-feedback.md +18 -18
- package/content/docs/diagnostic-report.md +19 -21
- package/content/docs/index.md +23 -20
- package/content/docs/scenario-guide.md +37 -37
- package/content/knowledge/README.md +22 -22
- package/content/knowledge/automation/README.md +10 -10
- package/content/knowledge/automation/concepts.md +25 -25
- package/content/knowledge/automation/conclusions.md +22 -22
- package/content/knowledge/automation/queries.md +12 -12
- package/content/knowledge/automation/signals.md +47 -47
- package/content/knowledge/automation/workflow.md +22 -22
- package/content/knowledge/cases/README.md +10 -10
- package/content/knowledge/cases/dashboard-parameter-deep-binding.md +8 -8
- package/content/knowledge/common/README.md +17 -16
- package/content/knowledge/common/concepts.md +18 -18
- package/content/knowledge/common/conclusions.md +11 -11
- package/content/knowledge/common/queries.md +58 -48
- package/content/knowledge/common/signals.md +29 -29
- package/content/knowledge/common/topics/baseline-comparison.md +3 -3
- package/content/knowledge/common/topics/large-results.md +4 -3
- package/content/knowledge/common/topics/linked-traces.md +1 -1
- package/content/knowledge/common/topics/query-budget.md +2 -2
- package/content/knowledge/common/topics/query-example.md +5 -5
- package/content/knowledge/common/topics/query-scope.md +14 -0
- package/content/knowledge/common/topics/setup-signoz-mcp.md +25 -25
- package/content/knowledge/common/topics/start-and-anchors.md +2 -2
- package/content/knowledge/common/workflow.md +15 -15
- package/content/knowledge/component/README.md +9 -9
- package/content/knowledge/component/concepts.md +2 -2
- package/content/knowledge/component/conclusions.md +4 -4
- package/content/knowledge/component/queries.md +1 -1
- package/content/knowledge/component/signals.md +21 -21
- package/content/knowledge/component/workflow.md +13 -13
- package/content/knowledge/dashboard/README.md +12 -12
- package/content/knowledge/dashboard/concepts.md +2 -2
- package/content/knowledge/dashboard/conclusions.md +9 -9
- package/content/knowledge/dashboard/queries.md +28 -28
- package/content/knowledge/dashboard/signals.md +27 -27
- package/content/knowledge/dashboard/topics/calculation-panorama.md +23 -23
- package/content/knowledge/dashboard/topics/component-comparison.md +7 -7
- package/content/knowledge/dashboard/topics/dynamic-fields.md +11 -11
- package/content/knowledge/dashboard/topics/filter-tree.md +18 -18
- package/content/knowledge/dashboard/topics/name-binding.md +4 -4
- package/content/knowledge/dashboard/workflow.md +27 -27
- package/content/knowledge/dataset/README.md +10 -10
- package/content/knowledge/dataset/concepts.md +4 -4
- package/content/knowledge/dataset/conclusions.md +3 -3
- package/content/knowledge/dataset/queries.md +2 -2
- package/content/knowledge/dataset/signals.md +13 -13
- package/content/knowledge/dataset/topics/steps.md +37 -37
- package/content/knowledge/dataset/workflow.md +16 -16
- package/content/knowledge/engine/README.md +10 -10
- package/content/knowledge/engine/concepts.md +34 -34
- package/content/knowledge/engine/conclusions.md +28 -28
- package/content/knowledge/engine/queries.md +50 -50
- package/content/knowledge/engine/signals.md +35 -35
- package/content/knowledge/engine/topics/metric-fields.md +67 -67
- package/content/knowledge/engine/topics/patterns.md +17 -17
- package/content/knowledge/engine/workflow.md +12 -12
- package/content/knowledge/errors.md +80 -0
- package/content/knowledge/signal-index.md +31 -63
- package/content/knowledge/update/README.md +17 -17
- package/content/knowledge/update/concepts.md +28 -28
- package/content/knowledge/update/conclusions.md +27 -27
- package/content/knowledge/update/queries.md +34 -34
- package/content/knowledge/update/signals.md +14 -14
- package/content/knowledge/update/topics/correlations.md +33 -33
- package/content/knowledge/update/topics/datasource-update-patterns.md +21 -21
- package/content/knowledge/update/topics/discover-executions.md +16 -16
- package/content/knowledge/update/topics/enterprise-analysis.md +31 -31
- package/content/knowledge/update/topics/enterprise-report.md +13 -13
- package/content/knowledge/update/topics/events-execution.md +57 -57
- package/content/knowledge/update/topics/events-intake.md +38 -38
- package/content/knowledge/update/topics/events-outcome.md +80 -80
- package/content/knowledge/update/topics/lifecycle.md +25 -25
- package/content/knowledge/update/topics/scene-producers.md +58 -58
- package/content/knowledge/update/workflow.md +21 -21
- package/content/scripts/assets/calculation-panorama.html +260 -80
- package/content/scripts/render_calculation_panorama.py +75 -0
- package/content-manifest.json +85 -83
- package/package.json +1 -1
package/AGENT_SETUP.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# FX 数据诊断:Agent 安装与管理
|
|
2
2
|
|
|
3
|
-
本文供执行安装与管理的 Agent 读取,不作为日常诊断的前置上下文。包版本为 `0.1.
|
|
3
|
+
本文供执行安装与管理的 Agent 读取,不作为日常诊断的前置上下文。包版本为 `0.1.20261113121222`,需要 Node.js `>=22` 及 npm。用户只需表达安装、使用、更新或卸载意图,环境准备和客户端登记由 Agent 完成。
|
|
4
4
|
|
|
5
5
|
用户明确要求安装、更新、回退、卸载或检查 FX 数据诊断时,也会触发薄 Skill,并直接执行对应管理命令,不先运行 `context` 或读取诊断规则;只有开始诊断时才按薄 Skill 加载内容。普通聊天不主动加载。
|
|
6
6
|
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
## 按需使用
|
|
56
56
|
|
|
57
|
-
用户明确要求用 FX 数据诊断分析问题后,按薄 Skill 调用一次稳定入口的 `context
|
|
57
|
+
用户明确要求用 FX 数据诊断分析问题后,按薄 Skill 调用一次稳定入口的 `context`。其输出已包含首轮规则正文(AGENTS.md、快速查询、环境映射)和本次临时目录,Agent 直接开始排查,其余知识仅在当前步骤需要时读取。CLI 同时在后台检查更新,固定本次调查返回的版本与 `pinned_cli`;同一调查继续复用,不重复调用稳定入口的 `context`。普通聊天和管理请求无需预加载诊断内容或检查更新。
|
|
58
58
|
|
|
59
59
|
已有 SigNoZ 查询途径(MCP、Skill 等)直接复用;实时查询受阻时才按包内配置 Skill 处理,凭据只保存在本机。Python 按需准备;独立解释器可通过 `FX_DATA_DIAGNOSTICS_PYTHON` 指定绝对路径。
|
|
60
60
|
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
|
|
63
63
|
用户要求更新时,调用稳定入口的 `update`;要求回退到上次更新前时调用 `rollback`,明确指定版本时调用 `update --version <版本号>`。新调查使用切换后的版本,进行中的调查保持原版本。回退不锁定后续版本,下一次新诊断仍检查最新版;需要持续使用旧版时按配置变量关闭后台更新。新增客户端只登记,不隐式更新。
|
|
64
64
|
|
|
65
|
-
使用时的后台更新由 CLI 完成,无需 Agent 设置定时任务或另跑 `update
|
|
65
|
+
使用时的后台更新由 CLI 完成,无需 Agent 设置定时任务或另跑 `update`。更新静默完成,诊断输出不包含更新状态,无需读取或提示;用户询问时通过 `status` 查看。
|
|
66
66
|
|
|
67
67
|
旧版用户需先手动升级一次才能获得后台更新能力。版本切换后按客户端要求刷新技能或新开聊天。
|
|
68
68
|
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
## 更新
|
|
26
26
|
|
|
27
|
-
每次开始新诊断时,工具会在后台检查更新,不等待更新即可排查。更新成功后,各 Agent
|
|
27
|
+
每次开始新诊断时,工具会在后台检查更新,不等待更新即可排查。更新成功后,各 Agent 的下一次新诊断使用新版;当前调查保持原版本,更新失败也不影响排查。更新在后台静默完成,不影响排查;需要确认当前版本或更新结果时,可要求 Agent 检查。
|
|
28
28
|
|
|
29
29
|
需要立即更新并等待完成时说:
|
|
30
30
|
|
|
@@ -40,4 +40,4 @@
|
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
43
|
-
**给 Agent:** 按 [Agent 执行说明](https://unpkg.com/@fx-data/ai-diagnostics@0.1.
|
|
43
|
+
**给 Agent:** 按 [Agent 执行说明](https://unpkg.com/@fx-data/ai-diagnostics@0.1.20261113121222/AGENT_SETUP.md) 完成安装与管理。已有本地包时,优先读取包内 `AGENT_SETUP.md`;本地 `.tgz` 只需读取 `package/AGENT_SETUP.md`。按命令结果简短反馈,成功即结束;只有失败或结果不完整时才排错。
|
package/bin/core-ai.mjs
CHANGED
|
@@ -46,7 +46,7 @@ function commandHelp(argv) {
|
|
|
46
46
|
uninstall: { usage: 'uninstall [--home DIR]', description: '一次清理本账户已登记入口、受管版本和已记录来源的 npm 包;用户材料与独立 MCP 配置保留。', completion: 'ok=true 且 complete=true 即结束;无需 status、doctor、ls 或额外 npm uninstall。不完整时仅按 npm_package 的 fallback 处理。' },
|
|
47
47
|
status: { usage: 'status [--home DIR]', description: '按需查看共享安装状态;无需作为安装或卸载的前置步骤。' },
|
|
48
48
|
doctor: { usage: 'doctor [--home DIR]', description: '用户要求检查或出现具体异常时,检查完整性和独立能力。' },
|
|
49
|
-
context: { usage: 'context [--home DIR]', description: '
|
|
49
|
+
context: { usage: 'context [--home DIR]', description: '开始诊断时获取当前版本、内容路径、本次临时目录和首轮规则正文;管理操作无需预先调用。' },
|
|
50
50
|
session: { usage: 'session [--home DIR]', description: '为诊断材料创建临时目录。' },
|
|
51
51
|
version: { usage: 'version [--home DIR]', description: '显示当前使用的版本。' },
|
|
52
52
|
};
|
|
@@ -167,33 +167,31 @@ description: 仅当用户明确要求用 FX 数据诊断分析问题,或安装
|
|
|
167
167
|
|
|
168
168
|
# FX 数据诊断
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
## 诊断
|
|
171
171
|
|
|
172
|
-
|
|
172
|
+
每次新诊断先执行一次稳定入口 context,不做其他准备:
|
|
173
173
|
|
|
174
174
|
macOS / Linux:
|
|
175
175
|
\`\`\`sh
|
|
176
176
|
${shell} context
|
|
177
177
|
\`\`\`
|
|
178
178
|
|
|
179
|
-
Windows PowerShell
|
|
179
|
+
Windows PowerShell(路径含空格时保留引号和调用运算符 &):
|
|
180
180
|
\`\`\`powershell
|
|
181
181
|
${powershell} context
|
|
182
182
|
\`\`\`
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
context 的输出已包含首轮所需的全部内容:rules 依次为 AGENTS.md 全文、快速查询和环境映射,直接按 AGENTS.md 的“分步排查”开始工作,无需再读取这些文件;session_dir 是本次临时目录,用于保存日志和 Metric 正文,无需另行调用 session。其余知识按 rules 中的链接仅在当前步骤需要时读取,不预加载,也不切换用户工作区;路径以 content_root 为基准,文档链接相对所在文件解析。
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
同一调查固定使用首次 context 返回的版本、node 和 pinned_cli,不重复调用稳定入口 context。包内脚本以 <node> <pinned_cli> python <脚本绝对路径> ... 执行(PowerShell 在带引号的 Node 路径前加 &);只有这些脚本需要 Python。更新由 CLI 在后台静默完成,下次新诊断生效,无需处理或提示。已有 SigNoZ 查询途径(MCP、Skill 等)直接复用,实时查询受阻时才读取 setup-signoz-mcp。
|
|
187
187
|
|
|
188
|
-
|
|
188
|
+
## 管理
|
|
189
189
|
|
|
190
|
-
context、status
|
|
190
|
+
安装、更新、回退、卸载或检查时,将上述命令中的 context 替换为 update、rollback、uninstall、status 或 doctor 直接执行,不运行 context,不读取诊断规则、源码或客户端缓存,不依赖 PATH 中的全局 CLI。正常返回后用 2–3 句话反馈结果即结束,不再运行 status、ls 或 doctor 复查;命令失败时才按具体错误排错。本工具不要求安装清单或长期记忆,客户端有强制要求时仍遵循。
|
|
191
191
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
用户明确要求卸载时,说明会一起移除本账户已登记客户端的入口、所有已安装版本和 npm 包,进行中诊断将无法继续调用包内脚本,然后直接执行稳定入口 uninstall,不重复请求确认,不先运行 status。命令按记录的原 npm 环境完成清理;根据 removed_skills、npm_package 和 complete 报告结果,不再另跑 npm uninstall。安装未记录可用 npm 来源、返回 npm_package.status=unconfirmed 时,只按 fallback 补充清理,不猜测其他 npm 环境。保留的材料是用户提供的日志、Metric 文件和生成报告,以及独立安装的 MCP 和配置;包内规则与知识随包删除,无需扫描或备份其他目录。doctor 仅用于用户要求检查或排错。
|
|
192
|
+
- 更新默认使用 latest;回退到上次更新前用 rollback,也可用 --version 指定版本,已保留的版本校验通过后直接复用。各客户端的新调查共用切换后的版本,进行中的调查继续使用原 pinned_cli;完成后按客户端要求刷新技能或新开聊天。
|
|
193
|
+
- 用户明确要求卸载时,先说明会一并移除本账户已登记客户端的入口、所有已安装版本和 npm 包,进行中的诊断将无法继续调用包内脚本,然后直接执行 uninstall,不重复确认。按 removed_skills、npm_package 和 complete 报告结果,不另跑 npm uninstall;npm_package.status=unconfirmed 时仅按 fallback 补充清理。用户提供的日志、Metric 文件、生成的报告以及独立安装的 MCP 和配置会保留,无需扫描或备份其他目录。
|
|
194
|
+
- 用户询问版本或更新情况时执行 status;doctor 仅用于用户要求检查或排错,其 python.available=false 表示按需补齐,不代表安装失败。
|
|
197
195
|
`;
|
|
198
196
|
}
|
|
199
197
|
|
|
@@ -271,6 +269,26 @@ function contextFor(root, home, pkg, manifest) {
|
|
|
271
269
|
launcher: launchers(home).executable, launcher_script: launchers(home).script };
|
|
272
270
|
}
|
|
273
271
|
|
|
272
|
+
// First-round rules travel with context so a diagnosis starts without extra reads.
|
|
273
|
+
// A missing section is a packaging defect and must fail instead of returning partial rules.
|
|
274
|
+
function section(file, heading) {
|
|
275
|
+
const text = fs.readFileSync(file, 'utf8');
|
|
276
|
+
const start = text.indexOf(`\n## ${heading}\n`);
|
|
277
|
+
if (start < 0) throw new Error(`Section "${heading}" not found in ${file}`);
|
|
278
|
+
const end = text.indexOf('\n## ', start + 1);
|
|
279
|
+
return text.slice(start + 1, end < 0 ? undefined : end).trim();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function firstRoundRules(content) {
|
|
283
|
+
const file = relative => path.join(content, relative);
|
|
284
|
+
return [
|
|
285
|
+
{ file: 'AGENTS.md', text: fs.readFileSync(file('AGENTS.md'), 'utf8') },
|
|
286
|
+
{ file: 'knowledge/common/queries.md', text: section(file('knowledge/common/queries.md'), '快速查询') },
|
|
287
|
+
{ file: 'knowledge/common/concepts.md', text: ['环境映射', 'fx-data-server 后端子环境']
|
|
288
|
+
.map(heading => section(file('knowledge/common/concepts.md'), heading)).join('\n\n') },
|
|
289
|
+
];
|
|
290
|
+
}
|
|
291
|
+
|
|
274
292
|
function clearAbandonedInstallLock(home) {
|
|
275
293
|
const file = path.join(home, '.install.lock');
|
|
276
294
|
let info;
|
|
@@ -598,10 +616,11 @@ function update(home, options, action = 'update') {
|
|
|
598
616
|
}
|
|
599
617
|
|
|
600
618
|
// Automatic updates belong to the shared installation, not to an Agent. Only
|
|
601
|
-
// a new diagnostic entry starts a worker
|
|
619
|
+
// a new diagnostic entry starts a worker. Updates are silent: diagnostic output
|
|
620
|
+
// never carries update state; `status` reports the last job when asked.
|
|
602
621
|
const autoUpdateFile = 'auto-update.json';
|
|
603
622
|
const autoUpdateLock = '.auto-update.lock';
|
|
604
|
-
const
|
|
623
|
+
const legacyUpdateNotice = 'auto-update-notice.json'; // Written by releases that delivered notices; removed on uninstall.
|
|
605
624
|
const autoUpdateTimeout = 60_000;
|
|
606
625
|
const autoUpdateEnabled = () => process.env.FX_DATA_DIAGNOSTICS_AUTO_UPDATE !== '0';
|
|
607
626
|
const readOptional = file => { try { return json(file); } catch { return null; } };
|
|
@@ -644,35 +663,15 @@ function saveUpdateJob(home, job, status) {
|
|
|
644
663
|
if (!updateJobOwned(home, job.id) || ownedState(home, false)?.state?.install_id !== job.install_id) return;
|
|
645
664
|
job.status = status;
|
|
646
665
|
atomicWrite(path.join(home, autoUpdateFile), JSON.stringify(job));
|
|
647
|
-
const message = status === 'updating'
|
|
648
|
-
? `发现 FX 数据诊断新版 ${job.target_version},正在后台更新。本次分析继续使用已固定版本,更新成功后下次诊断生效。`
|
|
649
|
-
: status === 'updated'
|
|
650
|
-
? `FX 数据诊断已后台更新至 ${job.target_version},供下次新诊断使用;进行中的分析仍使用各自已固定的版本。`
|
|
651
|
-
: status === 'failed'
|
|
652
|
-
? 'FX 数据诊断后台检查或更新未完成,继续使用当前可用版本,不影响本次排查。'
|
|
653
|
-
: null;
|
|
654
|
-
if (message) atomicWrite(path.join(home, autoUpdateNotice), JSON.stringify({ id: `${job.id}:${status}`, install_id: job.install_id, status, message }));
|
|
655
666
|
}
|
|
656
667
|
|
|
657
668
|
function autoUpdateDetails(home) {
|
|
658
669
|
if (!autoUpdateEnabled()) return null;
|
|
659
670
|
try {
|
|
660
671
|
const state = ownedState(home, false)?.state;
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
const details = job?.install_id === state.install_id
|
|
672
|
+
const job = state && readOptional(path.join(home, autoUpdateFile));
|
|
673
|
+
return job?.install_id === state.install_id
|
|
664
674
|
? { status: job.status, ...(job.target_version ? { target_version: job.target_version } : {}) } : null;
|
|
665
|
-
// Claim one notice without deleting a newer notice written concurrently.
|
|
666
|
-
// Other clients may receive the next state; the worker never writes to a
|
|
667
|
-
// parent's terminal and diagnostic/script stdout keeps its original shape.
|
|
668
|
-
const claimed = path.join(home, `${autoUpdateNotice}.${randomUUID()}.read`);
|
|
669
|
-
try {
|
|
670
|
-
fs.renameSync(path.join(home, autoUpdateNotice), claimed);
|
|
671
|
-
const notice = readOptional(claimed);
|
|
672
|
-
if (notice?.install_id === state.install_id) return { ...details, notification: { id: notice.id, status: notice.status, message: notice.message } };
|
|
673
|
-
} catch { /* No notice, or another CLI already delivered it. */ }
|
|
674
|
-
finally { fs.rmSync(claimed, { force: true }); }
|
|
675
|
-
return details;
|
|
676
675
|
} catch { return null; } // Update bookkeeping must never block diagnosis.
|
|
677
676
|
}
|
|
678
677
|
|
|
@@ -793,7 +792,7 @@ function uninstall(home) {
|
|
|
793
792
|
// Remove only owned program files. Configuration, npm cache and evidence are retained.
|
|
794
793
|
// Keep the stable command and state until version cleanup completes, so a
|
|
795
794
|
// client-denied recursive deletion can be confirmed and retried normally.
|
|
796
|
-
for (const name of [autoUpdateLock, autoUpdateFile,
|
|
795
|
+
for (const name of [autoUpdateLock, autoUpdateFile, legacyUpdateNotice, 'releases', 'bin', 'state.json']) fs.rmSync(path.join(home, name), { recursive: true, force: true });
|
|
797
796
|
const finished = performance.now();
|
|
798
797
|
const elapsed = (from, to) => Math.round((to - from) * 100) / 100;
|
|
799
798
|
emit({ ok: true, action: 'uninstall', complete: npmPackage.status !== 'unconfirmed', home,
|
|
@@ -884,22 +883,19 @@ async function main() {
|
|
|
884
883
|
// Capture paths before starting the worker. Direct calls to a pinned release
|
|
885
884
|
// are continuations, even if that release is still the current one.
|
|
886
885
|
const context = contextFor(packageRoot, home, pkg, manifest);
|
|
887
|
-
const auto = autoUpdateDetails(home);
|
|
888
886
|
const directPinned = isInstalledBundle(packageRoot, home)
|
|
889
887
|
&& fs.realpathSync(process.argv[1]) === fs.realpathSync(fileURLToPath(import.meta.url));
|
|
888
|
+
const rules = firstRoundRules(context.content_root);
|
|
890
889
|
if (current?.state && !directPinned) startAutoUpdate(home);
|
|
891
|
-
return emit({ ...context,
|
|
890
|
+
return emit({ ...context, session_dir: fs.mkdtempSync(path.join(os.tmpdir(), 'core-ai-')), rules });
|
|
892
891
|
}
|
|
893
892
|
if (command === 'session') {
|
|
894
|
-
|
|
895
|
-
return emit({ directory: fs.mkdtempSync(path.join(os.tmpdir(), 'core-ai-')), ...(auto ? { auto_update: auto } : {}) });
|
|
893
|
+
return emit({ directory: fs.mkdtempSync(path.join(os.tmpdir(), 'core-ai-')) });
|
|
896
894
|
}
|
|
897
895
|
if (command === 'python') {
|
|
898
896
|
const runtime = python();
|
|
899
897
|
if (!runtime.available) throw new Error(runtime.requirement);
|
|
900
898
|
if (!rest.length) throw new Error('A script or Python option is required');
|
|
901
|
-
const auto = autoUpdateDetails(home);
|
|
902
|
-
if (auto?.notification) process.stderr.write(`${JSON.stringify({ fx_data_diagnostics: { auto_update: auto } })}\n`);
|
|
903
899
|
const result = spawnSync(runtime.executable, ['-I', '-B', ...rest], { stdio: 'inherit' });
|
|
904
900
|
if (result.error) throw result.error;
|
|
905
901
|
process.exitCode = result.status ?? 1;
|
package/content/AGENTS.md
CHANGED
|
@@ -1,64 +1,79 @@
|
|
|
1
1
|
# core-ai Agent 执行契约
|
|
2
2
|
|
|
3
|
-
你是 fx-data
|
|
3
|
+
你是 fx-data 问题诊断助手,为没有产品代码环境的使用者提供辅助排查。依据用户描述的操作、已有的日志和 trace,结合本仓库的知识,说明观察到的异常、可能的原因和后续排查方向。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
排查分步进行:每轮只完成一个步骤,汇报结果后由用户决定下一步(见第 1 节)。调查默认只读;未经用户明确同意,不修改业务资源、不触发任务、不变更配置或权限。凭据、租户敏感数据和完整业务载荷不得写入答复、知识、终端输出或仓库文件。
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
- npm 安装副本(没有 `.git`):不做 Git 更新,也不去更新使用者的其他项目,按下面的[安装副本规则](#安装副本的助手规则)来。
|
|
7
|
+
## 安装副本的助手规则
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
适用于通过 npm 安装的副本(内容目录不含 `.git`):
|
|
11
10
|
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
11
|
+
- `context` 的输出已包含本文、快速查询和环境映射,首轮直接使用,无需再读取这些文件。一次调查固定使用首次 `context` 返回的版本、`content_root`、`node` 和 `pinned_cli`,新版本在下次诊断生效。脚本以 `<node> <pinned_cli> python <脚本路径> ...` 运行;仓库相对路径以 `content_root` 为基准,文档内链接相对所在文件解析。
|
|
12
|
+
- SigNoZ 大响应和 Metric 正文保存在 `context` 返回的 `session_dir`,不写入安装目录。
|
|
13
|
+
- 版本更新由 CLI 在后台静默完成,下次诊断生效,助手无需处理或提示。
|
|
14
|
+
- 用户要求更新、回退、卸载或检查时,使用稳定入口的 `update`、`rollback`、`uninstall`、`doctor`。
|
|
16
15
|
|
|
17
|
-
## 1.
|
|
16
|
+
## 1. 分步排查
|
|
18
17
|
|
|
19
|
-
-
|
|
20
|
-
-
|
|
18
|
+
- 仓库开发模式:用户修改本仓库的 Agent、知识、评测、测试或文档时,按源码仓库的 `maintainers/README.md` 执行(npm 安装副本不含该目录),不查询线上数据。仅当用户明确要求验证真实诊断行为时,才在授权范围内使用线上只读数据。
|
|
19
|
+
- 问题诊断模式:用户排查具体业务问题时,不以单轮给出完整结论为目标。每轮只完成一个步骤,汇报后停止,由用户决定后续方向。
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
每轮包含三个环节:
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
1. **执行一个步骤**。首轮为快速定位:基于已有材料确认对应的操作,以及报错内容或耗时所在的环节。报错原文在[报错速查](knowledge/errors.md)中按关键片段检索,无需通读;需要本次实际记录时,按[快速查询](knowledge/common/queries.md#快速查询)查询一至两次。后续各轮仅沿用户选定的方向推进一步。
|
|
24
|
+
2. **汇报**。用三至五句话说明本步骤已确认的内容和尚未确认的内容。
|
|
25
|
+
3. **提供后续选项**。给出两至三个具体方向,每项用一句话说明查询内容及可回答的问题;现象疑似产品缺陷时,增加“整理为 bug 反馈”选项。客户端提供选项控件时使用控件,否则编号列出。随后等待用户选择。
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
单个步骤的范围:至多读取一处知识(一个域的 `workflow.md` 或命中的章节),查询两至三次。达到该范围仍无结论时,汇报现状并提供选项,不自行继续查询。快速定位阶段不展开场景细节,不查找历史基线,不读取引擎 Metric。
|
|
28
|
+
|
|
29
|
+
后续方向须有依据:报错速查“需进一步排查”一节给出的入口、对应域 `workflow.md` 的候选假设,或本步骤新发现的线索;不提供缺乏依据的方向。结论已明确且用户可据此处理时(如配置问题),直接说明,无需附加选项。
|
|
30
|
+
|
|
31
|
+
用户在开始时已明确范围的,按该范围一次完成,不逐步询问,例如“直接查到底,无需询问”、生成更新报告、生成计算关系图。用户追问时先作答再继续,已确认的对象、时间和现象持续沿用。
|
|
32
|
+
|
|
33
|
+
## 2. 选择入口
|
|
34
|
+
|
|
35
|
+
用户选定方向或要求完整结果时,按下表确定知识入口。入口仅为起点,每轮仍只推进一个步骤。
|
|
27
36
|
|
|
28
37
|
| 用户目标 | 起点 |
|
|
29
38
|
|---|---|
|
|
30
|
-
|
|
|
39
|
+
| 明确要求将单租户一段时间内的更新情况生成报告或 HTML | [更新知识 · 企业更新分析](knowledge/update/workflow.md#企业更新分析) |
|
|
31
40
|
| 慢、超时、卡顿、内存超限、OOM、`MemoryLimitExceeded`、资源消耗异常、性能退化或回归 | [性能排查入口](knowledge/common/workflow.md),再按场景进入对应知识域 |
|
|
32
|
-
|
|
|
41
|
+
| 仅需获取或解读一份 engine metric | [引擎知识](knowledge/engine/workflow.md) |
|
|
33
42
|
| 询问或分析租户近期更新情况,或解释更新来源、request、chain/DAG、node attempt、requeue、load、listener、engine task 和计数 | [更新知识 · 解释更新记录](knowledge/update/workflow.md#解释更新记录) |
|
|
34
|
-
|
|
|
35
|
-
|
|
|
36
|
-
|
|
|
43
|
+
| 自动化是否执行、未触发的原因、通知未送达、回填失败,或提供 workflowId 查询执行情况 | [自动化知识](knowledge/automation/workflow.md) |
|
|
44
|
+
| 仅需配置诊断环境,或实时查询因工具、连接问题受阻 | [配置 SigNoZ MCP](knowledge/common/topics/setup-signoz-mcp.md),完成后回到原问题 |
|
|
45
|
+
| 其他问题:非性能报错的原因、结果异常、稳定性问题 | 暂无专门入口;先说明该类问题覆盖有限,再按[问题定位方法](docs/architecture.md#其他问题如何开始)结合已有材料分析 |
|
|
37
46
|
|
|
38
|
-
|
|
47
|
+
无法判断问题类型时,先基于已有日志、trace 或运行材料做一次只读浅分型,仍无法判断再询问用户。用户已描述慢、超时、OOM 等现象时,无需再询问问题类型。
|
|
39
48
|
|
|
40
49
|
## 3. 诊断原则
|
|
41
50
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
51
|
+
适用于沿选定方向深入的步骤,快速定位阶段不适用。
|
|
52
|
+
|
|
53
|
+
- **先识别场景,报错仅为表象**。超时、内存超限、行数上限通常由引擎报出,引擎仅表明触及了何种限制,计算规模过大的原因需在业务层确认:分析表需确认哪个步骤放大或汇聚了数据,或来源表是否增长;更新需确认是否为上游失败连带,以及哪个节点负载高;组件和仪表板需确认查询本身,以及筛选、参数、动态字段、联动所绑定的表。仅说明引擎超时或 OOM,用户无法据此处理。
|
|
54
|
+
- 优先使用已有信息,材料充分时直接分析。仅追问下一步判断所必需的信息,不重复索取用户已提供的内容。
|
|
55
|
+
- 区分三类信息:日志和 trace 直接记录的事实、相关信号、推测。知识描述系统的一般行为,本次实际情况以本次记录为准;字段缺失、结果为空或被截断均不能证明事件未发生。
|
|
56
|
+
- 可依据日志线索、项目知识和通用经验提出若干候选原因,说明各自依据及待核实点;知识未覆盖的方向也可作为假设。
|
|
57
|
+
- 同一调查内,已确认的范围、已读取的知识和已取得的结果直接复用;相互独立的查询并行发出。
|
|
48
58
|
|
|
49
59
|
### 查找知识
|
|
50
60
|
|
|
51
|
-
|
|
61
|
+
知识按域组织(common、dataset、component、dashboard、update、engine、automation),各域文件结构一致,说明见[知识目录](knowledge/README.md)。
|
|
52
62
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
4. **还不够再展开**:看该域 `README.md` 登记的 `topics/`。相近的已核实案例在 [cases](knowledge/cases/README.md),只用来提假设。不知道某条规则写在哪,查[规则归属索引](docs/index.md)。
|
|
63
|
+
- 首次进入某个域时读取其 `workflow.md`,了解切入点、常见现象和易错点。其余文件按需读取命中的章节:概念见 `concepts.md`,span、属性和日志的含义见 `signals.md`,结论边界见 `conclusions.md`,查询方法见 `queries.md`。
|
|
64
|
+
- 已有 span、属性或日志名称时,查[信号索引](knowledge/signal-index.md),可直接定位到含义所在章节。
|
|
65
|
+
- 仍不充分时,查阅该域 `README.md` 登记的 `topics/` 和[案例库](knowledge/cases/README.md)(案例仅用于提出假设)。规则归属不明时,查[规则归属索引](docs/index.md)。
|
|
57
66
|
|
|
58
67
|
### 工具使用
|
|
59
68
|
|
|
60
|
-
|
|
69
|
+
深入阶段首次查询新的日志或 trace 前,先阅读[公共查询规则](knowledge/common/queries.md)的“默认值速查”和“选择和调用工具”,查询日志时再阅读“查日志”。已有 traceId 或任务标识时使用精确查询。便捷搜索和 trace 详情不返回 `data.request_context` 等业务属性,需通过 Query Builder 在 `selectFields` 中显式指定。返回时间为 UTC,向用户展示时换算为北京时间。大响应保存为临时文件,通过 shell 按需读取。
|
|
61
70
|
|
|
62
71
|
## 4. 交付
|
|
63
72
|
|
|
64
|
-
|
|
73
|
+
使用业务语言,先回答用户本轮的问题。
|
|
74
|
+
|
|
75
|
+
- 每轮汇报:本步骤确认的内容(报错含义、对应操作、耗时或失败所在环节),仍属推测的部分,以及后续选项。用户索取记录、数值或链接时,给出事实及其覆盖范围。
|
|
76
|
+
- 深入后说明原因:先给结论,再给关键依据和尚不确定之处,写法参考[诊断结果交付](docs/diagnostic-report.md)。
|
|
77
|
+
- 用户选择“整理为 bug 反馈”时:仅使用已取得的内容,按[整理为 bug 反馈](docs/diagnostic-report.md#整理为-bug-反馈)形成可直接提交的描述,不为此追加查询。
|
|
78
|
+
|
|
79
|
+
知识中的内部术语(如计数单位、关联边、锚点、`unknown`、`needs_revalidation`)需转述为使用者可理解的业务表述;分析步骤使用页面上的中文名称(如“第 53 步:新增字段”),不使用 `AddNewColumn` 等类型名或引擎算子名;不要求使用者阅读源码或搭建代码环境。
|
package/content/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# fx-data 问题诊断助手
|
|
2
2
|
|
|
3
|
-
`core-ai` 为没有产品代码环境的使用者提供 fx-data
|
|
3
|
+
`core-ai` 为没有产品代码环境的使用者提供 fx-data 问题的辅助排查。助手依据业务操作、日志和项目知识定位可疑环节,说明可能的原因、判断依据和后续排查方向。
|
|
4
4
|
|
|
5
5
|
## 解决什么问题
|
|
6
6
|
|
|
@@ -9,24 +9,25 @@
|
|
|
9
9
|
| 分析表预览或步骤取数慢 | 数据范围、步骤计算与执行耗时 |
|
|
10
10
|
| 组件或仪表板加载慢 | 查询条件、筛选、参数、联动与组件取数 |
|
|
11
11
|
| 更新慢、超时、内存超限 | 调度等待、依赖、计算、写入与重试 |
|
|
12
|
-
|
|
|
12
|
+
| 更新来源或数量不明确 | 触发来源、更新链路、节点与尝试次数 |
|
|
13
13
|
| 生成单租户更新报告 | 小时峰值、`UpdateScene`、执行规模和耗时,交付 HTML |
|
|
14
|
-
|
|
|
14
|
+
| 自动化未触发、通知未收到或回填失败 | 按 workflowId 核对每次执行、跳过原因、动作结果与回填进度 |
|
|
15
|
+
| 某个报错的含义与处理方式 | 按报错原文检索速查表,先说明含义和处理方式 |
|
|
15
16
|
| 其他报错、结果异常或偶发不可用 | 核对现象与执行记录,整理已确认事实和待验证问题 |
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
性能问题已有各场景的知识和入口提示,其他问题先依据现有材料辅助分析。
|
|
18
19
|
|
|
19
20
|
## 开始前准备
|
|
20
21
|
|
|
21
|
-
npm
|
|
22
|
+
npm 安装:向 Agent 发送“帮我安装并启用 FX 数据诊断,npm 包是 `@fx-data/ai-diagnostics`”,Agent 将按包内 README 安装(优先复用已有的共享安装),并登记当前客户端的 Skill。需要 Node.js/npm,Python 按需准备。安装副本在每次新诊断时于后台检查更新,不影响当前排查,更新失败时继续使用旧版(设计见源码仓库 `maintainers/npm-cli.md`)。
|
|
22
23
|
|
|
23
|
-
1.
|
|
24
|
-
2.
|
|
25
|
-
3.
|
|
24
|
+
1. 使用源码目录时,以支持 `AGENTS.md` 的客户端(如 Codex、Claude Code)打开本仓库,代码由使用者自行更新。
|
|
25
|
+
2. 诊断需要查询 SigNoZ 的 trace、日志和引擎统计。尚未建立连接时助手会自动安装和配置,仅需按提示在本机配置中填入对应环境的 API Key(正式、测试环境分别配置),请勿在对话中发送 Key。
|
|
26
|
+
3. 仅有离线材料(日志、trace 导出、Metric 文件)时无需配置,直接提供给助手即可。
|
|
26
27
|
|
|
27
28
|
## 如何提问
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
直接描述发生的情况,并提供已有的对象链接、发生时间、环境、截图或日志。例如:
|
|
30
31
|
|
|
31
32
|
> 正式环境,今天 10:20 左右,选择“华东区”后,销售仪表板的两个图表一直加载。这是仪表板链接和截图。
|
|
32
33
|
|
|
@@ -40,33 +41,34 @@ npm 安装:对 Agent 说“帮我安装并启用 FX 数据诊断,npm 包是
|
|
|
40
41
|
|
|
41
42
|
> 帮我看下 workflowId=xxx 这个自动化最近的执行情况,客户说昨晚没收到通知。
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
已有材料可直接提供给助手:
|
|
44
45
|
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
46
|
+
- 未说明环境时,默认查询正式环境。
|
|
47
|
+
- 查询企业更新且未提供时间时,默认查看最近 24 小时。
|
|
48
|
+
- 提供 dagId 即可直接查询更新链路,无需再提供时间。
|
|
49
|
+
- 提及“之前正常”“以前没超限”时,助手会主动查找此前的正常记录进行对比,无需先提供成功记录。
|
|
50
|
+
- 仪表板内组件异常时,助手会先查找对应组件的单独预览记录;未找到时仍继续分析,并提示检查单独预览是否同样异常。详见[组件取数对照](knowledge/dashboard/workflow.md#组件取数的对照核对)。
|
|
51
|
+
- 缺少关键信息时,助手一次性说明需要补充的内容及其用途。
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
助手分步排查:首轮快速定位本次对应的操作、报错内容或耗时所在环节并简要汇报,随后给出若干可继续的方向供选择,也可选择整理为 bug 反馈。需要一次完成完整排查时,在开始时说明“直接查到底,无需询问”。继续同一问题时,助手沿用已确认的范围和查询结果。
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
调查默认只读。修改业务资源、触发任务或变更配置前,助手会先取得明确授权;报告材料应脱敏。
|
|
55
56
|
|
|
56
|
-
##
|
|
57
|
+
## 输出内容
|
|
57
58
|
|
|
58
|
-
-
|
|
59
|
+
- 本步骤结论:哪个对象的哪次操作出现问题,已定位到的环节或条件。
|
|
60
|
+
- 后续选项:可继续排查的方向及各自能回答的问题;现象疑似产品缺陷时,可由助手整理为 bug 反馈。
|
|
59
61
|
- 关键依据:对应执行记录、错误、统计或对照结果,以及它们如何支持判断。
|
|
60
62
|
- 计算关系图:支持将同次计算已取得的依赖与逐表条件生成可独立打开的 HTML 图,能力与知识索引见[仪表板知识](knowledge/dashboard/README.md#能力)。
|
|
61
|
-
-
|
|
63
|
+
- 待确认信息(有实质缺口时):仍需确认的问题和最小补充材料。
|
|
62
64
|
- 需求反馈(有依据时):本轮发现的未覆盖场景、知识缺口或工具改进线索,供后续改进本项目。使用者无需提供开发方案或跟踪处理。详见[诊断后的需求反馈](docs/diagnostic-feedback.md)。
|
|
63
65
|
|
|
64
66
|
## 延伸阅读
|
|
65
67
|
|
|
66
68
|
- [规则归属索引](docs/index.md):每条规则由哪个文件维护。
|
|
67
69
|
- [问题定位方法](docs/architecture.md):通用排查思路与结论分层。
|
|
68
|
-
- [按场景排查](docs/scenario-guide.md)
|
|
69
|
-
- [诊断结果交付](docs/diagnostic-report.md)
|
|
70
|
+
- [按场景排查](docs/scenario-guide.md):分析表、组件、仪表板、更新各自的排查要点。
|
|
71
|
+
- [诊断结果交付](docs/diagnostic-report.md):结论、复核依据和 bug 反馈的写法。
|
|
70
72
|
|
|
71
73
|
## 维护本项目
|
|
72
74
|
|
|
@@ -1,91 +1,86 @@
|
|
|
1
1
|
# 问题定位方法
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
从使用者的一次具体操作出发,依据运行记录和项目知识确认问题所在的环节、触发条件和原因。使用者无需具备产品代码环境;排查分步进行,每个步骤完成后由使用者决定后续方向;材料不足时,列出需要补充的内容。源码目录和 npm 安装副本的判断方法相同,推理均由当前 Agent 完成。
|
|
4
4
|
|
|
5
5
|
## 目录
|
|
6
6
|
|
|
7
|
-
- [
|
|
8
|
-
- [
|
|
9
|
-
- [
|
|
10
|
-
- [
|
|
7
|
+
- [明确问题](#明确问题)
|
|
8
|
+
- [定位对应操作](#定位对应操作)
|
|
9
|
+
- [还原实际过程](#还原实际过程)
|
|
10
|
+
- [以区分原因为目标取证](#以区分原因为目标取证)
|
|
11
11
|
- [区分发现与原因](#区分发现与原因)
|
|
12
12
|
- [单次分析与前后对照](#单次分析与前后对照)
|
|
13
|
-
- [
|
|
14
|
-
- [什么时候交接给研发](#什么时候交接给研发)
|
|
13
|
+
- [分步推进与停止](#分步推进与停止)
|
|
15
14
|
- [其他问题如何开始](#其他问题如何开始)
|
|
16
15
|
|
|
17
|
-
##
|
|
16
|
+
## 明确问题
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
先确认预期结果和实际结果。以下各项已有的直接使用,缺失的再询问(默认值见[默认值速查](../knowledge/common/queries.md#默认值速查)):
|
|
20
19
|
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
20
|
+
- 操作:点击、修改或执行的内容;
|
|
21
|
+
- 对象:具体的分析表、组件、仪表板或更新;
|
|
22
|
+
- 时间和环境:发生时间、所在环境,以及时间是否带时区;
|
|
23
|
+
- 现象和影响:慢、失败、结果错误或暂时不可用,影响单个还是多个对象。
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
“一直很慢”与“今天某次慢”的调查范围不同;“以前正常”也并非任意一次历史记录都可作为对照。先用已有信息缩小范围,不要求用户一次提供完整清单。
|
|
27
26
|
|
|
28
|
-
##
|
|
27
|
+
## 定位对应操作
|
|
29
28
|
|
|
30
|
-
|
|
29
|
+
已有执行链接时直接查看;仅有对象链接时,在已确认的环境和时间范围内查找记录;仅有截图时,先核对其中的对象和标识,无法辨认或首次查询无结果时先向用户确认,不依据猜测扩大搜索范围。
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
失败或内存超限时先查找对应的错误记录,仅为耗时问题时查找本次的耗时记录,不因其他记录更慢或错误更严重而更换目标。前台预览、后台更新、失败重试和正常对照分别记录,不合并为一次执行。多个候选均可信且必须择一才能回答时,说明差异后请用户确认;企业更新概况直接列出观察结果并突出异常即可。
|
|
33
32
|
|
|
34
|
-
##
|
|
33
|
+
## 还原实际过程
|
|
35
34
|
|
|
36
35
|
用户明确要求生成单租户更新报告或 HTML 时,按[企业更新分析](../knowledge/update/workflow.md#企业更新分析)聚合窗口、按需下钻并生成文件。一般的更新情况分析按[解释更新记录](../knowledge/update/workflow.md#解释更新记录)在对话中交付。
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
先说明本次计算的内容,再解释耗时所在环节或失败原因。按[场景排查](scenario-guide.md)核对:读取了哪些表和数据范围;哪些筛选、参数、聚合、联动、权限参与了计算;耗时位于等待、计算、写入还是返回;是否发生失败重试,以及由此增加的工作量。
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
页面配置说明可能的计算方式,请求和执行记录说明实际的计算方式,两者对应同一对象、同一次操作时才能合并解释。组件取数慢与更新慢同时出现时,需确认本次组件请求是否在等待或读取本次更新的结果,共享底层计算仅作为线索。仪表板内组件异常时,先按[组件取数对照](../knowledge/dashboard/workflow.md#组件取数的对照核对)查看单独预览,没有对照时仍继续分析。
|
|
41
40
|
|
|
42
|
-
##
|
|
41
|
+
## 以区分原因为目标取证
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
查看错误前后的时间线、重复出现的异常、耗时变化和上下游记录,提出少量候选原因并按线索强弱排序。每个方向须写明支持它的记录、其他可能的解释,以及可用于区分的后续查询;缺少字段或关联时保留为待验证假设,先查看其他线索。相近的已核实案例见[案例库](../knowledge/cases/README.md),仅用于提出方向。
|
|
45
44
|
|
|
46
|
-
|
|
|
45
|
+
| 当前假设 | 需要核对的内容 | 可得出的结论 |
|
|
47
46
|
|---|---|---|
|
|
48
|
-
| 筛选条件扩大了计算范围 | 筛选值、绑定字段、关联表路径和实际计算范围 |
|
|
49
|
-
|
|
|
50
|
-
|
|
|
51
|
-
|
|
|
47
|
+
| 筛选条件扩大了计算范围 | 筛选值、绑定字段、关联表路径和实际计算范围 | 哪些额外的数据处理与该条件有关 |
|
|
48
|
+
| 更新在等待上游 | 节点开始时间、依赖状态和等待记录 | 等待与计算各自的占比 |
|
|
49
|
+
| 内存超限源于中间数据增多 | 输入量、各阶段输入输出、内存和失败记录 | 数据如何增长并触及上限 |
|
|
50
|
+
| 多条日志属于重复更新 | 各条记录的更新、节点和尝试标识及明确关联 | 属于正常展开、重试还是重复执行 |
|
|
52
51
|
|
|
53
|
-
|
|
52
|
+
查询前先明确缺少的是哪项判断,以及结果可区分哪些可能;查询方式、结果复用和空结果的处理见[公共查询规则](../knowledge/common/queries.md)。已有记录可直接解释现象时,核对反证和适用范围即可。已选定的慢或失败引擎执行需查看对应的 Metric;必要的查询完成后即交付,不为满足流程而重复查询。
|
|
54
53
|
|
|
55
54
|
## 区分发现与原因
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
结论的确定程度须与依据相称:
|
|
58
57
|
|
|
59
|
-
| 层次 |
|
|
58
|
+
| 层次 | 可以表述为 | 尚不能说明 |
|
|
60
59
|
|---|---|---|
|
|
61
|
-
| 已确认现象 |
|
|
62
|
-
| 已确认过程 | 某个阶段产生了大量中间结果,下游承受了这些数据 |
|
|
63
|
-
| 已确认原因 |
|
|
64
|
-
| 待验证推测 |
|
|
60
|
+
| 已确认现象 | 本次更新失败,错误为内存超限 | 内存占用过高的原因 |
|
|
61
|
+
| 已确认过程 | 某个阶段产生了大量中间结果,下游承受了这些数据 | 业务配置或输入形成该状况的原因 |
|
|
62
|
+
| 已确认原因 | 本次的具体条件扩大了计算范围,记录显示其如何形成压力并触发失败 | 未经验证的修改必然有效 |
|
|
63
|
+
| 待验证推测 | 现象与等待上游相符,但缺少依赖完成时间 | 等待上游即为根因 |
|
|
65
64
|
|
|
66
|
-
|
|
65
|
+
仅有总行数时不推断倾斜或放大;两个事件时间接近不能说明因果;字段缺失不等于事件未发生。涉及行数、字节、内存、倍数时须写明对象、单位和来源,不同任务、阶段的数值不得随意相除或相加。引擎的物理阶段不能直接对应为页面上的步骤。
|
|
67
66
|
|
|
68
67
|
## 单次分析与前后对照
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
“之前没超限”“以前正常”“最近变慢”等表述即表示需要对比:先定位本次执行,再按[主动对比](../knowledge/common/topics/baseline-comparison.md#主动对比)主动查找基线,不要求用户先提供成功的 trace。仅有失败材料时,先解释本次的输入、处理过程和失败条件,正常样本并非必需。
|
|
71
70
|
|
|
72
|
-
|
|
71
|
+
回答“为何以前正常、本次异常”时,需确认对象、查询条件、参数、数据范围和结果具有可比性,两侧各自使用其时间和执行记录。多项条件同时变化时分别说明;仅耗时不同时,不将差异全部归因于某个筛选器或配置。没有可比样本时,将“相对以前的变化”记为缺口,仍交付本次的事实。
|
|
73
72
|
|
|
74
|
-
##
|
|
73
|
+
## 分步推进与停止
|
|
75
74
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
## 什么时候交接给研发
|
|
79
|
-
|
|
80
|
-
涉及没覆盖的产品行为、执行结果互相矛盾,或现有记录分不出原因时,按[交接研发](diagnostic-report.md#交接研发)整理已确认的问题、依据和待验证的判断。
|
|
75
|
+
排查按[分步排查](../AGENTS.md#1-分步排查)进行:每轮只完成一个步骤,汇报本步骤确认的内容,再给出两至三个可继续的方向供用户选择。以下情况尤其不应自行继续:现象和关键触发条件已得到解释;缺少一项关键材料,继续查看现有记录也无法区分原因;多个候选原因均可信,需要用户确认具体操作。现象疑似产品缺陷时,在选项中增加“整理为 bug 反馈”,写法见[诊断结果交付](diagnostic-report.md#整理为-bug-反馈)。
|
|
81
76
|
|
|
82
77
|
## 其他问题如何开始
|
|
83
78
|
|
|
84
|
-
|
|
79
|
+
非性能报错、结果异常、偶发不可用目前没有完整的专项方法,先按通用步骤整理材料,不套用性能问题的解释。已有报错原文时,先在[报错速查](../knowledge/errors.md)中检索,命中后先依据该条目答复。
|
|
85
80
|
|
|
86
|
-
-
|
|
87
|
-
- 前台请求的 trace
|
|
88
|
-
-
|
|
89
|
-
-
|
|
81
|
+
- 报错:查看入口 span 的 `has_error` 和 `status_message`,HTTP 200 也可能是业务失败。`status_message` 为面向用户的业务提示(功能未开通、权限不足、请求过于频繁、表不存在、表正在更新等)时,表示业务规则拒绝了请求,并非系统故障;可按同一 route、同一提示统计一段时间内的次数,判断是普遍现象还是仅本次出现。其他报错保留完整错误、触发操作、时间和对应执行,并区分必现和偶发。
|
|
82
|
+
- 前台请求的 trace 通常不包含企业 ID,无法确定企业时如实说明并请用户提供,不作猜测。
|
|
83
|
+
- 结果异常:以脱敏的最小示例说明预期与实际的差异,核对筛选条件、时间范围、权限和数据是否已更新。
|
|
84
|
+
- 偶发不可用:确认影响对象、持续时间和恢复方式,以及同一时间是否存在其他异常记录。
|
|
90
85
|
|
|
91
|
-
|
|
86
|
+
可证明的事实先行交付;需要进一步验证产品行为时,将其列为待确认的问题,不承诺缺乏依据的根因。
|