import { Request, Response } from 'express'; import { getAllMetrics, resetMetrics } from '../utils/metrics.js'; import { getLogger } from '../utils/logging.js'; const logger = getLogger(); /** * Get metrics endpoint handler */ export function getMetricsHandler(req: Request, res: Response): void { try { const metrics = getAllMetrics(); // Respond with metrics in requested format const format = req.query.format as string; if (format === 'text') { // Simple text format for metrics let text = ''; // Counters for (const [key, value] of Object.entries(metrics.counters)) { text += `# COUNTER\n${key} ${value}\n`; } // Gauges for (const [key, value] of Object.entries(metrics.gauges)) { text += `# GAUGE\n${key} ${value}\n`; } // Histograms for (const [key, data] of Object.entries(metrics.histograms)) { text += '# HISTOGRAM\n'; // Check if data is an object before using Object.entries if (data && typeof data === 'object') { for (const [stat, value] of Object.entries(data as Record)) { text += `${key}.${stat} ${value}\n`; } } } res.setHeader('Content-Type', 'text/plain'); res.send(text); } else { // Default to JSON format res.json(metrics); } logger.debug('Metrics endpoint called', { clientIp: req.ip, userAgent: req.headers['user-agent'] }); } catch (error) { logger.error('Error in metrics endpoint', { error }); res.status(500).json({ error: 'Failed to retrieve metrics' }); } } /** * Reset metrics endpoint handler */ export function resetMetricsHandler(req: Request, res: Response): void { try { resetMetrics(); logger.info('Metrics reset', { clientIp: req.ip }); res.json({ success: true, message: 'Metrics reset successful' }); } catch (error) { logger.error('Error resetting metrics', { error }); res.status(500).json({ error: 'Failed to reset metrics' }); } }