From 8ee558e5a85f44ac0d7338af6b1bea026cd5df07 Mon Sep 17 00:00:00 2001 From: Satvik-Singh192 Date: Mon, 29 Jun 2026 08:39:49 +0000 Subject: [PATCH] feat: implemented memory logger and a new endpoint --- src/app.ts | 5 +++- src/domain/gate/proof-verification.ts | 1 + src/infra/memory.ts | 33 +++++++++++++++++++++++ src/infra/memoryLogger.ts | 39 +++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/infra/memory.ts create mode 100644 src/infra/memoryLogger.ts diff --git a/src/app.ts b/src/app.ts index 1f6fbce..d0a08af 100644 --- a/src/app.ts +++ b/src/app.ts @@ -5,7 +5,8 @@ import helmet from "helmet"; import { getPublicKey, blindEvaluate } from "./voprf/routes"; import { gateRouter } from "./interface/gate"; import { expressErrorHandler } from "./infra/error-handler"; - +import { getMemoryStats } from "./infra/memory"; +import { memoryLogger } from "./infra/memoryLogger"; // Express App const app = express(); @@ -15,6 +16,7 @@ app.use(express.urlencoded({ extended: false })); // parse application/json app.use(express.json()); +app.use(memoryLogger); // Use default logger for now app.use( @@ -34,6 +36,7 @@ app.use("/ping", function (req: Request, res: Response) { res.json({ reply: "pong" }); res.end(); }); +app.get("/internal/memory", getMemoryStats); // VOPRF endpoints app.get("/voprf/public-key", getPublicKey); diff --git a/src/domain/gate/proof-verification.ts b/src/domain/gate/proof-verification.ts index 9368eed..fc2e405 100644 --- a/src/domain/gate/proof-verification.ts +++ b/src/domain/gate/proof-verification.ts @@ -123,5 +123,6 @@ export const assertProofValid = async (proof: SemaphoreProofShape): Promise + Number((bytes / 1024 / 1024).toFixed(2)); + +export const collectMemoryStats = (): MemorySnapshot => { + const memory = process.memoryUsage(); + const bn128Engine = (globalThis as any).curve_bn128; + return { + + bn128EngineCached: !!bn128Engine, + + rssMb: bytesToMb(memory.rss), + heapUsedMb: bytesToMb(memory.heapUsed), + heapTotalMb: bytesToMb(memory.heapTotal), + externalMb: bytesToMb(memory.external), + arrayBuffersMb: bytesToMb(memory.arrayBuffers), + }; +}; + +export const getMemoryStats = (_req: Request, res: Response): void => { + res.json(collectMemoryStats()); +}; \ No newline at end of file diff --git a/src/infra/memoryLogger.ts b/src/infra/memoryLogger.ts new file mode 100644 index 0000000..10c8d59 --- /dev/null +++ b/src/infra/memoryLogger.ts @@ -0,0 +1,39 @@ +import { NextFunction, Request, Response } from "express"; +import { collectMemoryStats } from "./memory"; +import { logger } from "../logger"; + +export const memoryLogger = ( + req: Request, + res: Response, + next: NextFunction +): void => { + if (req.originalUrl === "/internal/memory") { + return next(); + } + + const before = collectMemoryStats(); + const start = Date.now(); + + res.on("finish", () => { + const after = collectMemoryStats(); + + logger.info({ + method: req.method, + path: req.originalUrl, + statusCode: res.statusCode, + durationMs: Date.now() - start, + + mem_before_rssMb: before.rssMb, + mem_before_heapUsedMb: before.heapUsedMb, + mem_before_externalMb: before.externalMb, + + mem_after_rssMb: after.rssMb, + mem_after_heapUsedMb: after.heapUsedMb, + mem_after_externalMb: after.externalMb, + + bn128Cached: after.bn128EngineCached + }); + }); + + next(); +}; \ No newline at end of file