From 7a38a31699082338a3218b1cb73b7ca09ddbf94d Mon Sep 17 00:00:00 2001 From: sblausten Date: Tue, 20 Dec 2022 08:56:22 +0100 Subject: [PATCH] Do not fail fast on run checks endpoint when a single check fails and return error message alongside any results that completed Signed-off-by: sblausten --- .changeset/proud-birds-worry.md | 5 ++++ .../src/service/router.ts | 24 +++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 .changeset/proud-birds-worry.md diff --git a/.changeset/proud-birds-worry.md b/.changeset/proud-birds-worry.md new file mode 100644 index 0000000000..cef7120fe1 --- /dev/null +++ b/.changeset/proud-birds-worry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-tech-insights-backend': patch +--- + +Complete check results run when a single check errors so that we don't block other checks from working due to an error in a single check diff --git a/plugins/tech-insights-backend/src/service/router.ts b/plugins/tech-insights-backend/src/service/router.ts index 6dba290422..d9cfa9b0ad 100644 --- a/plugins/tech-insights-backend/src/service/router.ts +++ b/plugins/tech-insights-backend/src/service/router.ts @@ -103,16 +103,30 @@ export async function createRouter< checks, entities, }: { checks: string[]; entities: CompoundEntityRef[] } = req.body; + let error = undefined; const tasks = entities.map(async entity => { const entityTriplet = typeof entity === 'string' ? entity : stringifyEntityRef(entity); - const results = await factChecker.runChecks(entityTriplet, checks); - return { - entity: entityTriplet, - results, - }; + try { + const results = await factChecker.runChecks(entityTriplet, checks); + return { + entity: entityTriplet, + results, + }; + } catch (e: any) { + const errorMessage = `Failed to run check for entity ${entityTriplet} due to error: ${e.message}`; + logger.error(errorMessage); + error = errorMessage; + return { + entity: entityTriplet, + results: [], + }; + } }); const results = await Promise.all(tasks); + if (error) { + return res.status(500).send({ error, results }); + } return res.json(results); }); } else {