Merge pull request #600 from pikasTech/fix/otel-diagnose-candidate-scan-20260621

fix: 改进 Code Agent OTel trace 候选选择
This commit is contained in:
Lyon
2026-06-21 22:31:14 +08:00
committed by GitHub
+19 -4
View File
@@ -335,7 +335,7 @@ function parseDiagnoseCodeAgentOptions(args: string[]): DiagnoseCodeAgentOptions
let businessTraceId: string | null = null;
let traceId: string | null = null;
let limit = 40;
let candidateLimit = 20;
let candidateLimit = 300;
let lookbackMinutes = 10080;
for (let index = 0; index < args.length; index += 1) {
const arg = args[index];
@@ -362,7 +362,7 @@ function parseDiagnoseCodeAgentOptions(args: string[]): DiagnoseCodeAgentOptions
const value = args[index + 1];
if (value === undefined || value.startsWith("--")) throw new Error("--candidate-limit requires a value");
const parsed = Number(value);
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) throw new Error("--candidate-limit must be an integer from 1 to 100");
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 500) throw new Error("--candidate-limit must be an integer from 1 to 500");
candidateLimit = parsed;
index += 1;
} else if (arg === "--lookback-minutes" || arg === "--since-minutes") {
@@ -2646,6 +2646,7 @@ def candidate_score(trace_id, meta, trace_body, trace_rc, trace_err):
)
if is_workbench_get_single_span:
add(-80, "single-span Workbench GET/SSE trace")
candidate_quality = "low-confidence-workbench-single-span" if is_workbench_get_single_span else "normal"
service_path = {
service: ("reached" if service in services else "missing")
for service in ("hwlab-cloud-api", "agentrun-manager", "agentrun-runner")
@@ -2664,6 +2665,8 @@ def candidate_score(trace_id, meta, trace_body, trace_rc, trace_err):
"identity": {key: identity.get(key) for key in ("runId", "commandId", "runnerJobId", "runnerId", "backendProfile") if identity.get(key) not in (None, "")},
"terminalStatus": agentrun.get("terminalStatus"),
"errorSpanCount": len(error_spans),
"candidateQuality": candidate_quality,
"lowConfidence": candidate_quality != "normal",
"rootTraceName": meta_root_name or None,
"rootServiceName": meta_root_service or None,
"spanNamePreview": names[:8],
@@ -2720,6 +2723,13 @@ def resolve_trace():
break
candidate_summaries.sort(key=lambda item: item.get("score", -999999), reverse=True)
selected_summary = next((item for item in candidate_summaries if item.get("traceId") == selected_trace_id), None)
selected_quality = selected_summary.get("candidateQuality") if isinstance(selected_summary, dict) else None
selected_low_confidence = bool(selected_summary.get("lowConfidence")) if isinstance(selected_summary, dict) else False
selected_service_path = selected_summary.get("servicePath") if isinstance(selected_summary, dict) else None
selected_complete = bool(selected_service_path.get("complete")) if isinstance(selected_service_path, dict) else False
selected_rejected_reason = None
if selected_low_confidence and not selected_complete:
selected_rejected_reason = "best candidate is only a single-span Workbench GET/SSE trace; no high-confidence Code Agent trace was found in the scanned window"
mapping = {
"mode": "business-trace-id",
"businessTraceId": BUSINESS_TRACE_ID,
@@ -2732,6 +2742,9 @@ def resolve_trace():
"scannedCandidateCount": scanned,
"candidateSelectionMode": "scored-service-and-span-content",
"selectedScore": selected_score,
"selectedQuality": selected_quality,
"selectedLowConfidence": selected_low_confidence,
"selectedRejectedReason": selected_rejected_reason,
"selectedReasons": selected_summary.get("reasons", []) if isinstance(selected_summary, dict) else [],
"selectedMeta": compact_meta(selected),
"candidatePreview": candidate_summaries[:8],
@@ -2741,6 +2754,8 @@ def resolve_trace():
mapping["rawSearchBody"] = search_parsed if isinstance(search_parsed, dict) else search_body[-12000:]
if selected_trace_id is None:
return None, mapping, "no OTel trace found for business trace"
if selected_rejected_reason is not None:
return None, mapping, selected_rejected_reason
return selected_trace_id, mapping, None
resolved_trace_id, mapping, resolve_error = resolve_trace()
@@ -2754,8 +2769,8 @@ if resolved_trace_id is None:
"facts": [],
},
"next": {
"expandWindow": "bun scripts/cli.ts platform-infra observability diagnose-code-agent --target ${target.id} --business-trace-id ${businessTraceIdForNext} --lookback-minutes 10080 --candidate-limit 100 --full",
"search": "bun scripts/cli.ts platform-infra observability search --target ${target.id} --query '{ .traceId = \\"${businessTraceIdForNext}\\" }' --lookback-minutes 10080 --candidate-limit 100 --limit 10",
"expandWindow": "bun scripts/cli.ts platform-infra observability diagnose-code-agent --target ${target.id} --business-trace-id ${businessTraceIdForNext} --lookback-minutes 10080 --candidate-limit 500 --full",
"search": "bun scripts/cli.ts platform-infra observability search --target ${target.id} --query '{ .traceId = \\"${businessTraceIdForNext}\\" }' --lookback-minutes 10080 --candidate-limit 500 --limit 10",
},
}
print(json.dumps(payload, ensure_ascii=False, indent=2))