Tracing is a specialized form of logging that is designed to work effectively in large, distributed environments. When done right, tracing follows the path of a request across process and service boundaries. This provides a big step up in application observability and can help inform a developer why certain requests are slow, or why they might have behaved unexpectedly. This tutorial will familiarize users with the benefits of tracing and describe a general toolkit for emitting traces from applications in a minimally intrusive way. We will walk through a simple example app, which receives an HTTP request, and gradually instrument it to be observable via traces. We will discuss language constructs that can generate traces—namely decorators, monkey-patching and context managers—and give users pointers on how they might add tracing to their own applications and libraries. In the process, users will become familiar with the existing standards for modeling traces, and some of the challenges involved in adhering to this model in a distributed, asynchronous environment.