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

How to collect OpenTelemetry traces locally

If you are using the prima-telemetry 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 prima-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=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