diff --git a/src/kernel/engine.js b/src/kernel/engine.js index 99f26c2..6e37cf3 100644 --- a/src/kernel/engine.js +++ b/src/kernel/engine.js @@ -41,6 +41,21 @@ class Engine extends EventEmitter { uptimeSeconds: this.uptimeStart ? Math.floor((Date.now() - this.uptimeStart) / 1000) : 0 }; } + + getMetrics() { + const memory = process.memoryUsage(); + return { + status: this.status, + engine: this.name, + version: this.version, + uptimeSeconds: this.uptimeStart ? Math.floor((Date.now() - this.uptimeStart) / 1000) : 0, + memory: { + heapUsedMB: Math.round((memory.heapUsed / 1024 / 1024) * 100) / 100, + heapTotalMB: Math.round((memory.heapTotal / 1024 / 1024) * 100) / 100, + rssMB: Math.round((memory.rss / 1024 / 1024) * 100) / 100 + } + }; + } } module.exports = { Engine }; diff --git a/tests/kernel.test.js b/tests/kernel.test.js index 6d53447..976824a 100644 --- a/tests/kernel.test.js +++ b/tests/kernel.test.js @@ -25,3 +25,17 @@ test('Engine starts and stops correctly with lifecycle events', async () => { assert.strictEqual(engine.status, 'STOPPED'); assert.strictEqual(stoppedFired, true); }); + +test('Engine returns system memory and runtime metrics', async () => { + const engine = new Engine({ name: 'metrics-engine' }); + await engine.start(); + const metrics = engine.getMetrics(); + + assert.strictEqual(metrics.status, 'RUNNING'); + assert.strictEqual(metrics.engine, 'metrics-engine'); + assert.strictEqual(typeof metrics.uptimeSeconds, 'number'); + assert.strictEqual(typeof metrics.memory.heapUsedMB, 'number'); + assert.ok(metrics.memory.heapUsedMB > 0); + + await engine.stop(); +});