Merge pull request #600 from pikasTech/fix/otel-diagnose-candidate-scan-20260621
fix: 改进 Code Agent OTel trace 候选选择
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user