Skip to main content
RunBook Academy

Git, CI/CD & GitOpsLXXXI · Synced versus HealthySyncedVsHealthy

The 3 AM test — what tells you the workload is broken when the dashboard is green

Advanced⏱ ~22 mingit

What you'll learn

  • Run the 3 AM test - the sequence of external checks that catch workload failures the controller cannot see
  • Identify the four signal sources that catch Synced+Degraded incidents
  • Distinguish "the controller is wrong" from "the controller is right but the workload is broken"
  • Use external signals to triage a page before opening a single dashboard panel

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

Not yet marked complete on this device.

The 3 AM test is the sequence of external checks an on-call engineer runs when paged for a workload whose dashboard says Synced + Healthy. The test exists because the dashboard is right - the manifests agree, the controller’s health library says the workload is functioning - and the engineer still got paged. The page comes from a signal the controller cannot see: a user error, a downstream latency spike, a business metric that has flat-lined, a log pattern the alerting system has learned to flag.

The test is ordered for speed. The goal is to identify the source of the page in under five minutes, without chasing the dashboard, without opening six terminal tabs, and without assuming the GitOps controller is wrong.

Why the dashboard can be green and the page be real

The controller answers two questions on every tick: do the manifests agree, and is the workload in a state the controller’s health library recognises? The controller does not answer: are users getting correct responses, is the workload reaching its downstream dependencies, is the workload doing the thing it was designed to do, are business metrics within bounds. The dashboard is a view of the first two questions. The page comes from somewhere in the second set.

flowchart LR
    A["Page fires"] --> B["Dashboard check"]
    B -->|"Synced + Healthy"| C["External signals"]
    B -->|"Synced + Degraded"| Z["Workload-layer incident"]
    B -->|"OutOfSync + Healthy"| Y["Manifest-drift incident"]
    B -->|"OutOfSync + Degraded"| X["Dual-layer incident"]
    C -->|"user-facing errors"| D["User reports"]
    C -->|"downstream latency"| E["Dependency check"]
    C -->|"business metrics"| F["Metric check"]
    C -->|"log patterns"| G["Log check"]

When the dashboard is green and the page is real, the engineer is in the top branch. The four external signals are the next step. Each catches a class of failure the controller cannot see.

The four external signal sources

User-facing errors. The most direct signal that the workload is broken is users reporting it. Status pages, support tickets, error-reporting SDKs, application-level error counters. If users are reporting errors and the dashboard is green, the workload is broken at a layer the controller cannot inspect. This is the first signal to check because it is the closest to the truth: a user is the only “probe” that exercises the full path.

Downstream-call latency. Most workloads call other systems: databases, caches, message queues, third-party APIs. The controller’s health check library does not inspect the latency of these calls. A workload that has passed readiness probes but is timing out on every database query is Healthy by every metric the controller has. A latency dashboard or a tracing system that shows downstream call durations is the second signal to check.

Business metrics. The metrics that matter to the business: orders per minute, signups per hour, search-response rate, transactions completed. These metrics are typically outside the controller’s view. They are the third signal because they catch failures that affect the business but do not produce user error reports yet - for example, a checkout flow that completes successfully but charges the wrong amount.

Log patterns. Anomaly detection in logs, error-rate spikes, stack traces from production code paths the dashboard does not instrument. Logs are the last signal because they are the noisiest: a useful log pattern usually requires knowing what to look for, and the engineer at 3 AM is looking for whatever the alerting system flagged.

Running the test

The order of the four signals is operational. Each signal catches a class of failure the previous signal misses, and each signal is faster to check than the one after it.

  1. User errors first. If users are reporting errors, the workload is broken at the user-facing layer. The fix is not in the cluster; it is in the workload or its dependencies. Skipping this step and going straight to the cluster costs the engineer minutes and may send them down a path the dashboard supports but the page does not.
  2. Downstream latency second. If user errors are absent or sparse, but downstream latency has spiked, the workload is broken at the dependency layer. The cluster is fine; the workload cannot reach what it depends on. This is the most common Synced + Degraded root cause.
  3. Business metrics third. If user errors and downstream latency are both clean, but business metrics are off, the workload is “working” in the narrow sense but not producing the outcomes the business cares about. This is rarer but real: a payment service that approves every transaction is Healthy and Synced and is losing money.
  4. Log patterns fourth. If the first three signals are clean, the engineer is looking at a slow-burn incident: an error pattern that has not yet produced user reports, a memory leak that has not yet crashed a pod, a configuration drift that has not yet affected user-visible behaviour. Logs are where the slow-burn incident shows up first.
argocd app get "$APP" --show-operation

The dashboard check at the start of the test confirms the engineer is in the green-dashboard branch. The output shows Sync Status: Synced and Health Status: Healthy. The engineer then runs the four-signal sequence outside the cluster.

kubectl get application "$APP" -n argocd -o yaml

The CR check confirms what the CLI shows and rules out a stale cache. If the CR and the CLI both say Synced + Healthy, the engineer is in the green-dashboard branch and the four-signal sequence is the right path.

Production discipline

The production framing of the 3 AM test has three rules:

  1. Dashboard green plus page real means look outside the cluster. The controller is not the source of the page. The page is coming from a signal the controller does not have.
  2. The four-signal order is operational. User errors, downstream latency, business metrics, logs. Skipping ahead costs minutes. Skipping back costs nothing.
  3. The 3 AM test is the runbook. The four-signal sequence is what the on-call engineer runs. Encoding it in the team’s runbook - with the specific dashboards, queries, and thresholds for each signal - is the difference between a five-minute triage and a fifty-minute triage.

Cross-course references

  • Observability for Production Sysadmins - Parts V-VII (Metrics, Logs, Traces) cover the signal sources the 3 AM test relies on. Without them, the test has no inputs.
  • Linux for Production Sysadmins - Part XXVIII (OnCall) covers the discipline of running structured checks under time pressure, which is the operational context of the 3 AM test.
  • Kubernetes for Production Sysadmins - Parts XV-XVII (Probes) cover the probe design that determines whether the controller’s health library can catch what the workload is doing.

Quiz

Knowledge check · 4 questions

  1. Q1. At 3 AM, the on-call engineer is paged for a customer-facing API. The dashboard says Synced + Healthy. What is the first thing the engineer should do?

  2. Q2. When the dashboard is Synced + Healthy and the page is real, the most likely root cause is that the GitOps controller is reporting the wrong Health state.

  3. Q3. List the four external signal sources the 3 AM test checks, in the order the test checks them, and explain why the order matters.

  4. Q4. Run the 3 AM test on a workload that the dashboard says is Synced + Healthy but that the on-call has been paged for.

    The on-call engineer is paged at 3:17 AM for an internal analytics service. The dashboard says Synced + Healthy. The application error counter has not spiked. Downstream latency to the analytics database is normal. Business metrics - reports generated per hour - are 60% below baseline. Log scans show an increase in 'partial result returned' warnings starting at 3:05 AM. The deployment history shows no recent changes; the controller is on the same revision as Git.

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