1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | exports.Tracer = void 0;
|
7 | const EventMessage_1 = require("./model/EventMessage");
|
8 | const Span_1 = require("./Span");
|
9 | const util_1 = __importDefault(require("./lib/util"));
|
10 | const config_1 = __importDefault(require("./lib/config"));
|
11 | const _ = require('lodash');
|
12 | const TraceParent = require('traceparent');
|
13 |
|
14 |
|
15 |
|
16 | class ATracer {
|
17 | static createSpan;
|
18 | static createChildSpanFromContext;
|
19 | static injectContextToMessage;
|
20 | static injectContextToHttpRequest;
|
21 | static extractContextFromMessage;
|
22 | static extractContextFromHttpRequest;
|
23 | }
|
24 | class Tracer {
|
25 | |
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | static createSpan(service, tags, recorders, defaultTagsSetter) {
|
33 | ``;
|
34 | return new Span_1.Span(new EventMessage_1.EventTraceMetadata({ service, tags }), recorders, defaultTagsSetter);
|
35 | }
|
36 | |
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 | static createChildSpanFromContext(service, spanContext, recorders) {
|
43 | let resultContext;
|
44 | if (!!config_1.default.EVENT_LOGGER_TRACESTATE_HEADER_ENABLED) {
|
45 | resultContext = { ...spanContext, ...{ parentSpanId: undefined } };
|
46 | }
|
47 | else {
|
48 | resultContext = { ...spanContext, ...{ parentSpanId: spanContext.spanId } };
|
49 | }
|
50 | if (!!spanContext.tags && !!spanContext.tags.tracestate) {
|
51 | const tracestateDecoded = (!!spanContext.tags.tracestate && spanContext.tags.tracestate.includes(config_1.default.EVENT_LOGGER_VENDOR_PREFIX)) ? util_1.default.tracestateDecoder(config_1.default.EVENT_LOGGER_VENDOR_PREFIX, spanContext.tags.tracestate) : undefined;
|
52 | const parentId = (!!tracestateDecoded && !!tracestateDecoded.parentId) ? tracestateDecoded.parentId : undefined;
|
53 | resultContext = (!!tracestateDecoded && tracestateDecoded.vendor === config_1.default.EVENT_LOGGER_VENDOR_PREFIX) ?
|
54 | {
|
55 | service,
|
56 | traceId: spanContext.traceId,
|
57 | spanId: spanContext.spanId,
|
58 | flags: spanContext.flags,
|
59 | sampled: spanContext.sampled,
|
60 | parentSpanId: parentId,
|
61 | tags: {
|
62 | ...spanContext.tags
|
63 | }
|
64 | } : ((!!config_1.default.EVENT_LOGGER_TRACEID_PER_VENDOR) ?
|
65 | { ...resultContext,
|
66 | ...{
|
67 | parentSpanId: undefined,
|
68 | traceId: undefined
|
69 | }
|
70 | } :
|
71 | { ...resultContext,
|
72 | ...{
|
73 | parentSpanId: undefined
|
74 | }
|
75 | });
|
76 | }
|
77 | let outputContext = Object.assign({}, resultContext, {
|
78 | service,
|
79 | spanId: undefined,
|
80 | startTimestamp: undefined,
|
81 | finishTimestamp: undefined
|
82 | });
|
83 | return new Span_1.Span(new EventMessage_1.EventTraceMetadata(outputContext), recorders);
|
84 | }
|
85 | |
86 |
|
87 |
|
88 |
|
89 |
|
90 |
|
91 | static injectContextToMessage(context, carrier, injectOptions = {}) {
|
92 | let result = _.cloneDeep(carrier);
|
93 | let { path } = injectOptions;
|
94 | if (carrier instanceof EventMessage_1.EventMessage || (('metadata' in carrier)))
|
95 | path = 'metadata';
|
96 | else if (carrier instanceof EventMessage_1.EventTraceMetadata)
|
97 | return Promise.resolve(context);
|
98 | if (!path) {
|
99 | Object.assign(result, { trace: context });
|
100 | }
|
101 | else
|
102 | _.merge(_.get(result, path), { trace: context });
|
103 | return result;
|
104 | }
|
105 | |
106 |
|
107 |
|
108 |
|
109 |
|
110 |
|
111 | static injectContextToHttpRequest(context, request, type = EventMessage_1.HttpRequestOptions.w3c) {
|
112 | let result = _.cloneDeep(request);
|
113 | result.headers = (0, Span_1.setHttpHeader)(context, type, result.headers);
|
114 | return result;
|
115 | }
|
116 | |
117 |
|
118 |
|
119 |
|
120 |
|
121 |
|
122 | static extractContextFromMessage(carrier, extractOptions = {}) {
|
123 | let spanContext;
|
124 | let { path } = extractOptions;
|
125 | if (carrier instanceof EventMessage_1.EventMessage || (('metadata' in carrier) && 'trace' in carrier.metadata)) {
|
126 | path = 'metadata.trace';
|
127 | }
|
128 | else if ('trace' in carrier) {
|
129 | path = 'trace';
|
130 | }
|
131 | spanContext = new EventMessage_1.EventTraceMetadata(_.get(carrier, path, carrier));
|
132 | return spanContext;
|
133 | }
|
134 | static extractContextFromHttpRequest(request, type = EventMessage_1.HttpRequestOptions.w3c) {
|
135 | let spanContext;
|
136 | switch (type) {
|
137 | case EventMessage_1.HttpRequestOptions.xb3: {
|
138 | let result = {};
|
139 | const requestHasXB3headers = !!request.headers && Object.keys(request.headers).some(key => !!key.toLowerCase().match(/x-b3-/));
|
140 | if (!requestHasXB3headers) {
|
141 | return undefined;
|
142 | }
|
143 | for (let [key, value] of Object.entries(request.headers)) {
|
144 | let keyLowerCase = key.toLowerCase();
|
145 | if (keyLowerCase.startsWith('x-b3-')) {
|
146 | let resultKey = key.replace('x-b3-', '');
|
147 | result[resultKey] = value;
|
148 | }
|
149 | }
|
150 | spanContext = new EventMessage_1.EventTraceMetadata(result);
|
151 | return spanContext;
|
152 | }
|
153 | case EventMessage_1.HttpRequestOptions.w3c:
|
154 | default: {
|
155 | if (!request.headers || !request.headers.traceparent) {
|
156 | return undefined;
|
157 | }
|
158 | const context = TraceParent.fromString(request.headers.traceparent);
|
159 | const sampled = context.flags ? context.flags & 0x01 : 0;
|
160 | spanContext = new EventMessage_1.EventTraceMetadata({
|
161 | traceId: context.traceId,
|
162 | spanId: context.id,
|
163 | flags: context.flags,
|
164 | sampled
|
165 | });
|
166 | const tracestates = request.headers.tracestate ? util_1.default.getTracestateMap(config_1.default.EVENT_LOGGER_VENDOR_PREFIX, request.headers.tracestate).tracestates : {};
|
167 | if (request.headers.tracestate || config_1.default.EVENT_LOGGER_TRACESTATE_HEADER_ENABLED) {
|
168 | spanContext = {
|
169 | ...spanContext,
|
170 | ...{ tracestates },
|
171 | ...{ tags: { tracestate: request.headers.tracestate } }
|
172 | };
|
173 | }
|
174 | return spanContext;
|
175 | }
|
176 | }
|
177 | }
|
178 | }
|
179 | exports.Tracer = Tracer;
|
180 |
|
\ | No newline at end of file |