Awesome
NestJS Prometheus
<!-- toc -->- Installation
- Usage
- Injecting individual metrics
- Setting default labels
- Prefixing custom metrics
- Available metrics
- Providing a custom controller
- Pushgateway
Installation
yarn add @willsoto/nestjs-prometheus prom-client
npm install @willsoto/nestjs-prometheus prom-client
Usage
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.
Changing the metrics http endpoint
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-prometheus";
@Module({
imports: [
PrometheusModule.register({
path: "/mymetrics",
}),
],
})
export class AppModule {}
Disabling default metrics collection
import { Module } from "@nestjs/common";
import { PrometheusModule } from "@willsoto/nestjs-prometheus";
@Module({
imports: [
PrometheusModule.register({
defaultMetrics: {
enabled: false,
},
}),
],
})
export class AppModule {}
Configuring the default metrics
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 {}
Injecting individual metrics
// 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>) {}
}
Setting default labels
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.
Prefixing custom metrics
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:
Option 1 (recommended)
- Add the
PrometheusModule
to theexports
of the registeringModule
. It may be useful to create aCommonModule
that registers and exports thePrometheusModule
. - Import that module into whatever module you are creating the custom metrics.
Option 2 (not recommended)
- Mark the
PrometheusModule
asglobal
Available metrics
<!-- Prettier will delete these imports as they are unused. So we ignore these blocks. --> <!-- prettier-ignore-start -->Counter
import { makeCounterProvider } from "@willsoto/nestjs-prometheus";
Gauge
import { makeGaugeProvider } from "@willsoto/nestjs-prometheus";
Histogram
import { makeHistogramProvider } from "@willsoto/nestjs-prometheus";
Summary
import { makeSummaryProvider } from "@willsoto/nestjs-prometheus";
<!-- prettier-ignore-end -->
Providing a custom controller
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 {}
Pushgateway
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) {}
}