diff --git a/.github/workflows/ci-pull-requests.yml b/.github/workflows/ci-pull-requests.yml index 60fc45b4b99..11801a5310f 100644 --- a/.github/workflows/ci-pull-requests.yml +++ b/.github/workflows/ci-pull-requests.yml @@ -249,5 +249,5 @@ jobs: if: always() uses: ./.github/workflows/util-qa-metrics-comment-reusable.yml with: - metrics: memory-heap-used-baseline,docker-image-size-n8n,docker-image-size-runners + metrics: memory-heap-used-baseline,memory-rss-baseline,instance-ai-heap-used-baseline,instance-ai-rss-baseline,docker-image-size-n8n,docker-image-size-runners secrets: inherit diff --git a/packages/testing/playwright/tests/performance/memory-consumption-instance-ai.spec.ts b/packages/testing/playwright/tests/performance/memory-consumption-instance-ai.spec.ts new file mode 100644 index 00000000000..947931761c5 --- /dev/null +++ b/packages/testing/playwright/tests/performance/memory-consumption-instance-ai.spec.ts @@ -0,0 +1,53 @@ +import { test, expect } from '../../fixtures/base'; +import { attachMetric, getStableHeap } from '../../utils/performance-helper'; + +test.use({ + capability: { + resourceQuota: { memory: 0.75, cpu: 0.5 }, + services: ['victoriaLogs', 'victoriaMetrics', 'vector'], + env: { + N8N_ENABLED_MODULES: 'instance-ai', + N8N_INSTANCE_AI_MODEL: 'anthropic/claude-sonnet-4-6', + N8N_INSTANCE_AI_MODEL_API_KEY: 'fake-key', + }, + }, +}); + +test.describe( + 'Instance AI Memory Consumption @capability:observability', + { + annotation: [{ type: 'owner', description: 'Catalysts' }], + }, + () => { + test('Idle baseline with Instance AI module loaded', async ({ + n8nContainer, + services, + }, testInfo) => { + const obs = services.observability; + + const result = await getStableHeap(n8nContainer.baseUrl, obs.metrics); + + await attachMetric(testInfo, 'instance-ai-heap-used-baseline', result.heapUsedMB, 'MB'); + await attachMetric(testInfo, 'instance-ai-heap-total-baseline', result.heapTotalMB, 'MB'); + await attachMetric(testInfo, 'instance-ai-rss-baseline', result.rssMB, 'MB'); + await attachMetric(testInfo, 'instance-ai-pss-baseline', result.pssMB ?? 0, 'MB'); + await attachMetric( + testInfo, + 'instance-ai-non-heap-overhead-baseline', + result.nonHeapOverheadMB, + 'MB', + ); + + expect(result.heapUsedMB).toBeGreaterThan(0); + expect(result.heapTotalMB).toBeGreaterThan(0); + expect(result.rssMB).toBeGreaterThan(0); + + console.log( + `[INSTANCE AI IDLE] Heap used: ${result.heapUsedMB.toFixed(1)} MB | ` + + `Heap total: ${result.heapTotalMB.toFixed(1)} MB | ` + + `RSS: ${result.rssMB.toFixed(1)} MB | ` + + `Non-heap overhead: ${result.nonHeapOverheadMB.toFixed(1)} MB`, + ); + }); + }, +);