logging

  • A correlation id that survives a language boundary

    Two services generating their own request identifiers means two traces for one request and no way to connect them. Deciding where the identifier originates is the whole conversation,…

  • An SLO that survived contact with the business

    99.9% was written in a document in 2020 and had never been measured. Three teams with three definitions of “up”.

  • A multi-window alert stops firing when it recovers

    A long window detects a sustained problem and keeps firing for hours after it ends, which trains people to ignore the alert. The long window is doing the…

  • Model events lie about who made the change

    An ORM observer sees that a row changed and has no idea who changed it or why, so it invents an actor from whatever ambient context exists. The…

  • A job summary is markdown you write to a file

    A pipeline that reports its result by making somebody open the log is a pipeline whose result nobody reads. Writing the failure explanation into the summary rather than…

  • An incident channel that is created, not chosen

    Deciding where to coordinate during an incident is a decision made badly under pressure, and automating the creation removes it. The timeline being captured automatically is the part…

  • An audit record needs before, after and an actor

    A log line saying that an order was updated answers none of the questions asked during a dispute. Recording only the changed fields rather than the whole model…

  • Exemplars link a metric to a trace

    A latency histogram tells you the 99th percentile is four seconds and cannot tell you which request that was, and an exemplar attaches a trace id to a…

  • An audit log that a lawyer could read

    A dispute, and a log that recorded that something changed. “Order updated” with no before, no after and no actor.

  • An error boundary catches renders and not event handlers

    An error boundary catches errors thrown during rendering, in lifecycle methods and in constructors, and nothing thrown from a click handler or a promise. Handlers and promises need…