javascript - Exponera vanlig http-endpoint i NestJS-mikrotjänster


Jag har denna mikrotjänst skriven med NestJs:

async function bootstrap() {
  const port = parseInt(process.env.PORT || '5000', 10);

  const app = await NestFactory.createMicroservice(ApplicationModule, {
    transport: Transport.TCP,
    options: { host: '0.0.0.0', port }
  });
  app.listen(() => console.log(`Microservice is listening on port ${port}`));
}
bootstrap();

Men nu behöver jag implementera en endpoint /metrics för Prometheus. Så frågan är hur gör jag detta med NestJs-mikrotjänst

Av detta problem får jag intrycket att det inte är möjligt. Är detta sant och i så fall, finns det en lösning jag kan använda?

Jag försökte tillämpa middleware på följande sätt

Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService, DBService],
})
export class ApplicationModule {
  configure(consumer: MiddlewareConsumer) {
    consumer
      .apply(MetricsMiddleware)
      .forRoutes('/metrics') // Also tried '*'
  }
}

Men när jag gör curl http://localhost:5000/metrics händer ingenting, middleware kallas inte

@Injectable()
export class MetricsMiddleware implements NestMiddleware {
    constructor() {}

    use(req, res, next) {
        console.log('yes');
        next();
    }
}

Uppdatering: Det här problemet kommer inte heller att hjälpa :(

Svar #1

Om du vill att din applikation ska stödja både HTTP-förfrågningar och en mikrotjänst, kan du skapa en hybridapplikation.

// Create your regular nest application.
const app = await NestFactory.create(ApplicationModule);

// Then combine it with your microservice
const microservice = app.connectMicroservice({
  transport: Transport.TCP,
  options: { host: '0.0.0.0', port: 5000 }
});

await app.startAllMicroservices();
await app.listen(3001);

Relaterade artiklar