UNPKG

@devopsplaybook.io/otel-utils-fastify

Version:

Utility to simplify integration with Open Telemetry for Fastify API Server

59 lines (58 loc) 2.58 kB
"use strict"; 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; }