Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

NestJS

La integración de NestJS con ClickStack le permite crear un logger o usar el logger predeterminado para enviar logs a ClickStack (basado en nest-winston).

Esta guía integra:

✅ Logs✖️ Métricas✖️ Trazas

Para enviar métricas o APM/trazas, también deberá añadir a su aplicación la integración de lenguaje correspondiente.

Primeros pasos

Importa HyperDXNestLoggerModule en el AppModule principal y usa el método forRoot() para configurarlo.

import { Module } from '@nestjs/common';
import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';

@Module({
  imports: [
    HyperDXNestLoggerModule.forRoot({
      url: 'http://your-otel-collector:4318',
      apiKey: ***YOUR_INGESTION_API_KEY***, // No es necesario para Managed ClickStack
      maxLevel: 'info',
      service: 'my-app',
    }),
  ],
})
export class AppModule {}

A continuación, la instancia de winston estará disponible para inyectarla en todo el proyecto mediante el token de inyección HDX_LOGGER_MODULE_PROVIDER:

import { Controller, Inject } from '@nestjs/common';
import { HyperDXNestLoggerModule, HyperDXNestLogger } from '@hyperdx/node-logger';

@Controller('cats')
export class CatsController {
  constructor(
    @Inject(HyperDXNestLoggerModule.HDX_LOGGER_MODULE_PROVIDER)
    private readonly logger: HyperDXNestLogger,
  ) { }

  meow() {
    this.logger.info({ message: '🐱' });
  }
}

Reemplazar el logger de Nest (también durante el arranque)

Usar la inyección de dependencias tiene un pequeño inconveniente. Nest primero debe inicializar la aplicación (instanciando módulos y providers, inyectando dependencias, etc.) y, durante este proceso, la instancia de HyperDXNestLogger aún no está disponible, lo que significa que Nest recurre al logger interno.

Una solución es crear el logger fuera del ciclo de vida de la aplicación mediante la función createLogger y pasarlo a NestFactory.create. Nest entonces envolverá nuestro logger personalizado (la misma instancia que devuelve el método createLogger) en la clase Logger y le reenviará todas las llamadas:

Crea el logger en el archivo main.ts

import { HyperDXNestLoggerModule } from '@hyperdx/node-logger';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: HyperDXNestLoggerModule.createLogger({
      url: 'http://your-otel-collector:4318',
      apiKey: ***YOUR_INGESTION_API_KEY***, // No se necesita para Managed ClickStack
      maxLevel: 'info',
      service: 'my-app',
    })
  });
  await app.listen(3000);
}
bootstrap();

Modifique el módulo principal para que proporcione el servicio Logger:

import { Logger, Module } from '@nestjs/common';

@Module({
  providers: [Logger],
})
export class AppModule {}

Luego, inyecta el logger simplemente tipándolo con Logger de @nestjs/common:

import { Controller, Logger } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  constructor(private readonly logger: Logger) {}

  meow() {
    this.logger.log({ message: '🐱' });
  }
}
Navigation