@willsoto/nestjs-prometheus

NestJS module for Prometheus

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
@willsoto/nestjs-prometheus
43556.0.07 months ago4 years agoMinified + gzip package size for @willsoto/nestjs-prometheus in KB

Readme

NestJS Prometheus


- Changing the metrics http endpoint - Disabling default metrics collection - Configuring the default metrics - Option 1 (recommended) - Option 2 (not recommended) - Counter - Gauge - Histogram - Summary

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)

  1. Add the PrometheusModule to the exports of the registering Module. It may be useful to create a CommonModule that registers and exports the PrometheusModule.
  2. Import that module into whatever module you are creating the custom metrics.

Option 2 (not recommended)

  1. Mark the PrometheusModule as global

Available metrics

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";

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) {}
}