feat: health check for temporal

This commit is contained in:
Nevo David 2026-03-31 23:12:12 +07:00
parent afda06bb6a
commit 3a376f4a9c
4 changed files with 67 additions and 20 deletions

View file

@ -5,6 +5,7 @@ import { DatabaseModule } from '@gitroom/nestjs-libraries/database/prisma/databa
import { AutopostService } from '@gitroom/nestjs-libraries/database/prisma/autopost/autopost.service';
import { EmailActivity } from '@gitroom/orchestrator/activities/email.activity';
import { IntegrationsActivity } from '@gitroom/orchestrator/activities/integrations.activity';
import { HealthController } from '@gitroom/orchestrator/health.controller';
const activities = [
PostActivity,
@ -17,7 +18,7 @@ const activities = [
DatabaseModule,
getTemporalModule(true, require.resolve('./workflows'), activities),
],
controllers: [],
controllers: [HealthController],
providers: [...activities],
get exports() {
return [...this.providers, ...this.imports];

View file

@ -0,0 +1,34 @@
import { Controller, Get, Res } from '@nestjs/common';
import { Response } from 'express';
import { Connection } from '@temporalio/client';
@Controller('health')
export class HealthController {
@Get('/status')
async getHealthStatus(@Res() res: Response) {
let connection: Connection | undefined;
try {
const address = process.env.TEMPORAL_ADDRESS || 'localhost:7233';
connection = await Connection.connect({
address,
...(process.env.TEMPORAL_TLS === 'true' ? { tls: true } : {}),
...(process.env.TEMPORAL_API_KEY
? { apiKey: process.env.TEMPORAL_API_KEY }
: {}),
});
const namespace = process.env.TEMPORAL_NAMESPACE || 'default';
await Promise.race([
connection.workflowService.describeNamespace({ namespace }),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('timeout')), 10000)
),
]);
return res.status(200).json({ status: 'ok' });
} catch {
return res.status(500).json({ status: 'error' });
} finally {
await connection?.close().catch(() => {});
}
}
}

View file

@ -9,9 +9,12 @@ import * as dns from 'node:dns';
dns.setDefaultResultOrder('ipv4first');
async function bootstrap() {
// some comment again
const app = await NestFactory.createApplicationContext(AppModule);
const app = await NestFactory.create(AppModule);
app.enableShutdownHooks();
const port = process.env.ORCHESTRATOR_PORT || 3002;
await app.listen(port);
console.log(`Orchestrator health check listening on port ${port}`);
}
bootstrap();

View file

@ -106,25 +106,34 @@ export class OrganizationRepository {
getImpersonateUser(name: string) {
return this._userOrg.model.userOrganization.findMany({
where: {
user: {
OR: [
{
name: {
contains: name,
},
OR: [
{
organizationId: {
contains: name,
},
{
email: {
contains: name,
},
},
{
user: {
OR: [
{
name: {
contains: name,
},
},
{
email: {
contains: name,
},
},
{
id: {
contains: name,
},
},
],
},
{
id: {
contains: name,
},
},
],
},
},
],
},
select: {
id: true,