import http from 'http'; import * as client from 'prom-client'; import config from 'lib/Config'; import { Log } from 'lib/Log'; const log = Log.child({ method: 'Metrics', }); /** Register default node metrics to collect */ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access client.collectDefaultMetrics({}); /** Spawn a server to handle metrics requests */ const server = http.createServer((req, res) => { log.trace('Fetch metrics'); // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access client.register .metrics() .then((metrics: string) => { res .writeHead(200, { 'Content-Length': Buffer.byteLength(metrics), 'Content-Type': 'text/plain', }) .end(metrics); }) .catch((err: Error) => { log.error('Failed to resolve metrics', err); res .writeHead(500, { 'Content-Type': 'text/plain', }) .end(); }); }); // Only listen to internal requests if (config.metrics.enabled) { const { host, port } = config.metrics; const hostname = `${host}:${port}`; log.info('Registering metrics server %s (env: %s) @ %s', config.app.name, config.env, hostname); server.listen(+port, host, () => { log.info('Metrics for %s (env: %s) started @ %s', config.app.name, config.env, hostname); }); } else log.info('Metrics disabled for this service'); export default client;