From 5c31204906d20ec1fcc1eadcdba72201e6a95b1b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 04:34:01 +0000 Subject: [PATCH 1/2] Initial plan From b7c11cadea274bf53ea26e2dcb1a8df7f4bd2a3f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 04:39:00 +0000 Subject: [PATCH 2/2] fix(otel): show real OTLP trace ID in observability summary Prefer `otel_trace_id` over `workflow_call_id` in `collectObservabilityData()` so the job summary displays the 32-char hex trace ID that exists in Sentry/Honeycomb/Datadog, with a fallback to `workflow_call_id` when the OTLP trace ID is not available. Updated tests to assert the correct field is used and added a fallback test case. Fixes # Agent-Logs-Url: https://github.com/github/gh-aw/sessions/da3f4dd1-cc9a-45d9-800b-988d0fd3bb8d Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../js/generate_observability_summary.cjs | 2 +- .../generate_observability_summary.test.cjs | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/actions/setup/js/generate_observability_summary.cjs b/actions/setup/js/generate_observability_summary.cjs index e28cd13d65c..b9ab440f927 100644 --- a/actions/setup/js/generate_observability_summary.cjs +++ b/actions/setup/js/generate_observability_summary.cjs @@ -60,7 +60,7 @@ function collectObservabilityData() { const agentOutput = readJSONIfExists(AGENT_OUTPUT_PATH) || { items: [], errors: [] }; const items = Array.isArray(agentOutput.items) ? agentOutput.items : []; const errors = Array.isArray(agentOutput.errors) ? agentOutput.errors : []; - const traceId = awInfo.context && typeof awInfo.context.workflow_call_id === "string" ? awInfo.context.workflow_call_id : ""; + const traceId = awInfo.context ? awInfo.context.otel_trace_id || awInfo.context.workflow_call_id || "" : ""; return { workflowName: awInfo.workflow_name || "", diff --git a/actions/setup/js/generate_observability_summary.test.cjs b/actions/setup/js/generate_observability_summary.test.cjs index b3029b78758..51217610506 100644 --- a/actions/setup/js/generate_observability_summary.test.cjs +++ b/actions/setup/js/generate_observability_summary.test.cjs @@ -38,7 +38,7 @@ describe("generate_observability_summary.cjs", () => { engine_id: "copilot", staged: false, firewall_enabled: true, - context: { workflow_call_id: "trace-123" }, + context: { workflow_call_id: "12345678901-1", otel_trace_id: "a3f2c8d1e4b7091f6a5c2e3d8f401b72" }, }) ); fs.writeFileSync( @@ -57,7 +57,8 @@ describe("generate_observability_summary.cjs", () => { expect(summary).toContain("Observability"); expect(summary).toContain("- **workflow**: triage-workflow"); expect(summary).toContain("- **engine**: copilot"); - expect(summary).toContain("- **trace id**: trace-123"); + expect(summary).toContain("- **trace id**: a3f2c8d1e4b7091f6a5c2e3d8f401b72"); + expect(summary).not.toContain("12345678901-1"); expect(summary).toContain("- **posture**: write-capable"); expect(summary).toContain("- **created items**: 2"); expect(summary).toContain("- **blocked requests**: 1"); @@ -67,6 +68,25 @@ describe("generate_observability_summary.cjs", () => { expect(mockCore.summary.write).toHaveBeenCalledTimes(1); }); + it("falls back to workflow_call_id when otel_trace_id is absent", async () => { + fs.writeFileSync( + "/tmp/gh-aw/aw_info.json", + JSON.stringify({ + workflow_name: "triage-workflow", + engine_id: "copilot", + staged: false, + firewall_enabled: false, + context: { workflow_call_id: "12345678901-1" }, + }) + ); + + await module.main(mockCore); + + expect(mockCore.summary.addRaw).toHaveBeenCalledTimes(1); + const summary = mockCore.summary.addRaw.mock.calls[0][0]; + expect(summary).toContain("- **trace id**: 12345678901-1"); + }); + it("skips summary generation when opt-in mode is disabled", async () => { process.env.GH_AW_OBSERVABILITY_JOB_SUMMARY = "off";