Install from crates.io
prima-tracing = "0.11"For ease of use you can use the following feature sets:
-
liveenables the feature you will most likely want in a production/staging environment -
devenables the features you will most likely want in a dev environment -
json-loggeroutputs traces to standard output in JSON format -
datadogextendsjson-loggeroutput with trace and span information allowing Datadog to connect logs and traces -
tracesexports tracing spans and events using the opentelemetry-otlp exporter -
rt-tokio-current-threadconfigures the OpenTelemetry tracer to use Tokio’s current thread runtime (e.g.actix_web::main). Without this feature, the Tokio multi-thread runtime is used by default.
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):
jaeger:
image: jaegertracing/all-in-one:1.35
ports:
- 16686:16686
- 55681:55681
environment:
COLLECTOR_OTLP_ENABLED: true
COLLECTOR_OTLP_HTTP_HOST_PORT: 55681You can then visit the Jaeger web UI on your browser to search the traces.
use prima_tracing::{builder, configure_subscriber, init_subscriber, Environment};
use tracing::{info, info_span};
fn main() -> std::io::Result<()> {
let subscriber = configure_subscriber(
builder("simple")
.with_country(Country::Common)
.with_env(Environment::Dev)
.build()
);
let _guard = init_subscriber(subscriber);
let span = info_span!("MySpan");
let _guard = span.enter();
info!("Starting my awesome app");
Ok(())
}It works like the simple example, but activating the json-logger automatically
uses the JSON format as output
use prima_tracing::{builder, configure_subscriber, init_subscriber, Country, Environment};
use tracing::{info, info_span};
fn main() -> std::io::Result<()> {
let subscriber = configure_subscriber(
builder("json")
.with_country(Country::Common)
.with_env(Environment::Dev)
.build()
);
let _guard = init_subscriber(subscriber);
let span = info_span!("MySpan");
let _guard = span.enter();
info!("Starting my awesome app");
Ok(())
}You need to have an OpenTelemetry collector (such as Jaeger) running locally.
use prima_tracing::{builder, configure_subscriber, init_subscriber, Country, Environment};
use tracing::{info, info_span};
fn main() -> std::io::Result<()> {
let subscriber = configure_subscriber(
builder("myapp")
.with_country(Country::Common)
.with_env(Environment::Dev)
.with_version("1.0".to_string())
.with_telemetry(
"http://localhost:55681".to_string(),
"myapp".to_string(),
)
.build(),
);
let _guard = init_subscriber(subscriber);
let span = info_span!("MySpan");
let _guard = span.enter();
info!("Starting my awesome app");
Ok(())
}use prima_tracing::json;
use tracing::{info, info_span};
use tracing_log::LogTracer;
use tracing_subscriber::{layer::SubscriberExt, EnvFilter};
fn main() -> std::io::Result<()> {
let subscriber = tracing_subscriber::Registry::default()
.with(EnvFilter::from_default_env())
.with(json::storage::layer())
.with(json::formatter::layer("test".to_owned(), "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(())
}RUST_LOG=info cargo run --example simpleRun Jaeger locally
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.35Run pong service:
RUST_LOG=info cargo run --features=traces --example pongRun ping service:
RUST_LOG=info cargo run --features=traces --example pingCheck health of ping service (which calls pong service)
curl http://localhost:8081/checkOpen the browser at http://localhost:16686 to inspect the traced request
RUST_LOG=info cargo run --features=datadog,traces --example datadog_json_loggerRUST_LOG=info cargo run --features=json-logger --example custom_formatterRUST_LOG=info cargo run --features=json-logger --example custom-subscriberRUST_LOG=info cargo run --features=json-logger --example custom-json-subscriber