| Users/Requests | Trace Volume | Storage Needs | Processing Load | Visualization Complexity |
|---|---|---|---|---|
| 100 users | Low (few traces/sec) | Small (MBs/day) | Single collector handles | Simple UI, few traces |
| 10K users | Moderate (hundreds traces/sec) | GBs/day | Multiple collectors needed | UI supports filtering, sampling |
| 1M users | High (thousands traces/sec) | TBs/month | Distributed collectors, storage clusters | Advanced querying, sampling, aggregation |
| 100M users | Very High (hundreds K traces/sec) | Petabytes/year | Highly distributed, sharded storage, autoscaling | AI-assisted analysis, anomaly detection |
Distributed tracing in HLD - Scalability & System Analysis
The first bottleneck is the trace data ingestion and storage. As user requests grow, the volume of trace data increases rapidly. A single collector or storage node cannot handle the write throughput and storage demands. This causes delays or data loss.
- Horizontal scaling: Add more trace collectors and storage nodes to distribute load.
- Sampling: Collect only a subset of traces to reduce volume.
- Aggregation: Summarize trace data to reduce storage and processing.
- Sharding: Partition trace data by service or time to scale storage.
- Compression: Compress trace data before storage to save space.
- CDN/Edge: Use edge collectors near services to reduce network load.
- Asynchronous processing: Buffer and batch trace data to smooth spikes.
Assuming 1M users generating 1000 traces/sec, each trace ~10KB:
- Data ingestion: 1000 traces/sec * 10KB = ~10MB/sec (~80Mbps)
- Storage per day: 10MB/sec * 86400 sec = ~864GB/day
- Storage per month: ~25TB
- Collector servers: Each handles ~5000 traces/sec, so 1 server can handle ingestion load.
- Storage cluster: Needs to support ~10K writes/sec with replication.
Start by explaining what distributed tracing is and why it matters. Then discuss how trace volume grows with users and requests. Identify the bottleneck in ingestion and storage. Propose scaling solutions like sampling and horizontal scaling. Mention trade-offs like data loss vs cost. Finally, discuss monitoring and alerting for trace system health.
Your trace database handles 1000 queries per second (QPS). Traffic grows 10x to 10,000 QPS. What do you do first and why?
Answer: Implement sampling to reduce trace volume or add read replicas and shard storage to distribute load. This prevents overload and maintains performance.
Practice
TraceID and spans are used to:Solution
Step 1: Understand distributed tracing basics
Distributed tracing helps track how a request flows through different parts of a system.Step 2: Identify the role of TraceID and spans
TraceID links all parts of a request, and spans represent each step or service involved.Final Answer:
Track requests as they move through multiple services -> Option CQuick Check:
Distributed tracing = Track requests [OK]
- Confusing tracing with data storage
- Mixing tracing with load balancing
- Thinking tracing encrypts data
Solution
Step 1: Identify correct data format for spans
Spans are usually represented as structured data like JSON objects with keys and values.Step 2: Compare options
{ "traceId": "abc123", "spanId": "xyz789", "operation": "db_query" } shows a JSON object with clear keys for traceId, spanId, and operation, which is standard.Final Answer:
{ "traceId": "abc123", "spanId": "xyz789", "operation": "db_query" } -> Option BQuick Check:
Span = JSON object with keys [OK]
- Using arrays instead of objects
- Using plain strings without structure
- Using XML tags incorrectly
{"traceId": "t1", "spans": [{"spanId": "s1", "parentId": null, "operation": "frontend"}, {"spanId": "s2", "parentId": "s1", "operation": "backend"}, {"spanId": "s3", "parentId": "s2", "operation": "db_query"}]}What is the correct order of operations for this request?
Solution
Step 1: Analyze parent-child relationships
The span with parentId null is the root: frontend (s1). Backend (s2) is child of frontend, and db_query (s3) is child of backend.Step 2: Determine operation order
Request flows from frontend to backend to db_query following parent-child links.Final Answer:
frontend -> backend -> db_query -> Option AQuick Check:
Parent-child order = frontend to db_query [OK]
- Ignoring parentId null as root
- Reversing operation order
- Mixing span order in array with execution order
traceId values. What is the most likely cause?Solution
Step 1: Understand traceId propagation
TraceId must be passed along all services handling the request to link spans correctly.Step 2: Identify cause of missing traceId
If traceId is missing, it usually means the tracing library or instrumentation did not forward it properly.Final Answer:
The tracing library failed to propagate the traceId across services -> Option AQuick Check:
Missing traceId = propagation failure [OK]
- Blaming storage or network issues
- Confusing authentication with tracing
- Assuming traceId is optional
Solution
Step 1: Consider scalability challenges
Tracing every request fully creates huge data and overhead, which is not scalable for hundreds of services.Step 2: Evaluate best practices
Sampling reduces data volume by tracing only some requests, and scalable backends handle storage efficiently.Step 3: Assess other options
Synchronous sending blocks requests, and local storage prevents global analysis.Final Answer:
Use sampling to trace only a subset of requests and store spans in a scalable backend -> Option DQuick Check:
Sampling + scalable storage = scalable tracing [OK]
- Tracing all requests causing overload
- Synchronous sending blocking services
- Not aggregating trace data centrally
Ready to prove it?
Pass the test and this pattern moves unknown
