From e89db010938c59831b4ddcde42465845690afb9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=83=81=EC=97=B0=5B=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20AI=5D?= Date: Sun, 1 Feb 2026 01:35:36 +0900 Subject: [PATCH 1/3] fix: pass OpenTelemetry environment variables to Claude Code subprocess MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Environment variables set in workflow's step `env:` block were not being passed to the Claude Code subprocess because composite actions only forward explicitly referenced environment variables. This fix adds references for telemetry-related environment variables: - CLAUDE_CODE_ENABLE_TELEMETRY - OTEL_METRICS_EXPORTER - OTEL_LOGS_EXPORTER - OTEL_EXPORTER_OTLP_PROTOCOL - OTEL_EXPORTER_OTLP_ENDPOINT - OTEL_METRIC_EXPORT_INTERVAL - OTEL_LOGS_EXPORT_INTERVAL - OTEL_RESOURCE_ATTRIBUTES Co-Authored-By: 조상연[플레이스 AI] Co-Authored-By: csy1204 Co-Authored-By: Claude Opus 4.5 --- action.yml | 10 ++++++++++ base-action/action.yml | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/action.yml b/action.yml index f75a575a6..447f8e85d 100644 --- a/action.yml +++ b/action.yml @@ -312,6 +312,16 @@ runs: ANTHROPIC_DEFAULT_HAIKU_MODEL: ${{ env.ANTHROPIC_DEFAULT_HAIKU_MODEL }} ANTHROPIC_DEFAULT_OPUS_MODEL: ${{ env.ANTHROPIC_DEFAULT_OPUS_MODEL }} + # Telemetry configuration + CLAUDE_CODE_ENABLE_TELEMETRY: ${{ env.CLAUDE_CODE_ENABLE_TELEMETRY }} + OTEL_METRICS_EXPORTER: ${{ env.OTEL_METRICS_EXPORTER }} + OTEL_LOGS_EXPORTER: ${{ env.OTEL_LOGS_EXPORTER }} + OTEL_EXPORTER_OTLP_PROTOCOL: ${{ env.OTEL_EXPORTER_OTLP_PROTOCOL }} + OTEL_EXPORTER_OTLP_ENDPOINT: ${{ env.OTEL_EXPORTER_OTLP_ENDPOINT }} + OTEL_METRIC_EXPORT_INTERVAL: ${{ env.OTEL_METRIC_EXPORT_INTERVAL }} + OTEL_LOGS_EXPORT_INTERVAL: ${{ env.OTEL_LOGS_EXPORT_INTERVAL }} + OTEL_RESOURCE_ATTRIBUTES: ${{ env.OTEL_RESOURCE_ATTRIBUTES }} + - name: Update comment with job link if: steps.prepare.outputs.contains_trigger == 'true' && steps.prepare.outputs.claude_comment_id && always() shell: bash diff --git a/base-action/action.yml b/base-action/action.yml index 34f5d9ae3..1e4b531e1 100644 --- a/base-action/action.yml +++ b/base-action/action.yml @@ -202,3 +202,13 @@ runs: ANTHROPIC_DEFAULT_SONNET_MODEL: ${{ env.ANTHROPIC_DEFAULT_SONNET_MODEL }} ANTHROPIC_DEFAULT_HAIKU_MODEL: ${{ env.ANTHROPIC_DEFAULT_HAIKU_MODEL }} ANTHROPIC_DEFAULT_OPUS_MODEL: ${{ env.ANTHROPIC_DEFAULT_OPUS_MODEL }} + + # Telemetry configuration + CLAUDE_CODE_ENABLE_TELEMETRY: ${{ env.CLAUDE_CODE_ENABLE_TELEMETRY }} + OTEL_METRICS_EXPORTER: ${{ env.OTEL_METRICS_EXPORTER }} + OTEL_LOGS_EXPORTER: ${{ env.OTEL_LOGS_EXPORTER }} + OTEL_EXPORTER_OTLP_PROTOCOL: ${{ env.OTEL_EXPORTER_OTLP_PROTOCOL }} + OTEL_EXPORTER_OTLP_ENDPOINT: ${{ env.OTEL_EXPORTER_OTLP_ENDPOINT }} + OTEL_METRIC_EXPORT_INTERVAL: ${{ env.OTEL_METRIC_EXPORT_INTERVAL }} + OTEL_LOGS_EXPORT_INTERVAL: ${{ env.OTEL_LOGS_EXPORT_INTERVAL }} + OTEL_RESOURCE_ATTRIBUTES: ${{ env.OTEL_RESOURCE_ATTRIBUTES }} From 370fda3543c90c35016cfbbd0a578ab962e692b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=83=81=EC=97=B0=5B=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20AI=5D?= Date: Sun, 1 Feb 2026 01:42:25 +0900 Subject: [PATCH 2/3] test: add tests for OTEL environment variables passthrough MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verify that telemetry-related environment variables are correctly passed through to sdkOptions.env when set in process.env. Co-Authored-By: 조상연[플레이스 AI] Co-Authored-By: csy1204 Co-Authored-By: Claude Opus 4.5 --- base-action/test/parse-sdk-options.test.ts | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/base-action/test/parse-sdk-options.test.ts b/base-action/test/parse-sdk-options.test.ts index 175508af3..f38bb64b7 100644 --- a/base-action/test/parse-sdk-options.test.ts +++ b/base-action/test/parse-sdk-options.test.ts @@ -312,4 +312,54 @@ describe("parseSdkOptions", () => { expect(result.hasJsonSchema).toBe(true); }); }); + + describe("environment variables passthrough", () => { + test("should include OTEL environment variables in sdkOptions.env", () => { + // Set up test environment variables + const originalEnv = { ...process.env }; + process.env.CLAUDE_CODE_ENABLE_TELEMETRY = "1"; + process.env.OTEL_METRICS_EXPORTER = "otlp"; + process.env.OTEL_LOGS_EXPORTER = "otlp"; + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = "http/json"; + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://example.com"; + process.env.OTEL_METRIC_EXPORT_INTERVAL = "10000"; + process.env.OTEL_LOGS_EXPORT_INTERVAL = "5000"; + process.env.OTEL_RESOURCE_ATTRIBUTES = "department=test"; + + try { + const options: ClaudeOptions = {}; + const result = parseSdkOptions(options); + + // Verify OTEL env vars are passed through to sdkOptions.env + expect(result.sdkOptions.env?.CLAUDE_CODE_ENABLE_TELEMETRY).toBe("1"); + expect(result.sdkOptions.env?.OTEL_METRICS_EXPORTER).toBe("otlp"); + expect(result.sdkOptions.env?.OTEL_LOGS_EXPORTER).toBe("otlp"); + expect(result.sdkOptions.env?.OTEL_EXPORTER_OTLP_PROTOCOL).toBe( + "http/json", + ); + expect(result.sdkOptions.env?.OTEL_EXPORTER_OTLP_ENDPOINT).toBe( + "https://example.com", + ); + expect(result.sdkOptions.env?.OTEL_METRIC_EXPORT_INTERVAL).toBe( + "10000", + ); + expect(result.sdkOptions.env?.OTEL_LOGS_EXPORT_INTERVAL).toBe("5000"); + expect(result.sdkOptions.env?.OTEL_RESOURCE_ATTRIBUTES).toBe( + "department=test", + ); + } finally { + // Restore original environment + process.env = originalEnv; + } + }); + + test("should set CLAUDE_CODE_ENTRYPOINT in sdkOptions.env", () => { + const options: ClaudeOptions = {}; + const result = parseSdkOptions(options); + + expect(result.sdkOptions.env?.CLAUDE_CODE_ENTRYPOINT).toBe( + "claude-code-github-action", + ); + }); + }); }); From c04c93b0a41b9d1efcb60d9afe11c0bb9882591d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=83=81=EC=97=B0=5B=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20AI=5D?= Date: Sun, 1 Feb 2026 10:21:57 +0900 Subject: [PATCH 3/3] fix: add missing OTEL_EXPORTER_OTLP_HEADERS environment variable Add OTEL_EXPORTER_OTLP_HEADERS to the list of OpenTelemetry environment variables passed through to the Claude Code subprocess. This variable is needed for authentication when connecting to OTLP endpoints that require bearer tokens or other credentials. Co-Authored-By: Claude Opus 4.5 --- action.yml | 1 + base-action/action.yml | 1 + base-action/test/parse-sdk-options.test.ts | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/action.yml b/action.yml index 447f8e85d..f596655c5 100644 --- a/action.yml +++ b/action.yml @@ -318,6 +318,7 @@ runs: OTEL_LOGS_EXPORTER: ${{ env.OTEL_LOGS_EXPORTER }} OTEL_EXPORTER_OTLP_PROTOCOL: ${{ env.OTEL_EXPORTER_OTLP_PROTOCOL }} OTEL_EXPORTER_OTLP_ENDPOINT: ${{ env.OTEL_EXPORTER_OTLP_ENDPOINT }} + OTEL_EXPORTER_OTLP_HEADERS: ${{ env.OTEL_EXPORTER_OTLP_HEADERS }} OTEL_METRIC_EXPORT_INTERVAL: ${{ env.OTEL_METRIC_EXPORT_INTERVAL }} OTEL_LOGS_EXPORT_INTERVAL: ${{ env.OTEL_LOGS_EXPORT_INTERVAL }} OTEL_RESOURCE_ATTRIBUTES: ${{ env.OTEL_RESOURCE_ATTRIBUTES }} diff --git a/base-action/action.yml b/base-action/action.yml index 1e4b531e1..29b7c8b56 100644 --- a/base-action/action.yml +++ b/base-action/action.yml @@ -209,6 +209,7 @@ runs: OTEL_LOGS_EXPORTER: ${{ env.OTEL_LOGS_EXPORTER }} OTEL_EXPORTER_OTLP_PROTOCOL: ${{ env.OTEL_EXPORTER_OTLP_PROTOCOL }} OTEL_EXPORTER_OTLP_ENDPOINT: ${{ env.OTEL_EXPORTER_OTLP_ENDPOINT }} + OTEL_EXPORTER_OTLP_HEADERS: ${{ env.OTEL_EXPORTER_OTLP_HEADERS }} OTEL_METRIC_EXPORT_INTERVAL: ${{ env.OTEL_METRIC_EXPORT_INTERVAL }} OTEL_LOGS_EXPORT_INTERVAL: ${{ env.OTEL_LOGS_EXPORT_INTERVAL }} OTEL_RESOURCE_ATTRIBUTES: ${{ env.OTEL_RESOURCE_ATTRIBUTES }} diff --git a/base-action/test/parse-sdk-options.test.ts b/base-action/test/parse-sdk-options.test.ts index f38bb64b7..9c1095cef 100644 --- a/base-action/test/parse-sdk-options.test.ts +++ b/base-action/test/parse-sdk-options.test.ts @@ -322,6 +322,8 @@ describe("parseSdkOptions", () => { process.env.OTEL_LOGS_EXPORTER = "otlp"; process.env.OTEL_EXPORTER_OTLP_PROTOCOL = "http/json"; process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://example.com"; + process.env.OTEL_EXPORTER_OTLP_HEADERS = + "Authorization=Bearer test-token"; process.env.OTEL_METRIC_EXPORT_INTERVAL = "10000"; process.env.OTEL_LOGS_EXPORT_INTERVAL = "5000"; process.env.OTEL_RESOURCE_ATTRIBUTES = "department=test"; @@ -340,6 +342,9 @@ describe("parseSdkOptions", () => { expect(result.sdkOptions.env?.OTEL_EXPORTER_OTLP_ENDPOINT).toBe( "https://example.com", ); + expect(result.sdkOptions.env?.OTEL_EXPORTER_OTLP_HEADERS).toBe( + "Authorization=Bearer test-token", + ); expect(result.sdkOptions.env?.OTEL_METRIC_EXPORT_INTERVAL).toBe( "10000", );