Skip to content

Commit 52f3a07

Browse files
authored
Ensure gh-aw.aic is emitted on conclusion spans (#38510)
1 parent ba0b5d3 commit 52f3a07

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

actions/setup/js/send_otlp_span.cjs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ function parseBooleanEnv(value) {
139139
return undefined;
140140
}
141141

142+
/**
143+
* Resolve the job name for conclusion spans.
144+
*
145+
* Normally this comes from INPUT_JOB_NAME (job-name action input), but some
146+
* deployment paths can miss that env var in the post step. In that case, fall
147+
* back to parsing the conclusion span name ("gh-aw.<job>.conclusion").
148+
*
149+
* @param {string} spanName
150+
* @returns {string}
151+
*/
152+
function resolveConclusionJobName(spanName) {
153+
const inputJobName = (process.env.INPUT_JOB_NAME || "").trim();
154+
if (inputJobName) {
155+
return inputJobName;
156+
}
157+
const match = /^gh-aw\.([^.]+)\.conclusion$/.exec(spanName);
158+
return match ? match[1] : "";
159+
}
160+
142161
/**
143162
* Parse setup-time aw_context passed via environment before aw_info.json exists.
144163
*
@@ -1937,7 +1956,7 @@ async function sendJobConclusionSpan(spanName, options = {}) {
19371956
const awmgVersion = (typeof awInfo.awmg_version === "string" ? awInfo.awmg_version : "") || process.env.GH_AW_INFO_AWMG_VERSION || "";
19381957
const bodyModified = typeof awInfo.body_modified === "boolean" ? awInfo.body_modified : parseBooleanEnv(process.env.GH_AW_INFO_BODY_MODIFIED);
19391958
const trackerId = process.env.GH_AW_TRACKER_ID || awInfo.tracker_id || "";
1940-
const jobName = process.env.INPUT_JOB_NAME || "";
1959+
const jobName = resolveConclusionJobName(spanName);
19411960
const jobEmitsOwnTokenUsage = jobName === "agent" || jobName === "detection" || (!!engineId && jobName === engineId);
19421961
const runId = process.env.GITHUB_RUN_ID || "";
19431962
const runAttempt = awInfo.run_attempt || process.env.GITHUB_RUN_ATTEMPT || "1";

actions/setup/js/send_otlp_span.test.cjs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3561,6 +3561,23 @@ describe("sendJobConclusionSpan", () => {
35613561
expect(aicAttr.value.doubleValue).toBe(0.125);
35623562
});
35633563

3564+
it("includes gh-aw.aic when INPUT_JOB_NAME is missing but span name is gh-aw.agent.conclusion", async () => {
3565+
const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" });
3566+
vi.stubGlobal("fetch", mockFetch);
3567+
3568+
process.env.GH_AW_OTLP_ENDPOINTS = JSON.stringify([{ url: "https://traces.example.com" }]);
3569+
process.env.GH_AW_AIC = "0.125";
3570+
delete process.env.INPUT_JOB_NAME;
3571+
3572+
await sendJobConclusionSpan("gh-aw.agent.conclusion");
3573+
3574+
const body = JSON.parse(mockFetch.mock.calls[0][1].body);
3575+
const span = body.resourceSpans[0].scopeSpans[0].spans[0];
3576+
const aicAttr = span.attributes.find(a => a.key === "gh-aw.aic");
3577+
expect(aicAttr).toBeDefined();
3578+
expect(aicAttr.value.doubleValue).toBe(0.125);
3579+
});
3580+
35643581
it("emits dashboard metrics and aliases on the conclusion span", async () => {
35653582
const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" });
35663583
vi.stubGlobal("fetch", mockFetch);

0 commit comments

Comments
 (0)