211 lines
6.0 KiB
TypeScript
211 lines
6.0 KiB
TypeScript
/*!
|
|
* Copyright 2020, OpenTelemetry Authors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* https://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import {
|
|
Context,
|
|
defaultGetter,
|
|
defaultSetter,
|
|
SpanContext,
|
|
TraceFlags,
|
|
} from '@opentelemetry/api';
|
|
import {
|
|
getExtractedSpanContext,
|
|
setExtractedSpanContext,
|
|
} from '@opentelemetry/core';
|
|
import * as assert from 'assert';
|
|
import {
|
|
JaegerHttpTracePropagator,
|
|
UBER_TRACE_ID_HEADER,
|
|
} from '../src/JaegerHttpTracePropagator';
|
|
|
|
describe('JaegerHttpTracePropagator', () => {
|
|
const jaegerHttpTracePropagator = new JaegerHttpTracePropagator();
|
|
const customHeader = 'new-header';
|
|
const customJaegerHttpTracePropagator = new JaegerHttpTracePropagator(
|
|
customHeader
|
|
);
|
|
let carrier: { [key: string]: unknown };
|
|
|
|
beforeEach(() => {
|
|
carrier = {};
|
|
});
|
|
|
|
describe('.inject()', () => {
|
|
it('should set uber trace id header', () => {
|
|
const spanContext: SpanContext = {
|
|
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
|
|
spanId: '6e0c63257de34c92',
|
|
traceFlags: TraceFlags.SAMPLED,
|
|
};
|
|
|
|
jaegerHttpTracePropagator.inject(
|
|
setExtractedSpanContext(Context.ROOT_CONTEXT, spanContext),
|
|
carrier,
|
|
defaultSetter
|
|
);
|
|
assert.deepStrictEqual(
|
|
carrier[UBER_TRACE_ID_HEADER],
|
|
'd4cda95b652f4a1592b449d5929fda1b:6e0c63257de34c92:0:01'
|
|
);
|
|
});
|
|
|
|
it('should use custom header if provided', () => {
|
|
const spanContext: SpanContext = {
|
|
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
|
|
spanId: '6e0c63257de34c92',
|
|
traceFlags: TraceFlags.SAMPLED,
|
|
};
|
|
|
|
customJaegerHttpTracePropagator.inject(
|
|
setExtractedSpanContext(Context.ROOT_CONTEXT, spanContext),
|
|
carrier,
|
|
defaultSetter
|
|
);
|
|
assert.deepStrictEqual(
|
|
carrier[customHeader],
|
|
'd4cda95b652f4a1592b449d5929fda1b:6e0c63257de34c92:0:01'
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('.extract()', () => {
|
|
it('should extract context of a sampled span from carrier', () => {
|
|
carrier[UBER_TRACE_ID_HEADER] =
|
|
'd4cda95b652f4a1592b449d5929fda1b:6e0c63257de34c92:0:01';
|
|
const extractedSpanContext = getExtractedSpanContext(
|
|
jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
defaultGetter
|
|
)
|
|
);
|
|
|
|
assert.deepStrictEqual(extractedSpanContext, {
|
|
spanId: '6e0c63257de34c92',
|
|
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
|
|
isRemote: true,
|
|
traceFlags: TraceFlags.SAMPLED,
|
|
});
|
|
});
|
|
|
|
it('should extract context of a sampled span from carrier with 1 bit flag', () => {
|
|
carrier[UBER_TRACE_ID_HEADER] =
|
|
'9c41e35aeb6d1272:45fd2a9709dadcf1:a13699e3fb724f40:1';
|
|
const extractedSpanContext = getExtractedSpanContext(
|
|
jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
defaultGetter
|
|
)
|
|
);
|
|
|
|
assert.deepStrictEqual(extractedSpanContext, {
|
|
spanId: '45fd2a9709dadcf1',
|
|
traceId: '9c41e35aeb6d1272',
|
|
isRemote: true,
|
|
traceFlags: TraceFlags.SAMPLED,
|
|
});
|
|
});
|
|
|
|
it('should extract context of a sampled span from UTF-8 encoded carrier', () => {
|
|
carrier[UBER_TRACE_ID_HEADER] =
|
|
'ac1f3dc3c2c0b06e%3A5ac292c4a11a163e%3Ac086aaa825821068%3A1';
|
|
const extractedSpanContext = getExtractedSpanContext(
|
|
jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
defaultGetter
|
|
)
|
|
);
|
|
|
|
assert.deepStrictEqual(extractedSpanContext, {
|
|
spanId: '5ac292c4a11a163e',
|
|
traceId: 'ac1f3dc3c2c0b06e',
|
|
isRemote: true,
|
|
traceFlags: TraceFlags.SAMPLED,
|
|
});
|
|
});
|
|
|
|
it('should use custom header if provided', () => {
|
|
carrier[customHeader] =
|
|
'd4cda95b652f4a1592b449d5929fda1b:6e0c63257de34c92:0:01';
|
|
const extractedSpanContext = getExtractedSpanContext(
|
|
customJaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
defaultGetter
|
|
)
|
|
);
|
|
|
|
assert.deepStrictEqual(extractedSpanContext, {
|
|
spanId: '6e0c63257de34c92',
|
|
traceId: 'd4cda95b652f4a1592b449d5929fda1b',
|
|
isRemote: true,
|
|
traceFlags: TraceFlags.SAMPLED,
|
|
});
|
|
});
|
|
|
|
it('returns undefined if UBER_TRACE_ID_HEADER header is missing', () => {
|
|
assert.deepStrictEqual(
|
|
getExtractedSpanContext(
|
|
jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
defaultGetter
|
|
)
|
|
),
|
|
undefined
|
|
);
|
|
});
|
|
|
|
it('returns undefined if UBER_TRACE_ID_HEADER header is invalid', () => {
|
|
carrier[UBER_TRACE_ID_HEADER] = 'invalid!';
|
|
assert.deepStrictEqual(
|
|
getExtractedSpanContext(
|
|
jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
defaultGetter
|
|
)
|
|
),
|
|
undefined
|
|
);
|
|
});
|
|
});
|
|
|
|
it('should fail gracefully on bad responses from getter', () => {
|
|
const ctx1 = jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
(c, k) => 1 // not a number
|
|
);
|
|
const ctx2 = jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
(c, k) => [] // empty array
|
|
);
|
|
const ctx3 = jaegerHttpTracePropagator.extract(
|
|
Context.ROOT_CONTEXT,
|
|
carrier,
|
|
(c, k) => undefined // missing value
|
|
);
|
|
|
|
assert.ok(ctx1 === Context.ROOT_CONTEXT);
|
|
assert.ok(ctx2 === Context.ROOT_CONTEXT);
|
|
assert.ok(ctx3 === Context.ROOT_CONTEXT);
|
|
});
|
|
});
|