Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mentos1386/nest-raven
Sentry Module for Nest.js Framework
https://github.com/mentos1386/nest-raven
module nest nestjs node raven sentry
Last synced: about 1 month ago
JSON representation
Sentry Module for Nest.js Framework
- Host: GitHub
- URL: https://github.com/mentos1386/nest-raven
- Owner: mentos1386
- License: mit
- Created: 2018-02-20T13:25:27.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-09-24T03:23:35.000Z (about 2 months ago)
- Last Synced: 2024-09-29T01:41:28.139Z (about 2 months ago)
- Topics: module, nest, nestjs, node, raven, sentry
- Language: TypeScript
- Homepage:
- Size: 3.17 MB
- Stars: 248
- Watchers: 4
- Forks: 26
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
- awesome-nestjs - Nest Raven - Nest.js 框架的 Sentry Raven 模块 (资源 / 组件和库)
README
Sentry Module for Nest framework
## Description
This is a [sentry](https://sentry.io/) module for [Nest](https://github.com/nestjs/nest).
This package is no longer based on deprecated raven module, but rather on new stable [@sentry/node](https://www.npmjs.com/package/@sentry/node) module.
#### Should i use this for large projects?
This is not a solution for all cases and large applications, just a quick starter that covers the common rest/graphql capturing (the basics).
You might want deeper integration with Sentry, which means you can still use this to cover the rest/graphql error capture, but you will have to use the rest of Sentry SDK to cover other cases.For really large projects, you might have to take this library as an example of how to integrate sentry with NestJS, and write your custom integration instead.
## Installation
```bash
$ npm i --save nest-raven
```## Quick Start
### Include Module
For Module to work you need to [setup Sentry SDK yourself](https://docs.sentry.io/platforms/node/),
this should be done in your `main.ts` file where you initialize the NestJS application.> app.module.ts
```ts
@Module({
imports: [RavenModule],
})
export class ApplicationModule implements NestModule {}
```### Using Interceptor
> app.controller.ts
```ts
@UseInterceptors(new RavenInterceptor())
@Get('/some/route')
public async someRoute() {
...
}
```With this setup, sentry will pick up all exceptions (even 400 types).
#### Global
If you want to set up interceptor as global, you have to follow Nest
instructions [here](https://docs.nestjs.com/interceptors). Something like
this. This only works for Controllers not for Gateways (limitation by NestJS):> app.module.ts
```ts
import { APP_INTERCEPTOR } from '@nestjs/core';@Module({
imports: [RavenModule],
providers: [
{
provide: APP_INTERCEPTOR,
useValue: new RavenInterceptor(),
},
],
})
export class ApplicationModule {}
```#### Filters
Sometimes we don't want to catch all exceptions but only 500 or those
that we didn't handle properly. For that we can add filters on interceptor
to filter out good exceptions.> app.controller.ts
```ts
@UseInterceptors(new RavenInterceptor({
filters: [
// Filter exceptions of type HttpException. Ignore those that
// have status code of less than 500
{ type: HttpException, filter: (exception: HttpException) => 500 > exception.getStatus() }
],
}))
@Get('/some/route')
public async someRoute() {
...
}
```#### Transformers
It may be useful to add some extra data to the Sentry's context before sending
the payload. Adding some request-related properties for instance. To achieve
this we can add scope transformers on interceptor to injecte some data
dynamically.> app.controller.ts
```ts
@UseInterceptors(new RavenInterceptor({
transformers: [
// Add an extra property to Sentry's scope
(scope: Scope, context: ExecutionContext) => {
const req = context.switchToHttp().getRequest();
scope.addExtra('important query', req.query.important_query)
scope.addExtra('important key', 'useful value');
}
],
}))
@Get('/some/route')
public async someRoute() {
...
}
```#### Additional data
Interceptor automatically adds `req` and `req.user` (as user) to additional data.
Other additional data can be added for each interceptor.
- tags
- extra
- fingerprint
- level> app.controller.ts
```ts
import { Severity } from '@sentry/node';@UseInterceptors(new RavenInterceptor({
tags: {
type: 'fileUpload',
},
level: Severity.Warning,
}))
@Get('/some/route')
public async someRoute()
...
}
```#### Websockets
> **Note:** Websockets ignore Global interceptors.
It will add `ws_client` and `ws_data` extras.
> app.gateway.ts
```ts
@UseInterceptors(new RavenInterceptor())
@SubscribeMessage('message_name')
public someMessage(client, data: string): string {
...
}
```#### GraphQL
It will add `fieldName` and `args` extras.
> app.gateway.ts
```ts
@Mutation()
@UseInterceptors(new RavenInterceptor())
async upvotePost(@Args('postId') postId: number) {
...
}
```