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..3a36eab --- /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 = performance.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; };