diff --git a/packages/opentelemetry-core/src/context/propagation/B3Format.ts b/packages/opentelemetry-core/src/context/propagation/B3Format.ts index 916eeb985a..fe8ed5f1cb 100644 --- a/packages/opentelemetry-core/src/context/propagation/B3Format.ts +++ b/packages/opentelemetry-core/src/context/propagation/B3Format.ts @@ -76,6 +76,7 @@ export class B3Format implements HttpTextFormat { return { traceId, spanId, + isRemote: true, traceFlags: isNaN(Number(options)) ? TraceFlags.UNSAMPLED : Number(options), diff --git a/packages/opentelemetry-core/src/context/propagation/BinaryTraceContext.ts b/packages/opentelemetry-core/src/context/propagation/BinaryTraceContext.ts index 628bc5eca7..6d44ca7894 100644 --- a/packages/opentelemetry-core/src/context/propagation/BinaryTraceContext.ts +++ b/packages/opentelemetry-core/src/context/propagation/BinaryTraceContext.ts @@ -86,6 +86,9 @@ export class BinaryTraceContext implements BinaryFormat { ) { return null; } + + result.isRemote = true; + // See serializeSpanContext for byte offsets. result.traceId = toHex(buf.slice(TRACE_ID_OFFSET, SPAN_ID_FIELD_ID_OFFSET)); result.spanId = toHex( diff --git a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts index a0d45e5196..f964f2273e 100644 --- a/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts +++ b/packages/opentelemetry-core/src/context/propagation/HttpTraceContext.ts @@ -90,6 +90,8 @@ export class HttpTraceContext implements HttpTextFormat { const spanContext = parse(traceParent); if (!spanContext) return null; + spanContext.isRemote = true; + const traceStateHeader = carrier[TRACE_STATE_HEADER]; if (traceStateHeader) { // If more than one `tracestate` header is found, we merge them into a diff --git a/packages/opentelemetry-core/test/context/B3Format.test.ts b/packages/opentelemetry-core/test/context/B3Format.test.ts index 456a8ba443..cc1113e93c 100644 --- a/packages/opentelemetry-core/test/context/B3Format.test.ts +++ b/packages/opentelemetry-core/test/context/B3Format.test.ts @@ -55,6 +55,7 @@ describe('B3Format', () => { spanId: '6e0c63257de34c92', traceFlags: TraceFlags.UNSAMPLED, traceState: new TraceState('foo=bar,baz=qux'), + isRemote: false, }; b3Format.inject(spanContext, 'B3Format', carrier); @@ -101,6 +102,7 @@ describe('B3Format', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.UNSAMPLED, }); }); @@ -114,6 +116,7 @@ describe('B3Format', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.SAMPLED, }); }); @@ -127,6 +130,7 @@ describe('B3Format', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.SAMPLED, }); }); @@ -140,6 +144,7 @@ describe('B3Format', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.UNSAMPLED, }); }); @@ -173,6 +178,7 @@ describe('B3Format', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.SAMPLED, }); }); diff --git a/packages/opentelemetry-core/test/context/BinaryTraceContext.test.ts b/packages/opentelemetry-core/test/context/BinaryTraceContext.test.ts index 692f98b6b7..fae99249a8 100644 --- a/packages/opentelemetry-core/test/context/BinaryTraceContext.test.ts +++ b/packages/opentelemetry-core/test/context/BinaryTraceContext.test.ts @@ -134,7 +134,7 @@ describe('BinaryTraceContext', () => { binaryTraceContext.fromBytes(testCase.binary), testCase.structured && Object.assign( - { traceFlags: TraceFlags.UNSAMPLED }, + { isRemote: true, traceFlags: TraceFlags.UNSAMPLED }, testCase.structured ) ); diff --git a/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts b/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts index fb16ef1507..4d212b2f85 100644 --- a/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts +++ b/packages/opentelemetry-core/test/context/HttpTraceContext.test.ts @@ -76,6 +76,7 @@ describe('HttpTraceContext', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.SAMPLED, }); }); @@ -106,6 +107,7 @@ describe('HttpTraceContext', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.SAMPLED, }); }); @@ -139,6 +141,7 @@ describe('HttpTraceContext', () => { assert.deepStrictEqual(extractedSpanContext, { spanId: 'b7ad6b7169203331', traceId: '0af7651916cd43dd8448eb211c80319c', + isRemote: true, traceFlags: TraceFlags.SAMPLED, traceState: new TraceState('foo=bar,baz=qux,quux=quuz'), }); diff --git a/packages/opentelemetry-types/src/trace/span_context.ts b/packages/opentelemetry-types/src/trace/span_context.ts index 11bdca3f78..ad793f7c6f 100644 --- a/packages/opentelemetry-types/src/trace/span_context.ts +++ b/packages/opentelemetry-types/src/trace/span_context.ts @@ -35,6 +35,10 @@ export interface SpanContext { * lowercase hex characters corresponding to 64 bits. */ spanId: string; + /** + * Only true if the SpanContext was propagated from a remote parent. + */ + isRemote?: boolean; /** * Trace flags to propagate. *