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
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?
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?
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.
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?
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?
Q6. Prometheus normally exhausts CPU before it exhausts memory,
because query evaluation and rule evaluation dominate its
resource profile on a busy platform.
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?
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?
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.
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?
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?
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?
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.
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?
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?
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?
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?
Q18. Which statements about missing data in PromQL are correct?
Select all that apply.
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?
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?
Q21. An `inhibit_rule` is written with
`source_matchers: [alertname = ClusterDown]`,
`target_matchers: [severity = critical]`, and no `equal:`
clause. What is the production consequence?
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?
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?
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.
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.
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?
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?
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?
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.
Q30. Which of the following does the course name as dashboard
anti-patterns? Select all that apply.
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?
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?
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.
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?
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?
Q36. Running a second Loki compactor against the same object-storage
bucket doubles retention throughput, because the two instances
divide the tenants between them.
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?
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?
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.
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?
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.
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?
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.
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?
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.
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?
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?
Q48. Applying USE to a network interface on a Linux host, which
node_exporter series is the *saturation* signal?
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?
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?
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?
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.
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?
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?
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?
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.
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?
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.
Q59. Which defect does `promtool check config` NOT catch?
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?
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.
Q62. A backup job tars the Prometheus data directory nightly while
the process is running. What should it do instead, and why?
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?
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?
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?
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?
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:
OpenTelemetry Collector 0.110 (gateway), a second Alertmanager
app-1 … app-4
The application tier: web, checkout, payments, a PostgreSQL primary, node_exporter and cAdvisor on each
Object storage
One 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.
“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.”
“Grafana keeps going blank for the last few hours of data on
the Prometheus panels, then coming back.”
“When we do get paged, we get paged a lot. Last month one
switch reboot produced sixty-one notifications.”
“The log search only ever goes back about a day. Our incident
reviews are supposed to cover a week.”
“The trace view shows the front end and it shows the payment
service, but they are never the same trace.”
“The storage bill has gone from £900 a month to £2,600 and
nobody can say why.”
“Someone in the warehouse team showed me a Grafana dashboard
on their phone. They do not have an account.”
“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:
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.
Root cause. The mechanism, named precisely — the
configuration key, the pipeline stage, the metric.
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.
Remediation. The specific change, with the file and the key.
Validation. How you would prove the fix worked, from
outside the change — a query, a probe, a test push, a fixture.
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
Band
Requirement
Pass
At 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 pass
At least 19 of 21, plus a residual-risk section that names a limitation of the platform rather than of the estate.
Fail
Fewer 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
Report
Defects
1 — no page for the checkout outage
K5, K7, K19
2 — Grafana panels going blank
K2, K3, K19
3 — sixty-one notifications
K6, K8
4 — logs only go back a day
K12, K14
5 — front end and payments never the same trace
K16
6 — storage bill nearly tripled
K1, K13, K14, K17
7 — dashboards visible without an account
K10
8 — certificate expired without warning
K21
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.