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>
25 lines
1.1 KiB
TypeScript
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 });
|
|
});
|
|
}
|