diff --git a/src/routes/getStatus.ts b/src/routes/getStatus.ts index 7f764f5..b817450 100644 --- a/src/routes/getStatus.ts +++ b/src/routes/getStatus.ts @@ -3,25 +3,41 @@ import { Logger } from "../utils/logger"; import { Request, Response } from "express"; import os from "os"; import redis from "../utils/redis"; +import { promiseOrTimeout } from "../utils/promise"; export async function getStatus(req: Request, res: Response): Promise { const startTime = Date.now(); let value = req.params.value as string[] | string; value = Array.isArray(value) ? value[0] : value; + let processTime, redisProcessTime = -1; try { - const dbVersion = (await db.prepare("get", "SELECT key, value FROM config where key = ?", ["version"])).value; + const dbVersion = await promiseOrTimeout(db.prepare("get", "SELECT key, value FROM config where key = ?", ["version"]), 5000) + .then(e => { + processTime = Date.now() - startTime; + return e.value; + }) + .catch(e => { + Logger.error(`status: SQL query timed out: ${e}`); + return -1; + }); let statusRequests: unknown = 0; - try { - const numberRequests = await redis.increment("statusRequest"); - statusRequests = numberRequests?.[0]; - } catch (error) { } // eslint-disable-line no-empty + const numberRequests = await promiseOrTimeout(redis.increment("statusRequest"), 5000) + .then(e => { + redisProcessTime = Date.now() - startTime; + return e; + }).catch(e => { + Logger.error(`status: redis increment timed out ${e}`); + return [-1]; + }); + statusRequests = numberRequests?.[0]; const statusValues: Record = { uptime: process.uptime(), commit: (global as any).HEADCOMMIT || "unknown", db: Number(dbVersion), startTime, - processTime: Date.now() - startTime, + processTime, + redisProcessTime, loadavg: os.loadavg().slice(1), // only return 5 & 15 minute load average statusRequests, hostname: os.hostname() diff --git a/test/cases/getStatus.ts b/test/cases/getStatus.ts index abf22b3..7f4ffaf 100644 --- a/test/cases/getStatus.ts +++ b/test/cases/getStatus.ts @@ -110,4 +110,16 @@ describe("getStatus", () => { }) .catch(err => done(err)); }); + + it("Should be able to get redis latency", function (done) { + if (!config.redis?.enabled) this.skip(); + client.get(endpoint) + .then(res => { + assert.strictEqual(res.status, 200); + const data = res.data; + assert.ok(data.redisProcessTime >= 0); + done(); + }) + .catch(err => done(err)); + }); });