• Eliza Weisman's avatar
    Introduce `tokio-trace` (#827) · 03d6e802
    Eliza Weisman authored
    <!-- Thank you for your Pull Request. Please provide a description above
    and review the requirements below.
    
    Bug fixes and new features should include tests.
    
    Contributors guide:
    https://github.com/tokio-rs/tokio/blob/master/CONTRIBUTING.md -->
    
    ## Motivation
    
    In asynchronous systems like Tokio, interpreting traditional log
    messages can often be quite challenging. Since individual tasks are
    multiplexed on the same thread, associated events and log lines are
    intermixed making it difficult to trace the logic flow. Currently, none
    of the available logging frameworks or libraries in Rust offer the
    ability to trace logical paths through a futures-based program.
    
    There also are complementary goals that can be accomplished with such a
    system. For example, metrics / instrumentation can be tracked by
    observing emitted events, or trace data can be exported to a distributed
    tracing or event processing system.
    
    In addition, it can often be useful to generate this diagnostic data in
    a structured manner that can be consumed programmatically. While prior
    art for structured logging in Rust exists, it is not currently
    standardized, and is not "Tokio-friendly".
    
    ## Solution
    
    This branch adds a new library to the tokio project, `tokio-trace`.
    `tokio-trace` expands upon logging-style diagnostics by allowing
    libraries and applications to record structured events with additional
    information about *temporality* and *causality* --- unlike a log
    message, a span in `tokio-trace` has a beginning and end time, may be
    entered and exited by the flow of execution, and may exist within a
    nested tree of similar spans. In addition, `tokio-trace` spans are
    *structured*, with the ability to record typed data as well as textual
    messages.
    
    The `tokio-trace-core` crate contains the core primitives for this
    system, which are expected to remain stable, while `tokio-trace` crate
    provides a more "batteries-included" API. In particular, it provides
    macros which are a superset of the `log` crate's `error!`, `warn!`,
    `info!`, `debug!`, and `trace!` macros, allowing users to begin the
    process of adopting `tokio-trace` by performing a drop-in replacement.
    
    ## Notes
    
    Work on this project had previously been carried out in the
    [tokio-trace-prototype] repository. In addition to the `tokio-trace` and
    `tokio-trace-core` crates, the `tokio-trace-prototype` repo also
    contains prototypes or sketches of adapter, compatibility, and utility
    crates which provide useful functionality for `tokio-trace`, but these
    crates are not yet ready for a release. When this branch is merged, that
    repository will be archived, and the remaining unstable crates will be
    moved to a new `tokio-trace-nursery` repository. Remaining issues on the
    `tokio-trace-prototype` repo will be moved to the appropriate new repo.
    
    The crates added in this branch are not _identical_ to the current head
    of the `tokio-trace-prototype` repo, as I did some final clean-up and docs
    polish in this branch prior to merging this PR.
    
    [tokio-trace-prototype]: https://github.com/hawkw/tokio-trace-prototype
    
    
    
    Closes: #561
    
    Signed-off-by: default avatarEliza Weisman <eliza@buoyant.io>
    03d6e802
This project is licensed under the MIT License. Learn more