← Uber Interview Insights

Uber·Software Engineer·Onsite - System Design / Architecture·Senior

SeniorPrefer not to say
Apr 2026

Summary

Uber system design round focused entirely on building a distributed logging system for a massive microservices platform. Multi-part question that went deep into ingestion, storage tiering, and operational concerns. Pretty grueling but the structure helped.

Questions Asked (9)

Q1

Design a distributed logging system for a large microservices platform handling millions of log events per second across multiple regions, from ingestion all the way to searchable storage.

System DesignTechnical Trade-offs
Author's notes

This is the core question and it's massive.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements (scale, latency, retention, query patterns) and then walk through the end-to-end pipeline: ingestion, buffering, processing, storage, and querying. Emphasize trade-offs at each stage, such as durability vs. latency and cost vs. query flexibility, and justify choices based on Uber's scale and multi-region needs.

Pro tip: Proactively discuss failure modes and how the system degrades gracefully—interviewers at Uber value reliability and operational maturity as much as raw scale. Also, mention concrete technologies (e.g., Kafka, Flink, Elasticsearch) but focus on why they fit, not just name-dropping.

1. Clarify Requirements and Constraints

Ask about scale (events/sec, data volume), latency requirements (ingest-to-search), retention, query patterns, and multi-region consistency needs. Establish what 'searchable' means (full-text, structured queries, real-time vs. batch).

2. Design Ingestion and Buffering

Propose a scalable ingestion layer (e.g., HTTP/gRPC endpoints, agents) that writes to a distributed message queue like Kafka for durability and decoupling. Discuss partitioning, replication, and backpressure handling.

3. Design Processing and Enrichment

Use stream processing (e.g., Flink, Spark Streaming) to parse, enrich, filter, and route logs. Address exactly-once semantics, windowing, and handling of malformed data.

4. Design Storage and Indexing

Choose storage tiers: hot (Elasticsearch/OpenSearch for real-time search), warm (object storage like S3 for batch analytics), and cold (archival). Discuss indexing strategies, sharding, and retention policies.

5. Design Query and Multi-Region Strategy

Provide a query layer (e.g., Kibana, custom API) that federates across regions. Discuss data replication, consistency models, and how to handle cross-region searches with acceptable latency.

Key Points to Mention

  • Partitioning and replication strategies for Kafka to handle millions of events/sec and ensure durability.
  • Trade-offs between real-time indexing (Elasticsearch) and cost-effective batch storage (S3) for different query needs.
  • Exactly-once processing semantics and how to handle duplicate or lost logs in stream processing.
  • Multi-region deployment: data sovereignty, replication lag, and query federation across regions.
  • Backpressure and load shedding mechanisms to prevent system overload during traffic spikes.
  • Retention policies and tiered storage to balance cost and compliance requirements.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How does a log line travel from an application process to a durable buffer, and what happens on the host agent side in terms of batching and back-pressure?

System DesignTechnical Trade-offs
Author's notes

I knew the general shape here: local agent, batching, a broker tier.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Structure your answer as a journey: start with the application emitting a log line, then trace it through the logging library, local agent, and into a durable buffer. Emphasize the host agent's role in batching and back-pressure, and discuss trade-offs like latency vs. throughput and reliability vs. resource usage.

Pro tip: Mention that back-pressure must be propagated end-to-end, and that the agent often uses a combination of in-memory queues and disk-based buffers to handle bursts while maintaining durability. Also, highlight that batching improves efficiency but can increase latency, so tuning is critical.

1. Application Logging

Explain how the application generates a log line using a logging library (e.g., log4j, zap) and writes it to a local sink, such as stdout or a Unix domain socket, typically asynchronously to avoid blocking the application.

2. Host Agent Ingestion

Describe how the host agent (e.g., Fluentd, Filebeat, or a custom agent) collects logs from the sink, parses them, and applies initial processing like filtering or enrichment.

3. Batching and Buffering

Detail how the agent batches log lines based on size or time thresholds, and buffers them in memory and/or on disk to handle temporary downstream unavailability or traffic spikes.

4. Back-Pressure Mechanisms

Explain how back-pressure is applied when the buffer is full or the downstream is slow: the agent may slow down ingestion, drop logs, or block the application, depending on configuration and reliability requirements.

5. Durable Buffer and Delivery

Describe how batched logs are sent to a durable buffer (e.g., Kafka, a distributed queue) with acknowledgments, and how retries and at-least-once semantics ensure durability.

Key Points to Mention

  • Asynchronous logging in the application to minimize performance impact
  • Host agent architecture: input plugins, buffers, and output plugins
  • Batching strategies: size-based, time-based, and adaptive batching
  • Back-pressure handling: blocking, dropping, or sampling logs
  • Durability guarantees: disk-based buffers, replication, and acknowledgments
  • Trade-offs: latency vs. throughput, resource usage vs. reliability

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

How would you design the storage and indexing layer, including how you tier logs from hot searchable storage to cheap long-term archival?

System DesignData Modeling
Author's notes

This part went better.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements: scale (e.g., petabytes/day), query patterns (search by trace ID, service, time range), retention needs, and cost constraints. Then propose a tiered architecture: hot tier (e.g., Elasticsearch) for recent logs with fast indexing and search, warm tier (e.g., object storage with columnar format) for older logs with slower but cheaper access, and cold tier (e.g., Glacier) for archival. Explain data lifecycle policies, indexing strategies (e.g., time-based indices, sharding), and how to handle schema evolution and efficient querying across tiers.

Pro tip: Emphasize the trade-off between cost and query latency, and propose a unified query layer that abstracts tiering from users. Mention Uber's specific challenges like high cardinality and the need for real-time debugging, and reference existing systems like Uber's Logging pipeline (e.g., using Kafka, Flink, and HDFS) to show domain awareness.

1. Clarify Requirements and Constraints

Ask about data volume, ingestion rate, query patterns (e.g., full-text search, aggregations), latency requirements, retention period, and budget. Understand what 'hot' means (e.g., last 7 days) and compliance needs.

2. Design Hot Tier for Search and Real-time Access

Propose a distributed search engine like Elasticsearch or ClickHouse for recent logs, with time-based indices, sharding, and replication. Discuss indexing strategies (e.g., inverted index, columnar) and how to handle high write throughput.

3. Design Warm and Cold Tiers for Cost-Effective Storage

Use object storage (e.g., S3) with columnar formats (Parquet) for warm tier, and archival storage (e.g., Glacier) for cold tier. Explain compression, partitioning by time, and metadata management for efficient retrieval.

4. Implement Tiering and Lifecycle Policies

Describe automated policies to move data from hot to warm to cold based on age or access patterns. Discuss how to handle queries that span tiers, possibly using a query federation layer or pre-computed indexes.

5. Address Operational Concerns and Trade-offs

Cover monitoring, cost optimization, data durability, and disaster recovery. Discuss trade-offs between latency, cost, and complexity, and how to evolve the system as needs change.

Key Points to Mention

  • Time-based partitioning and indexing (e.g., daily indices) to simplify retention and querying.
  • Use of columnar storage (Parquet/ORC) for warm tier to enable efficient compression and predicate pushdown.
  • Query federation or a unified query interface to abstract tiering from users.
  • Data lifecycle management with automated policies (e.g., S3 Lifecycle, Elasticsearch ILM).
  • Handling high cardinality and schema evolution in logs.
  • Cost and performance trade-offs between hot, warm, and cold tiers.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

A single high-cardinality field like a unique request URL with embedded IDs is blowing up your index size. How do you detect this and what do you do about it?

System DesignRoot Cause Analysis
Author's notes

Blanked for a moment.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by explaining how you would detect the issue using index metrics and cardinality analysis, then propose a multi-pronged solution: normalize the field, use a different data structure, or apply filtering. Emphasize the trade-offs and the importance of monitoring to prevent recurrence.

Pro tip: Mention that high-cardinality fields often stem from poor data modeling; consider using a hash or a separate index for such fields. Also, highlight the importance of setting up alerts on index size and cardinality to catch issues early.

1. Detection

Use monitoring tools to track index size, cardinality, and query performance. Identify fields with high cardinality by analyzing index statistics or using cardinality aggregation.

2. Root Cause Analysis

Determine why the field is high-cardinality: is it a unique identifier, timestamp, or URL with embedded IDs? Assess the impact on storage and query performance.

3. Solution Design

Evaluate options: normalize the data (e.g., extract IDs), use a different data type (e.g., keyword vs. text), apply filtering, or use a separate index. Consider using hashing or truncation if uniqueness is not needed.

4. Implementation and Testing

Implement the chosen solution, test for performance improvements, and ensure no functionality is broken. Monitor the index size and query latency post-change.

5. Prevention

Set up alerts for index size and cardinality thresholds. Educate teams on data modeling best practices to avoid similar issues.

Key Points to Mention

  • Cardinality aggregation to measure distinct values
  • Index size and memory usage monitoring
  • Normalization vs. denormalization trade-offs
  • Using keyword fields with doc_values for sorting/aggregations
  • Hashing or truncating high-cardinality fields
  • Separate index or routing for high-cardinality data

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

An engineer needs to trace a single request across 30 services. What needs to be in the logging schema and transport path to make that possible, and how does it interact with sampling?

System DesignAPI & Integrations
Author's notes

Trace IDs in every log line, propagated through request context.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining the core requirements for distributed tracing: a unique trace ID propagated across all services, standardized logging with trace context, and a transport path that carries this context. Then explain how sampling decisions are made and propagated to ensure end-to-end visibility while managing overhead.

Pro tip: Emphasize that sampling must be consistent across services—once a trace is sampled, all downstream services must honor that decision—and discuss how to handle partial traces when sampling is adaptive.

1. Define the logging schema

Include a trace ID, span ID, parent span ID, service name, timestamp, and other relevant metadata in every log entry. Ensure the schema is consistent across all services.

2. Propagate context in transport

Use headers (e.g., traceparent, tracestate) or message metadata to pass trace context between services. Ensure all communication protocols (HTTP, gRPC, messaging) support this.

3. Implement sampling strategies

Decide on sampling at the trace level (head-based or tail-based). Propagate the sampling decision (e.g., via a sampled flag) so all services in the trace are consistent.

4. Handle sampling interactions

Discuss how sampling affects trace completeness and how to adjust sampling rates dynamically. Consider tail-based sampling for capturing errors or high-latency traces.

5. Ensure scalability and performance

Address overhead concerns: use efficient serialization, asynchronous logging, and sampling to reduce volume. Ensure the system can handle high throughput.

Key Points to Mention

  • Trace ID and span ID propagation across services
  • Standardized logging format (e.g., JSON) with trace context
  • Transport mechanisms: HTTP headers, gRPC metadata, message attributes
  • Sampling decision propagation (e.g., sampled flag in trace context)
  • Head-based vs. tail-based sampling trade-offs
  • Consistent sampling to avoid partial traces and ensure end-to-end visibility

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q6

A region goes fully offline for 2 hours and comes back. What happens to logs produced during the outage and how do they become searchable afterward?

System DesignTechnical Trade-offs
Author's notes

Tied back to the durability guarantees from part one.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Walk through the end-to-end logging pipeline, explaining how logs are buffered locally during the outage and then flushed, ingested, and indexed once connectivity is restored. Emphasize durability, ordering, and eventual searchability, while discussing trade-offs like backpressure and data loss prevention.

Pro tip: Mention that logs are typically written to a local disk-backed buffer (e.g., Kafka or a file-based queue) to survive restarts, and that idempotent ingestion with deduplication ensures exactly-once semantics. This shows you understand real-world failure modes beyond just 'they get sent later'.

1. Local buffering during outage

Explain that log producers write to a durable local buffer (e.g., disk-based queue or Kafka with replication) so logs are not lost when the region is offline.

2. Reconnection and flushing

Once connectivity returns, the buffer is drained and logs are sent to the central logging pipeline, often with backpressure and rate limiting to avoid overwhelming the system.

3. Ingestion and processing

The central pipeline (e.g., Kafka, Flink, or Logstash) ingests the logs, performs parsing, enrichment, and possibly deduplication or ordering based on timestamps.

4. Indexing and storage

Processed logs are written to a searchable store (e.g., Elasticsearch, ClickHouse, or a data lake) where they become available for queries.

5. Searchability and consistency

Discuss how logs become searchable after indexing, and address potential issues like out-of-order events, delayed visibility, and how to handle queries spanning the outage period.

Key Points to Mention

  • Durability: logs must be persisted locally to survive process restarts or crashes during the outage.
  • Backpressure and rate limiting: when the region comes back, a flood of logs can overwhelm the central pipeline, so throttling is needed.
  • Ordering and timestamps: logs may arrive out of order; use event-time processing and watermarking to handle this.
  • Idempotency and deduplication: ensure logs are not duplicated if retries occur during flushing.
  • Searchability latency: logs become searchable only after indexing, which may take time proportional to the backlog.
  • Trade-offs: choosing between guaranteed delivery (at-least-once) vs. exactly-once, and the impact on system complexity and latency.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q7

The business wants to cut logging costs by 40% without losing the ability to debug production incidents. What levers do you pull and how do you verify debugging capability is preserved?

Technical Trade-offsProduct Analytics & Metrics
Author's notes

Sampling debug-level logs aggressively, compressing earlier, moving to cheaper storage tiers faster, and dropping or aggregating metrics-style logs that are better served by a metrics system.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing logging as a cost-benefit trade-off: identify what debugging actually requires (e.g., request tracing, error context, latency percentiles) and then cut costs by reducing volume, not fidelity. Propose concrete levers like sampling, tiered retention, structured logging, and log level optimization, and define verification through metrics like MTTR and incident replay tests.

Pro tip: Tie every logging change to a measurable debugging outcome (e.g., MTTR, incident resolution rate) and run a canary period where you compare old vs. new logging on real incidents before full rollout.

1. Define debugging requirements

Work with incident responders to list the critical questions logs must answer during production incidents (e.g., which service failed, error type, user impact).

2. Identify cost drivers and levers

Analyze current logging costs (volume, retention, indexing) and map them to levers like sampling, log levels, structured logging, and tiered storage.

3. Design a cost-reduction plan

Propose a combination of levers that targets 40% savings while preserving the critical debugging signals identified in step 1.

4. Verify debugging capability

Define metrics (e.g., MTTR, incident resolution rate) and run controlled experiments (canary, replay past incidents) to ensure debugging is not degraded.

5. Iterate and monitor

Roll out gradually, monitor both cost and debugging metrics, and adjust the plan based on feedback from incident responders.

Key Points to Mention

  • Sampling strategies (e.g., adaptive sampling, tail-based sampling) to reduce volume while keeping errors and slow requests.
  • Log level optimization (e.g., reducing DEBUG/INFO in production, using dynamic log levels).
  • Structured logging and centralized aggregation to improve query efficiency and reduce redundant logs.
  • Tiered retention (hot vs. cold storage) and compression to cut storage costs.
  • Metrics like MTTR, incident resolution time, and error detection rate to verify debugging capability.
  • Canary deployments and A/B testing of logging changes to compare debugging effectiveness.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q8

How do you prevent one noisy service from starving other tenants in a shared logging pipeline?

System DesignTechnical Trade-offs
Author's notes

Per-tenant partitioning in the broker and rate limiting at the agent level.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing the problem as multi-tenant resource isolation in a shared logging pipeline, then propose a layered defense: admission control, per-tenant quotas, and backpressure. Emphasize trade-offs between fairness, latency, and operational complexity, and tie your answer to Uber's scale and reliability needs.

Pro tip: Mention that logging pipelines are often best-effort, so you should prioritize protecting the critical path (e.g., other tenants' logs) over guaranteeing every log line. Also, highlight the importance of observability into per-tenant usage to detect and mitigate noisy neighbors dynamically.

1. Clarify requirements and constraints

Ask about the pipeline architecture (e.g., Kafka, Fluentd, custom agents), tenant definition, SLAs, and whether logs can be dropped. This shows you avoid premature solutions.

2. Identify isolation points

Map where tenants share resources: ingestion endpoints, message queues, processing workers, and storage. Each point needs a control mechanism.

3. Design admission control and quotas

Propose per-tenant rate limits, token buckets, or concurrency caps at ingestion. Enforce quotas on bytes/events per second and burst allowances.

4. Implement backpressure and prioritization

Use bounded queues, load shedding, and priority queues to ensure one tenant cannot monopolize downstream processing. Consider fair queuing or weighted fair queuing.

5. Monitor, alert, and adapt

Instrument per-tenant metrics (ingest rate, queue depth, drop rate) and set alerts. Use dynamic quota adjustments or circuit breakers to handle spikes.

Key Points to Mention

  • Per-tenant rate limiting and quotas at ingestion (e.g., token bucket, leaky bucket).
  • Backpressure mechanisms like bounded queues and load shedding to prevent overload.
  • Fair queuing or weighted fair queuing to allocate processing capacity proportionally.
  • Isolation of resources (e.g., separate Kafka topics/partitions, dedicated worker pools) to contain blast radius.
  • Observability: per-tenant metrics, tracing, and alerting to detect noisy neighbors early.
  • Trade-offs: strict isolation vs. resource efficiency, latency vs. fairness, and complexity of dynamic quotas.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q9

How do you monitor the logging pipeline itself without depending on the very index it feeds?

System DesignRoot Cause Analysis
Author's notes

You need a separate metrics path, basically.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by acknowledging the circular dependency problem: if the logging pipeline's health is monitored via the same index it feeds, a failure in the pipeline can blind you to the failure. Then propose a layered monitoring strategy that uses independent, out-of-band signals (e.g., metrics, heartbeats, and dead-letter queues) to detect pipeline issues. Finally, discuss how to alert on those signals and ensure the monitoring system itself is highly available and decoupled.

Pro tip: Emphasize that you treat the logging pipeline as a production service with its own SLOs, and you monitor it using a separate, simpler observability stack (e.g., Prometheus + Alertmanager) that doesn't rely on the pipeline's output. This shows you understand the importance of avoiding correlated failures.

1. Identify the circular dependency

Explain that monitoring the pipeline via its own index creates a single point of failure: if the pipeline breaks, you lose both logs and the ability to detect the break. This sets the stage for a decoupled solution.

2. Define independent health signals

List out-of-band metrics such as ingestion rate, processing latency, error counts, queue depths, and heartbeat events. These should be emitted by the pipeline components themselves or by sidecars, not derived from the indexed logs.

3. Choose a separate monitoring stack

Propose using a dedicated metrics and alerting system (e.g., Prometheus, Grafana, Alertmanager) that is independent of the logging index. This stack should have its own high-availability setup and not depend on the pipeline it monitors.

4. Implement alerting and escalation

Define alert rules based on the independent signals, with thresholds and escalation policies. Ensure alerts are actionable and include runbooks for common failure modes.

5. Validate and iterate

Regularly test the monitoring by simulating pipeline failures (e.g., chaos engineering) to ensure alerts fire correctly. Also, monitor the monitoring system itself for availability and correctness.

Key Points to Mention

  • Avoiding correlated failures by using separate infrastructure for monitoring
  • Using metrics (e.g., Prometheus) instead of logs for pipeline health
  • Heartbeat/keepalive signals from pipeline components
  • Dead-letter queues and error queues as failure indicators
  • SLOs for the logging pipeline (e.g., ingestion latency, availability)
  • Chaos engineering to validate monitoring coverage

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.