@creditkarma/thrift-client-zipkin-filter
Version:
Zipkin tracing for thrift-client
80 lines • 3.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThriftClientZipkinFilter = void 0;
const zipkin_1 = require("zipkin");
const thrift_server_core_1 = require("@creditkarma/thrift-server-core");
const zipkin_core_1 = require("@creditkarma/zipkin-core");
function applyL5DHeaders(requestHeaders, headers) {
if ((0, zipkin_core_1.hasL5DHeader)(requestHeaders)) {
return (0, zipkin_core_1.addL5Dheaders)(headers);
}
else {
return headers;
}
}
function readRequestContext(requestHeaders, tracer, logger) {
if ((0, zipkin_core_1.containsZipkinHeaders)(requestHeaders)) {
return {
traceId: (0, zipkin_core_1.traceIdForHeaders)(requestHeaders),
headers: requestHeaders,
logger,
};
}
else {
const rootId = tracer.createRootId();
return {
traceId: {
traceId: rootId.traceId,
spanId: rootId.spanId,
parentId: rootId.parentId,
sampled: rootId.sampled.getOrElse(false),
},
headers: {},
logger,
};
}
}
function readRequestHeaders(request) {
if (request.context && request.context.headers) {
return request.context.headers;
}
else {
return {};
}
}
function ThriftClientZipkinFilter({ localServiceName, remoteServiceName, tracerConfig = {}, }) {
const serviceName = remoteServiceName || localServiceName;
const tracer = (0, zipkin_core_1.getTracerForService)(serviceName, tracerConfig);
const instrumentation = new zipkin_1.Instrumentation.HttpClient({
tracer,
serviceName: localServiceName,
remoteServiceName,
});
return {
methods: [],
handler(request, next) {
const requestHeaders = readRequestHeaders(request);
const requestContext = readRequestContext(requestHeaders, tracer, tracerConfig.logger);
if (requestContext.traceId !== undefined) {
tracer.setId((0, zipkin_core_1.traceIdFromTraceId)(requestContext.traceId));
return tracer.scoped(() => {
const updatedHeaders = instrumentation.recordRequest({ headers: {} }, (0, thrift_server_core_1.formatUrl)(request.uri), request.methodName || '').headers;
const traceId = tracer.id;
const withLD5Headers = applyL5DHeaders(requestHeaders, updatedHeaders);
return next(request.data, { headers: withLD5Headers }).then((res) => {
instrumentation.recordResponse(traceId, `${res.statusCode}`);
return res;
}, (err) => {
instrumentation.recordError(traceId, err);
return Promise.reject(err);
});
});
}
else {
return next();
}
},
};
}
exports.ThriftClientZipkinFilter = ThriftClientZipkinFilter;
//# sourceMappingURL=ThriftClientZipkinFilter.js.map