Crates.io | fastrace-axum |
lib.rs | fastrace-axum |
version | 0.1.2 |
created_at | 2025-03-27 13:32:25.271059+00 |
updated_at | 2025-08-07 11:59:00.461117+00 |
description | A axum instrument for propagating trace context for fastrace |
homepage | |
repository | https://github.com/fast/fastrace-axum |
max_upload_size | |
id | 1607947 |
size | 83,005 |
fastrace-axum
is a middleware library that connects fastrace, a distributed tracing library, with axum, a gRPC framework for Rust. This integration enables seamless trace context propagation across microservice boundaries in gRPC-based applications.
Context propagation is a fundamental concept in distributed tracing that enables the correlation of operations spanning multiple services. When a request moves from one service to another, trace context information needs to be passed along, ensuring that all operations are recorded as part of the same trace.
fastrace-axum
implements the W3C Trace Context standard for propagating trace information between services. This ensures compatibility with other tracing systems that follow the same standard.
fastrace
library for complete distributed tracing.Add fastrace-axum
to your Cargo.toml:
[dependencies]
fastrace = "0.7"
fastrace-axum = "0.1"
Apply the FastraceLayer
to your axum server:
use fastrace::collector::Config;
use fastrace::collector::ConsoleReporter;
#[tokio::main]
async fn main() {
// Configurate fastrace reporter.
fastrace::set_reporter(ConsoleReporter, Config::default());
let app = axum::Router::new()
.route("/ping", axum::routing::get(ping))
// Add a the FastraceLayer to routes.
// The layer extracts trace context from incoming requests.
.layer(fastrace_axum::FastraceLayer);
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
#[fastrace::trace] // Trace individual handlers.
async fn ping() -> &'static str {
"pong"
}
To propagate trace context from clients to your axum service:
use fastrace::prelude::*;
use reqwest::Client;
#[fastrace::trace]
async fn send_request() {
let client = Client::new();
let response = client
.get("http://your-axum-service/endpoint")
.headers(fastrace_reqwest::traceparent_headers()) // Adds traceparent header.
.send()
.await
.unwrap();
// Process response...
}
Check out the examples directory for a complete ping/pong service example that demonstrates both client and server tracing.
To run the example:
Start the server:
cargo run --example server
In another terminal, run the client:
cargo run --example client
Both applications will output trace information showing the request flow, including the propagated context.
traceparent
header.This project is licensed under the Apache-2.0 license.