This library has taken an idea from the @willsoto/nestjs-prometheus
# npm
$ npm install --save nest-prometheus
# yarn
$ yarn add nest-prometheus
import { Module } from '@nestjs/common';
import { PrometheusModule } from 'nest-prometheus';
@Module({
imports: [PrometheusModule.register()],
})
export class AppModule {}
By default, this will register a /metrics
endpoint that will return the default metrics.
import { Module } from '@nestjs/common';
import { PrometheusModule } from 'nest-prometheus';
@Module({
imports: [
PrometheusModule.register({
path: '/mymetrics',
}),
],
})
export class AppModule {}
import { Module } from '@nestjs/common';
import { PrometheusModule } from 'nest-prometheus';
@Module({
imports: [
PrometheusModule.register({
defaultMetrics: {
enabled: false,
},
}),
],
})
export class AppModule {}
import { Module } from '@nestjs/common';
import { PrometheusModule } from 'nest-prometheus';
@Module({
imports: [
PrometheusModule.register({
defaultMetrics: {
// See https://github.com/siimon/prom-client#configuration
config: {},
},
}),
],
})
export class AppModule {}
// module.ts
import { Module } from '@nestjs/common';
import { PrometheusModule, makeCounterProvider } from 'nest-prometheus';
import { Service } from './service';
@Module({
imports: [PrometheusModule.register()],
providers: [
Service,
makeCounterProvider({
name: 'metric_name',
help: 'metric_help',
}),
],
})
export class AppModule {}
// service.ts
import { Injectable } from '@nestjs/common';
import { Counter } from 'prom-client';
import { InjectMetric } from 'nest-prometheus';
@Injectable()
export class Service {
constructor(@InjectMetric('metric_name') public counter: Counter<string>) {}
}
import { Module } from '@nestjs/common';
import { PrometheusModule } from 'nest-prometheus';
@Module({
imports: [
PrometheusModule.register({
defaultLabels: {
app: 'My app',
},
}),
],
})
export class AppModule {}
See the docs for more information.
import { makeCounterProvider } from 'nest-prometheus';
import { makeGaugeProvider } from 'nest-prometheus';
import { makeHistogramProvider } from 'nest-prometheus';
import { makeSummaryProvider } from 'nest-prometheus';
If you need to implement any special logic or have access to the controller (e.g., to customize Swagger), you can provide your own controller (or subclass) of the default controller.
Here is a basic example which should be enough to extend or customize in any way you might need.
// my-custom-controller.ts
import { PrometheusController } from 'nest-prometheus';
import { Controller, Get, Res } from '@nestjs/common';
import { Response } from 'express';
@Controller()
class MyCustomController extends PrometheusController {
@Get()
async index(@Res() response: Response) {
await super.index(response);
}
}
import { Module } from '@nestjs/common';
import { PrometheusModule } from 'nest-prometheus';
import { MyCustomController } from './my-custom-controller';
@Module({
imports: [
PrometheusModule.register({
controller: MyCustomController,
}),
],
})
export class AppModule {}
See Changelog for more information.
Contributions welcome! See Contributing.
Mostafa Gholami
mst-ghi