@devopsplaybook.io/otel-utils-fastify
Version:
Utility to simplify integration with Open Telemetry for Fastify API Server
59 lines (58 loc) • 2.58 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.StandardTracerFastifyRegisterHooks = StandardTracerFastifyRegisterHooks;
exports.OTelRequestSpan = OTelRequestSpan;
const api_1 = require("@opentelemetry/api");
const core_1 = require("@opentelemetry/core");
const sdk_node_1 = require("@opentelemetry/sdk-node");
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
const propagator = new core_1.W3CTraceContextPropagator();
function StandardTracerFastifyRegisterHooks(fastify, standardTracer, standardLogger, options) {
const logger = standardLogger.createModuleLogger("Fastify");
fastify.addHook("onRequest", async (req) => {
var _a;
if (req.method === "OPTIONS" ||
!req.url.startsWith((options === null || options === void 0 ? void 0 : options.rootApiPath) || "/api")) {
return;
}
const spanName = `${req.method}-${req.url.split("?")[0]}`;
if ((_a = options === null || options === void 0 ? void 0 : options.ignoreList) === null || _a === void 0 ? void 0 : _a.includes(spanName)) {
return;
}
const callerContext = propagator.extract(api_1.ROOT_CONTEXT, req.headers, api_1.defaultTextMapGetter);
sdk_node_1.api.context.with(callerContext, () => {
const span = standardTracer.startSpan(spanName);
span.setAttribute(semantic_conventions_1.ATTR_HTTP_REQUEST_METHOD, req.method);
span.setAttribute(semantic_conventions_1.ATTR_URL_PATH, req.url);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
req.tracerSpanApi = span;
});
});
fastify.addHook("onResponse", async (req, reply) => {
const span = OTelRequestSpan(req);
if (!span) {
return;
}
if (reply.statusCode > 299) {
span.status.code = api_1.SpanStatusCode.ERROR;
}
else {
span.status.code = api_1.SpanStatusCode.OK;
}
span.setAttribute(semantic_conventions_1.ATTR_HTTP_RESPONSE_STATUS_CODE, reply.statusCode);
span.end();
});
fastify.addHook("onError", async (req, reply, error) => {
const span = OTelRequestSpan(req);
if (!span) {
return;
}
span.status.code = api_1.SpanStatusCode.ERROR;
span.recordException(error);
logger.error(error.message, error, span);
});
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function OTelRequestSpan(req) {
return req.tracerSpanApi;
}
;