import { Router, type Request, type Response } from 'express'; import { Gauge, register } from 'prom-client'; import type { StorageServiceInterface } from '../services/storageInterface.js'; import { logger } from '../lib/logger.js'; export function createMetricsRouter(storage: StorageServiceInterface): Router { const router = Router(); const gauge = new Gauge({ name: 'relay_storage_entries', help: 'Number of stored entries by kind', labelNames: ['kind'], }); /** * GET /metrics - Prometheus metrics. */ router.get('/', (_req: Request, res: Response): void => { void (async (): Promise => { try { const msgCount = storage.getMessages(0, Number.MAX_SAFE_INTEGER).length; gauge.set({ kind: 'messages' }, msgCount); gauge.set({ kind: 'signatures' }, storage.getSignatureCount()); gauge.set({ kind: 'keys' }, storage.getKeyCount()); gauge.set({ kind: 'seen_hashes' }, storage.getSeenHashCount()); res.set('Content-Type', register.contentType); res.send(await register.metrics()); } catch (err) { logger.error({ err }, 'Error generating metrics'); res.status(500).json({ error: 'Internal server error' }); } })(); }); return router; }