Git, CI/CD & GitOpsCXIV · Deployment MarkersRealTest
The 3 AM incident and the deploy marker — the real test
What you'll learn
- Walk the full 3 AM incident reconstruction using the annotation, the label, and the event log in concert
- Recognise the operational difference between a marker-equipped team (seconds-of-MTTR) and a marker-less team (minutes-of-MTTR) during a live incident
- Make the rollback decision using the deploy marker as the join key: identify the suspect version, identify the previous version, identify the deploy event, identify the actor and the build URL
- Apply the post-incident discipline: capture what the marker preserved, capture what the marker missed, and feed the gap back into the pipeline
Prerequisites
Verified against Git 2.55.x teaching target; 2.40+ minimum · GitHub Actions continuous service; Aug 2026 documentation baseline · Argo CD v3.5.x teaching target; v3.0+ minimum · Flux v2.9.x · Sigstore Cosign v3.1.x · SLSA v1.2 · OCI Distribution Specification v1.1 · Git LFS v3.7.1 · Kubernetes (cross-course target) 1.36.x
The marker discipline from the previous five lessons is abstract until 3 AM. At 3 AM the on-call engineer is paged for a regression in a service the engineer has never touched. The engineer opens the dashboard, sees the spike, and asks the first question of every incident: “what changed?”. The answer is on the timeline if the team has the marker discipline. The answer is in the CI system by hand if the team does not. The difference is the difference between a fast MTTR and a slow one.
The page arrives
The page arrives at 03:14 from the alerting system. The
service is api; the alert is “error rate above 5%
for 5 minutes”. The engineer opens the on-call
dashboard, which is the joined view from the previous
lesson: metric panels filtered by version, an Events
panel with the deploy events, and a Loki panel with
the error log lines. The spike is visible on the error
rate panel.
The engineer’s first action is to read the panel. The panel shows three time series: v3.4.0 (the previous version), v3.4.1 (the current version), and v3.3.7 (an older version still receiving a small percentage of traffic from a canary). The error rate for v3.4.1 spiked at 03:09 from 0.1% to 8%; the other versions are flat. The regression is in v3.4.1.
flowchart TB
A["Page arrives\n03:14"] --> B["Open joined view\nfiltered by version"]
B --> C["v3.4.1 error rate\nspiked at 03:09"]
C --> D["Identify suspect version\nv3.4.1"]
D --> E["Identify previous version\nv3.4.0"]
E --> F["Find deploy event\ntimestamp 02:47"]
F --> G["Confirm rollback\ntarget version"]
G --> H["Roll back\n01:32 elapsed"]
The marker surfaces the cause
The engineer reads the Events panel. The panel shows the deploy event for v3.4.1 at 02:47, with the annotation text “deploy 7a3f9d2 build 4527 release v3.4.1”. The event payload carries the SHA (7a3f9d2), the build number (4527), the actor (octocat), the build URL, and the environment (production). The engineer clicks the build URL; the CI run opens in a new tab.
The CI run shows the diff: the change introduced a new database query path that is not connection-pooled. The query exhausts the connection pool under load and returns 500 errors. The change-cause annotation in the pipeline log says “add new analytics query path”. The engineer has the cause, the change, the actor, and the approval chain in three clicks.
The Loki panel filtered by service_version="v3.4.1"
shows the error log lines: “connection pool exhausted
after 50 connections, request rejected”. The Tempo
panel filtered by the same attribute shows the failing
spans, all hitting the new analytics endpoint. The
joined view shows the regression, the cause, the failing
endpoint, and the deploy context in one screen.
The rollback decision
The engineer has the cause and the previous version. The
rollback is a single kubectl rollout undo command or,
in a GitOps workflow, a revert commit and a sync. The
engineer announces the rollback in the incident channel,
rolls back to v3.4.0, and watches the error rate
return to baseline by 03:16. Total elapsed time: 1
minute 32 seconds from page to recovery.
The rollback is reliable because the marker surfaces the target version. The engineer does not have to guess which version is the previous one; the Events panel shows the deploy history and the engineer rolls back to the version immediately preceding the suspect. The rollback is auditable because the event log records the rollback action with the actor, the timestamp, and the target version; the postmortem will have the complete record of the incident and the recovery.
What the marker preserved
The marker preserved six things the on-call engineer needed in order:
- The suspect version. The version label filtered the metric panel to v3.4.1; the engineer identified the regression in one click.
- The deploy event. The Events panel showed the structured record with the SHA, the build number, the actor, the build URL, and the environment.
- The change-cause. The annotation text described the change in human-readable form; the engineer read it on the panel.
- The previous version. The version label on the previous deploy was queryable; the engineer identified the rollback target in one click.
- The failing endpoint. The Loki and Tempo panels
filtered by
service_version="v3.4.1"showed the failing spans; the engineer confirmed the cause. - The audit trail. The rollback action was recorded in the event log; the postmortem has the complete record.
A team that has the marker discipline preserves all six. A team that does not have the marker discipline preserves one - the human-readable message in the annotation - and reconstructs the other five by hand.
What the marker missed
The postmortem captures what the marker preserved and what it missed. The marker missed three things in this incident:
- The connection-pool size at the time of the change. The diff showed the new query path but did not flag the connection-pool impact. The marker preserves the change; the marker does not preserve the capacity impact.
- The load test that should have caught the regression. The CI run included unit tests and integration tests but no load test. The marker preserves the build; the marker does not preserve the test gap.
- The rollback runbook. The team has the rollback procedure documented but the engineer had to reconstruct the exact command from memory. The marker preserves the deploy; the marker does not preserve the operational muscle memory.
The postmortem feeds these gaps back into the pipeline: add a load test to CI that exercises the connection pool, add a connection-pool-impact check to the pre-flight-validation, and add the rollback command to the on-call runbook with a link to the marker query.
Production discipline
- Open the joined view first during an incident. The metric, the log, the trace, and the deploy event are all on one panel; the engineer does not have to cross-reference systems by hand.
- Identify the suspect version by the metric filtered by version. The version label is the fastest path from spike to cause.
- Roll back to the version immediately preceding the suspect. The Events panel shows the deploy history; the rollback target is the previous entry.
- Announce the rollback in the incident channel with the marker reference. The annotation text and the build URL are the audit chain for the recovery.
- Capture what the marker missed in the postmortem. The gaps are the inputs to the next round of marker improvements.
Cross-course references
- This course, Part CXIII (ObservabilityIntegration) covers the timeline view that the joined view extends.
- This course, Part CVI (ChangeMgmt) covers the change record and the postmortem discipline that feed the marker gaps back into the pipeline.
- Observability course - Parts covering major incidents cover the on-call interface that the joined view implements.
Quiz
Knowledge check · 4 questions
Q1. During a 3 AM incident, the on-call engineer opens the joined view and identifies the suspect version in seconds. What does the marker discipline produce that a marker-less workflow does not?
Q2. A postmortem that celebrates the marker discipline's success and ignores the gaps the marker did not cover is a complete postmortem.
Q3. List the six things the marker discipline preserves that the on-call engineer needs during a 3 AM incident, in the order they are needed.
Q4. Diagnose the incident response gap and recommend the structural fix.
Team T is paged at 03:14 for a regression in the api service. The team has Grafana dashboards with metric panels, but the panels are not filtered by version. The team has Loki and Tempo but the service.version attribute is not exposed as a filterable label. The deploy events live in the GitOps controller's database but are not surfaced on the dashboard. The on-call engineer opens the metric panel, sees the spike, and must cross-reference the CI system by hand. The engineer opens GitHub Actions, finds the deploy workflow that finished at 03:09, reads the commit by hand, identifies v3.4.1 as the suspect, opens the workload YAML to confirm, opens the Git repository to find the previous release tag, and rolls back. Total elapsed time: 28 minutes. The team has MTTR trending up.
Passing score: 75%. Answers are checked in this browser.