@lokalise/fastify-extras
Version:
Opinionated set of fastify plugins, commonly used in Lokalise
61 lines • 1.96 kB
JavaScript
import fastify from 'fastify';
import fastifyMetrics from 'fastify-metrics';
import fp from 'fastify-plugin';
const METRICS_PORT = 9080;
function plugin(app, opts, done) {
// @ts-expect-error fixme
void app.register(fastifyMetrics, {
defaultMetrics: { enabled: true },
endpoint: null,
clearRegisterOnInit: true,
name: 'metrics',
routeMetrics: { enabled: true },
});
try {
const promServer = fastify({
loggerInstance: opts.logger ? opts.logger : undefined,
logger: opts.logger === false ? false : undefined,
disableRequestLogging: opts.disablePrometheusRequestLogging ?? true,
});
promServer.route({
url: '/metrics',
method: 'GET',
logLevel: 'info',
schema: {
// hide route from swagger plugins
hide: true,
},
handler: async (_, reply) => {
const metrics = await app.metrics.client.register.metrics();
return reply.type('text/plain').send(metrics);
},
});
app.addHook('onClose', async () => {
await promServer.close();
});
promServer
.listen({
port: METRICS_PORT,
host: opts.bindAddress,
listenTextResolver: (address) => {
return `Prometheus metrics server listening at ${address}`;
},
})
.then(() => {
done();
})
.catch((err) => {
const logObject = opts.errorObjectResolver(err);
promServer.log.error(logObject);
done(new Error('Critical error when trying to launch metrics server'));
});
}
catch (err) {
done(err);
}
}
export const metricsPlugin = fp(plugin, {
fastify: '5.x',
name: 'metrics-plugin',
});
//# sourceMappingURL=metricsPlugin.js.map