diff --git a/.changeset/breezy-baboons-crash.md b/.changeset/breezy-baboons-crash.md new file mode 100644 index 000000000..b1ef06260 --- /dev/null +++ b/.changeset/breezy-baboons-crash.md @@ -0,0 +1,7 @@ +--- +"braintrust": patch +"@braintrust/openai-agents": patch +"@braintrust/temporal": patch +--- + +fix: Add span provenance for temporal and openai agents sdk diff --git a/integrations/openai-agents-js/src/index.ts b/integrations/openai-agents-js/src/index.ts index e40b95173..167660f5f 100644 --- a/integrations/openai-agents-js/src/index.ts +++ b/integrations/openai-agents-js/src/index.ts @@ -279,24 +279,20 @@ export class OpenAIAgentsTraceProcessor { // Detect parent span from current execution context let span: BraintrustSpan; const current = currentSpan(); + const spanArgs = { + name: trace.name, + type: SpanTypeAttribute.TASK, + [Symbol.for("braintrust.spanInstrumentationName")]: "openai-agents", + }; if (current && current !== NOOP_SPAN) { // Create as child of current span - span = current.startSpan({ - name: trace.name, - type: SpanTypeAttribute.TASK, - }); + span = current.startSpan(spanArgs); } else { // No parent span available, create as root span = this.logger - ? this.logger.startSpan({ - name: trace.name, - type: SpanTypeAttribute.TASK, - }) - : startSpan({ - name: trace.name, - type: SpanTypeAttribute.TASK, - }); + ? this.logger.startSpan(spanArgs) + : startSpan(spanArgs); } span.log({ @@ -620,6 +616,7 @@ export class OpenAIAgentsTraceProcessor { const childSpan = parentSpan.startSpan({ name: spanNameFromAgents(span), type: spanTypeFromAgents(span), + [Symbol.for("braintrust.spanInstrumentationName")]: "openai-agents", }); traceData.childSpans.set(span.spanId, childSpan); } diff --git a/integrations/temporal-js/src/interceptors.ts b/integrations/temporal-js/src/interceptors.ts index 70706872d..285230c59 100644 --- a/integrations/temporal-js/src/interceptors.ts +++ b/integrations/temporal-js/src/interceptors.ts @@ -151,6 +151,7 @@ class BraintrustActivityInterceptor implements ActivityInboundCallsInterceptor { } const span = braintrust.startSpan({ + [Symbol.for("braintrust.spanInstrumentationName")]: "temporal", name: `temporal.activity.${info.activityType}`, spanAttributes: { type: "task" }, parent, diff --git a/integrations/temporal-js/src/sinks.ts b/integrations/temporal-js/src/sinks.ts index bd2967ca4..5ae0099be 100644 --- a/integrations/temporal-js/src/sinks.ts +++ b/integrations/temporal-js/src/sinks.ts @@ -40,6 +40,7 @@ export function createBraintrustSinks(): InjectedSinks { workflowSpanId?: string, ) => { const span = braintrust.startSpan({ + [Symbol.for("braintrust.spanInstrumentationName")]: "temporal", name: `temporal.workflow.${info.workflowType}`, spanAttributes: { type: "task" }, parent: parentContext, diff --git a/js/src/span-origin.ts b/js/src/span-origin.ts index 0c1afb303..755fc43f5 100644 --- a/js/src/span-origin.ts +++ b/js/src/span-origin.ts @@ -41,6 +41,7 @@ export const INSTRUMENTATION_NAMES = { OPENROUTER_AGENT: "openrouter-agent", PI_CODING_AGENT: "pi-coding-agent", STRANDS_AGENT_SDK: "strands-agent-sdk", + TEMPORAL: "temporal", TYPESAFE: "typesafe", VOYAGEAI: "voyageai", ELEVENLABS: "elevenlabs",