prima_tracing.rs

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


Installation

Install from crates.io

toml prima-tracing = "0.5"

Cargo features

For ease of use you can use the following feature sets:

How to collect traces locally

If you are using the tracing feature in your project, the recommended way to view exported traces on your machine is to use the Jaeger all-in-one Docker image.

You need to add the following service to your Docker Compose setup (your main container should depend on it): yaml jaeger: image: jaegertracing/all-in-one:1.35 ports: - 16686:16686 - 55681:55681 environment: COLLECTOR_OTLP_ENABLED: true COLLECTOR_OTLP_HTTP_HOST_PORT: 55681 You can then visit the Jaeger web UI on your browser to search the traces.

Usage examples

Simple

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

fn main() -> std::io::Result<()> { let subscriber = configuresubscriber(builder("simple").withenv(Environment::Dev).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 json-logger automatically uses the JSON format as output

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

fn main() -> std::io::Result<()> { let subscriber = configuresubscriber(builder("json").withenv(Environment::Dev).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, Environment}; use tracing::{info, infospan};

fn main() -> std::io::Result<()> { let subscriber = configuresubscriber( builder("myapp") .withenv(Environment::Dev) .withversion("1.0".tostring()) .withtelemetry( "http://localhost:55681/v1/traces".tostring(), "myapp".to_string(), ) .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 -e COLLECTOR_OTLP_ENABLED=true -e COLLECTOR_OTLP_HTTP_HOST_PORT=55681 jaegertracing/all-in-one:1.35

Run pong service:

sh RUST_LOG=info cargo run --features=traces --example pong

Run ping service:

sh RUST_LOG=info cargo run --features=traces --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=datadog,traces --example datadog_json_logger

Custom formatter

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

Custom subscriber with default JSON output

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

Custom subscriber with custom JSON output

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