Skip to main content
RunBook Academy

← All checklists in Observability

As neededpre-upgrade

Pre-Upgrade Checklist

29 items ·27 critical ·2 warn ·0 info

Run this before touching any component of the observability platform, however small the version bump looks. It is the companion to the post-upgrade checklist: this one decides whether to proceed and what you would do if it goes wrong, that one decides whether what happened was what you intended.

The items are grouped as reading, compatibility, validation against the new binary, recovery, sequencing and people. That ordering reflects cost: the reading is free, the compatibility work is an afternoon, and everything after the first irreversible step is priced in incident time.

Why this is a checklist and not a habit

Upgrading an observability platform has one property that makes it different from upgrading almost anything else: the system that would tell you the upgrade went wrong is the system being upgraded. A Prometheus that stops evaluating rules generates no alert about it. An Alertmanager whose cluster split delivers either nothing or everything twice. Grafana can lose its identity provider and report itself healthy to the operators, who are already signed in.

That is why so much of this list is about preparation rather than execution. The estate has no natural feedback loop during the change, so the baseline you captured, the runbook you wrote and the second person you asked to stay available are the entire feedback loop, and all three have to exist beforehand.

The two questions worth answering honestly

Everything here reduces to two questions. What does the new binary make of the state and configuration you already have — which is what the release notes, the compatibility work and the new-binary validation answer. And what would you restore from if the answer turned out to be wrong — which is what the snapshots, the runbook and the one-way boundaries answer.

Substitute your own hostnames, image tags, bucket names and paths throughout; the ones below are the shapes this course uses, not an estate that exists.

Sign-off

  • Change owner: ______________ Date: ___________
  • Reviewer: __________________ Date: ___________
  • Go/no-go by: _______________ At: _____________
  • Rollback rehearsed on: ______ By: _____________

Critical27 items

  1. curl -fsS https://api.github.com/repos/prometheus/prometheus/releases | jq -r '.[] | "\(.tag_name) \(.published_at)"' | head -20
  2. curl -fsS http://prometheus.internal:9090/api/v1/status/buildinfo | jq -r '.data.version'; curl -fsS http://alertmanager.internal:9093/api/v2/status | jq -r '.versionInfo.version'; curl -fsS -u "$GRAFANA_AUTH" http://grafana.internal:3000/api/health | jq -r '.version'
  3. grafana cli plugins ls
  4. docker run --rm -v /etc/prometheus:/etc/prometheus:ro prom/prometheus:v2.55.0 promtool check config /etc/prometheus/prometheus.yml
  5. docker run --rm -v /etc/prometheus:/etc/prometheus:ro prom/prometheus:v2.55.0 promtool test rules /etc/prometheus/tests/*.yml
  6. curl -fsS -XPOST http://prometheus.internal:9090/api/v1/admin/tsdb/snapshot | jq -r '.data.name'
  7. sqlite3 /var/lib/grafana/grafana.db ".backup '/var/backups/grafana/grafana-pre-upgrade.db'"
  8. aws s3api get-bucket-versioning --bucket prod-loki-chunks --profile loki-storage
  9. for q in "count(up)" "prometheus_tsdb_head_series" "rate(prometheus_tsdb_head_samples_appended_total[5m])"; do printf "%s " "$q"; curl -fsS -G http://prometheus.internal:9090/api/v1/query --data-urlencode "query=$q" | jq -r '.data.result[0].value[1]'; done
  10. curl -fsS -G http://meta-prom:9090/api/v1/query --data-urlencode 'query=up' | jq '.data.result | length'
  11. amtool --alertmanager.url=http://alertmanager.internal:9093 silence query

Warning2 items