使用AppSignal跟踪Fastify中的错误
作者:互联网
Fastify是Node.js的尖端网络框架,提供卓越的速度和效率。凭借其可扩展的插件系统,支持异步编程,并专注于极简主义,它是开发Node.js应用程序的后端开发人员的理想选择。
但即使是性能最强的Web应用程序,如果没有适当的工具,也会遇到难以调试的问题。
我们将探索如何将AppSignal用于Fastify应用程序。在本文结束时,您将完全有能力利用Fastify的潜力,使用AppSignal快速修复错误并识别性能瓶颈。
我们走吧!
开始使用Fastify和AppSignal
在我们深入安装之前,请确保您安装了Node和您喜欢的代码编辑器。理想情况下,您应该运行Node的最新LTS(在撰写本文时为v18),但如果您卡在早期版本上,最低要求是v10。
在您的终端中,移动到新目录,启动新项目,并将Fastify添加为依赖项:
cd my_project
npm init -y
npm install fastify
现在,您可以添加代码来设置一个非常简单的服务器。这有两条路由,一条返回响应,一条抛出错误。我打电话给我的app.js
:
const fastify = require("fastify")({
logger: true,
});
fastify.get("/", async (request, reply) => {
return { hello: "me" };
});
fastify.get("/error", async () => {
throw new Error("This is a test error.");
});
fastify.listen({ port: 3000 }, function (err, address) {
if (err) {
fastify.log.error(err);
process.exit(1);
}
console.log(`Server is now listening on ${address}`);
});
这可以通过直接将Node与node app.js
或更新yourpackagepackage.json
来运行。我们一会儿就做,所以等一下!
是时候设置您的AppSignal帐户了。导航到AppSignal网站,然后单击Start free trial
。在这里,您可以使用用户名和密码注册,也可以将AppSignal链接到您的GitHub帐户。在尝试该服务时,您无需提供任何信用卡详细信息。
注册并登录后,您将被带到仪表板。单击右上角的Add app
按钮,选择Node.js
,然后按照说明操作。
首先,我们将从项目目录运行npx @appsignal/cli install
。这将使用CLI工具下载和配置AppSignal依赖项。
在安装过程中,您将被要求提供一个push api键,您将看到该键在说明的第2步中列出。收到提示时将其粘贴到终端中,然后为您的应用程序命名。最后,将选项保存在配置文件中,并允许安装完成。
安装完成后,CLI会将运行命令打印到终端。现在我们可以用脚本块中的这一行更新我们的package.json
:
"start": "node --require './appsignal.cjs' app.js"
回到终端,我们可以通过运行npm run start
使用AppSignal启动服务器。
将Fastify与AppSignal集成
令人兴奋的是,如果我们要进行节点应用程序的正常仪器,我们已经完成了!Fastify是我们上面使用的CLI工具完全配置的众多集成之一。
通过Fastify集成,AppSignal会收到一个子跨度,表示Web请求期间所涉及的每个组件的执行时间。此功能为单个组件的性能提供了有价值的见解,帮助开发人员识别潜在的瓶颈或需要优化的领域。
集成使用请求路由作为操作名称,允许在监控仪表板中轻松识别和组织操作。此外,查询参数和请求主体数据被设置为跨度属性,提供请求详细信息的全面视图,这对于理解每个操作的上下文至关重要。
将Fastify与AppSignal集成的关键优势之一是自动错误跟踪。此功能可确保开发人员及时收到应用程序中出现的任何问题的通知,使他们能够快速解决问题,并保持Web应用程序的整体可靠性和用户体验。
让我们在上面创建的API上触发一些路由,并在AppSignal中探索这一点。因此,使用API客户端(如Postman或Insomnia)或您的网络浏览器,触发以下路由:
- http://localhost:3000/
- http://localhost:3000/error
- http://localhost:3000/not-here
- http://localhost:3000/not-here?测试=这里
在AppSignal仪表板页面上,选择左侧菜单上的Overview
。
- 在这个菜单中,我们可以决定放大或缩小到哪个时间段。这可以帮助我们专注于特定时间段,或鸟瞰应用程序的长期表现。
- 这三个图表提请注意要监控的最重要的指标。将它们放在仪表板上和居中,您可以将它们放在首位。
- 在这里,我们有最新的未决错误——我们稍后会放大这个。
- 最后,我们有最新的性能测量。再说一遍,我们很快就会放大那里。
使用AppSignal对Fastify错误进行分组
AppSignal在对相同类型的错误进行分组方面做得很好。这阻止了潜在的问题隐藏在实时数据流中。我们还可以与团队成员合作,调查我们应用程序中的问题。
这是错误摘要页面,这里发生了很多事情。
- 首先,我们有触发此错误的HTTP方法和路由。所有自动日志记录都是以这种方式识别的,使AppSignal能够更合理地对错误进行分组。
- 接下来,我们有应用程序和回溯末尾引发的错误消息。这是摘要页面,所以我们没有得到完整的堆栈跟踪。
- 我们可以单击
Inspect latest sample
,查看完整的请求/响应周期,以进行更有针对性的调查。 - 这里的日志允许您记录您尝试和排除的内容。这种共享笔记本减少了多个同事在同一方法上浪费时间的机会。
- 我们可以看看在过去一天或30天内是否存在这种错误的趋势。
- 在设置面板中,我们可以分配此错误,并决定何时提醒同事。这是一个极好的分类机制,允许团队将精力集中在开放和重要的问题上。
- 最后,这些请求之间的任何类似属性都会收集并显示在这里。
顶部还有其他标签。您可以自己探索这些,但我会特别提请您注意“Samples
选项卡。
这允许我们根据属性过滤结果,并单击以获取触发此错误的任何请求的详细信息。
Fastify中的路由性能
我们可以看到,当我们的应用程序抛出错误时,这将被有效跟踪。但是,识别基于绩效的问题呢?
这是分析来自我们API的GET请求时的最新示例。
- 我们对分组制作这些样本的请求类型进行了清晰的描述。
- 在这里,我们可以设置警告级别。它默认为10秒。因此,如果您的API需要超过10秒才能响应,AppSignal将发送警报。根据您的需求,您可以将此阈值降低到200毫秒或将其提高到60分钟左右。
- 这里有我们对样本的描述。我们可以看到这个请求会导致404错误。
- 同样,我们有一个趋势的可视化图表,因此我们可以快速了解任何潜在的性能下降或峰值。
- 我们可以通过单击此处来分析其他样本以比较和对比性能。在此页面的进一步下,我们可以找到描述此响应的属性以及作为请求URL的一部分发送的任何参数。
这些绩效指标是根据行动收集的。它们由方法和路线描述。我将使用MongoDB后端设置一个简单的CRUD API。
添加CRUD API
本教程假设您已经在系统上设置了MongoDB。如果没有,您可以前往MongoDB网站并自行设置。
要构建API,请首先添加以下库:
npm install @fastify/mongodb fastify-plugin
然后在名为db.js
的文件中创建一个数据库连接器插件:
const fastifyPlugin = require("fastify-plugin");
const fastifyMongo = require("@fastify/mongodb");
/**
* @param {FastifyInstance} fastify
* @param {Object} options
*/
async function dbConnector(fastify, options) {
fastify.register(fastifyMongo, {
url: "mongodb://localhost:27017/test_database",
});
}
module.exports = fastifyPlugin(dbConnector);
接下来,将路由带入他们自己的文件routes.js
,并添加动物api的路由:
/**
* Encapsulates the routes
* @param {FastifyInstance} fastify Encapsulated Fastify Instance
* @param {Object} options plugin options, refer to https://www.fastify.io/docs/latest/Reference/Plugins/#plugin-options
*/
async function routes(fastify, options) {
const collection = fastify.mongo.db.collection("test_collection");
fastify.get("/", async (request, reply) => {
return { hello: "me" };
});
fastify.get("/error", async () => {
throw new Error("This is a test error.");
});
fastify.get("/animals", async (request, reply) => {
const result = await collection.find().toArray();
if (result.length === 0) {
throw new Error("No documents found.");
}
return result;
});
fastify.get("/animals/:animal", async (request, reply) => {
const result = await collection.findOne({ animal: request.params.animal });
if (!result) {
throw new Error("Invalid value");
}
return result;
});
fastify.delete("/animals/:animal", async (request, reply) => {
const result = await collection.deleteOne({
animal: request.params.animal,
});
if (result.deletedCount === 0) {
return reply
.code(404)
.send({ error: true, message: "This item doesn't exist" });
}
return reply.code(204).send("");
});
const animalBodyJsonSchema = {
type: "object",
required: ["animal"],
properties: {
animal: { type: "string" },
},
};
const schema = {
body: animalBodyJsonSchema,
};
fastify.post("/animals", { schema }, async (request, reply) => {
// we can use the `request.body` object to get the data sent by the client
const result = await collection.insertOne({ animal: request.body.animal });
return result;
});
}
module.exports = routes;
最后,回到app.js
中,导入并注册插件:
fastify.register(require("./db"));
fastify.register(require("./routes"));
由于我在这里导入路由,我已经删除了我之前注册的/
和/error
路由。
使用CRUD API
现在这些路由已经设置好了,我可以查询每个路由。这是可用路线的表格。
方法 | 道路 | 参数 | 示例: | 描述 |
---|---|---|---|---|
获得 | / |
无 | 返回包含hello消息的对象 | |
获得 | /error |
无 | 抛出一个测试错误 | |
获得 | /animals |
无 | 返回所有动物的数组test_collection |
|
获得 | /animals/:animal |
animal (字符串,路径参数) |
/animals/dog |
从test_collection 返回特定动物对象(如果存在) |
删除 | /animals/:animal |
animal (字符串,路径参数) |
/animals/dog |
如果存在,则从test_collection 中删除指定的动物,并返回204状态代码,否则返回带有消息的404错误 |
发布 | /animals |
animal (字符串,请求主体) |
请求主体:{"animal": "dog"} |
将提供的动物插入test_collection 并返回结果 |
回到AppSignal Actions页面,我现在可以看到每个动作及其性能指标:
- 和以前一样,我们可以改变时间范围。我们也有
Custom range
,这使我们能够在跟踪中进行取证。 - 这是行动清单。单击任何这些链接都会将我们带到操作的摘要页面。除了链接到任何错误外,我们还可以访问构成此数据集的所有相关样本。
- 快速直观地了解我们每个行动响应所需的平均时间。最慢的是
/demo
,这是AppSignal提供的示例路由。 - 平均值是一个很好的衡量标准。第90个百分位数告诉我们90%的用户收到响应的速度。如果这些数字相差甚远,可能值得调查。
- 吞吐量是在我们选择的时间范围内通过操作发送的请求总数。
- 底部的摘要统计数据为我们提供了关于我们应用程序性能的体面总结。