diff --git a/action.yml b/action.yml index f75a575a6..f596655c5 100644 --- a/action.yml +++ b/action.yml @@ -312,6 +312,17 @@ 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_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 }} + - 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..29b7c8b56 100644 --- a/base-action/action.yml +++ b/base-action/action.yml @@ -202,3 +202,14 @@ 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_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 175508af3..9c1095cef 100644 --- a/base-action/test/parse-sdk-options.test.ts +++ b/base-action/test/parse-sdk-options.test.ts @@ -312,4 +312,59 @@ 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_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"; + + 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_EXPORTER_OTLP_HEADERS).toBe( + "Authorization=Bearer test-token", + ); + 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", + ); + }); + }); });