From 18d0d424fb495041bf44fe1a176129e58e51855a Mon Sep 17 00:00:00 2001 From: autocommit Date: Wed, 10 Jun 2026 06:01:33 -0700 Subject: [PATCH] =?UTF-8?q?feat(aggregation):=20=E2=9C=A8=20Add=20sessionI?= =?UTF-8?q?d=20extraction=20and=20propagation=20logic=20for=20session=20co?= =?UTF-8?q?rrelation=20in=20AggregationService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- services/processor/src/processors/aggregation.service.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/services/processor/src/processors/aggregation.service.ts b/services/processor/src/processors/aggregation.service.ts index 1613414..010c19b 100644 --- a/services/processor/src/processors/aggregation.service.ts +++ b/services/processor/src/processors/aggregation.service.ts @@ -54,7 +54,14 @@ export class AggregationService implements OnModuleDestroy { } async processEvent(event: ProcessableEvent): Promise { - const { eventType, timestamp, userId, properties } = event; + const { eventType, timestamp, sessionId, userId, properties } = event; + + // Synthetic canary events (quinn-analytics-canary.timer) exist to prove + // the tracker→edge→relay→collector→raw_events chain end-to-end. They must + // reach raw_events (that IS the proof) but never count toward metrics. + if (sessionId?.startsWith('canary-')) { + return; + } const hourBucket = this.getTimeBucket(timestamp, TimeGranularity.HOUR); const dayBucket = this.getTimeBucket(timestamp, TimeGranularity.DAY);