Skip to content

Commit 94eb37c

Browse files
committed
Count active postgres and redis requests
1 parent 0ced78d commit 94eb37c

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

src/databases/Postgres.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export class Postgres implements IDatabase {
3333
private poolRead: Pool;
3434
private lastPoolReadFail = 0;
3535

36+
activePostgresRequests = 0;
37+
3638
constructor(private config: DatabaseConfig) {}
3739

3840
async init(): Promise<void> {
@@ -108,13 +110,15 @@ export class Postgres implements IDatabase {
108110
tries++;
109111

110112
try {
113+
this.activePostgresRequests++;
111114
lastPool = this.getPool(type, options);
112115

113116
pendingQueries.push(savePromiseState(lastPool.query({ text: query, values: params })));
114117
const currentPromises = [...pendingQueries];
115118
if (options.useReplica && maxTries() - tries > 1) currentPromises.push(savePromiseState(timeoutPomise(this.config.postgresReadOnly.readTimeout)));
116119
const queryResult = await nextFulfilment(currentPromises);
117120

121+
this.activePostgresRequests--;
118122
switch (type) {
119123
case "get": {
120124
const value = queryResult.rows[0];
@@ -142,6 +146,7 @@ export class Postgres implements IDatabase {
142146
}
143147
} while (this.isReadQuery(type) && tries < maxTries());
144148

149+
this.activePostgresRequests--;
145150
throw new Error(`prepare (postgres): ${type} ${query} failed after ${tries} tries`);
146151
}
147152

src/routes/getStatus.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { db } from "../databases/databases";
22
import { Logger } from "../utils/logger";
33
import { Request, Response } from "express";
44
import os from "os";
5-
import redis from "../utils/redis";
5+
import redis, { getRedisActiveRequests } from "../utils/redis";
66
import { promiseOrTimeout } from "../utils/promise";
7+
import { Postgres } from "../databases/Postgres";
78

89
export async function getStatus(req: Request, res: Response): Promise<Response> {
910
const startTime = Date.now();
@@ -42,7 +43,9 @@ export async function getStatus(req: Request, res: Response): Promise<Response>
4243
redisProcessTime,
4344
loadavg: os.loadavg().slice(1), // only return 5 & 15 minute load average
4445
statusRequests,
45-
hostname: os.hostname()
46+
hostname: os.hostname(),
47+
activePostgresRequests: (db as Postgres)?.activePostgresRequests,
48+
activeRedisRequests: getRedisActiveRequests(),
4649
};
4750
return value ? res.send(JSON.stringify(statusValues[value])) : res.send(statusValues);
4851
} catch (err) {

src/utils/redis.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ let exportClient: RedisSB = {
2727

2828
let lastClientFail = 0;
2929
let lastReadFail = 0;
30+
let activeRequests = 0;
3031

3132
if (config.redis?.enabled) {
3233
Logger.info("Connected to redis");
@@ -40,10 +41,13 @@ if (config.redis?.enabled) {
4041
const get = client.get.bind(client);
4142
const getRead = readClient?.get?.bind(readClient);
4243
exportClient.get = (key) => new Promise((resolve, reject) => {
44+
activeRequests++;
4345
const timeout = config.redis.getTimeout ? setTimeout(() => reject(), config.redis.getTimeout) : null;
4446
const chosenGet = pickChoice(get, getRead);
4547
chosenGet(key).then((reply) => {
4648
if (timeout !== null) clearTimeout(timeout);
49+
50+
activeRequests--;
4751
resolve(reply);
4852
}).catch((err) => {
4953
if (chosenGet === get) {
@@ -52,6 +56,7 @@ if (config.redis?.enabled) {
5256
lastReadFail = Date.now();
5357
}
5458

59+
activeRequests--;
5560
reject(err);
5661
});
5762
});
@@ -91,4 +96,8 @@ function pickChoice<T>(client: T, readClient: T): T {
9196
}
9297
}
9398

99+
export function getRedisActiveRequests(): number {
100+
return activeRequests;
101+
}
102+
94103
export default exportClient;

0 commit comments

Comments
 (0)