|
| 1 | +import { wrap, unwrap } from '../src/wrapper'; |
| 2 | + |
| 3 | +import { |
| 4 | + defaultTextMapGetter, |
| 5 | + ROOT_CONTEXT, |
| 6 | + TextMapPropagator, |
| 7 | + trace, |
| 8 | + TraceFlags, |
| 9 | +} from '@opentelemetry/api'; |
1 | 10 | import type { AwsSdkInstrumentationConfig } from '@opentelemetry/instrumentation-aws-sdk'; |
| 11 | +import { TRACE_PARENT_HEADER } from '@opentelemetry/core'; |
| 12 | +import { AWSXRAY_TRACE_ID_HEADER } from '@opentelemetry/propagator-aws-xray'; |
2 | 13 | import { SDKRegistrationConfig } from '@opentelemetry/sdk-trace-base'; |
3 | | -import { TextMapPropagator } from '@opentelemetry/api'; |
4 | | - |
5 | | -import { wrap, unwrap } from '../src/wrapper'; |
6 | 14 |
|
7 | 15 | import { stub } from 'sinon'; |
8 | 16 | import assert from 'assert'; |
@@ -69,6 +77,29 @@ describe('wrapper', () => { |
69 | 77 | assert.deepEqual(actualPropagatorFields, expectedPropagatorFields); |
70 | 78 | }; |
71 | 79 |
|
| 80 | + const setAndGetConfiguredPropagator = ( |
| 81 | + propagatorNames: string[], |
| 82 | + ): TextMapPropagator => { |
| 83 | + if (propagatorNames && propagatorNames.length) { |
| 84 | + process.env.OTEL_PROPAGATORS = propagatorNames.join(','); |
| 85 | + } |
| 86 | + |
| 87 | + const configureSdkRegistrationStub = stub().returnsArg(0); |
| 88 | + global.configureSdkRegistration = configureSdkRegistrationStub; |
| 89 | + wrap(); |
| 90 | + assert(configureSdkRegistrationStub.calledOnce); |
| 91 | + |
| 92 | + const sdkRegistrationConfig: SDKRegistrationConfig = |
| 93 | + configureSdkRegistrationStub.getCall(0).firstArg; |
| 94 | + assert.notEqual(sdkRegistrationConfig, null); |
| 95 | + |
| 96 | + const propagator: TextMapPropagator | null | undefined = |
| 97 | + sdkRegistrationConfig.propagator; |
| 98 | + assert.notEqual(propagator, null); |
| 99 | + |
| 100 | + return propagator!; |
| 101 | + }; |
| 102 | + |
72 | 103 | it('is configured by default', () => { |
73 | 104 | // by default, 'W3CTraceContextPropagator' and 'W3CBaggagePropagator' propagators are added. |
74 | 105 | // - 'traceparent' and 'tracestate' fields are used by the 'W3CTraceContextPropagator' |
@@ -100,5 +131,52 @@ describe('wrapper', () => { |
100 | 131 | // in case of unsupported propagator, warning log is printed and empty propagator array is returned |
101 | 132 | testConfiguredPropagator(['jaeger'], []); |
102 | 133 | }); |
| 134 | + |
| 135 | + it('is configured in correct order', () => { |
| 136 | + const W3C_TRACE_ID = '5b8aa5a2d2c872e8321cf37308d69df2'; |
| 137 | + const W3C_SPAN_ID = '051581bf3cb55c13'; |
| 138 | + const AWS_XRAY_TRACE_ID = '8a3c60f7-d188f8fa79d48a391a778fa6'; |
| 139 | + const AWS_XRAY_SPAN_ID = '53995c3f42cd8ad8'; |
| 140 | + const carrier = { |
| 141 | + [TRACE_PARENT_HEADER]: `00-${W3C_TRACE_ID}-${W3C_SPAN_ID}-01`, |
| 142 | + [AWSXRAY_TRACE_ID_HEADER]: `Root=1-${AWS_XRAY_TRACE_ID};Parent=${AWS_XRAY_SPAN_ID};Sampled=1`, |
| 143 | + }; |
| 144 | + |
| 145 | + const propagator1: TextMapPropagator = setAndGetConfiguredPropagator([ |
| 146 | + 'tracecontext', |
| 147 | + 'xray', |
| 148 | + ]); |
| 149 | + const extractedSpanContext1 = trace |
| 150 | + .getSpan( |
| 151 | + propagator1.extract(ROOT_CONTEXT, carrier, defaultTextMapGetter), |
| 152 | + ) |
| 153 | + ?.spanContext(); |
| 154 | + // Last one overwrites, so we will see the context extracted from the last propagator (xray) |
| 155 | + assert.deepStrictEqual(extractedSpanContext1, { |
| 156 | + traceId: AWS_XRAY_TRACE_ID.replace('-', ''), |
| 157 | + spanId: AWS_XRAY_SPAN_ID, |
| 158 | + isRemote: true, |
| 159 | + traceFlags: TraceFlags.SAMPLED, |
| 160 | + }); |
| 161 | + |
| 162 | + unwrap(); |
| 163 | + |
| 164 | + const propagator2: TextMapPropagator = setAndGetConfiguredPropagator([ |
| 165 | + 'xray', |
| 166 | + 'tracecontext', |
| 167 | + ]); |
| 168 | + const extractedSpanContext2 = trace |
| 169 | + .getSpan( |
| 170 | + propagator2.extract(ROOT_CONTEXT, carrier, defaultTextMapGetter), |
| 171 | + ) |
| 172 | + ?.spanContext(); |
| 173 | + // Last one overwrites, so we will see the context extracted from the last propagator (tracecontext) |
| 174 | + assert.deepStrictEqual(extractedSpanContext2, { |
| 175 | + traceId: W3C_TRACE_ID, |
| 176 | + spanId: W3C_SPAN_ID, |
| 177 | + isRemote: true, |
| 178 | + traceFlags: TraceFlags.SAMPLED, |
| 179 | + }); |
| 180 | + }); |
103 | 181 | }); |
104 | 182 | }); |
0 commit comments