From 9962191bc5676858310267785c1586664580601b Mon Sep 17 00:00:00 2001 From: Simon Gurcke Date: Sat, 29 Nov 2025 19:25:39 +1000 Subject: [PATCH 1/2] Capture CPU/memory metrics --- src/common/client.ts | 2 ++ src/common/resources.ts | 35 +++++++++++++++++++++++++++++++++++ src/common/types.ts | 4 ++++ 3 files changed, 41 insertions(+) create mode 100644 src/common/resources.ts diff --git a/src/common/client.ts b/src/common/client.ts index 631ac71..4090ec1 100644 --- a/src/common/client.ts +++ b/src/common/client.ts @@ -6,6 +6,7 @@ import { Logger, getLogger } from "./logging.js"; import { isValidClientId, isValidEnv } from "./paramValidation.js"; import RequestCounter from "./requestCounter.js"; import RequestLogger from "./requestLogger.js"; +import { getCpuMemoryUsage } from "./resources.js"; import ServerErrorCounter from "./serverErrorCounter.js"; import { ApitallyConfig, @@ -225,6 +226,7 @@ export class ApitallyClient { this.validationErrorCounter.getAndResetValidationErrors(), server_errors: this.serverErrorCounter.getAndResetServerErrors(), consumers: this.consumerRegistry.getAndResetUpdatedConsumers(), + resources: getCpuMemoryUsage(), }; this.syncDataQueue.push(newPayload); diff --git a/src/common/resources.ts b/src/common/resources.ts new file mode 100644 index 0000000..a2f22a0 --- /dev/null +++ b/src/common/resources.ts @@ -0,0 +1,35 @@ +let lastCpuUsage: { user: number; system: number } | null = null; +let lastCpuTime: number | null = null; + +export function getCpuMemoryUsage() { + const currentCpuUsage = process.cpuUsage(); + const currentTime = Date.now(); + const memoryRss = process.memoryUsage().rss; + + let cpuPercent = null; + + if (lastCpuUsage !== null && lastCpuTime !== null) { + // Calculate elapsed time in microseconds + const elapsedTime = (currentTime - lastCpuTime) * 1000; + + // Calculate CPU time used (user + system) in microseconds + const cpuTime = + currentCpuUsage.user - + lastCpuUsage.user + + (currentCpuUsage.system - lastCpuUsage.system); + + // Calculate percentage + cpuPercent = (cpuTime / elapsedTime) * 100; + } + + // Update last values for next call + lastCpuUsage = currentCpuUsage; + lastCpuTime = currentTime; + + return cpuPercent !== null + ? { + cpu_percent: cpuPercent, + memory_rss: memoryRss, + } + : null; +} diff --git a/src/common/types.ts b/src/common/types.ts index 2eb837c..94b88e8 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -94,4 +94,8 @@ export type SyncPayload = { validation_errors: Array; server_errors: Array; consumers: Array; + resources: { + cpu_percent: number; + memory_rss: number; + } | null; }; From 676770abd9ac2c8d5165840e3d06464e4a69a9ee Mon Sep 17 00:00:00 2001 From: Simon Gurcke Date: Sun, 30 Nov 2025 22:41:58 +1000 Subject: [PATCH 2/2] Fix --- src/common/resources.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/resources.ts b/src/common/resources.ts index a2f22a0..3a36eab 100644 --- a/src/common/resources.ts +++ b/src/common/resources.ts @@ -3,7 +3,7 @@ let lastCpuTime: number | null = null; export function getCpuMemoryUsage() { const currentCpuUsage = process.cpuUsage(); - const currentTime = Date.now(); + const currentTime = performance.now(); const memoryRss = process.memoryUsage().rss; let cpuPercent = null;