[0] https://zipkin.io/ [1] https://www.jaegertracing.io/docs/1.18/architecture/ [2] https://lightstep.com/distributed-tracing/
You have to instrument your code and libraries to pass along a context that gets picked up by each piece along the call tree, and then each piece gets reported to a collector.
It's useful for microservices, and even for non-distributed web services if you have heavyweight libraries that it must interact with (databases, caches, queues, etc).
It only really works if all of the pieces understand each other, thus the OpenTelemetry [1] initiative.
You could be a pretty significant online retailer (Asos, say), run everything on a few instances of a monolith, and have all your information in easily interpretable log files, without needing to reach for distributed tracing tools.
Again, these tools are incredibly useful when you have a distributed system, and kinda pointless otherwise.
But when you do need it, you really need it.
Magpie: Online Modelling and Performance-aware Systems
"Understanding the performance of distributed systems requires correlation of thousands of interactions between numerous components ..."
https://pdfs.semanticscholar.org/cb76/9b0c983bce6a73cafd1f8a...