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