prima_tracing.rs

Utilities for configuring a tracing subscriber with support for logging and opentelemetry.


Installation

Install from crates.io

toml prima-tracing = "0.4.0"

Cargo features

Usage examples

Simple

```rust use primatracing::{builder, configuresubscriber, initsubscriber}; use tracing::{info, infospan};

fn main() -> std::io::Result<()> { let subscriber = configuresubscriber(builder("simple").withenv("dev".to_string()).build());

let _guard = init_subscriber(subscriber);

let span = info_span!("MySpan");
let _guard = span.enter();

info!("Starting my awesome app");
Ok(())

} ```

JSON output

It works like the simple example, but activating the prima-json-logger automatically uses the JSON format as output

```rust use primatracing::{builder, configuresubscriber, initsubscriber}; use tracing::{info, infospan};

fn main() -> std::io::Result<()> { let subscriber = configuresubscriber(builder("json").withenv("dev".to_string()).build());

let _guard = init_subscriber(subscriber);

let span = info_span!("MySpan");
let _guard = span.enter();

info!("Starting my awesome app");
Ok(())

}

```

OpenTelemetry

You need to have an OpenTelemetry collector (such as Jaeger) running locally.

```rust use primatracing::{builder, configuresubscriber, initsubscriber}; use tracing::{info, infospan};

fn main() -> std::io::Result<()> { let subscriber = configuresubscriber( builder("myapp") .withenv("dev".tostring()) .withversion("1.0".tostring()) .withtelemetry( "http://localhost:55681/v1/traces".tostring(), "myapp".tostring(), ) .build(), );

let _guard = init_subscriber(subscriber);

let span = info_span!("MySpan");
let _guard = span.enter();

info!("Starting my awesome app");
Ok(())

}

```

Custom Subscriber

```rust use primatracing::json; use tracing::{info, infospan}; use tracinglog::LogTracer; use tracingsubscriber::{layer::SubscriberExt, EnvFilter};

fn main() -> std::io::Result<()> { let subscriber = tracingsubscriber::Registry::default() .with(EnvFilter::fromdefaultenv()) .with(json::storage::layer()) .with(json::formatter::layer("test".toowned(), "dev".to_owned()));

LogTracer::init().expect("Failed to set logger");
tracing::subscriber::set_global_default(subscriber).expect("Setting default subscriber failed");

let span = info_span!("MySpan");
let _guard = span.enter();

info!("Starting my awesome app");
Ok(())

} ```

Running examples

Simple

sh RUST_LOG=info cargo run --example simple

Complex (OpenTelemetry)

Run Jaeger locally

sh docker run --rm -d -p 16686:16686 -p 55681:55681 jaegertracing/opentelemetry-all-in-one:latest

Run pong service:

sh RUST_LOG=info cargo run --features=prima-telemetry --example pong

Run ping service:

sh RUST_LOG=info cargo run --features=prima-telemetry --example ping

Check health of ping service (which calls pong service)

sh curl http://localhost:8081/check

Open the browser at http://localhost:16686 to inspect the traced request

OpenTelemetry + JSON logger with Datadog correlation IDs

sh RUST_LOG=info cargo run --features=prima-logger-datadog,prima-telemetry --example datadog_json_logger

Custom formatter

sh RUST_LOG=info cargo run --features=prima-logger-json --example custom_formatter

Custom subscriber with default JSON output

sh RUST_LOG=info cargo run --features=prima-logger-json --example custom-subscriber

Custom subscriber with custom JSON output

sh RUST_LOG=info cargo run --features=prima-logger-json --example custom-json-subscriber