feat: health check for temporal
This commit is contained in:
parent
afda06bb6a
commit
3a376f4a9c
4 changed files with 67 additions and 20 deletions
|
|
@ -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];
|
||||
|
|
|
|||
34
apps/orchestrator/src/health.controller.ts
Normal file
34
apps/orchestrator/src/health.controller.ts
Normal 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(() => {});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue