From ba558eb2b6dae95430f3deb9772e459e4eb0a8dd Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 22 Apr 2026 09:05:28 +0200 Subject: [PATCH] test(node-core): Fix minute-boundary race in session-aggregate tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SDK buckets session counts by minute-rounded timestamp (see `packages/node-core/src/integrations/http/httpServerIntegration.ts` lines 290-292). When the test's sequential requests straddle a minute boundary, the emitted payload splits across two aggregate buckets and the existing `aggregates: [{...}]` assertion fails — a pure timing race, not a code bug. Replace the hard-coded single-bucket assertion with an inline reduce that sums `exited`/`errored`/`crashed` across all returned buckets and asserts on the totals, matching the SDK's real behaviour. Applies to all 5 session-aggregate integration tests (2 in node-core, 3 in node). Two of them already flake (#20283, #20436); the other three share the same pattern and are preventively fixed. Closes #20283 Closes #20436 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../errored-session-aggregate/test.ts | 19 ++++++++++-------- .../sessions/exited-session-aggregate/test.ts | 18 ++++++++++------- .../crashed-session-aggregate/test.ts | 19 ++++++++++-------- .../errored-session-aggregate/test.ts | 20 ++++++++++--------- .../sessions/exited-session-aggregate/test.ts | 18 ++++++++++------- 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/dev-packages/node-core-integration-tests/suites/sessions/errored-session-aggregate/test.ts b/dev-packages/node-core-integration-tests/suites/sessions/errored-session-aggregate/test.ts index ba8110a62675..4ff4dea6d5cd 100644 --- a/dev-packages/node-core-integration-tests/suites/sessions/errored-session-aggregate/test.ts +++ b/dev-packages/node-core-integration-tests/suites/sessions/errored-session-aggregate/test.ts @@ -10,14 +10,17 @@ test('should aggregate successful, crashed and erroneous sessions', async () => .ignore('transaction', 'event') .unignore('sessions') .expect({ - sessions: { - aggregates: [ - { - started: expect.any(String), - exited: 2, - errored: 1, - }, - ], + sessions: agg => { + // Sessions are bucketed by minute; tolerate splits across a minute boundary by summing. + const totals = agg.aggregates.reduce( + (acc, b) => ({ + exited: acc.exited + (b.exited ?? 0), + errored: acc.errored + (b.errored ?? 0), + crashed: acc.crashed + (b.crashed ?? 0), + }), + { exited: 0, errored: 0, crashed: 0 }, + ); + expect(totals).toEqual({ exited: 2, errored: 1, crashed: 0 }); }, }) .start(); diff --git a/dev-packages/node-core-integration-tests/suites/sessions/exited-session-aggregate/test.ts b/dev-packages/node-core-integration-tests/suites/sessions/exited-session-aggregate/test.ts index 228ee9a98643..152861e87765 100644 --- a/dev-packages/node-core-integration-tests/suites/sessions/exited-session-aggregate/test.ts +++ b/dev-packages/node-core-integration-tests/suites/sessions/exited-session-aggregate/test.ts @@ -10,13 +10,17 @@ test('should aggregate successful sessions', async () => { .ignore('transaction', 'event') .unignore('sessions') .expect({ - sessions: { - aggregates: [ - { - started: expect.any(String), - exited: 3, - }, - ], + sessions: agg => { + // Sessions are bucketed by minute; tolerate splits across a minute boundary by summing. + const totals = agg.aggregates.reduce( + (acc, b) => ({ + exited: acc.exited + (b.exited ?? 0), + errored: acc.errored + (b.errored ?? 0), + crashed: acc.crashed + (b.crashed ?? 0), + }), + { exited: 0, errored: 0, crashed: 0 }, + ); + expect(totals).toEqual({ exited: 3, errored: 0, crashed: 0 }); }, }) .start(); diff --git a/dev-packages/node-integration-tests/suites/sessions/crashed-session-aggregate/test.ts b/dev-packages/node-integration-tests/suites/sessions/crashed-session-aggregate/test.ts index 712eeffcdeb3..ad8166e3163c 100644 --- a/dev-packages/node-integration-tests/suites/sessions/crashed-session-aggregate/test.ts +++ b/dev-packages/node-integration-tests/suites/sessions/crashed-session-aggregate/test.ts @@ -10,14 +10,17 @@ test('should aggregate successful and crashed sessions', async () => { .ignore('transaction', 'event') .unignore('sessions') .expect({ - sessions: { - aggregates: [ - { - started: expect.any(String), - exited: 2, - crashed: 1, - }, - ], + sessions: agg => { + // Sessions are bucketed by minute; tolerate splits across a minute boundary by summing. + const totals = agg.aggregates.reduce( + (acc, b) => ({ + exited: acc.exited + (b.exited ?? 0), + errored: acc.errored + (b.errored ?? 0), + crashed: acc.crashed + (b.crashed ?? 0), + }), + { exited: 0, errored: 0, crashed: 0 }, + ); + expect(totals).toEqual({ exited: 2, errored: 0, crashed: 1 }); }, }) .start(); diff --git a/dev-packages/node-integration-tests/suites/sessions/errored-session-aggregate/test.ts b/dev-packages/node-integration-tests/suites/sessions/errored-session-aggregate/test.ts index 4f35e6259697..d2c83f5d30fa 100644 --- a/dev-packages/node-integration-tests/suites/sessions/errored-session-aggregate/test.ts +++ b/dev-packages/node-integration-tests/suites/sessions/errored-session-aggregate/test.ts @@ -10,15 +10,17 @@ test('should aggregate successful, crashed and erroneous sessions', async () => .ignore('transaction', 'event') .unignore('sessions') .expect({ - sessions: { - aggregates: [ - { - started: expect.any(String), - exited: 1, - crashed: 1, - errored: 1, - }, - ], + sessions: agg => { + // Sessions are bucketed by minute; tolerate splits across a minute boundary by summing. + const totals = agg.aggregates.reduce( + (acc, b) => ({ + exited: acc.exited + (b.exited ?? 0), + errored: acc.errored + (b.errored ?? 0), + crashed: acc.crashed + (b.crashed ?? 0), + }), + { exited: 0, errored: 0, crashed: 0 }, + ); + expect(totals).toEqual({ exited: 1, errored: 1, crashed: 1 }); }, }) .start(); diff --git a/dev-packages/node-integration-tests/suites/sessions/exited-session-aggregate/test.ts b/dev-packages/node-integration-tests/suites/sessions/exited-session-aggregate/test.ts index 228ee9a98643..152861e87765 100644 --- a/dev-packages/node-integration-tests/suites/sessions/exited-session-aggregate/test.ts +++ b/dev-packages/node-integration-tests/suites/sessions/exited-session-aggregate/test.ts @@ -10,13 +10,17 @@ test('should aggregate successful sessions', async () => { .ignore('transaction', 'event') .unignore('sessions') .expect({ - sessions: { - aggregates: [ - { - started: expect.any(String), - exited: 3, - }, - ], + sessions: agg => { + // Sessions are bucketed by minute; tolerate splits across a minute boundary by summing. + const totals = agg.aggregates.reduce( + (acc, b) => ({ + exited: acc.exited + (b.exited ?? 0), + errored: acc.errored + (b.errored ?? 0), + crashed: acc.crashed + (b.crashed ?? 0), + }), + { exited: 0, errored: 0, crashed: 0 }, + ); + expect(totals).toEqual({ exited: 3, errored: 0, crashed: 0 }); }, }) .start();