zappyzep/backend/src/restCallStats.ts
2021-09-11 21:14:47 +03:00

35 lines
1.2 KiB
TypeScript

import { sorter } from "./utils";
Error.stackTraceLimit = Infinity;
type CallStats = { method: string; path: string; source: string; count: number };
const restCallStats: Map<string, CallStats> = new Map();
const looseSnowflakeRegex = /\d{15,}/g;
const queryParamsRegex = /\?.*$/g;
export function logRestCall(method: string, path: string) {
const anonymizedPath = path.replace(looseSnowflakeRegex, "0000").replace(queryParamsRegex, "");
const stackLines = (new Error().stack || "").split("\n").slice(10); // Remove initial fluff
const firstSrcLine = stackLines.findIndex((line) => line.includes("/backend/src"));
const source = stackLines
.slice(firstSrcLine !== -1 ? firstSrcLine : -5)
.filter((l) => !l.includes("processTicksAndRejections"))
.join("\n");
const key = `${method}|${anonymizedPath}|${source}`;
if (!restCallStats.has(key)) {
restCallStats.set(key, {
method,
path: anonymizedPath,
source,
count: 0,
});
}
restCallStats.get(key)!.count++;
}
export function getTopRestCallStats(count: number): CallStats[] {
const stats = Array.from(restCallStats.values());
stats.sort(sorter("count", "DESC"));
return stats.slice(0, count);
}