The subscriber who emailed about her missing lettuce is a real problem, and it's the moment Furrow actually learns why observability stops being optional the instant a request starts touching more than one process. Her box order had confirmed successfully. The app had shown lettuce as part of the box. And yet the box that arrived didn't have any — some substitution had happened somewhere between allocation and packing, and nobody could say where, because the only evidence was three separate services' local logs, on three separate machines, with three separate clocks that weren't even in perfect sync with each other.
Three practices turn that kind of mystery from "we'll never know" into "here's exactly what happened," and none of them are needed inside a single process:
With the trace pulled up, the actual answer took four minutes to find: the substitution logic had correctly swapped out lettuce for kale because Harvest's real-time count dipped below the reserved amount during packing — a legitimate, working feature — but nothing in that path updated the packing-list line item the app had already shown the subscriber, so her screen kept saying lettuce right up until the box left the warehouse. Not a bug in any one service. A gap between two services that were each individually correct, which is precisely the kind of failure a single stack trace could never have shown, because no single process ever held the whole story.
Common mistake: bolting on distributed tracing only after the incident that actually needed it, instead of before. Furrow shipped its trace ID plumbing the same week Harvest became its own service — not because anyone foresaw the lettuce mystery specifically, but because being able to say only "somewhere in there, across four services" about a customer's complaint was never going to be a usable answer, and the team knew that going in rather than learning it the hard way.