{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"angle":0,"strokeColor":"#628572","backgroundColor":"#edf5ee","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-1"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":30,"y":30,"width":420,"height":68,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-1","type":"text","seed":114,"x":50,"y":52.3,"width":380,"height":23.400000000000002,"fontSize":18,"fontFamily":1,"text":"Tenant Isolation in a Shared Platform","originalText":"Tenant Isolation in a Shared Platform","textAlign":"left","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#a68a53","backgroundColor":"#fff7e6","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-3"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":30,"y":123,"width":634.2084400000001,"height":153,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-3","type":"text","seed":260,"x":50,"y":141,"width":594.2084400000001,"height":117,"fontSize":18,"fontFamily":1,"text":"Ingestion isolation:\n• Per-tenant rate limits (enforced at gateway)\n• Per-tenant Kafka partitions (noisy tenant can't slow others)\n• Per-tenant metrics quota (max unique time-series count)\n→ Prevents \"cardinality explosion\" from one tenant","originalText":"Ingestion isolation:\n• Per-tenant rate limits (enforced at gateway)\n• Per-tenant Kafka partitions (noisy tenant can't slow others)\n• Per-tenant metrics quota (max unique time-series count)\n→ Prevents \"cardinality explosion\" from one tenant","textAlign":"left","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#9180ac","backgroundColor":"#f4effb","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-5"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":30,"y":301,"width":619.8412,"height":129.60000000000002,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-5","type":"text","seed":406,"x":50,"y":319,"width":579.8412,"height":93.60000000000001,"fontSize":18,"fontFamily":1,"text":"Storage isolation:\n• Tenant_id embedded in series_id hashing\n• Data physically co-located per tenant (locality for queries)\n• OR: dedicated storage nodes for large enterprise tenants","originalText":"Storage isolation:\n• Tenant_id embedded in series_id hashing\n• Data physically co-located per tenant (locality for queries)\n• OR: dedicated storage nodes for large enterprise tenants","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-4"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-7"}],"updated":0,"link":null,"locked":false,"id":"shape-6","type":"rectangle","seed":479,"x":30,"y":455.6,"width":613.0296400000001,"height":153,"customData":{"revealStep":4}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-4"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-7","type":"text","seed":552,"x":50,"y":473.6,"width":573.0296400000001,"height":117,"fontSize":18,"fontFamily":1,"text":"Query isolation:\n• Per-tenant query concurrency limits\n• Per-tenant query timeout (prevent one tenant from hogging\nquery nodes with expensive dashboards)\n• Resource quotas: max series scanned per query","originalText":"Query isolation:\n• Per-tenant query concurrency limits\n• Per-tenant query timeout (prevent one tenant from hogging\nquery nodes with expensive dashboards)\n• Resource quotas: max series scanned per query","textAlign":"left","verticalAlign":"middle","containerId":"shape-6","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":4}},{"angle":0,"strokeColor":"#628572","backgroundColor":"#edf5ee","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-5"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-9"}],"updated":0,"link":null,"locked":false,"id":"shape-8","type":"rectangle","seed":625,"x":30,"y":633.6,"width":592.4232400000001,"height":153,"customData":{"revealStep":5}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-5"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-9","type":"text","seed":698,"x":50,"y":651.6,"width":552.4232400000001,"height":117,"fontSize":18,"fontFamily":1,"text":"Billing metering:\n• Count: ingested data points per hour per tenant\n• Count: unique active time-series per tenant\n• Count: custom metrics vs infrastructure metrics\n• These counters themselves are stored as time-series (!)","originalText":"Billing metering:\n• Count: ingested data points per hour per tenant\n• Count: unique active time-series per tenant\n• Count: custom metrics vs infrastructure metrics\n• These counters themselves are stored as time-series (!)","textAlign":"left","verticalAlign":"middle","containerId":"shape-8","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":5}},{"angle":0,"strokeColor":"#a68a53","backgroundColor":"#fff7e6","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-6"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-11"}],"updated":0,"link":null,"locked":false,"id":"shape-10","type":"rectangle","seed":771,"x":30,"y":811.6,"width":646.49596,"height":223.20000000000002,"customData":{"revealStep":6}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-6"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-11","type":"text","seed":844,"x":50,"y":829.6,"width":606.49596,"height":187.20000000000002,"fontSize":18,"fontFamily":1,"text":"Cardinality explosion protection:\nProblem: Tenant tags a metric with user_id (10M unique values)\n→ 10M unique time-series from ONE metric\n→ Blows up storage and query costs\nSolution:\nMonitor unique series count per metric per tenant\nAlert at 10K unique series → warn tenant\nHard limit at 100K → reject new series with 429","originalText":"Cardinality explosion protection:\nProblem: Tenant tags a metric with user_id (10M unique values)\n→ 10M unique time-series from ONE metric\n→ Blows up storage and query costs\nSolution:\nMonitor unique series count per metric per tenant\nAlert at 10K unique series → warn tenant\nHard limit at 100K → reject new series with 429","textAlign":"left","verticalAlign":"middle","containerId":"shape-10","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":6}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}