@evanion/nestjs-correlation-id
Version:
Transparently forward or add correlation id to all requests
156 lines (117 loc) • 4.41 kB
Markdown
<h1 align="center">Nest.js Correlation ID middleware</h1>
<h3 align="center">Transparently include correlation IDs in all requests</h3>
<div align="center">
<a href="https://nestjs.com" target="_blank">
<img src="https://img.shields.io/badge/built%20with-NestJs-red.svg" alt="Built with NestJS">
</a>
</div>
### Why?
When debugging an issue in your applications logs, it helps to be able to follow a specific request up and down your whole stack. This is usually done by including a `correlation-id` (aka `Request-id`) header in all your requests, and forwarding the same id across all your microservices.
### Installation
```bash
yarn add @evanion/nestjs-correlation-id
```
```bash
npm install @evanion/nestjs-correlation-id
```
### How to use
Add the middleware to your `AppModule`
```ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import {
CorrelationIdMiddleware,
CorrelationModule,
} from '@evanion/nestjs-correlation-id';
@Module({
imports: [CorrelationModule.forRoot()],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(CorrelationIdMiddleware).forRoutes('*');
}
}
```
And then just inject the correlation middleware in your HttpService by calling the `registerAsync` method with the `withCorrelation` function.
```ts
import { HttpModule } from '@nestjs/axios';
import { withCorrelation } from '@evanion/nestjs-correlation-id';
@Module({
imports: [HttpModule.registerAsync(withCorrelation())],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
```
You can now use the `HttpService` as usual in your `UsersService` and `UsersController`
### Customize
You can easily customize the header and ID by including a config when you register the module
```ts
@Module({
imports: [CorrelationModule.forRoot({
header: string
generator: () => string
})]
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(CorrelationIdMiddleware).forRoutes('*');
}
}
```
#### Add `correlationId` to logs
In order to add the correlation ID to your logs, you can use the `CorrelationService` service to get the current correlationId.
In the following example, we are using the [@ntegral/nestjs-sentry](https://github.com/ntegral/nestjs-sentry) package, but you can use any package or provider you like.
```ts
import { CorrelationService } from '@evanion/nestjs-correlation-id';
import { Injectable, NestMiddleware } from '@nestjs/common';
import { InjectSentry, SentryService } from '@ntegral/nestjs-sentry';
import { NextFunction, Request, Response } from 'express';
@Injectable()
export class SentryMiddleware implements NestMiddleware {
constructor(
private readonly correlationService: CorrelationService,
@InjectSentry() private readonly sentryService: SentryService,
) {}
async use(_req: Request, _res: Response, next: NextFunction) {
const correlationId = await this.correlationService.getCorrelationId();
this.sentryService.instance().configureScope((scope) => {
scope.setTag('correlationId', correlationId);
});
next();
}
}
```
Then add it to your `AppModule`
```ts
import { Module } from '@nestjs-common';
import { SentryModule } from '@ntegral/nestjs-sentry';
import { CorrelationModule } from '@evanion/nestjs-correlation-id';
import { SentryMiddleware } from './middleware/sentry.middleware';
@Module({
imports: [
CorrelationModule.forRoot(),
SentryModule.forRoot({
// ... your config
}),
],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(CorrelationIdMiddleware).forRoutes('*');
consumer.apply(SentryMiddleware).forRoutes('*');
}
}
```
If you need to manually set the correlationId anywhere in your application. You can use the `CorrelationService` service to set the correlationId.
```ts
this.correlationService.setCorrelationId('some_correlation_id');
```
see [e2e tests](/test) for a fully working example
## Change Log
See [Changelog](CHANGELOG.md) for more information.
## Contributing
Contributions welcome! See [Contributing](CONTRIBUTING.md).
## Author
**Mikael Pettersson (Evanion on [Discord](https://discord.gg/G7Qnnhy))**
## License
Licensed under the MIT License - see the [LICENSE](LICENSE) file for details.