使用AppSignal跟踪Nestjs应用程序中的错误
#node #nest

许多变量 - 您的用户设备类型和配置,外部托管服务以及第三方库可能会影响应用程序的性能。没有性能监控系统,可能会出现许多问题。这些问题甚至可能意味着用户停止使用您的应用程序。

AppSignal提供应用程序性能监视(APM),具有诸如错误跟踪,性能监视,主机监视,异常检测和正常运行时间监视等功能,以帮助您跟踪错误并监视应用程序的性能。

在本文中,我们将为Nestjs应用程序设置应用程序信号,并提供一些使用AppSignal跟踪错误的提示。

让我们开始!

初始化Nestjs应用程序

Nestjs是构建Node.js服务器端应用程序的框架。 Nestjs是用打字稿构建的,并在开箱即用的位置支持Typescript,但它仍然使开发人员能够编写纯JavaScript代码。它提供了通过HTTP服务器框架(例如Express(默认))或快速曝光并公开API的抽象层,因此开发人员可以集成许多Nestjs的第三方模块。

您可以通过运行以下内容在计算机上安装Nestjs打字稿启动项目:

git clone https://github.com/nestjs/typescript-starter.git sample_app
cd sample_app
npm install

为Nestjs配置应用程序信号

如果您没有一个Appsignal帐户create one,请在下面运行以下命令以在应用程序中安装和配置应用程序。

npx @appsignal/cli install

这将安装必要的软件包,您会被要求使用配置方法。使用appsignal.cjs配置文件选项选择
CLI工具将在src/目录中生成一个名为appsignal.cjs的配置文件。

生成的配置包括:

  • 有效的推动API键
  • 应用程序名称
  • active设置为true

您可以通过单击组织设置来从应用程序信号帐户中获取推送API键。

appsignal_push_api_key.png

在本文中,我们将我们的应用程序称为“ sample_app”。

Nestjs错误跟踪AppSignal

node.js软件包的应用程序自动仪器nestjs。此命令在开发模式下使用热代码重新加载启动应用程序,并在启动时使用--require预订appsignal.cjs

npx nest start --watch --exec "node --require ./src/appsignal.cjs"

您应该将--require标志添加到启动应用程序的任何脚本中。对于我们的演示,我们只将其添加到start:dev

您还可以将上面的命令作为脚本包含在您的package.json中。

{
  "scripts": {
    // ...
    "start:dev": "nest start --watch --exec \"node --require ./src/appsignal.cjs\""
    // ...
  }
}

然后通过运行命令开始您的应用程序。

npm run start:dev

AppSignal跟踪您的Nestjs应用程序提出的任何错误,并将立即开始收集指标。

要对此进行测试,请在app.service.ts文件中更新getHello()方法以引起错误。

// src/app.service.ts
import { Injectable } from "@nestjs/common";

@Injectable()
export class AppService {
  getHello(): string {
    throw new Error("SOME SAMPLE ERROR");
    // return 'Hello World';
  }
}

然后在浏览器中打开http://localhost:3000,因此您的应用程序会引起错误。转到应用程序信号的仪表板,然后单击概述

appsignal_dashboard.png

AppSignal的错误跟踪提供了不同的见解,可帮助您控制应用程序。仪表板概述为重要指标提供了简单但功能强大的视觉效果,例如:

  • 错误率
  • 吞吐量
  • 响应时间
  • 最差的10个主机

以及更多!

当您单击最新打开错误部分中列出的错误时,这将打开一个页面,其中包含更多详细信息以帮助调试。

error_details

使用此信息,您可以:

  • 在发生错误的那天,请参见主机的状态
  • 了解有关请求环境或请求标题的更多信息
  • 通过呼叫插场进行回溯错误

您还可以集成个人问题跟踪器或GitHub来分配问题并管理错误。

Read more about AppSignal for Node.js.

用应用程序处理错误

在某些情况下,您希望应用程序忽略您的应用程序提出的一些错误,例如,使用您的应用程序通过bot提出的例外。

为此,您可以将ignoreErrors属性添加到appsignal.cjs中的配置对象。 ignoreErrors采用了一系列特定的错误名称。

const { Appsignal } = require("@appsignal/nodejs");

new Appsignal({
  // ...
  ignoreErrors: ["SpecificError", "AnotherError", "SomeError"],
});

要处理应用程序中的异常,请使用@appsignal/node软件包提供的sendError方法记录事件。

Nestjs具有一个内置异常层,该图层会自动处理应用程序中未经处理的异常。它捕获了未经处理的错误,并发送适当的用户友好响应。如我们所见,Appsignal也跟踪和报告了此类错误。

您可能需要完全控制异常层,以自定义发送给客户端的响应的内容。您可以使用@nestjs/commonExceptionFilter类。

src/exception_filters/目录中创建一个名为appsignalexception.filter.ts的新文件,然后将下面的代码复制到文件中。

import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
} from "@nestjs/common";
import { sendError } from "@appsignal/nodejs";
import { Response } from "express";

@Catch(HttpException)
export class AppSignalExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const status = exception.getStatus();

    sendError(exception);

    //  handle the exceptions however you want: logging, additional info, HTTP response, etc.
    response.status(status).send("handle the error however you may want");
  }
}

AppSignalExceptionFilter扩展了ExceptionFilter类,覆盖了捕获方法。

在应用程序服务中,更新您的app.service.ts文件,因此getHello升级了HttpException

import { HttpException, Injectable } from "@nestjs/common";

@Injectable()
export class AppService {
  getHello(): string {
    throw new HttpException("THIS IS AN ERROR", 500 /* status code */);
  }
}

在应用程序控制器中,通过更新app.controller.ts文件来利用异常过滤器。

import { Controller, Get, UseFilters } from "@nestjs/common";
import { AppService } from "./app.service";
import { AppSignalExceptionFilter } from "./exception_filters/appsignalexception.filter";

@Controller()
@UseFilters(new AppSignalExceptionFilter())
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

运行应用程序时,AppSignal将跟踪sendError方法发送的事件(请参阅下面的屏幕截图的“最新打开错误”部分):

appsignal_exception_handling

邀请团队成员并设置Appsignal中错误的警报

AppSignal可以用于管理协作工作流程,包括:

  • 将任务分配给团队成员
  • 向某些团队成员发送特定通知

要将团队成员添加到您的应用程序应用程序中,请单击仪表板底部左下方的应用程序设置按钮。

然后团队许可 - 管理该团队的邀请

AppSignal还提供了一个通知系统,该系统可以通过电子邮件发送警报,并与Slack,Discord,Microsoft团队等许多通信工具集成。

AppSignal的警报可以配置为适合您组织的工作流程。例如,如果您主要使用Slack和Email,则可以配置警报设置以向每个团队成员的电子邮件发送正常运行时间监视警报,并将错误跟踪器指标发送到特定的Slack频道。

单击应用程序设置通知访问配置面板的选项。
您可以根据工作流程添加集成并配置较旧的集成。

notification-configuration.png

AppSignal还可以提供通知的Webhooks,因此您可以创建工作流,功能和操作来处理应用程序中发生的事件。 Read the docs to find out more about AppSignal webhooks

在AppSignal中启用正常运行时间监视

应用程序的正常运行时间监视监视器,当您的应用程序降低并提醒您时。它检查您提供的URL并记录给定端点在不同区域的性能。

AppSignal PISS在全球多个区域中给定的URL,如果在30秒内没有响应,它将考虑该地区的应用程序。

要创建正常运行时间监视器,请单击添加正常时间监视器 正常运行时间监视页面并提供必要的信息。

appsignal_uptime_monitor_setup.png

Read more about uptime monitoring in AppSignal.

查看Monitoring Your NestJS Application with AppSignal以了解更多信息。

包起来

在本文中,我们为Nestjs应用程序安装了AppSignal。然后我们探索了如何:

  • 跟踪错误并挖掘错误详细信息
  • 设置来自Appsignal的警报以适合您的工作流程的方式跟踪错误
  • 启用对不同URL端点的正常运行时间监视

快乐调试!

P.S。如果您喜欢这篇文章,subscribe to our JavaScript Sorcery list每月深入研究更神奇的JavaScript技巧和技巧。

P.P.S。如果您需要node.js应用程序的apm,请go和check out the AppSignal APM for Node.js