From d1ea9e9acfef308fedd1919939168b55282cd1cf Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Fri, 14 Nov 2025 18:52:43 +0100 Subject: [PATCH 1/3] fix(core): Ensure metrics past MAX_METRIC_BUFFER_SIZE are not swallowed From f0737fa81950e8690eb119749c943366ff898b29 Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Fri, 14 Nov 2025 18:52:57 +0100 Subject: [PATCH 2/3] Add test --- packages/core/test/lib/metrics/internal.test.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/test/lib/metrics/internal.test.ts b/packages/core/test/lib/metrics/internal.test.ts index d9d123b63e99..3e479e282a0c 100644 --- a/packages/core/test/lib/metrics/internal.test.ts +++ b/packages/core/test/lib/metrics/internal.test.ts @@ -256,7 +256,10 @@ describe('_INTERNAL_captureMetric', () => { // Add one more to trigger flush _INTERNAL_captureMetric({ type: 'counter', name: 'trigger.flush', value: 999 }, { scope }); - expect(_INTERNAL_getMetricBuffer(client)).toEqual([]); + // After flushing the 1000 metrics, the new metric starts a fresh buffer with 1 item + const buffer = _INTERNAL_getMetricBuffer(client); + expect(buffer).toHaveLength(1); + expect(buffer?.[0]?.name).toBe('trigger.flush'); }); it('does not flush metrics buffer when it is empty', () => { From 1a4e02a6fc0ff44051171b63cf0e8c54083d436e Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Fri, 14 Nov 2025 18:55:37 +0100 Subject: [PATCH 3/3] Ensure metric that triggers flush on MAX_METRIC_BUFFER_SIZE is not swallowed --- packages/core/src/metrics/internal.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/src/metrics/internal.ts b/packages/core/src/metrics/internal.ts index 5371ecba8dfd..e94da7f36cd8 100644 --- a/packages/core/src/metrics/internal.ts +++ b/packages/core/src/metrics/internal.ts @@ -88,14 +88,16 @@ function setMetricAttribute( */ export function _INTERNAL_captureSerializedMetric(client: Client, serializedMetric: SerializedMetric): void { const bufferMap = _getBufferMap(); - const metricBuffer = _INTERNAL_getMetricBuffer(client); + if (metricBuffer === undefined) { bufferMap.set(client, [serializedMetric]); } else { - bufferMap.set(client, [...metricBuffer, serializedMetric]); if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) { _INTERNAL_flushMetricsBuffer(client, metricBuffer); + bufferMap.set(client, [serializedMetric]); + } else { + bufferMap.set(client, [...metricBuffer, serializedMetric]); } } }