Organize the answer around ownership, limits, failure, and recovery. Definitions become interview-ready when they survive a concrete production scenario.
Question set
11 detailed answers
01Define SLI, SLO, SLA, and error budget — with the budget math.
concept
Short answer: An SLI is a measured ratio: good events over total events. An SLO is an internal target for that SLI over a window (99.9% per 30 days). An SLA is an external customer contract where violations cost penalties. The error budget = 1 − SLO: the share of "allowed" errors you get to spend.
In depth:
| Term | What it is | Example |
|---|---|---|
| SLI | measured ratio: good events / total | share of requests < 300 ms without 5xx |
| SLO | internal target over a window | 99.9% per 30 days |
| SLA | external contract with penalties | 99.5%, else customer credits |
| Error budget | 1 − SLO | 0.1% of allowed errors |
SLO 99.9% over 30 days: 30 × 24 × 60 = 43,200 min
budget = 0.1% × 43,200 ≈ 43.2 min of downtime per month
SLO 99.99% ≈ 4.4 min per month
The SLO is always stricter than the SLA: the internal target must trip before contractual penalties do.
⚠️ Common mistake: treating SLO and SLA as synonyms and not knowing the numbers. The interviewer expects the math: 99.9% monthly ≈ 43 minutes, 99.99% ≈ 4.4 minutes.
02The error budget is exhausted mid-quarter. What actually happens?
concept
Short answer: The error budget is a decision mechanism, not a reporting number. The policy is agreed with product beforehand: budget exhausted → feature freeze, reliability work takes priority, releases are gated until the budget recovers. Without enforcement, all of it is theater.
In depth:
- The policy is signed before the incident — the team and product agreed in advance: budget gone means features wait. Arguing at the moment of exhaustion is too late.
- Escalation by remaining budget:
| Budget left | Action |
|---|---|
| > 50% | normal release pace |
| < 25% | tighten reviews, freeze risky rollouts |
| 0 — exhausted | feature freeze: reliability fixes only, releases gated |
- Reliability work gets priority — postmortem action items, rollback automation, tests: the things that actually win the budget back.
- Recovery — the budget is computed over a rolling window (typically 30 days): old errors age out of the window and the budget regrows on its own.
⚠️ Common mistake: answering "we'll try harder." Without pre-agreed consequences, the error budget is just a dashboard number, not a contract between reliability and feature velocity.
03Why alert on symptoms rather than causes?
middle
Short answer: You page a human when users are hurting — that is, on SLIs: error rate, latency. A "CPU at 90%" alert wakes the on-call for non-problems and stays silent during real ones: a degradation has many possible causes but one symptom. Cause metrics belong on dashboards — for diagnosis.
In depth:
| Symptom → page | Cause → dashboard | |
|---|---|---|
| Examples | error rate above SLO, p99 latency, checkout down | CPU 90%, memory, queue depth, slow disk |
| False positives | rare: users are actually hurting | common: CPU 90% may be normal |
| Missed incidents | almost none | easy: degradation with no "red" infra metric |
- CPU 90% is not an incident — a batch job legitimately saturating a machine; the on-call was woken for nothing.
- All boxes green, users hurting — a code bug, a bad config, a third-party API down: cause-based alerts stay silent.
- A slow disk that hurts nobody — if the SLIs are fine, that is a ticket for tomorrow, not a 3 a.m. page.
⚠️ Common mistake: alerting on everything "just in case." The result is alert fatigue: the on-call mutes the channel and misses the real incident.
04Explain burn-rate alerting. Why is it better than a static threshold?
senior
Short answer: Burn rate is how many times faster than budgeted you are spending the error budget: actual error rate ÷ budgeted error rate. Burn rate 1 means the budget is spent exactly by the end of the window. You alert on the burn speed over several windows: fast burns page, slow burns ticket. Every alert maps to the math of real user impact.
In depth:
SLO 99.9% over 30 days → budgeted error rate 0.1%
burn rate = actual error rate / 0.1%
burn 1 → budget spent exactly by the end of the 30-day window
page: burn 14.4× over a 1 h window
burned 14.4 × (1 h / 720 h) = 2% of the monthly budget in an hour
ticket: burn 6× over a 6 h window
burned 6 × (6 / 720) = 5% of the budget — slow but steady
- Multi-window, multi-burn-rate — a short window catches fast fires (page), a long one catches slow leaks (ticket); a short control window (5 min) clears the alert right after recovery.
- Versus a static threshold — "error rate > 1%" either wakes you on a blip of a dozen requests or stays silent for weeks while a leak eats the budget. Burn rate scales urgency with severity by itself.
- Answering "why was I woken?" — with numbers: "we burned 2% of the monthly budget in one hour."
⚠️ Common mistake: one threshold for every case. A fast fire and a slow leak need different windows and different urgency.
05Metrics vs logs vs traces: when is each the right tool?
concept
Short answer: Metrics are cheap aggregates: alerting and trends. Logs are discrete events: forensics for a specific incident, expensive at volume. Traces give per-request causality across services: "where did the 2 seconds go?" The signals are tied together via trace IDs and exemplars.
In depth:
| Metrics | Logs | Traces | |
|---|---|---|---|
| Question | "what is happening overall?" | "what exactly happened?" | "where in the chain is it slow?" |
| Granularity | aggregates over time | individual event | one request across services |
| Cost | pennies at fixed series count | expensive at volume | sampled |
| Role | alerts, dashboards, trends | investigation, audit | distributed-system latency |
- Start with metrics — an SLI alert tells you something is wrong.
- A trace shows where — which of the 12 services added 1.8 s of the 2.
- Logs explain why — the stack trace, the exact request, the exact user.
- Correlation — a shared trace ID in logs and exemplars in metrics let you jump between signals instead of eyeballing timestamps.
⚠️ Common mistake: "log everything — we'll sort it out later." In production that means a storage bill above your compute bill and grepping terabytes instead of an alert in seconds.
06How does Prometheus work: the pull model, the data model, and why rate() over counters?
middle
Short answer: Prometheus pulls: it scrapes /metrics endpoints on targets found via service discovery. A time series = metric name + label set. Counters only increase, so you look at speed, not value: rate() computes the per-second increase and correctly survives restarts.
In depth:
- Pull, not push — Prometheus scrapes targets on a schedule: a successful scrape itself (up == 1) is a free health check; service discovery (Kubernetes, Consul) finds targets automatically.
- Data model —
http_requests_total{method="GET", status="500"}: every unique label combination is its own series. - rate() over counters — a counter's absolute value is meaningless (it depends on uptime); rate() gives increase/sec and handles counter resets on restart.
# 5xx ratio
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# p99 from a histogram
histogram_quantile(0.99,
sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
- rate() window ≥ 2× the scrape interval — otherwise the window holds fewer than two points and the graph has gaps.
⚠️ Common mistake: alerting on a raw counter value or taking rate() of a gauge. Counter → rate(), gauge → current value/delta.
07What is metric cardinality, and how do you blow up Prometheus with a single label?
senior
Short answer: Cardinality is the number of unique label combinations: each combination is a separate time series living in memory. Memory grows roughly linearly with active series. A user_id label, a full URL, or a pod hash mints an unbounded number of series — and Prometheus OOMs.
In depth:
http_requests_total{path="/user/48211/cart", ...}
100,000 users × 5 methods × 10 statuses = 5,000,000 series
→ TSDB memory explodes, scrapes slow down, OOM
- The rule — before adding a label, ask: could it have 10,000+ values? Then it is a dimension for traces and logs, not for metrics.
- Usual suspects — user_id, session_id, full paths with parameters (normalize to /user/:id), IP addresses, pod hashes in label values.
- Diagnosis —
prometheus_tsdb_head_seriesand top metrics by cardinality via /api/v1/status/tsdb. - When many series are legitimate — the answer to scale is not "one more Prometheus" but VictoriaMetrics or Thanos: long-term storage, global querying, deduplication. A frequent question at Avito/Ozon interviews — that is their production stack.
⚠️ Common mistake: labeling by a request parameter "for easier filtering." One line of instrumentation — and a week later monitoring is down together with the service.
08Name the four golden signals of monitoring.
junior
Short answer: Latency, traffic, errors, saturation — from Google's SRE book. This set is enough to monitor almost any user-facing system. The subtlety: measure latency on successful requests — errors usually respond fast and "improve" the average.
In depth:
| Signal | What it measures | Example |
|---|---|---|
| Latency | response time of successful requests | p50/p99 duration |
| Traffic | load on the system | RPS, messages/sec |
| Errors | share of failed requests | 5xx rate, timeouts |
| Saturation | how "full" a resource is | CPU, memory, queue, disk |
- Error latency tracked separately — a fast 500 mixed into the pool masks degradation: p99 "improves" while users suffer.
- Saturation looks ahead — it is a leading signal: the queue grows now → latency degrades in minutes.
- This is a blitz question — answer without pausing; follow-ups usually dig into latency and saturation.
⚠️ Common mistake: computing latency over all requests including errors — fast 5xx responses statistically hide the real slowdown.
09You are paged at 3 a.m.: checkout error rate spiked 20 minutes after a deploy. What are your first 15 minutes?
senior
Short answer: Mitigate first, diagnose second. The deploy correlation is obvious — roll back the release without hunting for root cause: while you debug, users are losing orders. Diagnosis comes after the bleeding is stopped.
In depth:
0–2 min confirm: checkout SLI dashboard, blast radius (all? region? segment?)
2–5 min correlate: the deploy 20 min ago is the prime suspect
5–8 min ROLL BACK the deploy. Not a hotfix, not debugging — rollback
8–12 min verify SLI recovery; communicate: incident channel,
status page; if it is big — declare an incident
and assign roles (IC / comms / ops)
12–15 min preserve evidence: graphs, logs, release id — for the postmortem
- Mitigate first — a rollback is almost always faster and cheaper than a diagnosis; the root cause can wait until morning.
- Communication is not optional — a silent on-call creates a second incident; the channel timestamps later become the postmortem timeline.
- Preserve state — capture logs and graphs before the rollback erases the picture.
⚠️ Common mistake: heroically debugging root cause while production burns. The interviewer is listening for the order: stop the damage → communicate → only then the cause.
10What makes a postmortem blameless — and what makes it useful?
concept
Short answer: Blameless means focusing on the system, not on people: "human error" is where the analysis starts, not where it ends. What makes it useful: concrete action items with owners and deadlines that actually land in production, and findings shared across the whole organization.
In depth:
- Why no blame — if incidents get people punished, people hide details, and the organization loses its learning data. The question is not "who pushed the button" but "why did the system let one push take down production."
- Anatomy of a good postmortem:
| Section | Contents |
|---|---|
| Timeline | timestamped facts: detection, escalation, mitigation, resolution |
| Contributing factors | several factors instead of a single "root cause" |
| Impact | numbers: minutes, affected users, budget burned |
| Action items | concrete, each with an owner and a deadline |
- Useful = action items closed — track them like regular sprint tasks; a postmortem after which nothing changed is a ritual.
- Share widely — someone else's incident is the cheapest lesson for the neighboring team.
⚠️ Common mistake: "it was Dave's fault, he'll be more careful" — or 15 action items with no owners. Both guarantee a repeat incident.
11What is toil, and how do you reduce it on a team drowning in tickets?
concept
Short answer: Toil is operational work that is all of: manual, repetitive, automatable, tactical, devoid of enduring value, and scaling linearly with service growth. Google caps toil at roughly 50% of SRE time — the rest must go into engineering that kills that toil.
In depth:
- Six attributes — manual, repetitive, automatable, tactical (reactive), no enduring value, scales linearly with growth. The more that match, the purer the toil.
- Measure first — one or two weeks of accounting: ticket categories, time per category. Without data, "we're drowning" never becomes a plan.
- Attack the top — 2–3 categories usually make up half the volume: automation (a script instead of a runbook), self-service (a button for developers instead of a "grant me access" ticket), eliminating the source (fix the root bug).
- The toil budget as an argument — "we spend 60% of our time on toil, here is the accounting" is a legitimate case to management for carving out engineering time.
| Attribute | Toil | Not toil |
|---|---|---|
| Repetitive | password reset via ticket | designing a new alerting scheme |
| Automatable | manual restart per runbook | investigating a novel incident |
⚠️ Common mistake: calling all ops work toil. On-call and investigating novel incidents are not toil: they require judgment and create knowledge.
Source notes
References and review policy
RecallDeck’s interview answers are editorial material, reviewed against maintained official documentation where a primary reference is available. Tool selections use direct provider links and contain no affiliate placements. Features can change after the review date.
From reading to recall
Practice the full interview loop.
RecallDeck schedules the concepts you miss and keeps coding, design, and behavioral fundamentals available when the interviewer changes direction.