import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify'; import { httpRequestDurationHistogram, httpRequestsCounter } from './metrics.js'; /** * Register HTTP request instrumentation for Prometheus metrics */ export async function registerInstrumentation(app: FastifyInstance): Promise { app.addHook('onRequest', async (request: FastifyRequest, _reply: FastifyReply) => { (request as any).startTime = performance.now(); }); app.addHook('onResponse', async (request: FastifyRequest, reply: FastifyReply) => { const startTime = (request as any).startTime; if (startTime === undefined) return; const duration = (performance.now() - startTime) / 1000; // Convert to seconds const method = request.method; const route = request.routeOptions?.url || request.url.split('?')[0] || 'unknown'; const statusCode = reply.statusCode.toString(); // Record metrics httpRequestDurationHistogram.observe({ method, route, status_code: statusCode }, duration); httpRequestsCounter.inc({ method, route, status_code: statusCode }); }); }