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);