Skip to main content
RunBook Academy

← All assessments

Final assessment · expert · ~210 min · pass ≥ 80%

Observability for Production Sysadmins — Final Assessment

Objectives

  • Demonstrate command of the three signals and of the USE and RED methodologies
  • Demonstrate metric, label and cardinality judgement under a fixed memory budget
  • Demonstrate Prometheus pipeline reasoning from discovery through to remote write
  • Demonstrate production PromQL: rates, quantiles, staleness and missing data
  • Demonstrate alerting discipline: rules, routing, inhibition and burn-rate alerting
  • Demonstrate Grafana operational and security discipline
  • Demonstrate Loki stream, retention and ingestion-limit reasoning
  • Demonstrate tracing, sampling, propagation and exemplar competence
  • Demonstrate OpenTelemetry Collector pipeline and correlation reasoning
  • Demonstrate architecture, HA, capacity and cost judgement
  • Demonstrate telemetry security, redaction and multi-tenancy discipline
  • Demonstrate configuration-as-code and CI validation practice
  • Demonstrate meta-monitoring, backup, DR and upgrade competence
  • Demonstrate the incident method: mitigation, RCA and evidence discipline
  • Diagnose, rank and remediate a deliberately flawed observability estate

67 graded questions · last verified 2026-08-18

Assessment questions

Objective questions are scored automatically. Scenario answers use a second-stage rubric for evidence, remediation, and rollback.

Knowledge check · 67 questions

  1. Q1. The p99 of the checkout API has doubled over two hours. Every node CPU, memory, disk and network panel is unchanged, the 5xx rate is flat, and the request rate is flat. Which move produces the evidence that says where the extra time is being spent?

  2. Q2. A Redis cache is returning errors to about one request in twenty. Every USE panel on its host is comfortable: CPU 45%, memory 50%, disk and network well inside capacity. Which methodology answers the question the on-call actually has?

  3. Q3. A platform instrumented only with USE metrics can show every resource on every host as healthy while users are being served errors; RED on the service is what makes the user-visible state visible.

  4. Q4. `http_requests_total` carries `method` (5 values), `status` (8), `route` (40) and `instance` (12). A developer proposes adding `request_id`, one value per request, so that failed requests can be found from the metric. What happens to the series count?

  5. Q5. Two Prometheus servers each have 32 GiB of RAM. Server A holds 6 million active series with almost no series created or removed per hour. Server B holds 2 million active series but creates and removes about 1.5 million series every hour. Which is the more fragile of the two, and why?

  6. Q6. Prometheus normally exhausts CPU before it exhausts memory, because query evaluation and rule evaluation dominate its resource profile on a busy platform.

  7. Q7. kube-state-metrics is adding `pod_template_generation`, `controller_revision_hash` and `pod_template_hash` to every sample, and the head block has reached 26 million active series. You want those three labels to cost nothing in memory, in the WAL, in the blocks or in the remote-write queue. Where does the rule belong?

  8. Q8. `up{job="api", instance="10.0.4.7:8080"}` has been 0 for twenty minutes. From the Prometheus host, `curl` against that target's metrics path returns a full exposition body in 40 ms. What is the most likely explanation?

  9. Q9. If a configuration reload fails to parse, Prometheus keeps running the previous configuration and sets `prometheus_config_last_reload_successful` to 0, so nothing pages unless somebody alerted on that metric.

  10. Q10. A remote-write receiver is unreachable for six hours. Prometheus keeps scraping normally and its local retention is fifteen days. Head compaction, and therefore WAL truncation, happens roughly every two hours. What arrives at the receiver when it returns?

  11. Q11. A blackbox_exporter is deployed with an `http_2xx` module, and a Prometheus job rewrites `__address__` to the exporter while passing the real URL through `__param_target`. What performs each probe, and when?

  12. Q12. A fleet panel plots `node_memory_MemFree_bytes` over `node_memory_MemTotal_bytes` and reads 2-4% on every healthy host. The alert built on it pages most nights and nothing is ever wrong. What is the correct fix?

  13. Q13. A counter pushed to a Pushgateway by a batch job at 02:00 is expired automatically once that job's next scheduled run completes, so a stale value cannot outlive one cycle.

  14. Q14. A panel plots `rate(http_requests_total[1m])` for an application fleet. Between 02:50 and 02:56 the pipeline rolls every replica. The panel climbs to about 2 000 req/s at 02:55 and falls back to 1 000 req/s by 02:57. Load-balancer traffic was flat throughout. What is the panel showing?

  15. Q15. A job is scraped every 30 seconds. An engineer writes `rate(http_requests_total[15s])` in a new panel and gets "No data" on every series, while `rate(http_requests_total[2m])` on the same metric renders normally. Why?

  16. Q16. A latency panel reads `histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))`. It shows 80 ms and no alert has fired, but one of the four clusters behind it is serving a p99 of 740 ms against a 200 ms SLO. Which change makes the breach visible?

  17. Q17. A `checkout` deployment is scaled to zero at 03:00. The rule `expr: up{job="checkout"} == 0` never fires and the panel simply goes blank. Which replacement rule pages on the disappearance?

  18. Q18. Which statements about missing data in PromQL are correct? Select all that apply.

  19. Q19. A recording rule is named `job:http_requests_total:rate5m` and its expression is `sum by (job, instance) (rate(http_requests_total[5m]))`. A dashboard panel built on the recorded series renders about a thousand lines and takes thirty seconds to load. What is wrong?

  20. Q20. A rule has `for: 5m` and its group has `evaluation_interval: 30s`. The expression returns a result series continuously from 09:00:00 to 09:04:30, returns nothing at exactly 09:05:00, and returns a result series again from 09:05:30 onward. When does the alert start firing?

  21. Q21. An `inhibit_rule` is written with `source_matchers: [alertname = ClusterDown]`, `target_matchers: [severity = critical]`, and no `equal:` clause. What is the production consequence?

  22. Q22. An Alertmanager tree has a root, then a child route matching `severity = critical` whose own children match `team = payments`, `team = dba` and `team = infra`, and then — as a later peer of that critical route — a route matching `team = payments`. An alert arrives with `severity=critical, team=payments`. Which receiver is notified?

  23. Q23. A single-window burn-rate alert — a 1-hour window at 14.4x — has paged every Friday at 17:30 for six months as the weekday traffic dip briefly inflates the error ratio. The team has stopped reading it. Which change keeps the fast-burn page and removes the Friday noise?

  24. Q24. A sustained burn rate of 14.4 against a 30-day error budget exhausts that budget in roughly two days, which is why 14.4x over a 1-hour window is written as a page rather than a ticket.

  25. Q25. A team asks you to review a proposed rule before it goes on the pager rota. List the properties you would require before approving it, and say what each one prevents.

  26. Q26. A Grafana 11 install on an internal subnet ships with `[auth.anonymous] enabled = true` and `org_role = Viewer`. The team describes it as "internal Grafana". What is the accurate description of the boundary?

  27. Q27. A team builds a dashboard in the Grafana UI on an instance whose folders are file-provisioned. The dashboard is good and everyone uses it. After the next deploy it is gone. What happened?

  28. Q28. A dashboard takes eight seconds to load. Every panel, once it renders, returns in under 200 ms. The five variable dropdowns at the top say "loading" for the first five seconds. Where is the time going?

  29. Q29. A dashboard variable's regex is pushed down to the data source, so a `label_values()` variable filtered by a regex only ever fetches the values that the regex keeps.

  30. Q30. Which of the following does the course name as dashboard anti-patterns? Select all that apply.

  31. Q31. A Loki ingester is at 9.4 GiB resident and climbing. The stream-count panel shows 11.3 million active streams on one tenant, up from 40 000 a week ago. Queries on every other tenant are timing out. What is the cause, and where is the cost paid?

  32. Q32. The same team still needs to locate a specific `request_id` in Loki. Where should that identifier live so that it stays queryable without multiplying the stream count?

  33. Q33. Loki 3.x deletes nothing out of the box: the compactor runs but `retention_enabled` defaults to false, so a cluster deployed without an explicit retention decision keeps every log line forever.

  34. Q34. A Grafana panel for `{job="payments"}` is empty. The collector is running; its log shows `server returned HTTP status 429 Too Many Requests` and its remote-write error counter is climbing. What is the correct next move?

  35. Q35. Every line from a service is JSON and carries `"level":"error"`. The query `{service="checkout", level="error"}` returns nothing at all. Why, and what is the correct query?

  36. Q36. Running a second Loki compactor against the same object-storage bucket doubles retention throughput, because the two instances divide the tenants between them.

  37. Q37. A failed checkout has a Tempo trace with four spans — gateway, inventory, pricing, payment. The warehouse service's spans for the same request exist, with sensible parent and child links among themselves, but under a different trace id. Where is the defect?

  38. Q38. A service samples traces at 1% at the producer. A post-mortem needs the trace of one customer's failed cart from 14:03 and it is not in Tempo. Which change makes that class of trace available next time, and what does it cost?

  39. Q39. A tail sampler has to buffer every span of a trace until its decision window expires, so the gateway's memory cost scales with total incoming traffic rather than with the fraction of traces it eventually keeps.

  40. Q40. A p99 latency alert fired on a single 1.4 s outlier while the histogram curve sat at 80 ms. What mechanism puts the trace of that one request under the on-call engineer directly from the histogram panel?

  41. Q41. A trace is split in two by a `traceparent` that one hop failed to propagate. Which capabilities are lost as a result? Select all that apply.

  42. Q42. A gateway OpenTelemetry Collector is OOM-killed twice a week. Its pipeline declares `processors: [batch, memory_limiter, resource, transform]` and the limiter is configured with `limit_percentage: 80`. What is the fix?

  43. Q43. A single OpenTelemetry Collector pipeline can carry more than one signal, so a `logs` pipeline may also accept a trace receiver provided the exporter it feeds understands both.

  44. Q44. A new logs pipeline is added to a gateway collector. Lines arrive in Loki — the ingest counters move — but nobody on the owning team can see them in their Grafana. What is the first thing to check?

  45. Q45. Describe the metric-to-log-to-trace pivot as an on-call workflow, and state what must be true of the telemetry at each hop for the pivot to work.

  46. Q46. A CI job runs a container that lives for about twelve seconds, several hundred times a day. Prometheus scrapes cAdvisor every fifteen seconds. The container dashboard shows almost nothing for that job. What is happening, and what is the remedy?

  47. Q47. The only certificate alert on the platform is `TLSCertExpiresIn24Hours`, built on `probe_ssl_earliest_cert_expiry`. Reviewing the alert set, what do you change?

  48. Q48. Applying USE to a network interface on a Linux host, which node_exporter series is the *saturation* signal?

  49. Q49. Two Loki single-binary processes each hold their own chunks directory. Half the fleet's agents are configured to send to A and half to B. A dashboard reports "Loki HA, 2/2 healthy". What is the honest description of this deployment?

  50. Q50. A capacity plan for a new Prometheus multiplies samples per second by retention in seconds by 2 bytes per sample, then divides the result by a compression ratio of 10 to reach the disk budget. What is wrong with it?

  51. Q51. A team's observability bill has doubled over four months. Active series is flat, the service count is flat, query volume is flat, and no new tenant has been onboarded. What is the most likely explanation?

  52. Q52. A Prometheus host sized correctly for the memory its active series require is, by that fact alone, also sized correctly for its ingest rate and for the disk its retention window needs.

  53. Q53. A platform keeps thirteen months of full-resolution metrics on local NVMe so that year-old incidents remain investigable. Before adopting tiered retention instead, what is the honest trade-off the course asks you to state?

  54. Q54. A Prometheus runs with `--web.enable-admin-api` and `--web.enable-lifecycle` so an internal tool can take snapshots and reload configuration. Its Service is ClusterIP, but a NetworkPolicy gap lets the management subnet reach it. What is the worst realistic outcome, and what is the production default?

  55. Q55. An OTel Collector `transform` processor deletes attributes matching a pattern covering `password`, `token` and `secret`. A developer ships a field called `authToken`; the pattern has no case-insensitive flag and the credential lands in Tempo. What is the right response?

  56. Q56. Once a secret has been written into Loki, Tempo or Prometheus, nothing in that stack masks it at query time; the remaining remedies are access control, a shorter retention period and — in Loki alone — an explicit delete request.

  57. Q57. A reviewer needs a gate that catches an alert rule whose author wrote `for: 5s` where they meant `for: 5m`. Which one catches it?

  58. Q58. `promtool test rules` loads its synthetic series into in-memory storage and uses the same evaluation engine as the daemon, so it needs no network, no credentials and no running Prometheus.

  59. Q59. Which defect does `promtool check config` NOT catch?

  60. Q60. A meta-Prometheus and meta-Alertmanager run on the same Kubernetes cluster as the production observability stack they watch. The cluster API server fails at 02:14; the meta pods stay running but cannot refresh their service-account tokens, their federated scrape fails, and no page is delivered. What root cause should the post-mortem record?

  61. Q61. Which of the following, when shared between a production observability stack and its meta stack, will silently defeat the meta? Select all that apply.

  62. Q62. A backup job tars the Prometheus data directory nightly while the process is running. What should it do instead, and why?

  63. Q63. A team upgrading Loki from schema v11 to v13 edits `schema_config.configs`, removes the v11 entry and leaves only a v13 entry. The cluster restarts, new writes work, and six months of historical queries return nothing. Which rule did they break?

  64. Q64. A P0 is open: a user-facing service is returning errors and the error budget is burning at 40x. The primary on-call recognises the symptom and believes a restart will clear it, but the cause is not yet established. What does the operating model say to do?

  65. Q65. A card transaction fails for 30% of users for forty minutes and no alert fires at any point. Which investigation order does the alert-failure method prescribe?

  66. Q66. `HostClockSkewCritical` fires on `node_timex_offset_seconds` with a value of 1.412. The engineer connects to the host and `chronyc tracking` reports the system time 12 microseconds fast of NTP time. Which reading is right?

  67. Q67. Sketch the reference architecture for a production observability platform. Name the layers, say what runs in each, and state one failure mode that each layer is responsible for surviving.

Passing score: 80%. Answers are checked in this browser.

Observability for Production Sysadmins — Final Assessment

This assessment has two halves and both must be passed.

Theory — 120 minutes, closed book. Sixty-seven auto-scored questions spread across all one hundred and fourteen parts of the course: the three signals, cardinality, the Prometheus pipeline, exporters and probing, PromQL, rules and Alertmanager, Grafana, Loki and LogQL, tracing and Tempo, OpenTelemetry and correlation, domain observability, architecture and capacity, telemetry security, configuration as code, meta-monitoring and backup, and the incident method. The pass mark is 80%.

The questions are scenario-shaped on purpose. Almost none of them can be answered by recalling a definition; most give you a symptom plus the evidence and ask what it means or what you would do next. Where two answers both look defensible, the discriminator is usually a mechanism the course states explicitly — which pipeline stage a rule runs at, what an empty vector does to an operator, what a compactor lock does to a second compactor.

Practical — 90 minutes, open book and open shell. You are given a running, deliberately flawed observability estate. You diagnose it, rank what you find, and produce a remediation plan. The pass mark is stated under Marking, below.

The practical

The estate

You have inherited the observability platform for Northwind Retail, a mid-sized e-commerce operation. The previous platform engineer left four months ago. Nothing has been reviewed since.

The estate runs on three Linux hosts plus object storage:

HostRuns
obs-1Prometheus 2.55, Alertmanager 0.28, blackbox_exporter
obs-2Grafana 11, Loki 3.x (single binary), Tempo
obs-3OpenTelemetry Collector 0.110 (gateway), a second Alertmanager
app-1 … app-4The application tier: web, checkout, payments, a PostgreSQL primary, node_exporter and cAdvisor on each
Object storageOne bucket, shared by Loki and Tempo, with no lifecycle policy

Everything is deployed with Docker Compose from a directory on each host. There is a Git repository, but it has not been the source of truth for some time.

What the business has told you

These are the reports as you received them. They are symptoms, not diagnoses, and some of them have more than one cause.

  1. “Checkout was broken for about forty minutes on Tuesday afternoon — roughly a third of card payments failed — and nobody was paged. Support found out from customers.”
  2. “Grafana keeps going blank for the last few hours of data on the Prometheus panels, then coming back.”
  3. “When we do get paged, we get paged a lot. Last month one switch reboot produced sixty-one notifications.”
  4. “The log search only ever goes back about a day. Our incident reviews are supposed to cover a week.”
  5. “The trace view shows the front end and it shows the payment service, but they are never the same trace.”
  6. “The storage bill has gone from £900 a month to £2,600 and nobody can say why.”
  7. “Someone in the warehouse team showed me a Grafana dashboard on their phone. They do not have an account.”
  8. “One of the certificates expired last quarter. We found out when the site stopped loading.”

The access you have

  • sudo on obs-1, obs-2, obs-3 and on the four application hosts.
  • Read/write on the Compose directories and on every configuration file they mount: prometheus.yml and its rule files, alertmanager.yml, grafana.ini and the provisioning tree, loki.yaml, tempo.yaml, and the collector configuration.
  • The Grafana admin password. Record each time you use it: what you did with it is part of what you hand in.
  • Read-only credentials for the object-storage bucket, plus the billing console.
  • promtool, amtool, logcli and curl on all three observability hosts.
  • A staging estate with the same topology and no production traffic, which you may break freely.

You do not have a change window on production. Anything you would actually apply must be proposed with its risk, its blast radius and its rollback.

The deliverable

Produce one document with four parts.

Part A — Findings. Every defect you can evidence. For each one, in this order:

  1. Evidence. The command you ran or the query you issued, and the output that establishes the finding. A finding with no evidence does not score.
  2. Root cause. The mechanism, named precisely — the configuration key, the pipeline stage, the metric.
  3. Impact. What it costs, stated in operational terms: a failure it hides, a page it suppresses, a bill it inflates, an investigation it makes impossible.
  4. Remediation. The specific change, with the file and the key.
  5. Validation. How you would prove the fix worked, from outside the change — a query, a probe, a test push, a fixture.
  6. Prevention. The gate that stops it coming back: a CI check, a review rule, a budget, an owner.

Part B — Ranking. Order every finding by blast radius and justify the top five. Blast radius here means “how much of the estate, or how many future incidents, does this defect affect?” A defect that silences one alert ranks below one that silences a class of alerts, which ranks below one that means nobody is watching at all.

Part C — Change plan. The order in which you would apply the remediations, with dependencies stated. Some fixes make others visible; some fixes are unsafe until another is in place. Say which, and say what you would do first if you were given one hour and one restart.

Part D — Residual risk. What remains after your plan, and what you would need — budget, hardware, a second failure domain, a policy decision from the business — to close it.

Marking

BandRequirement
PassAt least 16 of the 21 defects found, each with evidence and a correct mechanism; the top three by blast radius correctly identified; a change plan with stated dependencies.
Strong passAt least 19 of 21, plus a residual-risk section that names a limitation of the platform rather than of the estate.
FailFewer than 16 found, or findings asserted without evidence, or a remediation that would cause an outage without a stated rollback.

A finding you found but could not evidence scores half. A finding you asserted without either evidence or a mechanism scores nothing — that is the same reasoning error as an alert with no runbook.


Marker’s key

The twenty-one defects, grouped by the layer they live in. The “expected evidence” column is what a passing answer shows; the “mechanism” column is what a passing answer names.

Metrics and Prometheus

K1 — High-cardinality metric label. The checkout service emits checkout_requests_total with a request_id label. Expected evidence: prometheus_tsdb_head_series growth, topk over count by (__name__)({__name__=~".+"}), or the TSDB status page’s top series by metric name. Mechanism: series count is the product of the label domains, and one domain is per-request. Remediation: drop the label at source; metric_relabel_configs with labeldrop as the immediate containment. Validation: head series falls and stays flat.

K2 — Bad PromQL in an alert. A rule uses a rate window shorter than the scrape interval on a counter that resets on every deploy, so it alternately returns no data and returns extrapolated spikes. Expected evidence: the rule expression beside the job’s scrape_interval, and the rule’s own evaluation history. Mechanism: rate() needs at least two samples, and it extrapolates across counter resets. Remediation: a window of two to four times the scrape interval, sourced from a recording rule.

K3 — Prometheus TSDB 95% full. Expected evidence: node_filesystem_avail_bytes for the data volume, plus the retention settings. Mechanism: retention and volume are a capacity equation, not a default. Remediation: set retention deliberately, size the volume from the four capacity equations, and alert on the volume at 20% free — before the ingest path starts failing.

K4 — No backup of rules, dashboards or configuration. Expected evidence: no snapshot job, no archive in the bucket, and a Git repository whose last commit predates the live configuration. Mechanism: configuration lives in Git and the TSDB is captured through the admin snapshot endpoint. Remediation: commit the live configuration, then schedule both.

Alerting

K5 — Broken alert routing. Every alert fires and nothing notifies: the routing tree names a receiver whose webhook URL is stale. Expected evidence: firing alerts in the Alertmanager UI with no corresponding delivery, amtool config routes test, and the notification-failure counters. Mechanism: routing is a tree walked depth-first, and delivery failure is a separate signal from firing. Remediation: fix the receiver, then alert on the delivery failures so this cannot recur silently.

K6 — Alert with no for: clause. A rule fires on every evaluation that crosses the threshold, so a 90-second blip produces three notifications. Expected evidence: the rule definition and the notification history for one incident. Mechanism: for: is the dwell that absorbs transient breaches. Remediation: a for: matched to the scrape interval and the SLO, and keep_firing_for where the incident oscillates.

K7 — Alert with no severity or routing labels. It reaches the catch-all receiver and nothing else. Expected evidence: the rule labels compared with the matchers in the routing tree. Mechanism: routing matches on labels; a rule that carries none cannot be routed. Remediation: severity and team on every rule, enforced in CI.

K8 — Inhibit rule with no equal:. A cluster-level alert suppresses criticals across the whole estate. Expected evidence: the inhibit_rules block, and suppressed alerts in the UI during an unrelated incident. Mechanism: inhibition is global; equal: is the only scope. This is the mechanism behind report 3, together with K6.

K9 — Alert with no runbook link. Expected evidence: the annotations block. Mechanism: the responder needs a starting point, and an alert with no action is a ticket. Remediation: runbook_url and dashboard_url annotations, enforced in CI.

Grafana

K10 — Anonymous access enabled. [auth.anonymous] enabled = true with org_role = Viewer. This is report 7. Expected evidence: grafana.ini, plus an unauthenticated curl that returns a dashboard. Mechanism: the boundary becomes “who can reach the port”, and every audit entry reads “Anonymous”. Remediation: disable it, configure SSO, and review what the anonymous Viewer could read.

K11 — Dashboards targeted with an unbounded instance regex. Every panel selects instance=~".*", and the variable behind it fetches every value of the label before its own regex narrows the list. Expected evidence: the dashboard JSON and the query inspector’s timings. Mechanism: variable queries run before panels and block them, and the cost is paid at the data source. Remediation: bound the variable at the query, or drive it from a recording rule.

Logs

K12 — Loki retention set to 24 hours against a 7-day requirement. This is report 4. Expected evidence: limits_config.retention_period beside the incident-review policy. Mechanism: retention must comfortably exceed the slowest plausible time to detection. Remediation: set the window from the requirement, then size the bucket for it.

K13 — Loki stream label carrying request_id. Expected evidence: the agent configuration, plus stream counts by label. Mechanism: a stream is one distinct label set and the ingester holds every active stream in memory. Remediation: move the identifier to structured metadata or to the line content behind a parser.

K14 — Loki compaction disabled. Nothing is ever deleted, and the index is never merged. Together with K12 this is the contradiction to find: a configured retention window that is never enforced. Expected evidence: compactor.retention_enabled, plus the age of the oldest object in the bucket. Mechanism: retention in Loki 3.x is opt-in and enforced by the compactor. This is a principal cause of report 6.

K15 — Sensitive data in a log line. The payments service logs a full card PAN and a customer email at INFO. Expected evidence: a LogQL query against the payments stream. Mechanism: redaction happens at the application and at the agent; the backend can only contain. Remediation: fix the call site, add an agent-side scrub as depth, and treat the stored data as an incident — access review, retention reduction, delete request.

Traces

K16 — Trace context not propagated. The web front end does not inject traceparent on its call to checkout. This is report 5. Expected evidence: two traces for one user journey with different trace ids, and a request capture showing no traceparent header. Mechanism: a service that does not inject or extract the header starts a new trace at that hop. Remediation: configure the propagator; add the propagation test to CI.

K17 — Trace sampling at 100% in production. Expected evidence: the SDK or collector sampling configuration, plus Tempo’s ingest volume. Mechanism: cost scales with total traffic. This is the other principal cause of report 6. Remediation: a deliberate strategy — head sampling for volume, tail sampling for the traces that matter — sized against the buffer the gateway can hold.

Collection and pipeline

K18 — Collector forwarding with no batching and no backpressure. No batch processor, and memory_limiter absent entirely. Expected evidence: the pipeline definition, plus the collector’s memory profile and restart history. Mechanism: processors run in declared order and the limiter is the gate. Remediation: memory_limiter first, batch last, with an explicit ceiling.

Platform

K19 — Nothing monitors the observability stack. No scrape job covers Prometheus, Alertmanager, Loki, Tempo or the collector, so their own health is invisible. Expected evidence: the scrape config. Mechanism: the platform is a production dependency like any other. This is part of report 1 and all of report 2: nothing alerts on prometheus_config_last_reload_successful, on notification failures, or on the collector restarting.

K20 — No meta-monitoring outside the failure domain. Even with K19 fixed, the stack watching itself cannot page when it is the thing that failed. Expected evidence: the deployment topology. Mechanism: a circular dependency defeats the last line of defence. Remediation: a small external meta stack, with its own notification path, sharing no auth, DNS, NTP or host with the platform.

K21 — TLS expiry alert only at 24 hours. This is report 8: the alert existed and gave no usable lead time. Expected evidence: the rule threshold beside the incident timeline. Mechanism: an alert whose first notification arrives a day before expiry is an incident the alert design created. Remediation: a ladder — a ticket at 30 days, escalating to a page as the date approaches — driven by probe_ssl_earliest_cert_expiry.

How the reports map to the defects

ReportDefects
1 — no page for the checkout outageK5, K7, K19
2 — Grafana panels going blankK2, K3, K19
3 — sixty-one notificationsK6, K8
4 — logs only go back a dayK12, K14
5 — front end and payments never the same traceK16
6 — storage bill nearly tripledK1, K13, K14, K17
7 — dashboards visible without an accountK10
8 — certificate expired without warningK21

Reports 1 to 8 do not cover K4, K9, K11, K15, K18 or K20. A candidate who works only from the reports finds fifteen of the twenty-one; the remaining six are found by reviewing the configuration against the checklists the course provides, which is the discipline being assessed.