logging

  • A dashboard rebuilt from the questions people ask

    A dashboard of fourteen panels, replaced by six, chosen by reading a quarter of incident messages. A dashboard built from available metrics answers what is measurable and a…

  • #[Deprecated] on a constant, and the notice nobody saw

    A deprecated class constant emitting a notice on every use, into a channel that had been discarding notices since a configuration change in March. The same mistake as…

  • Problem Details, and the field a consumer parsed by position

    A standard error format, adopted in 2023, and a consumer reading the first element of the errors object rather than looking up a key. An object is unordered…

  • An API versioned for the first time in six years

    Six years of additive-only changes, and a change that cannot be additive. A field whose meaning must change, with four consumers reading it.

  • Structured logs, and the field that was never queried

    Eleven fields on every log line, of which four have never appeared in a query. A structured log invites adding fields because each one is cheap, and the…

  • An on-call rota of three

    A rota of two is not a rota. A third person joined in November, and the gap was everything learned in the shadowing month and never written down.

  • An incident drill on a Tuesday afternoon

    A simulated incident, announced in advance, run against production with a deliberately broken dependency. Announcing it in advance removes the value of surprise and removes the risk of…

  • The endpoint we could not deprecate because nobody knew who used it

    An endpoint from 2019 with no documentation, no named consumer and four hundred requests a day. Two weeks of logging turned an unanswerable question into one email, and…

  • A status page nobody had ever updated during an incident

    A status page maintained since 2022, updated eleven times, none of them during an actual outage. Putting the communication before the diagnosis feels wrong and is right —…

  • An API that had two clients and three shapes

    One endpoint, two consumers, and a response that differs by header. Three serialisation paths for one resource, two of them accidental.