Audit Log Service · View 09 of 40 · 3 · Structure
Decisions
- One namespace and one managed identity per plane, with no group nesting between the Entra groups that back them. The namespace boundary is doing real authorization work, not just tidying.
- The ingest API is Rust because the p99 budget is 150 ms including a secret scan and a Kafka round trip, and a garbage-collected tail is most of that budget.
- The chain service is leader-elected per shard rather than singleton: 500 tenant chains extend in parallel, which is what makes 100 k events/s sealing possible at all.
Sizing
- 24 ingest pods sustain 25 k/s steady with headroom to 100 k/s on 3× horizontal scale; Envoy terminates mTLS ahead of them.
- 12 Kafka brokers on D16s v5, RF 3 across three zones, 240 partitions, 6 h local retention with tiered storage extending the replay window to 72 h.
- 16 ClickHouse nodes on E16ds v5, NVMe for the hot 30 days and Blob-backed storage beyond it.
Assumptions
- Strimzi-managed Kafka rather than Event Hubs: the durability contract needed here is acks=all with min.insync.replicas=2 and an explicitly controlled retention, and owning the broker is the cheaper way to own that contract. Event Hubs Premium remains the managed fallback if the operational load proves unwelcome.