From 8fc584da57dd8a55cecbf5241742f999cdd384bf Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Mon, 13 Jul 2026 23:28:39 +0800 Subject: [PATCH 1/4] Add span origin provenance --- plugins/trace-codex/src/braintrust/logger.ts | 58 +++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/plugins/trace-codex/src/braintrust/logger.ts b/plugins/trace-codex/src/braintrust/logger.ts index 4b95023..428a278 100644 --- a/plugins/trace-codex/src/braintrust/logger.ts +++ b/plugins/trace-codex/src/braintrust/logger.ts @@ -10,6 +10,7 @@ import { initLogger, type Span, type StartSpanArgs } from "braintrust"; import type { Logger } from "../log.ts"; +import { PLUGIN_VERSION } from "../version.ts"; export type { Span, StartSpanArgs }; @@ -90,6 +91,57 @@ export interface ReportingConfig { additionalMetadata?: Record; } +type SpanOriginEnvironment = { type: string; name?: string }; + +function detectEnvironment(env: NodeJS.ProcessEnv = process.env): SpanOriginEnvironment | undefined { + if (env.BRAINTRUST_ENVIRONMENT_TYPE) { + return env.BRAINTRUST_ENVIRONMENT_NAME + ? { type: env.BRAINTRUST_ENVIRONMENT_TYPE, name: env.BRAINTRUST_ENVIRONMENT_NAME } + : { type: env.BRAINTRUST_ENVIRONMENT_TYPE }; + } + if (env.GITHUB_ACTIONS) return { type: "ci", name: "github_actions" }; + if (env.GITLAB_CI) return { type: "ci", name: "gitlab_ci" }; + if (env.CIRCLECI) return { type: "ci", name: "circleci" }; + if (env.BUILDKITE) return { type: "ci", name: "buildkite" }; + if (env.CI) return { type: "ci", name: "ci" }; + if (env.VERCEL) return { type: "server", name: "vercel" }; + if (env.NETLIFY) return { type: "server", name: "netlify" }; + if (env.NODE_ENV === "production" || env.NODE_ENV === "staging") { + return { type: "server", name: env.NODE_ENV }; + } + if (env.NODE_ENV === "development" || env.NODE_ENV === "local") { + return { type: "local", name: env.NODE_ENV }; + } + return undefined; +} + +function pluginContext() { + const environment = detectEnvironment(); + return { + span_origin: { + name: "braintrust.plugin.codex", + version: PLUGIN_VERSION, + instrumentation: { name: "codex-event-processor" }, + ...(environment ? { environment } : {}), + }, + }; +} + +function withPluginContext(args: StartSpanArgs): StartSpanArgs { + const event = (args.event ?? {}) as Record; + const eventWithContext = { + ...event, + context: { + ...((event.context as Record | undefined) ?? {}), + ...pluginContext(), + }, + } as StartSpanArgs["event"]; + return { + ...args, + event: eventWithContext, + }; +} + /** * Builds a SpanFactory for a given reporting config. Injected into processors so * each session can create its own logger, and so tests can stay offline by @@ -133,15 +185,15 @@ export function createSpanFactory(config?: ReportingConfig, diagLogger?: Logger) hasApiKey: Boolean(config?.apiKey ?? process.env.BRAINTRUST_API_KEY), }); return { - startSpan: (args) => logger.startSpan(args), + startSpan: (args) => logger.startSpan(withPluginContext(args)), rehydrateSpan: (ref) => - logger.startSpan({ + logger.startSpan(withPluginContext({ spanId: ref.spanId, parentSpanIds: { parentSpanIds: ref.spanParents, rootSpanId: ref.rootSpanId }, ...(ref.name !== undefined ? { name: ref.name } : {}), ...(ref.type !== undefined ? { type: ref.type } : {}), ...(ref.startTime !== undefined ? { startTime: ref.startTime } : {}), - }), + })), flush: async () => { try { await logger.flush(); From 5ddd661de51dc5c6ffb0a9323398f2f72c28fbec Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Wed, 15 Jul 2026 14:48:19 +0800 Subject: [PATCH 2/4] Format span origin logger updates --- plugins/trace-codex/src/braintrust/logger.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/plugins/trace-codex/src/braintrust/logger.ts b/plugins/trace-codex/src/braintrust/logger.ts index 428a278..08f14ce 100644 --- a/plugins/trace-codex/src/braintrust/logger.ts +++ b/plugins/trace-codex/src/braintrust/logger.ts @@ -93,7 +93,9 @@ export interface ReportingConfig { type SpanOriginEnvironment = { type: string; name?: string }; -function detectEnvironment(env: NodeJS.ProcessEnv = process.env): SpanOriginEnvironment | undefined { +function detectEnvironment( + env: NodeJS.ProcessEnv = process.env, +): SpanOriginEnvironment | undefined { if (env.BRAINTRUST_ENVIRONMENT_TYPE) { return env.BRAINTRUST_ENVIRONMENT_NAME ? { type: env.BRAINTRUST_ENVIRONMENT_TYPE, name: env.BRAINTRUST_ENVIRONMENT_NAME } @@ -187,13 +189,15 @@ export function createSpanFactory(config?: ReportingConfig, diagLogger?: Logger) return { startSpan: (args) => logger.startSpan(withPluginContext(args)), rehydrateSpan: (ref) => - logger.startSpan(withPluginContext({ - spanId: ref.spanId, - parentSpanIds: { parentSpanIds: ref.spanParents, rootSpanId: ref.rootSpanId }, - ...(ref.name !== undefined ? { name: ref.name } : {}), - ...(ref.type !== undefined ? { type: ref.type } : {}), - ...(ref.startTime !== undefined ? { startTime: ref.startTime } : {}), - })), + logger.startSpan( + withPluginContext({ + spanId: ref.spanId, + parentSpanIds: { parentSpanIds: ref.spanParents, rootSpanId: ref.rootSpanId }, + ...(ref.name !== undefined ? { name: ref.name } : {}), + ...(ref.type !== undefined ? { type: ref.type } : {}), + ...(ref.startTime !== undefined ? { startTime: ref.startTime } : {}), + }), + ), flush: async () => { try { await logger.flush(); From 71ea7e9222edfe3ae832d206f1315a44815c8742 Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Wed, 15 Jul 2026 18:10:02 +0800 Subject: [PATCH 3/4] Fix span origin AWS environment detection --- plugins/trace-codex/src/braintrust/logger.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/trace-codex/src/braintrust/logger.ts b/plugins/trace-codex/src/braintrust/logger.ts index 08f14ce..eb08936 100644 --- a/plugins/trace-codex/src/braintrust/logger.ts +++ b/plugins/trace-codex/src/braintrust/logger.ts @@ -108,6 +108,16 @@ function detectEnvironment( if (env.CI) return { type: "ci", name: "ci" }; if (env.VERCEL) return { type: "server", name: "vercel" }; if (env.NETLIFY) return { type: "server", name: "netlify" }; + if ( + env.ECS_CONTAINER_METADATA_URI || + env.ECS_CONTAINER_METADATA_URI_V4 || + env.AWS_EXECUTION_ENV?.startsWith("AWS_ECS_") + ) { + return { type: "server", name: "ecs" }; + } + if (env.AWS_LAMBDA_FUNCTION_NAME || env.AWS_EXECUTION_ENV?.startsWith("AWS_Lambda_")) { + return { type: "server", name: "aws_lambda" }; + } if (env.NODE_ENV === "production" || env.NODE_ENV === "staging") { return { type: "server", name: env.NODE_ENV }; } From 194710d2b2141e305773cca5cd604f1f344e9dc3 Mon Sep 17 00:00:00 2001 From: Stephen Belanger Date: Wed, 15 Jul 2026 22:51:11 +0800 Subject: [PATCH 4/4] fix: preserve span origin environment name --- plugins/trace-codex/src/braintrust/logger.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/trace-codex/src/braintrust/logger.ts b/plugins/trace-codex/src/braintrust/logger.ts index eb08936..b2ba782 100644 --- a/plugins/trace-codex/src/braintrust/logger.ts +++ b/plugins/trace-codex/src/braintrust/logger.ts @@ -91,15 +91,16 @@ export interface ReportingConfig { additionalMetadata?: Record; } -type SpanOriginEnvironment = { type: string; name?: string }; +type SpanOriginEnvironment = { type?: string; name?: string }; function detectEnvironment( env: NodeJS.ProcessEnv = process.env, ): SpanOriginEnvironment | undefined { - if (env.BRAINTRUST_ENVIRONMENT_TYPE) { - return env.BRAINTRUST_ENVIRONMENT_NAME - ? { type: env.BRAINTRUST_ENVIRONMENT_TYPE, name: env.BRAINTRUST_ENVIRONMENT_NAME } - : { type: env.BRAINTRUST_ENVIRONMENT_TYPE }; + if (env.BRAINTRUST_ENVIRONMENT_TYPE || env.BRAINTRUST_ENVIRONMENT_NAME) { + return { + ...(env.BRAINTRUST_ENVIRONMENT_TYPE ? { type: env.BRAINTRUST_ENVIRONMENT_TYPE } : {}), + ...(env.BRAINTRUST_ENVIRONMENT_NAME ? { name: env.BRAINTRUST_ENVIRONMENT_NAME } : {}), + }; } if (env.GITHUB_ACTIONS) return { type: "ci", name: "github_actions" }; if (env.GITLAB_CI) return { type: "ci", name: "gitlab_ci" };