@fx-data/ai-diagnostics 0.1.20261026070913 → 0.1.20261107142011

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.
Files changed (254) hide show
  1. package/AGENT_SETUP.md +9 -6
  2. package/README.md +5 -5
  3. package/bin/core-ai.mjs +241 -25
  4. package/content/AGENTS.md +37 -57
  5. package/content/README.md +10 -41
  6. package/content/docs/architecture.md +45 -74
  7. package/content/docs/diagnostic-feedback.md +20 -38
  8. package/content/docs/diagnostic-report.md +19 -46
  9. package/content/docs/index.md +40 -128
  10. package/content/docs/scenario-guide.md +34 -52
  11. package/content/knowledge/README.md +49 -0
  12. package/content/knowledge/cases/README.md +60 -0
  13. package/content/knowledge/cases/dashboard-parameter-deep-binding.md +32 -0
  14. package/content/knowledge/common/README.md +31 -0
  15. package/content/knowledge/common/concepts.md +49 -0
  16. package/content/knowledge/common/{knowledge-applicability.md → conclusions.md} +10 -6
  17. package/content/knowledge/common/queries.md +98 -0
  18. package/content/knowledge/common/signals.md +58 -0
  19. package/content/knowledge/common/topics/baseline-comparison.md +23 -0
  20. package/content/knowledge/common/topics/large-results.md +12 -0
  21. package/content/knowledge/common/topics/linked-traces.md +11 -0
  22. package/content/knowledge/common/topics/query-budget.md +18 -0
  23. package/content/knowledge/common/topics/query-example.md +69 -0
  24. package/content/knowledge/common/topics/setup-signoz-mcp.md +102 -0
  25. package/content/knowledge/common/topics/start-and-anchors.md +19 -0
  26. package/content/knowledge/common/workflow.md +22 -0
  27. package/content/knowledge/component/README.md +26 -0
  28. package/content/knowledge/component/concepts.md +22 -0
  29. package/content/knowledge/component/conclusions.md +11 -0
  30. package/content/knowledge/component/queries.md +7 -0
  31. package/content/knowledge/component/signals.md +75 -0
  32. package/content/knowledge/component/workflow.md +23 -0
  33. package/content/knowledge/dashboard/README.md +31 -0
  34. package/content/knowledge/dashboard/concepts.md +26 -0
  35. package/content/knowledge/dashboard/conclusions.md +21 -0
  36. package/content/knowledge/dashboard/queries.md +69 -0
  37. package/content/knowledge/dashboard/signals.md +76 -0
  38. package/content/knowledge/dashboard/topics/component-comparison.md +9 -0
  39. package/content/knowledge/dashboard/topics/dynamic-fields.md +21 -0
  40. package/content/knowledge/dashboard/topics/filter-tree.md +35 -0
  41. package/content/knowledge/dashboard/topics/name-binding.md +9 -0
  42. package/content/knowledge/dashboard/workflow.md +35 -0
  43. package/content/knowledge/dataset/README.md +27 -0
  44. package/content/knowledge/dataset/concepts.md +30 -0
  45. package/content/knowledge/dataset/conclusions.md +11 -0
  46. package/content/knowledge/dataset/queries.md +7 -0
  47. package/content/knowledge/dataset/signals.md +61 -0
  48. package/content/knowledge/dataset/topics/steps.md +59 -0
  49. package/content/knowledge/dataset/workflow.md +27 -0
  50. package/content/knowledge/engine/README.md +27 -0
  51. package/content/knowledge/engine/concepts.md +80 -0
  52. package/content/knowledge/engine/conclusions.md +49 -0
  53. package/content/knowledge/engine/queries.md +117 -0
  54. package/content/knowledge/engine/signals.md +73 -0
  55. package/content/knowledge/engine/topics/metric-fields.md +104 -0
  56. package/content/knowledge/engine/topics/patterns.md +50 -0
  57. package/content/knowledge/engine/workflow.md +20 -0
  58. package/content/knowledge/signal-index.md +117 -0
  59. package/content/knowledge/update/README.md +39 -0
  60. package/content/knowledge/update/concepts.md +93 -0
  61. package/content/knowledge/update/conclusions.md +59 -0
  62. package/content/knowledge/update/queries.md +103 -0
  63. package/content/knowledge/update/signals.md +57 -0
  64. package/content/knowledge/update/topics/correlations.md +63 -0
  65. package/content/knowledge/update/topics/discover-executions.md +31 -0
  66. package/content/knowledge/update/topics/events-execution.md +136 -0
  67. package/content/knowledge/update/topics/events-intake.md +102 -0
  68. package/content/knowledge/update/topics/events-outcome.md +163 -0
  69. package/content/knowledge/update/topics/lifecycle.md +58 -0
  70. package/content/knowledge/update/topics/scene-producers.md +258 -0
  71. package/content/knowledge/update/workflow.md +29 -0
  72. package/content-manifest.json +73 -192
  73. package/package.json +2 -2
  74. package/content/.agents/skills/analyze-analysis-table-update-runtime/SKILL.md +0 -35
  75. package/content/.agents/skills/analyze-analysis-table-update-runtime/agents/openai.yaml +0 -7
  76. package/content/.agents/skills/analyze-analysis-table-update-runtime/references/discover-update-executions.md +0 -34
  77. package/content/.agents/skills/analyze-analysis-table-update-runtime/references/update-diagnostic-contract.md +0 -101
  78. package/content/.agents/skills/analyze-engine-metric/SKILL.md +0 -76
  79. package/content/.agents/skills/analyze-engine-metric/agents/openai.yaml +0 -13
  80. package/content/.agents/skills/analyze-engine-metric/scripts/analyze_engine_metric.py +0 -270
  81. package/content/.agents/skills/analyze-engine-metric/scripts/engine_metric_analysis/__init__.py +0 -11
  82. package/content/.agents/skills/analyze-engine-metric/scripts/engine_metric_analysis/metric_analyzer.py +0 -791
  83. package/content/.agents/skills/analyze-engine-metric/scripts/engine_metric_analysis/signoz_extract.py +0 -278
  84. package/content/.agents/skills/diagnose-component-performance/SKILL.md +0 -52
  85. package/content/.agents/skills/diagnose-component-performance/agents/openai.yaml +0 -7
  86. package/content/.agents/skills/diagnose-component-performance/references/experience.md +0 -34
  87. package/content/.agents/skills/diagnose-dashboard-performance/SKILL.md +0 -92
  88. package/content/.agents/skills/diagnose-dashboard-performance/agents/openai.yaml +0 -7
  89. package/content/.agents/skills/diagnose-dashboard-performance/references/experience.md +0 -63
  90. package/content/.agents/skills/diagnose-dataset-performance/SKILL.md +0 -52
  91. package/content/.agents/skills/diagnose-dataset-performance/agents/openai.yaml +0 -7
  92. package/content/.agents/skills/diagnose-dataset-performance/references/experience.md +0 -33
  93. package/content/.agents/skills/diagnose-performance/SKILL.md +0 -77
  94. package/content/.agents/skills/diagnose-performance/agents/openai.yaml +0 -7
  95. package/content/.agents/skills/diagnose-update-performance/SKILL.md +0 -55
  96. package/content/.agents/skills/diagnose-update-performance/agents/openai.yaml +0 -7
  97. package/content/.agents/skills/diagnose-update-performance/references/experience.md +0 -47
  98. package/content/.agents/skills/setup-signoz-mcp/SKILL.md +0 -30
  99. package/content/.agents/skills/setup-signoz-mcp/agents/openai.yaml +0 -7
  100. package/content/.agents/skills/setup-signoz-mcp/references/installation.md +0 -75
  101. package/content/.agents/skills/setup-signoz-mcp/references/windows-artifact.md +0 -14
  102. package/content/docs/npm-cli.md +0 -202
  103. package/content/docs/roadmap.md +0 -44
  104. package/content/docs/skill-writing-guide.md +0 -65
  105. package/content/knowledge/common/signoz-environments.json +0 -52
  106. package/content/knowledge/common/signoz-environments.md +0 -55
  107. package/content/knowledge/common/signoz-query-example.md +0 -41
  108. package/content/knowledge/common/signoz-query-policy.md +0 -145
  109. package/content/knowledge/common/trace-routing.md +0 -63
  110. package/content/knowledge/component/observability.md +0 -60
  111. package/content/knowledge/dashboard/observability.md +0 -168
  112. package/content/knowledge/dashboard/query-examples.md +0 -63
  113. package/content/knowledge/dataset/observability.md +0 -68
  114. package/content/knowledge/engine/metric-artifacts.md +0 -25
  115. package/content/knowledge/engine/metric-retrieval.md +0 -107
  116. package/content/knowledge/engine/metric-semantics.md +0 -172
  117. package/content/knowledge/engine/performance-patterns.md +0 -86
  118. package/content/knowledge/update/diagnostic/manifest.json +0 -209
  119. package/content/knowledge/update/diagnostic/observability/edges/edge-attempt-to-capacity-deferral.json +0 -17
  120. package/content/knowledge/update/diagnostic/observability/edges/edge-attempt-to-lock-requeue.json +0 -18
  121. package/content/knowledge/update/diagnostic/observability/edges/edge-attempt-to-merge.json +0 -17
  122. package/content/knowledge/update/diagnostic/observability/edges/edge-candidate-to-effective-root.json +0 -16
  123. package/content/knowledge/update/diagnostic/observability/edges/edge-capacity-deferral-to-attempt.json +0 -16
  124. package/content/knowledge/update/diagnostic/observability/edges/edge-chain-node-to-execution-detail.json +0 -18
  125. package/content/knowledge/update/diagnostic/observability/edges/edge-dlx-recovery-to-attempt.json +0 -16
  126. package/content/knowledge/update/diagnostic/observability/edges/edge-effective-execution-to-listener-before.json +0 -21
  127. package/content/knowledge/update/diagnostic/observability/edges/edge-effective-root-to-chain.json +0 -17
  128. package/content/knowledge/update/diagnostic/observability/edges/edge-engine-task-to-primary-result.json +0 -17
  129. package/content/knowledge/update/diagnostic/observability/edges/edge-execution-detail-to-publication.json +0 -16
  130. package/content/knowledge/update/diagnostic/observability/edges/edge-init-recovery-to-publication.json +0 -16
  131. package/content/knowledge/update/diagnostic/observability/edges/edge-listener-complete-to-child-release.json +0 -21
  132. package/content/knowledge/update/diagnostic/observability/edges/edge-listener-to-derived-chain.json +0 -21
  133. package/content/knowledge/update/diagnostic/observability/edges/edge-load-decision-to-load-operation.json +0 -16
  134. package/content/knowledge/update/diagnostic/observability/edges/edge-load-operation-to-engine-task.json +0 -17
  135. package/content/knowledge/update/diagnostic/observability/edges/edge-lock-requeue-to-attempt.json +0 -16
  136. package/content/knowledge/update/diagnostic/observability/edges/edge-logical-parent-to-child.json +0 -18
  137. package/content/knowledge/update/diagnostic/observability/edges/edge-merge-member-to-effective-execution.json +0 -18
  138. package/content/knowledge/update/diagnostic/observability/edges/edge-merge-to-load-decision.json +0 -17
  139. package/content/knowledge/update/diagnostic/observability/edges/edge-no-load-to-primary-result.json +0 -16
  140. package/content/knowledge/update/diagnostic/observability/edges/edge-primary-result-to-child-frontier.json +0 -18
  141. package/content/knowledge/update/diagnostic/observability/edges/edge-primary-result-to-listener.json +0 -23
  142. package/content/knowledge/update/diagnostic/observability/edges/edge-publication-to-attempt.json +0 -16
  143. package/content/knowledge/update/diagnostic/observability/edges/edge-ready-recovery-to-publication.json +0 -16
  144. package/content/knowledge/update/diagnostic/observability/edges/edge-request-to-candidate-root.json +0 -16
  145. package/content/knowledge/update/diagnostic/observability/identity-units/candidate-root.json +0 -13
  146. package/content/knowledge/update/diagnostic/observability/identity-units/dag-node.json +0 -14
  147. package/content/knowledge/update/diagnostic/observability/identity-units/effective-root.json +0 -14
  148. package/content/knowledge/update/diagnostic/observability/identity-units/engine-task.json +0 -13
  149. package/content/knowledge/update/diagnostic/observability/identity-units/execution-attempt.json +0 -12
  150. package/content/knowledge/update/diagnostic/observability/identity-units/execution-detail.json +0 -13
  151. package/content/knowledge/update/diagnostic/observability/identity-units/listener-invocation.json +0 -11
  152. package/content/knowledge/update/diagnostic/observability/identity-units/load-decision.json +0 -12
  153. package/content/knowledge/update/diagnostic/observability/identity-units/load-operation.json +0 -11
  154. package/content/knowledge/update/diagnostic/observability/identity-units/logical-dag-edge.json +0 -11
  155. package/content/knowledge/update/diagnostic/observability/identity-units/merge-decision.json +0 -12
  156. package/content/knowledge/update/diagnostic/observability/identity-units/node-primary-result.json +0 -12
  157. package/content/knowledge/update/diagnostic/observability/identity-units/queue-publication.json +0 -11
  158. package/content/knowledge/update/diagnostic/observability/identity-units/requeue.json +0 -11
  159. package/content/knowledge/update/diagnostic/observability/identity-units/update-chain.json +0 -13
  160. package/content/knowledge/update/diagnostic/observability/identity-units/update-request.json +0 -12
  161. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-after-commit-delivery.json +0 -131
  162. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-attempt-consumed.json +0 -175
  163. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-candidate-root-filter.json +0 -119
  164. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-capacity-deferred.json +0 -121
  165. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-child-release.json +0 -146
  166. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-dlx-recovery.json +0 -100
  167. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-effective-root-selection.json +0 -111
  168. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-engine-handoff.json +0 -171
  169. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-execution-frontier-persisted.json +0 -115
  170. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-init-recovery.json +0 -93
  171. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-intent-accepted.json +0 -151
  172. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-listener-derived-chain.json +0 -112
  173. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-listener-invocation.json +0 -154
  174. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-load-decision.json +0 -155
  175. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-load-operation.json +0 -108
  176. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-lock-requeued.json +0 -108
  177. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-logical-dependency-expansion.json +0 -129
  178. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-merge-decision.json +0 -174
  179. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-primary-node-result.json +0 -318
  180. package/content/knowledge/update/diagnostic/observability/lookups/analysis-update-ready-recovery.json +0 -92
  181. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-business-attempt.json +0 -33
  182. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-capacity-cycle.json +0 -31
  183. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-child-release.json +0 -32
  184. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-commit-publication.json +0 -29
  185. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-control-planning.json +0 -30
  186. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-engine-task.json +0 -27
  187. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-listener-callback.json +0 -27
  188. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-load-operation.json +0 -27
  189. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-lock-cycle.json +0 -31
  190. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-main-queue-wait.json +0 -32
  191. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-merge-evaluation.json +0 -29
  192. package/content/knowledge/update/diagnostic/observability/performance-segments/analysis-update-segment-parent-dependency-wait.json +0 -31
  193. package/content/knowledge/update/diagnostic/observability-index.json +0 -558
  194. package/content/knowledge/update/diagnostic/recipe-index.json +0 -85
  195. package/content/knowledge/update/diagnostic/recipes/dag-chain.json +0 -676
  196. package/content/knowledge/update/diagnostic/recipes/performance-window.json +0 -1128
  197. package/content/knowledge/update/diagnostic/recipes/scene-origin-async-message-or-callback.json +0 -438
  198. package/content/knowledge/update/diagnostic/recipes/scene-origin-derived-update-chain.json +0 -510
  199. package/content/knowledge/update/diagnostic/recipes/scene-origin-direct-service-call.json +0 -438
  200. package/content/knowledge/update/diagnostic/recipes/scene-origin-http.json +0 -438
  201. package/content/knowledge/update/diagnostic/recipes/scene-origin-internal-event.json +0 -438
  202. package/content/knowledge/update/diagnostic/recipes/scene-origin-job.json +0 -438
  203. package/content/knowledge/update/diagnostic/recipes/scene-origin-recovery-or-migration.json +0 -438
  204. package/content/knowledge/update/diagnostic/recipes/table-history.json +0 -508
  205. package/content/knowledge/update/diagnostic/recipes/table-in-chain.json +0 -595
  206. package/content/knowledge/update/diagnostic/scene-index.json +0 -252
  207. package/content/knowledge/update/diagnostic/scenes/active.json +0 -47
  208. package/content/knowledge/update/diagnostic/scenes/add.json +0 -140
  209. package/content/knowledge/update/diagnostic/scenes/agent.json +0 -20
  210. package/content/knowledge/update/diagnostic/scenes/archive.json +0 -32
  211. package/content/knowledge/update/diagnostic/scenes/auth-change.json +0 -116
  212. package/content/knowledge/update/diagnostic/scenes/call-back.json +0 -32
  213. package/content/knowledge/update/diagnostic/scenes/case-install.json +0 -20
  214. package/content/knowledge/update/diagnostic/scenes/case-replace.json +0 -7
  215. package/content/knowledge/update/diagnostic/scenes/cdc-schedule.json +0 -20
  216. package/content/knowledge/update/diagnostic/scenes/compute-model.json +0 -20
  217. package/content/knowledge/update/diagnostic/scenes/copy-data.json +0 -32
  218. package/content/knowledge/update/diagnostic/scenes/corp-linked.json +0 -7
  219. package/content/knowledge/update/diagnostic/scenes/corp-member-add.json +0 -20
  220. package/content/knowledge/update/diagnostic/scenes/corp-member-del.json +0 -7
  221. package/content/knowledge/update/diagnostic/scenes/corp-member-modify.json +0 -32
  222. package/content/knowledge/update/diagnostic/scenes/corp-member-sync.json +0 -152
  223. package/content/knowledge/update/diagnostic/scenes/corp-setting-member-rename.json +0 -152
  224. package/content/knowledge/update/diagnostic/scenes/corp-setting.json +0 -20
  225. package/content/knowledge/update/diagnostic/scenes/cross-project-allow.json +0 -32
  226. package/content/knowledge/update/diagnostic/scenes/default.json +0 -32
  227. package/content/knowledge/update/diagnostic/scenes/del.json +0 -20
  228. package/content/knowledge/update/diagnostic/scenes/dynamic-time.json +0 -20
  229. package/content/knowledge/update/diagnostic/scenes/edit.json +0 -92
  230. package/content/knowledge/update/diagnostic/scenes/excel-append.json +0 -44
  231. package/content/knowledge/update/diagnostic/scenes/excel-save.json +0 -32
  232. package/content/knowledge/update/diagnostic/scenes/folder-copy.json +0 -32
  233. package/content/knowledge/update/diagnostic/scenes/global.json +0 -56
  234. package/content/knowledge/update/diagnostic/scenes/handover.json +0 -32
  235. package/content/knowledge/update/diagnostic/scenes/history-handle.json +0 -20
  236. package/content/knowledge/update/diagnostic/scenes/manual-update.json +0 -44
  237. package/content/knowledge/update/diagnostic/scenes/migration.json +0 -20
  238. package/content/knowledge/update/diagnostic/scenes/param-change.json +0 -20
  239. package/content/knowledge/update/diagnostic/scenes/polars-error.json +0 -32
  240. package/content/knowledge/update/diagnostic/scenes/preview-exception.json +0 -20
  241. package/content/knowledge/update/diagnostic/scenes/preview-invalid.json +0 -20
  242. package/content/knowledge/update/diagnostic/scenes/project-excel-move.json +0 -20
  243. package/content/knowledge/update/diagnostic/scenes/re-check.json +0 -7
  244. package/content/knowledge/update/diagnostic/scenes/replace.json +0 -20
  245. package/content/knowledge/update/diagnostic/scenes/rollback.json +0 -68
  246. package/content/knowledge/update/diagnostic/scenes/save-as.json +0 -44
  247. package/content/knowledge/update/diagnostic/scenes/schedu.json +0 -56
  248. package/content/knowledge/update/diagnostic/scenes/table-move-other-workspace.json +0 -20
  249. package/content/knowledge/update/diagnostic/scenes/user-holder-to-normal.json +0 -20
  250. package/content/knowledge/update/observability.md +0 -16
  251. package/content/knowledge/update/runtime-evidence.md +0 -32
  252. package/content/scripts/receive_tool_result.py +0 -57
  253. /package/content/{.agents/skills/setup-signoz-mcp/scripts → scripts}/install_signoz_mcp.ps1 +0 -0
  254. /package/content/{.agents/skills/setup-signoz-mcp/scripts → scripts}/install_signoz_mcp.py +0 -0
@@ -1,278 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Select the best complete MetricOuts body from a SigNoZ builder-query response."""
3
-
4
- from __future__ import annotations
5
-
6
- import hashlib
7
- import json
8
- from pathlib import Path
9
- import re
10
- import sys
11
- from typing import Any, Dict, List
12
-
13
-
14
- METRIC_LOGGER = "com.fanruan.polars.metric.MetricOuts"
15
- TASK_NAME_PATTERN = re.compile(r"^[A-Za-z0-9._:-]+$")
16
- PIPELINE_PATTERN = re.compile(r"^\s*-\s+pipeline@", re.MULTILINE)
17
- OPERATOR_PATTERN = re.compile(
18
- r"^\s*-\s+<[^>]+>\s+[^@\n]+@-?\d+\s+\[[^\]]+\]", re.MULTILINE
19
- )
20
-
21
-
22
- class MetricExtractionError(RuntimeError):
23
- """Raised when the log response cannot identify one usable metric body."""
24
-
25
- def __init__(self, message: str, status: str = "format_error"):
26
- super().__init__(message)
27
- self.status = status
28
-
29
-
30
- def classify_metric_body(body: str) -> str:
31
- """Classify a complete MetricOuts body by the evidence it can provide."""
32
- if PIPELINE_PATTERN.search(body) and OPERATOR_PATTERN.search(body):
33
- return "full_metric"
34
- return "signoz_metric_log"
35
-
36
-
37
- def _decode_text_payload(payload: Any) -> Any:
38
- if isinstance(payload, list):
39
- decoded = []
40
- for item in payload:
41
- if isinstance(item, dict) and item.get("type") == "text" and isinstance(item.get("text"), str):
42
- try:
43
- decoded.append(json.loads(item["text"]))
44
- except json.JSONDecodeError:
45
- continue
46
- if decoded:
47
- return decoded[0] if len(decoded) == 1 else decoded
48
- return payload
49
-
50
-
51
- def _find_rows(payload: Any) -> List[Dict[str, Any]]:
52
- value = _decode_text_payload(payload)
53
- if isinstance(value, dict):
54
- if (
55
- value.get("isError")
56
- or value.get("status") in ("error", "failed")
57
- or value.get("error")
58
- ):
59
- raise MetricExtractionError(
60
- "Tool returned an error; no empty-log conclusion is available",
61
- "tool_error",
62
- )
63
- if value.get("type") == "text" and isinstance(value.get("text"), str):
64
- try:
65
- return _find_rows(json.loads(value["text"]))
66
- except json.JSONDecodeError as exc:
67
- raise MetricExtractionError("MCP text is not a JSON response") from exc
68
- if value.get("nextCursor") or value.get("hasMore") or value.get("truncated"):
69
- raise MetricExtractionError(
70
- "Log response has another page; the selected body is not yet unique",
71
- "query_incomplete",
72
- )
73
- if "structuredContent" in value and value["structuredContent"] is not None:
74
- return _find_rows(value["structuredContent"])
75
- if "content" in value and not value["content"]:
76
- raise MetricExtractionError("MCP response contains no query result")
77
- if "rows" in value:
78
- rows = value["rows"]
79
- if rows is None:
80
- return []
81
- if not isinstance(rows, list) or any(
82
- not isinstance(row, dict) for row in rows
83
- ):
84
- raise MetricExtractionError("Log rows have an unsupported shape")
85
- return rows
86
- found: List[Dict[str, Any]] = []
87
- recognized = False
88
- for key in ("data", "results", "content"):
89
- if key in value:
90
- recognized = True
91
- found.extend(_find_rows(value[key]))
92
- if recognized:
93
- return found
94
- if isinstance(value, list):
95
- if not value:
96
- raise MetricExtractionError(
97
- "Empty result envelope does not establish server-side empty rows"
98
- )
99
- if value and all(
100
- isinstance(row, dict)
101
- and (
102
- "body" in row
103
- or isinstance(row.get("data"), dict)
104
- and "body" in row["data"]
105
- )
106
- for row in value
107
- ):
108
- return value
109
- found = []
110
- for item in value:
111
- found.extend(_find_rows(item))
112
- return found
113
- raise MetricExtractionError(
114
- "Response format is not recognized; preserve the original object"
115
- )
116
-
117
-
118
- def _row_data(row: Dict[str, Any]) -> Dict[str, Any]:
119
- data = row.get("data")
120
- return data if isinstance(data, dict) else row
121
-
122
-
123
- def _attributes(data: Dict[str, Any]) -> Dict[str, Any]:
124
- merged = {}
125
- for key in ("resources_string", "attributes_string"):
126
- if isinstance(data.get(key), dict):
127
- merged.update(data[key])
128
- raw = data.get("attributes")
129
- if isinstance(raw, dict):
130
- return {**merged, **raw}
131
- if isinstance(raw, list):
132
- result: Dict[str, Any] = {}
133
- for item in raw:
134
- if isinstance(item, dict) and item.get("key") is not None:
135
- result[str(item["key"])] = item.get("value")
136
- return {**merged, **result}
137
- return merged
138
-
139
-
140
- def _extract_metric_and_companions(
141
- payload: Any, task_name: str, query_limit: int | None = None
142
- ) -> tuple[Dict[str, Any], List[Dict[str, Any]]]:
143
- normalized_task_name = str(task_name or "")
144
- if not TASK_NAME_PATTERN.fullmatch(normalized_task_name):
145
- raise MetricExtractionError(
146
- "task_name is missing or contains unsupported characters"
147
- )
148
-
149
- matched_by_digest: Dict[str, Dict[str, Any]] = {}
150
- raw_candidate_count = 0
151
- rows = _find_rows(payload)
152
- if query_limit is not None and len(rows) >= query_limit:
153
- raise MetricExtractionError(
154
- "Metric row count reached the known query limit; uniqueness is unconfirmed",
155
- "query_incomplete",
156
- )
157
- task_rows = 0
158
- for row in rows:
159
- data = _row_data(row)
160
- attrs = _attributes(data)
161
- logger_name = (
162
- data.get("logger.name")
163
- or attrs.get("logger.name")
164
- or data.get("scope_name")
165
- )
166
- body = data.get("body")
167
- if logger_name != METRIC_LOGGER or not isinstance(body, str):
168
- continue
169
- if not re.search(
170
- r"(?<![A-Za-z0-9._:-])"
171
- + re.escape(normalized_task_name)
172
- + r"(?![A-Za-z0-9._:-])",
173
- body,
174
- ):
175
- continue
176
- task_rows += 1
177
- if not re.search(r"^\s*end_of_metric\s*$", body, re.MULTILINE):
178
- continue
179
- raw_candidate_count += 1
180
- digest = hashlib.sha256(body.encode("utf-8")).hexdigest()
181
- if digest not in matched_by_digest:
182
- matched_by_digest[digest] = {
183
- "body": body,
184
- "timestamp": data.get("timestamp") or row.get("timestamp"),
185
- "logger_name": logger_name,
186
- "service_name": data.get("service.name") or attrs.get("service.name"),
187
- "metric_kind": classify_metric_body(body),
188
- "body_sha256": digest,
189
- "duplicate_count": 1,
190
- }
191
- else:
192
- matched_by_digest[digest]["duplicate_count"] += 1
193
-
194
- matched = list(matched_by_digest.values())
195
-
196
- if not matched:
197
- status = (
198
- "query_empty"
199
- if not rows
200
- else "body_incomplete"
201
- if task_rows
202
- else "task_mismatch"
203
- )
204
- raise MetricExtractionError(
205
- f"Metric selection failed: {status}; response_rows={len(rows)}, matching_task_rows={task_rows}",
206
- status,
207
- )
208
- full_metrics = [item for item in matched if item["metric_kind"] == "full_metric"]
209
- if len(full_metrics) == 1:
210
- selected = full_metrics[0]
211
- elif len(full_metrics) > 1:
212
- timestamps = [str(item.get("timestamp") or "unknown") for item in full_metrics]
213
- raise MetricExtractionError(
214
- f"Expected one full MetricOuts log for task {normalized_task_name}, "
215
- f"found {len(full_metrics)} distinct full metrics at {timestamps}",
216
- "body_ambiguous",
217
- )
218
- elif len(matched) == 1:
219
- selected = matched[0]
220
- else:
221
- timestamps = [str(item.get("timestamp") or "unknown") for item in matched]
222
- raise MetricExtractionError(
223
- f"Expected one MetricOuts summary for task {normalized_task_name}, "
224
- f"found {len(matched)} distinct summaries at {timestamps}",
225
- "body_ambiguous",
226
- )
227
-
228
- companions = [
229
- item for item in matched if item["body_sha256"] != selected["body_sha256"]
230
- ]
231
- companion_candidates = [
232
- {
233
- "timestamp": item.get("timestamp"),
234
- "logger_name": item["logger_name"],
235
- "service_name": item.get("service_name"),
236
- "metric_kind": item["metric_kind"],
237
- "body_sha256": item["body_sha256"],
238
- "duplicate_count": item["duplicate_count"],
239
- }
240
- for item in companions
241
- ]
242
- return {
243
- **selected,
244
- "response_row_count": len(rows),
245
- "raw_candidate_count": raw_candidate_count,
246
- "distinct_candidate_count": len(matched),
247
- "companion_candidates": companion_candidates,
248
- }, companions
249
-
250
-
251
- def extract_metric(payload: Any, task_name: str) -> Dict[str, Any]:
252
- selected, _ = _extract_metric_and_companions(payload, task_name)
253
- return selected
254
-
255
-
256
- def write_metric(
257
- payload: Any, task_name: str, output_dir: Path, *, query_limit: int | None = None
258
- ) -> Dict[str, Any]:
259
- selected, companions = _extract_metric_and_companions(
260
- payload, task_name, query_limit
261
- )
262
- output_dir.mkdir(parents=True, exist_ok=True)
263
- metric_path = output_dir / f"{task_name}.metric"
264
- metric_path.write_text(selected["body"], encoding="utf-8")
265
- if companions:
266
- companion_dir = output_dir / "companions"
267
- companion_dir.mkdir(parents=True, exist_ok=True)
268
- for metadata, item in zip(selected["companion_candidates"], companions):
269
- companion_path = companion_dir / f"{item['body_sha256']}.metric"
270
- companion_path.write_text(item["body"], encoding="utf-8")
271
- metadata["metric_path"] = str(companion_path)
272
- return {**selected, "metric_path": str(metric_path)}
273
-
274
-
275
- def read_payload(input_path: str) -> Any:
276
- if input_path == "-":
277
- return json.load(sys.stdin)
278
- return json.loads(Path(input_path).read_text(encoding="utf-8"))
@@ -1,52 +0,0 @@
1
- ---
2
- name: diagnose-component-performance
3
- description: 当 $diagnose-performance 已将问题路由到图表、组件或 widget 取数场景,并提供 widgetId、componentId、取数请求、trace、时间窗或候选假设时使用。负责分析组件入口、数据绑定、筛选联动、聚合排序和关联分析表证据,不承担性能总控。
4
- ---
5
-
6
- # 组件性能诊断
7
-
8
- ## 定位与默认目标
9
-
10
- 从组件取数入口判断主要问题位于请求上下文、数据绑定、组件查询、关联分析表、上游更新还是 engine 执行,并把阶段性证据交回 `$diagnose-performance`。
11
-
12
- 出现组件 span 时,仍需核对本次请求和执行证据,才能判断是否为组件配置问题。
13
-
14
- ## 按需读取
15
-
16
- 同一调查中,已读且适用范围未变的内容直接复用。下面的步骤只补当前缺口,已有执行和产物沿用。
17
-
18
- 1. 首次进入本场景时读取 [`../../../knowledge/component/observability.md`](../../../knowledge/component/observability.md):业务实体、调查关系、接口、span 和 attribute 都在这一份。
19
- 2. 外部组件入口必须先读取或复用[来源判定](../../../knowledge/common/trace-routing.md#外部组件取数入口);其他跨场景冲突按同一文件处理。
20
- 3. 需要生成或排序候选假设时读取 [references/experience.md](references/experience.md) 的相关经验;已有直接证据足够时核对反证和边界后返回。
21
-
22
- ## 排查顺序
23
-
24
- 1. 区分编辑态预览、仪表板中的组件请求和其他外部取数。外部入口按上述来源判定处理;确认来自仪表板时,立即交回 `$diagnose-performance` 进入仪表板专项,不在本 Skill 继续分析。只有“图表慢/超时”等现象时,先做这一区分。
25
- 2. 记录组件、绑定表、筛选/联动/权限上下文、环境、时间窗和用户感知耗时。
26
- 3. 根据精确 ID、请求上下文和时间窗收敛候选执行;不按最慢 span 静默选取。
27
- 4. 已有证据能解释当前现象时,核对反证和边界;否则形成少量候选根因,并主动寻找支持证据和反证。
28
- 5. 验证:
29
- - 组件 ID、查询表和请求上下文是否属于本次问题;
30
- - 是否一次触发多个查询或携带复杂筛选、联动、聚合和排序;
31
- - trace 的关键阶段和主要耗时;
32
- - 绑定分析表的资源版本或更新状态是否与当前执行相关。
33
- 6. 已选定慢或失败 engine 执行时,直接调用 `$analyze-engine-metric` 获取并解析 Metric;取证门槛和跳过条件见 `$diagnose-performance` 的“失败分析的完成条件”。
34
- 7. 请求来自 dashboard 时直接交回 `$diagnose-performance` 重新路由;证据指向 dataset/update 时带上关联场景和依据交回。
35
-
36
- ## 返回结果
37
-
38
- 向 `$diagnose-performance` 说明调查范围、候选判断及其证据与反证,列出缺少的请求上下文或资源信息、关联场景和下一项最小验证动作。按本次材料组织结果,不预设固定字段。
39
-
40
- ## 关键限制
41
-
42
- - 配置说明可能发起什么,trace 才说明本次发起了什么。
43
- - dashboard trace 中出现组件 span,不表示业务入口是组件预览。
44
- - 底层表正在更新与组件慢时间相关,不足以确认因果。
45
- - 只有通用 engine span 时不能确认组件场景。
46
- - 没有完整 dashboard 交互证据时,不声称已还原全部请求扩散。
47
-
48
- ## 能力与协作边界
49
-
50
- - 负责单个组件及其直接查询上下文,不重做完整 dashboard 关键路径。
51
- - 不替代 dataset/update 解释完整资源或运行生命周期。
52
- - 完成本场景证据后返回当前结论及其边界,由 `$diagnose-performance` 决定继续、并行或停止。
@@ -1,7 +0,0 @@
1
- interface:
2
- display_name: "组件性能诊断"
3
- short_description: "诊断组件取数、数据绑定、聚合排序和关联分析表性能问题"
4
- default_prompt: "使用 $diagnose-component-performance 诊断这个组件取数性能问题。"
5
-
6
- policy:
7
- allow_implicit_invocation: false
@@ -1,34 +0,0 @@
1
- # 组件性能排查经验
2
-
3
- 根据这些经验提出假设,再用本次配置和执行证据验证。
4
-
5
- 本文件只保留业务现象对应的候选与验证方向,取证和结束条件按[统一取证门槛](../../diagnose-performance/SKILL.md#失败分析的完成条件)执行。解释引擎耗时、内存或数据放大时,按需查[常见引擎性能问题](../../../../knowledge/engine/performance-patterns.md),不在经验中另设读取 Metric 的条件。
6
-
7
- ## 组件请求数量或计算量过大
8
-
9
- 候选假设:
10
-
11
- - 一个组件实际发起多个查询;
12
- - 筛选、联动、权限上下文扩大了查询;
13
- - 高基数聚合、排序或 TopN 成为主要阶段。
14
-
15
- 验证:
16
-
17
- - 统计同一次组件动作的查询数量;
18
- - 检查本次请求携带的控件和联动上下文;
19
- - 对比本次请求的 trace 阶段,并核对对应引擎执行。
20
-
21
- ## 组件慢来自绑定分析表
22
-
23
- 候选假设:
24
-
25
- - 绑定表仍在更新、更新失败或结果陈旧;
26
- - 组件查询本身很轻,但依赖的表读取或计算慢。
27
-
28
- 验证:
29
-
30
- - 用 `component.query.table_id` 或资源配置确认真实绑定;
31
- - 校验更新时间、版本和当前 trace 的关联;
32
- - 没有时间或版本证据时只标为 `CORRELATED` 或 `INFERRED`。
33
-
34
- 常见误判:组件出现在 dashboard trace 中,不表示根因一定属于组件配置。
@@ -1,92 +0,0 @@
1
- ---
2
- name: diagnose-dashboard-performance
3
- description: 当 $diagnose-performance 已将问题路由到仪表板 2.0(FVS)的筛选器自身候选值取数或组件取数场景,并提供 dashboardId、reportId、控件/组件、trace、时间窗或候选假设时使用。首次加载、筛选值变化和联动只作为组件取数的触发上下文。负责还原控件或组件的计算上下文;明确同一次动作影响多个组件时再分析影响范围和关键路径。不诊断并发容量、并发退化或压测问题,也不承担性能总控。
4
- ---
5
-
6
- # 仪表板性能诊断
7
-
8
- ## 定位与默认目标
9
-
10
- 只面向仪表板 2.0(FVS)。一级场景只有筛选器自身候选值取数慢和组件取数慢;首次加载、筛选值变化、参数变化和联动只记录为触发组件取数的动作。优先用 trace span attribute 还原本次具体业务计算,再判断计算范围、关系层级、操作复杂度和异常配置是否足以解释性能问题。
11
-
12
- 单个组件 trace 只覆盖该请求,完整仪表板交互还需其他请求和交互边界。绑定表数量多时,仍需证明它怎样影响本次计算。
13
-
14
- ## 按需读取
15
-
16
- 同一调查中,沿用已选执行和产物;已读且适用范围未变的内容直接复用,只补当前缺口。
17
-
18
- 1. 首次进入本场景时读取 [`../../../knowledge/dashboard/observability.md`](../../../knowledge/dashboard/observability.md):业务实体、调查关系、接口、span 和 attribute 都在这一份。
19
- 2. 外部组件入口必须先读取或复用[来源判定](../../../knowledge/common/trace-routing.md#外部组件取数入口);其他跨场景冲突按同一文件处理。
20
- 3. 需要生成或排序候选假设时读取 [references/experience.md](references/experience.md) 的相关经验;已有直接证据足够时核对反证和边界后返回。
21
-
22
- ## 组件取数先做对照
23
-
24
- 识别为仪表板内组件计算后,先自行查找对应组件的单独计算记录,再深入仪表板上下文;不等待用户先说明“单独正常”。已有可用对照直接复用,查找窗口、预算及编辑态属性缺失时的日志回退见[仪表板内外组件对照](../../../knowledge/common/signoz-query-policy.md#仪表板内外组件对照),身份与成功判定见[组件计算对照的证据](../../../knowledge/dashboard/observability.md#组件计算对照的证据)。
25
-
26
- - 找到可比的单独计算成功记录,且仪表板失败或明显退化:优先核对仪表板额外带入的动态字段、参数、筛选、联动与权限,比较直接读取已有结果和展开上游计算的差异;不能仅凭入口不同认定原因。
27
- - 两种入口均异常:保留各自执行,先查共同的组件查询、输入数据和计算链;需要进入其他场景时带上证据返回性能入口,不强行归因为仪表板条件。
28
- - 未找到对照、身份无法核实或记录不足:立即继续分析已有异常 trace 和必要 Metric,交付已确认事实、可能原因及各自缺口,并提示用户检查“单独组件预览时是否也报错或变慢”。不把提供正常 trace 或执行预览作为继续当前诊断的前提,不自行触发计算。
29
-
30
- 仪表板内的快速成功请求可以补充解释不同计算路径,但必须标明仍是仪表板请求,不能冒充组件单独预览。用户已经反馈单独预览结果时沿用反馈,不重复要求确认;尚未取得该执行材料时明确其证据层次。
31
-
32
- ## 排查顺序
33
-
34
- 1. 先区分筛选器自身候选值取数和组件取数。首次加载、筛选值变化、参数变化和联动只是组件取数的触发上下文,不作为并列取数场景;不要因为组件请求携带筛选条件就把它归为筛选器自身取数。
35
- 外部组件入口先按上述来源判定确认;属于仪表板的组件计算由本 Skill 直接调查,不先经过组件场景重新分流。
36
- 2. 记录用户感知的开始/完成条件、report/dashboard、控件/组件、环境、时间窗和触发动作。组件取数由一次动作触发多个组件时,以全部受影响组件刷新完成为用户感知的完成;筛选器自身候选值取数仍单独分析。
37
- 3. 对控件候选值取数,只分析当前控件的候选值计算及其他控件带来的筛选影响。
38
- 4. 对组件取数,先按上节完成有界对照查找,再从入口和计算链路的 span attribute 及关联请求日志还原当前组件的完整业务计算,不要先根据慢 span 选择 Metric:
39
- - 组件在计算哪些查询,使用哪些字段、聚合、排序、窗口或 TopN;
40
- - 根表、绑定表、筛选字段所在表及完整关系路径;
41
- - 控件条件、参数、权限、自动联动和组件间自定义联动分别加入了什么计算;
42
- - 数据范围是否被父表路径、无关字段、重复分支或不合理绑定放大。
43
- 先根据这些业务语义判断计算复杂度和具体问题,再形成少量候选根因;不要把 `control` 等同于筛选器影响。
44
- 5. 验证:
45
- - dashboard 与控件、组件的资源关系;
46
- - DataRequestObservation 入口信息,以及 `filter_conditions.root_table_id`、`node_count`、`max_depth`、`table_paths`、`tree_summary` 描述的最终筛选树;
47
- - 组件计算存在多层、多分支过滤树,或结论依赖筛选器所在层级时,必须按[筛选树还原与交付](../../../knowledge/dashboard/observability.md#筛选树还原与交付)校验并输出完整树结构,不能用数量摘要替代;
48
- - 当前组件的查询、绑定表与算子,以及控件条件、参数、权限、自动联动和组件间自定义联动;动态字段覆盖的确认及取证边界按[动态字段知识](../../../knowledge/dashboard/observability.md#动态字段覆盖与上游展开)处理;
49
- - 还原出的具体计算是否能够解释慢点;耗时集中在查询执行阶段只证明慢发生在哪里,执行事实按第 9 步取得。
50
- 默认详情缺少业务 attribute 时,按[取证例子](../../../knowledge/dashboard/query-examples.md)和当前 MCP 工具声明定向补取。助手按上述筛选树规则还原、核对和展示树,补齐名称,并处理核对失败的情况。控件或动态字段只剩 ID 时,按[名称与请求上下文的关联取证](../../../knowledge/dashboard/observability.md#名称与请求上下文的关联取证)查请求及控件关系日志,不能停在默认属性或计数摘要并宣称名称无法取得。
51
- 能找到同 report、同组件、同查询表、同一可靠短时间窗内未携带目标控件的请求时,优先作为基线,对比耗时和过滤树规模。当前 trace 没有覆盖参数、聚合、排序等完整查询指纹,因此即使身份和时间匹配也只能标为 `strong_correlated_signal`,不能当作严格因果对照;任一身份字段缺失或超出短窗时降为普通相关信号。
52
- 6. 用户明确是筛选值变化后变慢时,只把具有同一筛选证据或可靠时间边界的组件请求组成受影响集合;观察全部受影响组件,验证筛选绑定字段与表的位置是否合理,并区分影响范围大和单个计算慢。
53
- 未观察到其他组件请求只证明本次观测范围,不等于配置上绝对没有其他目标;确认影响范围唯一需按[核对配置影响范围](../../../knowledge/dashboard/observability.md#核对配置影响范围)读取 targets 并按画布 instanceId 判断。
54
- 7. 筛选字段绑定在较上层父表、使组件计算经过更宽的数据链路时,先比较受影响组件实际使用的表和字段:如果本次 payload、筛选树和资源关系已经证明该绑定带来额外计算,就把它作为性能原因返回。无法判断业务是否必须绑定到该父表时,只保留“能否下移需结合业务筛选范围确认”的适用边界,业务配置判断与执行层证据分别保留;已选定的慢或失败 engine 执行仍须获取 Metric。
55
- 8. 某个组件成为关键路径,或绑定表、更新状态可疑时,带上关联场景(component、dataset 或 update)和依据交回 `$diagnose-performance` 继续协调。
56
- 9. Metric 不能代替业务语义还原。已选定慢或失败 engine 执行时,直接调用 `$analyze-engine-metric` 获取并解析;不以业务解释看起来足够而跳过。取证门槛和跳过条件见 `$diagnose-performance` 的“失败分析的完成条件”。
57
-
58
- ## 查询选择与预算
59
-
60
- 根据当前缺口读取[取证例子](../../../knowledge/dashboard/query-examples.md),复用已有执行和字段。已有 trace 时补本次业务记录,并按上述对照规则优先查单独计算;只有资源时先寻找有限候选;已确认控件与交互范围时再核对受影响请求或同窗对照。精确条件未命中时只在同范围降级一次;组件单独计算使用公共规则规定的独立基线窗口,不为寻找基线跨天扫描。
61
-
62
- 筛选器自身取数与组件取数按实际入口和属性区分,触发动作另行记录。只有抽象描述时先确认目标,环境与时间明确后再查询。组件资产 ID 与画布实例 ID 仍需证据核对,不能自动互换。
63
-
64
- 需要确认配置影响范围或“绑定下移”的可行性时,只使用用户已有的脱敏 FVS 配置材料或当前可用的只读配置能力,按[核对配置影响范围](../../../knowledge/dashboard/observability.md#核对配置影响范围)执行;取不到配置时保留缺口。
65
-
66
- 查询结果由助手直接解释;大响应的传递、临时落盘和清理按[公共查询规则](../../../knowledge/common/signoz-query-policy.md)执行,不写入工作区。
67
-
68
- 同组件无控件基线优先复用已有业务记录,按当前范围查找,不为挑选基线跨天扫描。相同条件不重复查询。
69
-
70
- ## 返回结果
71
-
72
- 向 `$diagnose-performance` 返回使用者可理解、可复核的业务结论:哪个控件、组件、绑定字段或表关系扩大了计算范围,影响了哪些组件,已确认到哪里。工程细节留在内部证据中;信息不足时列出最小缺口,问题已解释且必要分析完成时结束排查。
73
-
74
- 涉及复杂树时,返回结果仍按上述筛选树规则展示结构和缺口,不能只交付数量摘要;字段含义、校验和名称补齐不在本 Skill 另写一套。
75
-
76
- ## 关键限制
77
-
78
- - 没有共同交互 ID 或可靠时间窗时,不拼接任意相邻 trace。
79
- - 请求数量多不等于关键路径一定慢。
80
- - 筛选器绑定表多只是 Experience 假设,必须由本次配置和执行验证。
81
- - 单个最慢组件不能自动解释用户感知的整体完成时间。
82
- - dashboard 是调查起点,不是根因位置声明。
83
- - 不使用 `valueLinkageMap` 解释 FVS 自定义联动。`control` 中 `type=81` 只直接证明 `ComponentControl` 组件间过滤;是否跨源必须结合当前组件绑定表、`value.tableId`、`filterCols` 和生成的过滤条件判断。
84
- - 不把 Metric、Pipeline 或 Operator 当作仪表板排查入口;它们不能替代对本次具体业务计算的还原。
85
- - 没有配置证据时,不把“建议下移”写成已验证可行的变更。
86
-
87
- ## 能力与协作边界
88
-
89
- - 负责仪表板交互边界、请求扩散和关键路径。
90
- - 不覆盖并发容量、并发退化或压测问题。排查单个控件或组件时,可以观测同一筛选影响的其他组件计算,用于确认影响范围、绑定合理性和关键路径,不把问题扩张为并发性能诊断。
91
- - 不在本 Skill 内重做组件、分析表、更新或 engine 的完整专项分析。
92
- - 相关场景证据不足时说明缺口并交回 `$diagnose-performance` 继续协调。
@@ -1,7 +0,0 @@
1
- interface:
2
- display_name: "仪表板性能诊断"
3
- short_description: "诊断仪表板 2.0 控件候选值与组件计算性能问题"
4
- default_prompt: "使用 $diagnose-dashboard-performance 诊断这个仪表板 2.0 的非并发性能问题。"
5
-
6
- policy:
7
- allow_implicit_invocation: false
@@ -1,63 +0,0 @@
1
- # 仪表板性能排查经验
2
-
3
- 根据这些经验安排调查顺序,再用 trace、配置和资源状态核对。
4
-
5
- 取数分类和业务字段按[仪表板诊断知识](../../../../knowledge/dashboard/observability.md)核对,本文件保留各类业务现象的候选与反证。取证和结束条件按[统一取证门槛](../../diagnose-performance/SKILL.md#失败分析的完成条件)执行;引擎机制按需查[常见引擎性能问题](../../../../knowledge/engine/performance-patterns.md),不另设读取 Metric 的条件。
6
-
7
- ## 筛选器自身取数慢
8
-
9
- 该场景只分析当前筛选器为了展示候选值而发起的控件取数。用户选择筛选值后触发的组件刷新不属于这里。
10
-
11
- 候选假设:
12
-
13
- - 候选值来源表或绑定字段过多,自动解析读取范围过大;
14
- - 其他筛选器带入的筛选上下文使当前候选值查询扩大或复杂化;
15
- - 候选值来源表或其上游状态成为关键路径。
16
-
17
- 验证:
18
-
19
- - 锚定当前控件候选值请求,不混入任何组件取数请求;
20
- - 检查候选值来源表、绑定字段、解析方式、其他控件条件和实际候选值数量;
21
- - 对比输入范围与候选值输出,验证是否存在为少量候选值读取大量数据的放大;
22
- - 需要下钻时只沿当前候选值请求关联的分析表和执行继续。
23
-
24
- 常见误判:筛选器配置了多个字段不等于一定慢;小表、缓存命中或手动候选值可能改变执行成本。历史案例中的“按钮组绑定多个大字段且自动解析”只能生成假设,必须用本次输入规模、候选值数量和解析配置验证,不能直接建议改为手动解析。
25
-
26
- ## 组件取数慢
27
-
28
- 该场景分析仪表板内组件自身的数据请求。组件取数可以由首次加载、筛选值变化、参数变化、联动或单组件刷新触发;触发动作只决定本次需要组织哪些组件请求,不改变它属于组件取数。
29
-
30
- 候选假设:
31
-
32
- - 组件自身查询、绑定表、聚合、排序、窗口或 TopN 计算复杂;
33
- - 筛选字段绑定在较上层父表,扩大组件过滤树和数据处理范围;
34
- - 参数、权限、自动联动或 `ComponentControl` 增加额外计算;
35
- - 一次动作触发多个组件取数,少数关键组件或共享上游表拖慢用户感知完成时间。
36
-
37
- 验证:
38
-
39
- - 先还原每个组件自身的查询、绑定表与算子,再分别叠加控件条件、参数、权限和联动;
40
- - 筛选值变化后变慢时,组织同一次动作触发的受影响组件请求,但排除筛选器自身候选值取数;
41
- - 验证筛选绑定字段与表的位置是否符合受影响组件的计算需要,并读取完整根表到绑定表路径;
42
- - 按同一次加载或交互组织请求,区分总请求数量与决定完成时间的关键组件;
43
- - 沿已证实关系验证关键组件、分析表、上游更新和必要的 engine 证据。
44
-
45
- 常见误判:组件请求携带筛选条件不等于“筛选器自身取数慢”,也不能把组件全部耗时都归因于筛选器。不要使用 FVS 已废弃的 `valueLinkageMap` 解释联动,不要把一次动作涉及多个组件升级为并发性能问题。
46
-
47
- 如果筛选字段绑定在较上层父表,而组件实际不需要经过这么上层的数据关系,优先判断该绑定是否扩大了组件计算范围。能够证明额外计算由该绑定引入时,保留这项业务原因证据;“业务上是否必须保持该绑定”是配置适用性边界。分别说明业务判断与执行事实,不用缺失统计补造原因。
48
-
49
- 历史案例中的以下模式只用于排序组件取数假设,每次仍需当前证据验证:
50
-
51
- - 日期区间参数不是默认值,导致打开仪表板时触发实时组件计算:核对本次参数值、默认值、打开动作与实际组件请求;
52
- - 查询面板每次调整日期区间都触发组件大计算:确认触发频率、同次动作的组件集合与完成时间;
53
- - 参数或筛选绑定在很深或很上游的层级,扩大组件过滤树:读取完整 `root->parent...` 路径、层级和受影响目标。
54
-
55
- 默认值、点击查询或绑定下移是否可用都带业务前提,不能由历史案例替用户决定。
56
-
57
- ## 单独预览正常,仪表板展开上游后超限
58
-
59
- 一次已核查案例中,组件可以直接读取少量已保存的汇总行;仪表板失败请求则出现上游动态字段覆盖,并展开多路明细、关联和公共缓存,最终触发查询内存上限。同一仪表板也有快速成功请求,因此“在仪表板内”本身不足以解释差异。
60
-
61
- 可优先核对是否已有动态字段覆盖,以及覆盖所在表到组件查询表的路径。覆盖确认的证据和补查边界按[动态字段知识](../../../../knowledge/dashboard/observability.md#动态字段覆盖与上游展开),名称恢复按[关联取证](../../../../knowledge/dashboard/observability.md#名称与请求上下文的关联取证),不把控件键的 `parameter:` 前缀当普通参数类型,也不把 `unbound` 当成动态字段未生效。
62
-
63
- 本案例通过同字段 ID、表、算子和目标组件匹配,从另一次控件关系请求日志补到了字段名。名称映射不能补出失败时的选择值,历史请求不能冒充失败 trace 的属性。需要实际计划和 Metric 区分展开上游、局部放大及缓存压力;只有计数和时间接近时仍保留因果缺口,不能直接认定动态字段是唯一根因。
@@ -1,52 +0,0 @@
1
- ---
2
- name: diagnose-dataset-performance
3
- description: 当 $diagnose-performance 已将问题路由到分析表、自助数据集、步骤预览或表计算场景,并提供 tableId、预览请求、相关 trace、时间窗或候选假设时使用。负责分析本场景证据并返回候选根因、反证、关联场景和当前结论层级,不承担性能总控。
4
- ---
5
-
6
- # 分析表性能诊断
7
-
8
- ## 定位与默认目标
9
-
10
- 从分析表业务语义出发,判断主要问题位于本次预览/步骤计算、依赖资源、上游更新还是 engine 执行,并给出可供 `$diagnose-performance` 继续推进的证据结果。
11
-
12
- table 状态异常时,需要对应运行证据才能确认更新是否为根因。
13
-
14
- ## 按需读取
15
-
16
- 同一调查中,已读且适用范围未变的内容直接复用。下面的步骤只补当前缺口,已有执行和产物沿用。
17
-
18
- 1. 首次进入本场景时读取 [`../../../knowledge/dataset/observability.md`](../../../knowledge/dataset/observability.md):业务实体、调查关系、接口、span 和 attribute 都在这一份。
19
- 2. 场景仍不明确或存在跨场景冲突时,读取 [`../../../knowledge/common/trace-routing.md`](../../../knowledge/common/trace-routing.md)。
20
- 3. 需要生成或排序候选假设时读取 [references/experience.md](references/experience.md) 的相关经验;已有直接证据足够时核对反证和边界后返回。
21
-
22
- ## 排查顺序
23
-
24
- 1. 标注编辑预览、查看结果和后台更新;不要把它们当成同一次执行,也不要把执行类型升级为用户必须预先选择的调查分支。
25
- 2. 记录 table、选中步骤、环境、时间窗、配置/资源版本和已有执行锚点。已有精确 trace 或请求时直接围绕本次执行分析。
26
- 3. 收敛本次候选执行。用户明确 OOM、内存超限或失败时,先按同一 table、时间窗和失败签名收集精确执行,再标注编辑预览、查看结果或后台更新;不因执行类型不同而请求消歧。只有资源且用户现象笼统时,再按执行类型和成功、失败及 OOM/timeout 等异常类型对候选做浅分型;不要从最慢的成功预览直接推断用户目标。只有多个候选指向不同原因且用户目标无法推断时才返回差异,请 `$diagnose-performance` 请求最小消歧,不把每类候选都深挖到底。
27
- 4. 已有证据能解释当前现象时,核对反证和边界;否则形成少量候选根因,并为每个候选列出需要的支持证据和反证。
28
- 5. 只围绕候选收集最小证据:
29
- - 预览入口、tableId、选中步骤和配置版本;
30
- - 关键 span、阶段耗时、错误及 Query 关联;
31
- - 依赖表或上游更新是否在相同资源版本和时间窗影响当前结果。
32
- 6. 锁定的是慢或失败分析表查询执行时,直接调用 `$analyze-engine-metric` 获取并解析 Metric;取证门槛和跳过条件见 `$diagnose-performance` 的“失败分析的完成条件”。
33
- 7. 锁定的是后台更新执行,或发现组件、仪表板等关联时,把关联场景和依据交回 `$diagnose-performance`,由其进入对应专项。
34
-
35
- ## 返回结果
36
-
37
- 向 `$diagnose-performance` 说明分析范围、候选判断及其证据与反证,列出缺少的执行或映射信息、关联场景和下一项最小验证动作。材料没有的信息保留未知。
38
-
39
- ## 关键限制
40
-
41
- - 静态配置只能证明可能行为,不能证明本次执行。
42
- - 前台预览和后台更新可能共享计算语义,但不是同一次运行。
43
- - 相同失败签名和计算链路可以跨预览、更新联合分析,但每条证据仍需保留自己的执行类型、trace 和 task,避免串线。
44
- - 相邻时间的成功 trace 不能替代用户报告的问题执行。
45
- - 资源链接只能确定调查对象,不能证明用户关心的是预览延迟、更新失败还是资源超限。
46
- - Experience 只能排序假设,不能确认根因。
47
-
48
- ## 能力与协作边界
49
-
50
- - 负责分析表场景的证据收集、候选判断和当前结论边界。
51
- - 不替代 dashboard/component 还原前台请求扩散,不替代 update 分析完整 DAG。
52
- - 不默认承担最终报告;完成专项分析后把结果交回 `$diagnose-performance` 汇总。
@@ -1,7 +0,0 @@
1
- interface:
2
- display_name: "分析表性能诊断"
3
- short_description: "诊断分析表预览、步骤计算链路与上游更新导致的性能问题"
4
- default_prompt: "使用 $diagnose-dataset-performance 诊断这个分析表性能问题。"
5
-
6
- policy:
7
- allow_implicit_invocation: false
@@ -1,33 +0,0 @@
1
- # 分析表性能排查经验
2
-
3
- 根据这些经验提出假设并安排调查顺序,根因仍需本次证据确认。
4
-
5
- 本文件只保留业务现象对应的候选与验证方向,取证和结束条件按[统一取证门槛](../../diagnose-performance/SKILL.md#失败分析的完成条件)执行。解释引擎耗时、内存或数据放大时,按需查[常见引擎性能问题](../../../../knowledge/engine/performance-patterns.md),不在经验中另设读取 Metric 的条件。
6
-
7
- ## 预览中的某个步骤突然变慢
8
-
9
- 候选假设:
10
-
11
- - 选中步骤之后引入了高基数聚合、排序、Join 或字段计算;
12
- - 本次预览使用的配置版本与用户描述不一致;
13
- - 引擎阶段成为主要耗时。
14
-
15
- 验证:
16
-
17
- - 对比相邻步骤的请求上下文和执行耗时;
18
- - 确认真实选中步骤和配置版本;
19
- - 核对本次预览对应的引擎执行,按统一取证门槛完成分析。
20
-
21
- ## 整张分析表一直很慢
22
-
23
- 候选假设:
24
-
25
- - 慢点在基础数据读取或共享上游,而不是最后一个操作;
26
- - 上游更新未完成、失败或产物陈旧;
27
- - 同一 tableId 在问题时间窗存在多个候选执行。
28
-
29
- 验证:
30
-
31
- - 先区分前台预览与后台更新;
32
- - 验证依赖表状态、资源版本和时间关联;
33
- - 不用最近一次成功 trace 替代问题执行。