mirror of
https://github.com/tokio-rs/tracing.git
synced 2025-10-02 23:34:40 +00:00

## Motivation The tracing_error crate should provide some basic functionality for instrumenting Errors with `SpanTraces` generically. The goal is to make it easy for users to instrument their errors without needing to add a `SpanTrace` to every error they construct. ## Solution Critically this trait provides 3 traits for instrumenting errors, `InstrumentResult`, `InstrumentError`, and `ExtractSpanTrace`. The first two traits expose a `in_current_span()` method that can work on a `Result<T, E: InstrumentError>` and an `Error`, respectively, that wraps the error type in a `TracedError` that stores the inner error and a SpanTrace. The third trait, `ExtractSpanTrace`, is used to retrieve the span_trace member of a `TracedError` from a `&dyn Error` trait object. This is done by downcasting the error to a `TracedError` and returning the inner `span_trace` if it is successful. By default this only works because the inner error is stored in a Box as a trait object, which prevents it from being part of the type signature for `TracedError`. However, this crate also exposes a second version of `TracedError` that does not box the inner error, thus avoiding the need for heap allocation, which it accomplishes by type erasing the `TracedError<E>` into a `TracedError<()>` while iterating through the error `source()` chain.