Crate emit

source
Expand description

Structured diagnostics for Rust applications.

emit is a framework for adding diagnostics to your Rust applications with a simple, powerful data model and an expressive syntax inspired by Message Templates.

These are the technical API docs for emit. Also see the guide for a complete introduction.

§Getting started

[dependencies.emit]
version = "0.11.0-alpha.21"

[dependencies.emit_term]
version = "0.11.0-alpha.21"
fn main() {
    let rt = emit::setup()
        .emit_to(emit_term::stdout())
        .init();

    // Your app code goes here
    greet("Rust");

    rt.blocking_flush(std::time::Duration::from_secs(5));
}

#[emit::span("Greet {user}")]
fn greet(user: &str) {
    emit::info!("Hello, {user}!");
}

The setup() function configures emit with an Emitter to write Events to. The emit macro emits an event, capturing any ambient state referred to in its template. The span macro instruments a function, timing its execution and correlating any other events emitted within it together.

§Stable vs nightly toolchains

emit works on stable versions of Rust, but can provide more accurate compiler messages on nightly toolchains.

§Crate features

  • std (default): Enable support for the standard library. Enable capturing properties as errors. Implies alloc
  • alloc: Enable APIs that require an allocator.
  • implicit_rt (default): Enable configuring the default shared runtime and calling emit and span without needing to specify a runtime manually.
  • implicit_internal_rt (default): Enable configuring the internal runtime for emit’s own diagnostics.
  • sval: Enable capturing complex properties using sval.
  • serde: Enable capturing complex properties using serde.

§Troubleshooting

Emitters write their own diagnostics to an alternative emit runtime, which you can configure via Setup::init_internal to debug them:

fn main() {
    // Configure the internal runtime before your regular setup
    let internal_rt = emit::setup()
        .emit_to(emit_term::stdout())
        .init_internal();

    let rt = emit::setup()
        .emit_to(emit::emitter::from_fn(|evt| println!("{evt:#?}")))
        .init();

    // Your app code goes here

    rt.blocking_flush(std::time::Duration::from_secs(5));

    // Flush the internal runtime after your regular setup
    internal_rt.blocking_flush(std::time::Duration::from_secs(5));
}

Re-exports§

Modules§

Macros§

Structs§

  • A type that behaves like a default, empty, null value.
  • A captured record of something significant that occurred during the operation of a system.
  • Either a single Timestamp for a point in time, or a pair of Timestamps for a range.
  • A hierarchical identifier, such as a::b::c.
  • A string value.
  • A lazily evaluated text template with named holes for interpolating properties into.
  • A Unix timestamp with nanosecond precision.
  • An anonymous captured value that can be serialized or formatted.

Traits§

Functions§

  • Flush the runtime, ensuring all diagnostic events are fully processed.
  • Get the shared clock.
  • Get the shared context.
  • Emit an event.
  • Get the shared random generator.

Attribute Macros§

  • Capture a property using its Debug implementation.
  • Capture a property using its Display implementation.
  • Capture a property using its Error implementation.
  • Capture a property using its serde::Serialize implementation.
  • Capture a property using its sval::Value implementation.
  • Capture a property using its ToValue implementation.
  • Wrap an operation in a debug span.
  • Wrap an operation in an error span.
  • Specify Rust format flags to use when rendering a property in a template.
  • Wrap an operation in an info span.
  • Specify the key for a property.
  • Specify that a property value of None should not be captured, instead of being captured as null.
  • Wrap an operation in a span.
  • Wrap an operation in a warn span.