tracing-bunyan-formatter-with-utc-offset

Crates.iotracing-bunyan-formatter-with-utc-offset
lib.rstracing-bunyan-formatter-with-utc-offset
version0.3.6
sourcesrc
created_at2023-03-16 09:54:56.167445
updated_at2023-03-16 09:54:56.167445
descriptionA Bunyan formatter for the tracing crate
homepage
repositoryhttps://github.com/theo-coder/tracing-bunyan-formatter
max_upload_size
id811391
size276,004
Theo (theo-coder)

documentation

https://docs.rs/tracing-bunyan-formatter/

README

tracing-bunyan-formatter

Bunyan formatting for tokio-rs/tracing.

Crates.io version Download docs.rs docs CircleCI badge

tracing-bunyan-formatter provides two Layers implementation to be used on top of a tracing Subscriber:

Important: each span will inherit all fields and properties attached to its parent - this is currently not the behaviour provided by tracing_subscriber::fmt::Layer.

Example

use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer, Config};
use tracing::instrument;
use tracing::info;
use tracing_subscriber::Registry;
use tracing_subscriber::layer::SubscriberExt;

#[instrument]
pub fn a_unit_of_work(first_parameter: u64) {
    for i in 0..2 {
        a_sub_unit_of_work(i);
    }
    info!(excited = "true", "Tracing is quite cool!");
}

#[instrument]
pub fn a_sub_unit_of_work(sub_parameter: u64) {
    info!("Events have the full context of their parent span!");
}

fn main() {
    // UTC offset
    let config = Config { offset: 1 };
    let formatting_layer = BunyanFormattingLayer::new("tracing_demo".into(), std::io::stdout, Some(config));
    let subscriber = Registry::default()
        .with(JsonStorageLayer)
        .with(formatting_layer);
    tracing::subscriber::set_global_default(subscriber).unwrap();

    info!("Orphan event without a parent span");
    a_unit_of_work(2);
}

Console output


If you pipe the output in the bunyan CLI:


Implementation strategy

The layered approach we have pursued is not necessarily the most efficient, but it makes it easier to separate different concerns and re-use common logic across multiple Layers.

While the current crate has no ambition to provide any sort of general purpose framework on top of [tracing-subscriber]'s Layer trait, the information collected by JsonStorageLayer can be leveraged via its public API by other downstream layers outside of this crate whose main concern is formatting. It significantly lowers the amount of complexity you have to deal with if you are interested in implementing your own formatter, for whatever reason or purpose.

You can also add another enrichment layer following the JsonStorageLayer to collect additional information about each span and store it in JsonStorage. We could have pursued this compositional approach to add elapsed_milliseconds to each span instead of baking it in JsonStorage itself.

Optional features

You can enable the arbitrary_precision feature to handle numbers of arbitrary size losslessly. Be aware of a known issue with untagged deserialization.

Testing

Currently the tests only support being run sequentially, so the number of threads needs to be restricted:

cargo test -- --test-threads 1

Commit count: 74

cargo fmt