UNPKG

8.52 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.Tracer = void 0;
7const EventMessage_1 = require("./model/EventMessage");
8const Span_1 = require("./Span");
9const util_1 = __importDefault(require("./lib/util"));
10const config_1 = __importDefault(require("./lib/config"));
11const _ = require('lodash');
12const TraceParent = require('traceparent');
13/**
14 * Describes Event SDK methods from Tracer perspective
15 */
16class ATracer {
17 static createSpan;
18 static createChildSpanFromContext;
19 static injectContextToMessage;
20 static injectContextToHttpRequest;
21 static extractContextFromMessage;
22 static extractContextFromHttpRequest;
23}
24class Tracer {
25 /**
26 * Creates new span from new trace
27 * @param service name of the service which will be asociated with the newly created span
28 * @param tags optional tags for the span
29 * @param recorders optional recorders. Defaults to defaultRecorder, which is either logger or sidecar client, based on default.json DISABLE_SIDECAR value
30 * @param defaultTagsSetter optional default tags setter method.
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 * Creates new child span from context with new service name
38 * @param service the name of the service of the new child span
39 * @param spanContext context of the previous span
40 * @param recorders optional recorders. Defaults to defaultRecorder, which is either logger or sidecar client, based on default.json DISABLE_SIDECAR value
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 * Injects trace context into a carrier with optional path.
87 * @param context span context to be injected
88 * @param carrier any kind of message or other object with keys of type String.
89 * @param injectOptions type and path of the carrier. Type is not implemented yet. Path is the path to the trace context.
90 */
91 static injectContextToMessage(context, carrier, injectOptions = {}) {
92 let result = _.cloneDeep(carrier);
93 let { path } = injectOptions; // type not implemented yet
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 * Injects trace context into a http request headers.
107 * @param context span context to be injected
108 * @param request HTTP request.
109 * @param type type of the headers that will be created - 'w3c' or 'xb3'.
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 * Extracts trace context from a carrier (ex: kafka message, event message, metadata, trace)
118 * with optional path for the trace context to be extracted.
119 * @param carrier any kind of message or other object with keys of type String.
120 * @param extractOptions type and path of the carrier. Type is not implemented yet. Path is the path to the trace context.
121 */
122 static extractContextFromMessage(carrier, extractOptions = {}) {
123 let spanContext;
124 let { path } = extractOptions; // type not implemented yet
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}
179exports.Tracer = Tracer;
180//# sourceMappingURL=Tracer.js.map
\No newline at end of file