From 19756471a629a6b9f083ab8c3c5c95495c3fbffb Mon Sep 17 00:00:00 2001 From: Julian Kaindl Date: Thu, 24 Oct 2019 18:24:49 +0200 Subject: [PATCH] feat: add IsRemote field to SpanContext, set by propagators (#451) * feat(opentelemetry-types): add isRemote field * fix(opentelemetry-core): set isRemote true when extracting * fix(opentelemetry-core): set isRemote on BinaryTraceContext * fix(opentelemetry-types): adjust isRemote comment Makes it more obvious when the flag changes and what the default value is. --- .../opentelemetry-core/src/context/propagation/B3Format.ts | 1 + .../src/context/propagation/BinaryTraceContext.ts | 3 +++ .../src/context/propagation/HttpTraceContext.ts | 2 ++ packages/opentelemetry-core/test/context/B3Format.test.ts | 6 ++++++ .../test/context/BinaryTraceContext.test.ts | 2 +- .../test/context/HttpTraceContext.test.ts | 3 +++ packages/opentelemetry-types/src/trace/span_context.ts | 4 ++++ 7 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/opentelemetry-core/src/context/propagation/B3Format.ts b/packages/opentelemetry-core/src/context/propagation/B3Format.ts index 916eeb985a1..fe8ed5f1cb2 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 628bc5eca74..6d44ca78946 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 a0d45e51965..f964f2273ef 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 456a8ba443f..cc1113e93c5 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 692f98b6b71..fae99249a8e 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 fb16ef15070..4d212b2f85c 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 11bdca3f781..ad793f7c6fa 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. *