unrust

Incident log timeline explorer

Trace an interleaved gateway, checkout and ledger log stream. Separate the first timeout symptom from the underlying lock wait and non-idempotent retry.

Free to use · No sign-up · Inputs stay in your browser

Compare the timeout budget against the downstream lock

Adjust the gateway timeout, ledger lock duration and retry policy. Identify both the first observable symptom and the root-cause line.

Client HTTP status
200
Committed ledger writes
2

Interleaved service timeline

Silent duplicate charge (200 OK, 2 ledger writes)

Line 3 records the root-cause budget mismatch (650ms lock wait vs 400ms gateway timeout), and Line 4 is the first observable timeout symptom. Because attempt 1 is still running in the ledger when attempt 2 starts without an idempotency key, both writes commit.

L1 · 10:14:00.000 [gateway] INFO

POST /checkout attempt=1 timeout=400ms idem=none

L2 · 10:14:00.015 [checkout] INFO

forwarding charge attempt=1 to ledger (idem=none)

L3 · 10:14:00.120 [ledger] WARNROOT CAUSE

waiting on row lock; commit will take 650ms (> gateway 400ms budget)

L4 · 10:14:00.400 [gateway] WARNFIRST SYMPTOM

upstream timeout after 400ms on attempt=1; client socket still open

L5 · 10:14:00.410 [gateway] INFO

retrying POST /checkout attempt=2 idem=none

L6 · 10:14:00.425 [checkout] INFO

forwarding charge attempt=2 to ledger (idem=none, new transaction)

L7 · 10:14:00.645 [ledger] ERROR

committed charge tx_102 amount=4900 from attempt=2 (2nd duplicate ledger write)

L8 · 10:14:00.660 [gateway] INFOFINAL OUTCOME

200 OK returned to client (attempt=2 succeeded, but ledger charged twice)

L9 · 10:14:00.665 [ledger] INFO

committed charge tx_101 amount=4900 from attempt=1 (1st ledger write)

Practice separating symptoms from root causes

In a log stream, the gateway logs a 504 timeout at 400ms and the database logs a slow commit at 665ms. Why is raising the retry count without an idempotency key dangerous?

Check the reasoning

A caller timeout cancels the wait on the client side, not necessarily the in-flight work on the downstream database. Retrying a non-idempotent write while the first attempt is still holding locks or committing can duplicate the side effect.

This is an original open example, not a scored drill. Close the tool before taking a diagnostic or an unassisted practice session.

About 14 minutes, no account needed. A free account adds a daily practice queue; paid plans add more practice and the full library.

How to use the result

Select the gateway timeout budget, downstream ledger commit duration and retry policy. Inspect how the interleaved timestamps shift and compare the HTTP status seen by the caller against the number of committed writes.

When the gateway times out at 400ms while the ledger write takes 650ms, the timeout warning at 400ms is the first caller-visible symptom, not the root cause. Retrying immediately without an idempotency key starts a second transaction while the first is still committing, producing two ledger writes.

These utilities and open examples do not contribute to your diagnostic score or practice history.

RFC 9110: HTTP idempotent methods and retry safety

Work through the example

Separate the first symptom from the root cause in service logs →