willsoto/nestjs-prometheus
NestJS module for Prometheus
collectyarn add @willsoto/nestjs-prometheus prom-client
npm install @willsoto/nestjs-prometheus prom-client
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-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 "@willsoto/nestjs-prometheus";
@Module({
imports: [
PrometheusModule.register({
path: "/mymetrics",
}),
],
})
export class AppModule {}
No download data available
No tracked packages depend on this.
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-prometheus";
@Module({
imports: [
PrometheusModule.register({
defaultMetrics: {
enabled: false,
},
}),
],
})
export class AppModule {}
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-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 "@willsoto/nestjs-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 { InjectMetric } from "@willsoto/nestjs-prometheus";
import { Counter } from "prom-client";
@Injectable()
export class Service {
constructor(@InjectMetric("metric_name") public counter: Counter<string>) {}
}
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-prometheus";
@Module({
imports: [
PrometheusModule.register({
defaultLabels: {
app: "My app",
},
}),
],
})
export class AppModule {}
See the docs for more information.
You can add a custom prefix to all custom metrics by providing the customMetricPrefix option to the module configuration.
Some caveats:
In order to have the custom metrics registered in different modules from where the PrometheusModule was registered, you must do one of a few things:
PrometheusModule to the exports of the registering Module. It may be useful to create a CommonModule that registers and exports the PrometheusModule.PrometheusModule as globalimport { makeCounterProvider } from "@willsoto/nestjs-prometheus";
import { makeGaugeProvider } from "@willsoto/nestjs-prometheus";
import { makeHistogramProvider } from "@willsoto/nestjs-prometheus";
import { makeSummaryProvider } from "@willsoto/nestjs-prometheus";
collectAll metric providers support an optional inject array, which lets you inject NestJS dependencies into the collect callback. The injected dependencies are passed as arguments to your collect function.
import { Module } from "@nestjs/common";
import { PrometheusModule, makeGaugeProvider } from "@willsoto/nestjs-prometheus";
@Module({
imports: [PrometheusModule.register()],
providers: [
makeGaugeProvider({
name: "queue_size",
help: "Number of waiting items in the queue",
inject: [getQueueToken("scheduledQueue")],
collect(queue) {
const value = await queue.getWaitingCount();
this.set(value);
},
}),
],
})
export class AppModule {}
This works with all metric types (makeCounterProvider, makeGaugeProvider, makeHistogramProvider, makeSummaryProvider).
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 { Controller, Get, Res } from "@nestjs/common";
import { PrometheusController } from "@willsoto/nestjs-prometheus";
import { Response } from "express";
@Controller()
class MyCustomController extends PrometheusController {
@Get()
async index(@Res({ passthrough: true }) response: Response) {
return super.index(response);
}
}
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-prometheus";
import { MyCustomController } from "./my-custom-controller";
@Module({
imports: [
PrometheusModule.register({
controller: MyCustomController,
}),
],
})
export class AppModule {}
In order to enable Pushgateway for injection, provide the configuration under the pushgateway key.
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-prometheus";
@Module({
imports: [
PrometheusModule.register({
pushgateway: {
url: "http://127.0.0.1:9091",
},
}),
],
})
export class AppModule {}
import { Injectable } from "@nestjs/common";
import * as client from "prom-client";
@Injectable()
export class Service {
constructor(private readonly pushgateway: client.Pushgateway) {}
}