diff --git a/.changeset/brown-pots-beg.md b/.changeset/brown-pots-beg.md new file mode 100644 index 0000000000..2ac54b76f1 --- /dev/null +++ b/.changeset/brown-pots-beg.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +fix(otel): exported logs and spans will now have matching trace IDs diff --git a/packages/core/src/v3/otel/tracingSDK.ts b/packages/core/src/v3/otel/tracingSDK.ts index 9bfd098ffd..694212f71b 100644 --- a/packages/core/src/v3/otel/tracingSDK.ts +++ b/packages/core/src/v3/otel/tracingSDK.ts @@ -314,7 +314,9 @@ class ExternalSpanExporterWrapper { | { traceId: string; spanId: string; traceFlags: number; tracestate?: string } | undefined ) { - this._isExternallySampled = isTraceFlagSampled(externalTraceContext?.traceFlags); + this._isExternallySampled = externalTraceContext + ? isTraceFlagSampled(externalTraceContext.traceFlags) + : !!externalTraceId; } private transformSpan(span: ReadableSpan): ReadableSpan | undefined { @@ -396,7 +398,9 @@ class ExternalLogRecordExporterWrapper { | { traceId: string; spanId: string; tracestate?: string; traceFlags: number } | undefined ) { - this._isExternallySampled = isTraceFlagSampled(externalTraceContext?.traceFlags); + this._isExternallySampled = externalTraceContext + ? isTraceFlagSampled(externalTraceContext.traceFlags) + : !!externalTraceId; } export(logs: any[], resultCallback: (result: any) => void): void { @@ -416,16 +420,17 @@ class ExternalLogRecordExporterWrapper { } transformLogRecord(logRecord: ReadableLogRecord): ReadableLogRecord { - // If there's no spanContext, or if the externalTraceId is not set, return the original logRecord. - if (!logRecord.spanContext || !this.externalTraceId || !this.externalTraceContext) { - return logRecord; - } - // Capture externalTraceId for use within the proxy's scope. + // Use externalTraceContext.traceId if available, otherwise fall back to generated externalTraceId const externalTraceId = this.externalTraceContext ? this.externalTraceContext.traceId : this.externalTraceId; + // If there's no spanContext, or if the externalTraceId is not set, return the original logRecord. + if (!logRecord.spanContext || !externalTraceId) { + return logRecord; + } + return new Proxy(logRecord, { get(target, prop, receiver) { if (prop === "spanContext") {