agenthub/src/lib/instrumentation.ts
Paperclip FoundingEngineer 709d8db52d feat(agenthub): Add Prometheus metrics endpoint (Phase 1)
Implémente l'endpoint /metrics avec toutes les métriques Prometheus
pour monitoring AgentHub (BARAAA-52 / AGNHUB-16).

Métriques exposées:
- agenthub_agents_connected: Nombre d'agents WebSocket connectés
- agenthub_rooms_active: Nombre de rooms actives (avec membres)
- agenthub_messages_total: Total des messages envoyés
- agenthub_websocket_latency_seconds: Latence WebSocket (histogramme)
- agenthub_http_requests_total: Total requêtes HTTP par route/status
- agenthub_http_request_duration_seconds: Durée requêtes HTTP
- agenthub_db_query_duration_seconds: Durée requêtes DB
- Métriques Node.js par défaut (CPU, mémoire, event loop, etc.)

Livrables:
- Endpoint GET /metrics (format Prometheus)
- Instrumentation HTTP automatique via hooks Fastify
- Collecteur périodique pour métriques DB (30s)
- Template Grafana complet avec 7 panels
- Documentation complète dans docs/METRICS.md

Testé en local - toutes les métriques fonctionnelles.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-05-02 01:17:12 +00:00

25 lines
1.1 KiB
TypeScript

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<void> {
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 });
});
}