Fastify 是一种快速、低开销且极具可扩展性的现代 Web 框架,它在很多方面都超越了 Express 和 Koa 等传统框架。在 Fastify 中,监控和日志记录是非常重要的一部分。保持监控和日志记录的良好实践有助于更好地理解应用程序的行为并有助于快速诊断和修复问题。在本文中,我将详细介绍 Fastify 中监控和日志记录的最佳实践,并提供示例代码和指导意义。
监控
在 Fastify 中,监控是一个非常重要的方面。它可以帮助您在应用程序中收集有关请求和响应的有用信息,并针对性地进行优化。以下是 Fastify 中监控的最佳实践:
1. 使用 metrics 插件
Fastify 提供了一个叫做 metrics 的插件,它非常适合用于监控。它可以为您的应用程序提供许多有用的指标,例如请求计数、响应时间分布、请求速率等等。
// javascriptcn.com 代码示例 const fastify = require('fastify')(); const metricsPlugin = require('fastify-metrics'); fastify.register(metricsPlugin, { endpoint: '/metrics' }); fastify.listen(3000, (err) => { if (err) throw err; console.log(`Listening on: ${fastify.server.address().port}`); });
2. 记录请求和响应
除了监控指标之外,记录请求和响应也是非常重要的。这可以帮助您了解应用程序的行为,以及快速诊断和修复问题。
// javascriptcn.com 代码示例 const fastify = require('fastify')(); fastify.addHook('onRequest', (request, reply, done) => { request.log.info({ req: { headers : request.headers, method : request.method, url : request.url } }); done(); }); fastify.addHook('onResponse', (request, reply, done) => { request.log.info({ res: { statusCode : reply.raw.statusCode, headers : reply.raw.getHeaders() } }); done(); }); fastify.get('/', (request, reply) => { reply.send({ hello: 'world' }); }); fastify.listen(3000, (err) => { if (err) throw err; console.log(`Listening on: ${fastify.server.address().port}`); });
3. 将监控指标发送到外部系统
将监控指标发送到外部系统,例如 Grafana、Datadog 等,可以让您更轻松地查看应用程序的运行状况并作出响应。
// javascriptcn.com 代码示例 const fastify = require('fastify')(); const metricsPlugin = require('fastify-metrics'); const prometheus = require('prom-client'); prometheus.collectDefaultMetrics({ prefix: 'fastify_demo_' }); fastify.register(metricsPlugin, { endpoint: '/metrics', metrics: { httpRequestDurationMs: new prometheus.Histogram({ name: 'http_request_duration_ms', help: 'Histogram of request duration in ms', buckets: [10, 50, 100, 200, 500, 1000, 2000, 5000] }), httpRequestCounter: new prometheus.Counter({ name: 'http_request_counter', help: 'Counter of all HTTP requests', labelNames: ['method', 'statusCode'] }) } }); fastify.addHook('onRequest', (request, reply, done) => { request.log.info({ req: { headers : request.headers, method : request.method, url : request.url } }); const start = process.hrtime(); reply.once('onSend', () => { const duration = process.hrtime(start); const ms = duration[0] * 1000 + duration[1] / 1e6; const statusCode = reply.raw.statusCode; const method = request.method; request.log.info({ res: { statusCode : statusCode, headers : reply.raw.getHeaders() } }); fastify.metrics.httpRequestDurationMs.observe( { method, statusCode }, ms ); fastify.metrics.httpRequestCounter.inc( { method, statusCode } ); }); done(); }); fastify.get('/', (request, reply) => { reply.send({ hello: 'world' }); }); fastify.listen(3000, (err) => { if (err) throw err; console.log(`Listening on: ${fastify.server.address().port}`); });
日志记录
良好的日志记录可以帮助您了解应用程序的运行状况,以及快速诊断和修复问题。以下是 Fastify 中日志记录的最佳实践:
1. 使用 Pino
Fastify 使用 Pino 作为其默认日志记录器,它是一个快速的非阻塞日志记录器,并可与 Structured Logging 一起使用。它还支持向外部系统发送日志,例如 Loggly、Splunk、Graylog 等等。
// javascriptcn.com 代码示例 const fastify = require('fastify')(); fastify.get('/', (request, reply) => { request.log.info('Hello World'); reply.send({ hello: 'world' }); }); fastify.listen(3000, (err) => { if (err) throw err; console.log(`Listening on: ${fastify.server.address().port}`); });
2. 结构化日志记录
结构化日志记录非常适合在大规模应用程序中使用。它可以帮助您更轻松地查看和分析日志,以及快速诊断和修复问题。
// javascriptcn.com 代码示例 const fastify = require('fastify')(); const pino = require('pino')(); fastify.addHook('onRequest', (request, reply, done) => { pino.info({ req: { headers : request.headers, method : request.method, url : request.url } }); done(); }); fastify.addHook('onResponse', (request, reply, done) => { pino.info({ res: { statusCode : reply.raw.statusCode, headers : reply.raw.getHeaders() } }); done(); }); fastify.get('/', (request, reply) => { request.log.info('Hello World'); reply.send({ hello: 'world' }); }); fastify.listen(3000, (err) => { if (err) throw err; console.log(`Listening on: ${fastify.server.address().port}`); });
3. 将日志发送到外部系统
将日志发送到外部系统,例如 Graylog、Loggly 等等,可以让您更轻松地查看和分析日志,并可以帮助您快速诊断和修复问题。
// javascriptcn.com 代码示例 const fastify = require('fastify')(); const pino = require('pino')(); const pinoGelf = require('pino-gelf'); fastify.addHook('onRequest', (request, reply, done) => { pino.info({ req: { headers : request.headers, method : request.method, url : request.url } }); done(); }); fastify.addHook('onResponse', (request, reply, done) => { pino.info({ res: { statusCode : reply.raw.statusCode, headers : reply.raw.getHeaders() } }); done(); }); fastify.get('/', (request, reply) => { request.log.info('Hello World'); reply.send({ hello: 'world' }); }); const pinogelf = pinoGelf({ // graylog server address host: 'localhost', // graylog server port port: 12201, // the name of the client hostname: 'fastify_demo', // additional fields to add to all log messages additionalFields: { app: 'fastify_demo' } }); pino.pipe(pinogelf); fastify.listen(3000, (err) => { if (err) throw err; console.log(`Listening on: ${fastify.server.address().port}`); });
总结
在本文中,我们介绍了 Fastify 中监控和日志记录的最佳实践,并提供了示例代码和指导意义。通过采用这些最佳实践,您可以更轻松地理解您的应用程序,并快速诊断和修复问题。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652df9027d4982a6ebf0f7df