{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"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-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":36,"y":32,"width":390,"height":644.4,"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":56,"y":50,"width":350,"height":608.4,"fontSize":18,"fontFamily":1,"text":"Push (Datadog / StatsD /\nOpenTelemetry)\n\nAgent on each host → pushes metrics\nto ingestion gateway\n\nHost Agent ---(HTTPS/gRPC)--->\nIngestion Gateway ---> Kafka\n\nPros:\n+ Works behind firewalls/NAT\n(outbound only)\n+ Agent controls batching and\ncompression\n+ Supports short-lived processes\n(batch jobs, serverless)\n+ Event-driven: can send on every\nmetric collection\n\nCons:\n- If ingestion gateway is down,\nagent must buffer\n- More complex agent (retry logic,\nbackoff)\n- Rate limiting at gateway required\nper tenant","originalText":"Push (Datadog / StatsD /\nOpenTelemetry)\n\nAgent on each host → pushes metrics\nto ingestion gateway\n\nHost Agent ---(HTTPS/gRPC)--->\nIngestion Gateway ---> Kafka\n\nPros:\n+ Works behind firewalls/NAT\n(outbound only)\n+ Agent controls batching and\ncompression\n+ Supports short-lived processes\n(batch jobs, serverless)\n+ Event-driven: can send on every\nmetric collection\n\nCons:\n- If ingestion gateway is down,\nagent must buffer\n- More complex agent (retry logic,\nbackoff)\n- Rate limiting at gateway required\nper tenant","textAlign":"center","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"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-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":466,"y":32,"width":390,"height":667.8000000000001,"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":486,"y":50,"width":350,"height":631.8000000000001,"fontSize":18,"fontFamily":1,"text":"Pull (Prometheus)\n\nPrometheus server ---(HTTP\nscrape)---> Target /metrics endpoint\n\nScrape every 15s from known targets\nvia service discovery\n\nPros:\n+ Central server controls collection\nrate\n+ Easier debugging (can manually\ncurl /metrics)\n+ No agent needed (app just\nexposes HTTP endpoint)\n+ Simple to detect \"target down\"\n(scrape fails)\n\nCons:\n- Must know all targets (service\ndiscovery needed)\n- Doesn't work behind NAT/firewall\neasily\n- Short-lived jobs may exit before\nbeing scraped\n- Scaling: one Prometheus server can\nscrape ~100K targets","originalText":"Pull (Prometheus)\n\nPrometheus server ---(HTTP\nscrape)---> Target /metrics endpoint\n\nScrape every 15s from known targets\nvia service discovery\n\nPros:\n+ Central server controls collection\nrate\n+ Easier debugging (can manually\ncurl /metrics)\n+ No agent needed (app just\nexposes HTTP endpoint)\n+ Simple to detect \"target down\"\n(scrape fails)\n\nCons:\n- Must know all targets (service\ndiscovery needed)\n- Doesn't work behind NAT/firewall\neasily\n- Short-lived jobs may exit before\nbeing scraped\n- Scaling: one Prometheus server can\nscrape ~100K targets","textAlign":"center","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"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-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":36,"y":739.8000000000001,"width":735.19358,"height":102.3,"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":56,"y":757.8000000000001,"width":695.19358,"height":66.3,"fontSize":17,"fontFamily":1,"text":"Recommendation: Push model for SaaS platform (multi-tenant, firewall-friendly)\nPull model internally for Kubernetes (Prometheus + service discovery)\nSupport both: push API + Prometheus remote-write adapter","originalText":"Recommendation: Push model for SaaS platform (multi-tenant, firewall-friendly)\nPull model internally for Kubernetes (Prometheus + service discovery)\nSupport both: push API + Prometheus remote-write adapter","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}