diff --git a/src/main.ts b/src/main.ts index 485af76..1354eea 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,7 +3,6 @@ import { ConfigService } from '@nestjs/config' import { NestFactory } from '@nestjs/core' import { AppModule } from './app.module' -import { CustomResponseTransformInterceptor } from './common/customResponse' import { setDefaults } from './common/dayjs' async function bootstrap() { @@ -15,7 +14,6 @@ async function bootstrap() { const port = config.get('PORT', 3000) app.enableShutdownHooks() app.useGlobalPipes(new ValidationPipe({ transform: true })) - app.useGlobalInterceptors(new CustomResponseTransformInterceptor()) setDefaults() await app.listen(port, () => console.log(`Listening on port ${port}`)) } diff --git a/src/members/controller.ts b/src/members/controller.ts index d7086b7..b32da14 100644 --- a/src/members/controller.ts +++ b/src/members/controller.ts @@ -1,8 +1,10 @@ -import { Controller, Get, Inject, Query } from '@nestjs/common' +import { Controller, Get, Inject, Query, UseInterceptors } from '@nestjs/common' +import { CustomResponseTransformInterceptor } from '../common/customResponse' import { MembersService } from './service' @Controller('members') +@UseInterceptors(CustomResponseTransformInterceptor) export class MembersController { constructor( @Inject(MembersService) diff --git a/src/prometheus/controller.ts b/src/prometheus/controller.ts new file mode 100644 index 0000000..f7a79d7 --- /dev/null +++ b/src/prometheus/controller.ts @@ -0,0 +1,16 @@ +import { Controller, Get, Inject } from '@nestjs/common' + +import { PrometheusProvider } from './provider' + +@Controller('metrics') +export class PrometheusController { + constructor( + @Inject(PrometheusProvider) + private readonly promProvider: PrometheusProvider, + ) {} + + @Get('/') + async getMetrics() { + return await this.promProvider.getMetrics() + } +} diff --git a/src/prometheus/module.ts b/src/prometheus/module.ts index 27d3c3d..e7d9d42 100644 --- a/src/prometheus/module.ts +++ b/src/prometheus/module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common' +import { PrometheusController } from './controller' import { PrometheusProvider } from './provider' @Module({ + controllers: [PrometheusController], providers: [PrometheusProvider], }) export class PrometheusModule {} diff --git a/src/prometheus/provider.ts b/src/prometheus/provider.ts index 8422f08..0700384 100644 --- a/src/prometheus/provider.ts +++ b/src/prometheus/provider.ts @@ -1,11 +1,13 @@ import { OnApplicationBootstrap } from '@nestjs/common' -import { collectDefaultMetrics, Registry } from 'prom-client' +import { collectDefaultMetrics, Counter, Registry } from 'prom-client' export class PrometheusProvider implements OnApplicationBootstrap { private readonly registry: Registry + private readonly counters: Map constructor() { this.registry = new Registry() + this.counters = new Map() } onApplicationBootstrap() { @@ -15,4 +17,18 @@ export class PrometheusProvider implements OnApplicationBootstrap { labels: { GIT_COMMIT: process.env.GIT_COMMIT ?? 'unknown' }, }) } + + async getMetrics() { + return this.registry.metrics() + } + + async count(name: string, help: string, increment = 1) { + let counter = this.counters.get(name) + if (counter == null) { + counter = new Counter({ name, help }) + this.counters.set(name, counter) + } + + counter.inc(increment) + } } diff --git a/src/recurringReservations/controller.ts b/src/recurringReservations/controller.ts index 35afdd0..f55c7b2 100644 --- a/src/recurringReservations/controller.ts +++ b/src/recurringReservations/controller.ts @@ -20,6 +20,7 @@ import { ValidateNested, } from 'class-validator' +import { CustomResponseTransformInterceptor } from '../common/customResponse' import { DayOfWeek } from './entity' import { RecurringReservationsService } from './service' @@ -79,7 +80,7 @@ export class UpdateRecurringReservationRequest { } @Controller('recurring-reservations') -@UseInterceptors(ClassSerializerInterceptor) +@UseInterceptors(ClassSerializerInterceptor, CustomResponseTransformInterceptor) export class RecurringReservationsController { constructor( @Inject(RecurringReservationsService) diff --git a/src/reservations/controller.ts b/src/reservations/controller.ts index 40a2a06..81030f8 100644 --- a/src/reservations/controller.ts +++ b/src/reservations/controller.ts @@ -23,6 +23,7 @@ import { } from 'class-validator' import { Dayjs } from 'dayjs' +import { CustomResponseTransformInterceptor } from '../common/customResponse' import { DayjsTransformer } from '../common/dayjs' import { LoggerService } from '../logger/service.logger' import { RESERVATIONS_QUEUE_NAME, ReservationsQueue } from './config' @@ -70,7 +71,7 @@ export class CreateReservationRequest { } @Controller('reservations') -@UseInterceptors(ClassSerializerInterceptor) +@UseInterceptors(ClassSerializerInterceptor, CustomResponseTransformInterceptor) export class ReservationsController { constructor( @Inject(ReservationsService)