mirror of
https://github.com/OneUptime/oneuptime
synced 2024-11-21 22:59:07 +00:00
48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import RunCron from "../../Utils/Cron";
|
|
import LIMIT_MAX from "Common/Types/Database/LimitMax";
|
|
import OneUptimeDate from "Common/Types/Date";
|
|
import WorkflowStatus from "Common/Types/Workflow/WorkflowStatus";
|
|
import { EVERY_MINUTE } from "Common/Utils/CronTime";
|
|
import WorkflowLogService from "Common/Server/Services/WorkflowLogService";
|
|
import QueryHelper from "Common/Server/Types/Database/QueryHelper";
|
|
import WorkflowLog from "Common/Models/DatabaseModels/WorkflowLog";
|
|
|
|
RunCron(
|
|
"Workflow:TimeoutJobs",
|
|
{ schedule: EVERY_MINUTE, runOnStartup: false },
|
|
async () => {
|
|
// Timeout all workflows that have been scheduled for more than 5 minutes
|
|
const stalledWorkflowLogs: Array<WorkflowLog> =
|
|
await WorkflowLogService.findBy({
|
|
query: {
|
|
createdAt: QueryHelper.lessThan(OneUptimeDate.getSomeMinutesAgo(5)),
|
|
workflowStatus: WorkflowStatus.Scheduled,
|
|
},
|
|
limit: LIMIT_MAX,
|
|
select: {
|
|
logs: true,
|
|
_id: true,
|
|
},
|
|
skip: 0,
|
|
props: {
|
|
isRoot: true,
|
|
},
|
|
});
|
|
|
|
for (const stalledWorkflowLog of stalledWorkflowLogs) {
|
|
await WorkflowLogService.updateOneById({
|
|
id: stalledWorkflowLog.id!,
|
|
data: {
|
|
workflowStatus: WorkflowStatus.Error,
|
|
logs: `${
|
|
stalledWorkflowLog.logs
|
|
} \n ${OneUptimeDate.getCurrentDateAsFormattedString()}: Workflow was not picked up by the runner and has timed out.`,
|
|
},
|
|
props: {
|
|
isRoot: true,
|
|
},
|
|
});
|
|
}
|
|
},
|
|
);
|