diff --git a/src/routes/getStatus.ts b/src/routes/getStatus.ts index b4ea254..bc855c2 100644 --- a/src/routes/getStatus.ts +++ b/src/routes/getStatus.ts @@ -2,6 +2,7 @@ import { db } from "../databases/databases"; import { Logger } from "../utils/logger"; import { Request, Response } from "express"; import os from "os"; +import redis from "../utils/redis"; export async function getStatus(req: Request, res: Response): Promise { const startTime = Date.now(); @@ -9,13 +10,16 @@ export async function getStatus(req: Request, res: Response): Promise value = Array.isArray(value) ? value[0] : value; try { const dbVersion = (await db.prepare("get", "SELECT key, value FROM config where key = ?", ["version"])).value; + const numberRequests = await redis.increment("statusRequest"); + const statusRequests = numberRequests?.replies?.[0]; const statusValues: Record = { uptime: process.uptime(), commit: (global as any).HEADCOMMIT || "unknown", db: Number(dbVersion), startTime, processTime: Date.now() - startTime, - loadavg: os.loadavg().slice(1) // only return 5 & 15 minute load average + loadavg: os.loadavg().slice(1), // only return 5 & 15 minute load average + statusRequests }; return value ? res.send(JSON.stringify(statusValues[value])) : res.send(statusValues); } catch (err) { diff --git a/src/utils/redis.ts b/src/utils/redis.ts index 8bdea23..6e4d1d6 100644 --- a/src/utils/redis.ts +++ b/src/utils/redis.ts @@ -9,6 +9,7 @@ interface RedisSB { setAsync?(key: string, value: string): Promise<{err: Error | null, reply: string | null}>; delAsync?(...keys: [string]): Promise; close?(flush?: boolean): void; + increment?(key: string): Promise<{err: Error| null, replies: any[] | null}>; } let exportObject: RedisSB = { @@ -20,6 +21,8 @@ let exportObject: RedisSB = { new Promise((resolve) => resolve({ err: null, reply: undefined })), delAsync: () => new Promise((resolve) => resolve(null)), + increment: () => + new Promise((resolve) => resolve({ err: null, replies: undefined })), }; if (config.redis) { @@ -31,7 +34,12 @@ if (config.redis) { exportObject.setAsync = (key, value) => new Promise((resolve) => client.set(key, value, (err, reply) => resolve({ err, reply }))); exportObject.delAsync = (...keys) => new Promise((resolve) => client.del(keys, (err) => resolve(err))); exportObject.close = (flush) => client.end(flush); - + exportObject.increment = (key) => new Promise((resolve) => + client.multi() + .incr(key) + .expire(key, 60) + .exec((err, replies) => resolve({ err, replies })) + ); client.on("error", function(error) { Logger.error(error); }); diff --git a/test/cases/getStatus.ts b/test/cases/getStatus.ts index b515427..970ebed 100644 --- a/test/cases/getStatus.ts +++ b/test/cases/getStatus.ts @@ -1,6 +1,7 @@ import assert from "assert"; import { db } from "../../src/databases/databases"; import { client } from "../utils/httpClient"; +import { config } from "../../src/config"; let dbVersion: number; describe("getStatus", () => { @@ -86,4 +87,27 @@ describe("getStatus", () => { }) .catch(err => done(err)); }); + + it("Should be able to get statusRequests only", function (done) { + if (!config.redis) this.skip(); + client.get(`${endpoint}/statusRequests`) + .then(res => { + assert.strictEqual(res.status, 200); + assert.ok(Number(res.data) > 1); + done(); + }) + .catch(err => done(err)); + }); + + it("Should be able to get status with statusRequests", function (done) { + if (!config.redis) this.skip(); + client.get(endpoint) + .then(res => { + assert.strictEqual(res.status, 200); + const data = res.data; + assert.ok(data.statusRequests > 2); + done(); + }) + .catch(err => done(err)); + }); });