diff --git a/CHANGELOG.md b/CHANGELOG.md index 06c61339..cdc3fc6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If - DANE: Verify DNSSEC is supported by the resolver before attempting to validate TLSA records. - TLS: Update search index when file-backed certificates are refreshed. - JMAP: `Principal/query` returns broad results when a `name` or `email` filter cannot be resolved. +- Webhooks: event IDs collide for same event type emitted in the same second. ## [0.16.10] - 2026-06-21 diff --git a/crates/trc/src/serializers/json.rs b/crates/trc/src/serializers/json.rs index fed7ff7a..96f79f4e 100644 --- a/crates/trc/src/serializers/json.rs +++ b/crates/trc/src/serializers/json.rs @@ -12,6 +12,9 @@ use serde::{ Serialize, Serializer, ser::{SerializeMap, SerializeSeq}, }; +use std::sync::atomic::{AtomicU64, Ordering}; + +static EVENT_ID_COUNTER: AtomicU64 = AtomicU64::new(0); struct Keys<'x> { keys: &'x [(Key, Value)], @@ -83,7 +86,12 @@ impl>> Serialize for JsonEventSerializer { if self.with_id { map.serialize_entry( "id", - &format!("{}{}", event.inner.timestamp, event.inner.typ.to_id()), + &format!( + "{}{}{}", + event.inner.timestamp, + EVENT_ID_COUNTER.fetch_add(1, Ordering::Relaxed), + event.inner.typ.to_id() + ), )?; } if self.with_description {