From f0e2770f73976e513955d3c80a67268c41fea73e Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 17 Jan 2022 12:18:03 +0100 Subject: [PATCH 1/6] Add blocker to health checks --- packages/health-check/src/checks/critical.js | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/health-check/src/checks/critical.js b/packages/health-check/src/checks/critical.js index d5527b50..0907d640 100644 --- a/packages/health-check/src/checks/critical.js +++ b/packages/health-check/src/checks/critical.js @@ -169,6 +169,28 @@ async function accountHealthCheck(done) { done({ name: "accounts", time: calculateElapsedTime(time), ...data }); } +// blockerHealthCheck returns the result of blocker container health endpoint +async function blockerHealthCheck(done) { + const time = process.hrtime(); + const data = { up: false }; + + try { + const response = await got(`${process.env.BLOCKER_HOST}:${process.env.BLOCKER_PORT}/health`, { responseType: "json" }); + + data.statusCode = response.statusCode; + data.response = response.body; + data.up = response.body.dbAlive === true; + data.ip = response.ip; + } catch (error) { + data.statusCode = error?.response?.statusCode || error.statusCode || error.status; + data.errorMessage = error.message; + data.errorResponseContent = getResponseContent(error.response); + data.ip = error?.response?.ip ?? null; + } + + done({ name: "blocker", time: calculateElapsedTime(time), ...data }); +} + async function genericAccessCheck(name, url) { const time = process.hrtime(); const data = { up: false, url }; @@ -205,4 +227,8 @@ if (process.env.ACCOUNTS_ENABLED === "true") { checks.push(accountHealthCheck, accountWebsiteCheck); } +if (process.env.PORTAL_MODULES && process.env.PORTAL_MODULES.indexOf('b') !== -1) { + checks.push(blockerHealthCheck); +} + module.exports = checks; From 45e0398afe01db01f7f5d5275d3875398fa6f096 Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 17 Jan 2022 13:25:54 +0100 Subject: [PATCH 2/6] Add protocol --- packages/health-check/src/checks/critical.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/health-check/src/checks/critical.js b/packages/health-check/src/checks/critical.js index 0907d640..75ca6d4d 100644 --- a/packages/health-check/src/checks/critical.js +++ b/packages/health-check/src/checks/critical.js @@ -175,7 +175,7 @@ async function blockerHealthCheck(done) { const data = { up: false }; try { - const response = await got(`${process.env.BLOCKER_HOST}:${process.env.BLOCKER_PORT}/health`, { responseType: "json" }); + const response = await got(`http://${process.env.BLOCKER_HOST}:${process.env.BLOCKER_PORT}/health`, { responseType: "json" }); data.statusCode = response.statusCode; data.response = response.body; From 4096a7ebf22b5ae6e939cb0b17d521f637b12aaa Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 17 Jan 2022 13:40:39 +0100 Subject: [PATCH 3/6] Delete ip property from check --- packages/health-check/src/checks/critical.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/health-check/src/checks/critical.js b/packages/health-check/src/checks/critical.js index 75ca6d4d..5384d8a6 100644 --- a/packages/health-check/src/checks/critical.js +++ b/packages/health-check/src/checks/critical.js @@ -180,14 +180,17 @@ async function blockerHealthCheck(done) { data.statusCode = response.statusCode; data.response = response.body; data.up = response.body.dbAlive === true; - data.ip = response.ip; } catch (error) { data.statusCode = error?.response?.statusCode || error.statusCode || error.status; data.errorMessage = error.message; data.errorResponseContent = getResponseContent(error.response); - data.ip = error?.response?.ip ?? null; } + // this is a no-op but it's added to explicitly document the ip property + // should not be set on the data object to prevent the IP from being compared + // to the server's IP - this is not required for this check and will fail + delete data.ip + done({ name: "blocker", time: calculateElapsedTime(time), ...data }); } From 75bebf414271cf01d903574aeebc3611b5afbeda Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 17 Jan 2022 13:50:21 +0100 Subject: [PATCH 4/6] Add changelog --- changelog/items/other/blocker-health-check.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/items/other/blocker-health-check.md diff --git a/changelog/items/other/blocker-health-check.md b/changelog/items/other/blocker-health-check.md new file mode 100644 index 00000000..2e45834c --- /dev/null +++ b/changelog/items/other/blocker-health-check.md @@ -0,0 +1 @@ +- Add health check for the blocker container From 61ca207974f752c6717e34e5b3914a5dee68784e Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 17 Jan 2022 13:54:12 +0100 Subject: [PATCH 5/6] Cleanup PR --- packages/health-check/src/checks/critical.js | 6 ++++-- packages/health-check/src/utils.js | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/health-check/src/checks/critical.js b/packages/health-check/src/checks/critical.js index 5384d8a6..cf7248da 100644 --- a/packages/health-check/src/checks/critical.js +++ b/packages/health-check/src/checks/critical.js @@ -1,9 +1,11 @@ const got = require("got"); const FormData = require("form-data"); const { isEqual } = require("lodash"); -const { calculateElapsedTime, getResponseContent } = require("../utils"); +const { calculateElapsedTime, getResponseContent, isPortalModuleEnabled } = require("../utils"); const { SkynetClient, stringToUint8ArrayUtf8, genKeyPairAndSeed } = require("skynet-js"); +const MODULE_BLOCKER = 'b' + const skynetClient = new SkynetClient(process.env.SKYNET_PORTAL_API); const exampleSkylink = "AACogzrAimYPG42tDOKhS3lXZD8YvlF8Q8R17afe95iV2Q"; @@ -230,7 +232,7 @@ if (process.env.ACCOUNTS_ENABLED === "true") { checks.push(accountHealthCheck, accountWebsiteCheck); } -if (process.env.PORTAL_MODULES && process.env.PORTAL_MODULES.indexOf('b') !== -1) { +if (isPortalModuleEnabled(MODULE_BLOCKER)) { checks.push(blockerHealthCheck); } diff --git a/packages/health-check/src/utils.js b/packages/health-check/src/utils.js index cebdb426..c5a43d8b 100644 --- a/packages/health-check/src/utils.js +++ b/packages/health-check/src/utils.js @@ -39,9 +39,17 @@ function ensureValidJSON(object) { return JSON.parse(stringified); } +/** + * isPortalModuleEnabled returns true if the given module is enabled + */ +function isPortalModuleEnabled(module) { + return process.env.PORTAL_MODULES && process.env.PORTAL_MODULES.indexOf(module) !== -1 +} + module.exports = { calculateElapsedTime, getYesterdayISOString, getResponseContent, ensureValidJSON, + isPortalModuleEnabled, }; From 9eb1240bc1253cab91688d9ad16e34abd2ef6401 Mon Sep 17 00:00:00 2001 From: PJ Date: Mon, 17 Jan 2022 14:04:55 +0100 Subject: [PATCH 6/6] Run prettier --- packages/health-check/src/checks/critical.js | 8 +++++--- packages/health-check/src/utils.js | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/health-check/src/checks/critical.js b/packages/health-check/src/checks/critical.js index cf7248da..0cd16a95 100644 --- a/packages/health-check/src/checks/critical.js +++ b/packages/health-check/src/checks/critical.js @@ -4,7 +4,7 @@ const { isEqual } = require("lodash"); const { calculateElapsedTime, getResponseContent, isPortalModuleEnabled } = require("../utils"); const { SkynetClient, stringToUint8ArrayUtf8, genKeyPairAndSeed } = require("skynet-js"); -const MODULE_BLOCKER = 'b' +const MODULE_BLOCKER = "b"; const skynetClient = new SkynetClient(process.env.SKYNET_PORTAL_API); const exampleSkylink = "AACogzrAimYPG42tDOKhS3lXZD8YvlF8Q8R17afe95iV2Q"; @@ -177,7 +177,9 @@ async function blockerHealthCheck(done) { const data = { up: false }; try { - const response = await got(`http://${process.env.BLOCKER_HOST}:${process.env.BLOCKER_PORT}/health`, { responseType: "json" }); + const response = await got(`http://${process.env.BLOCKER_HOST}:${process.env.BLOCKER_PORT}/health`, { + responseType: "json", + }); data.statusCode = response.statusCode; data.response = response.body; @@ -191,7 +193,7 @@ async function blockerHealthCheck(done) { // this is a no-op but it's added to explicitly document the ip property // should not be set on the data object to prevent the IP from being compared // to the server's IP - this is not required for this check and will fail - delete data.ip + delete data.ip; done({ name: "blocker", time: calculateElapsedTime(time), ...data }); } diff --git a/packages/health-check/src/utils.js b/packages/health-check/src/utils.js index c5a43d8b..414771f8 100644 --- a/packages/health-check/src/utils.js +++ b/packages/health-check/src/utils.js @@ -43,7 +43,7 @@ function ensureValidJSON(object) { * isPortalModuleEnabled returns true if the given module is enabled */ function isPortalModuleEnabled(module) { - return process.env.PORTAL_MODULES && process.env.PORTAL_MODULES.indexOf(module) !== -1 + return process.env.PORTAL_MODULES && process.env.PORTAL_MODULES.indexOf(module) !== -1; } module.exports = {