Crates.io | fastrace-tonic |
lib.rs | fastrace-tonic |
version | 0.1.0 |
created_at | 2025-03-18 15:38:35.217474+00 |
updated_at | 2025-03-18 15:38:35.217474+00 |
description | A tonic instrument for propagating trace context for fastrace |
homepage | |
repository | https://github.com/fast/fastrace-tonic |
max_upload_size | |
id | 1596719 |
size | 24,743 |
fastrace-tonic
is a middleware library that connects fastrace, a distributed tracing library, with tonic, 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-tonic
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-tonic
to your Cargo.toml:
[dependencies]
fastrace = "0.7"
fastrace-tonic = "0.1"
Apply the FastraceServerLayer
to your tonic server:
use fastrace_tonic::FastraceServerLayer;
use tonic::transport::Server;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize fastrace reporter.
fastrace::set_reporter(ConsoleReporter, Config::default());
// Add FastraceServerLayer to your tonic server.
Server::builder()
.layer(FastraceServerLayer)
.add_service(YourServiceServer::new(YourService::default()))
.serve("[::1]:50051".parse()?)
.await?;
fastrace::flush();
Ok(())
}
Apply the FastraceClientLayer
to your tonic client:
use fastrace_tonic::FastraceClientLayer;
use tower::ServiceBuilder;
async fn make_client_call() -> Result<(), Box<dyn std::error::Error>> {
// Create channel with FastraceClientLayer.
let channel = tonic::transport::Channel::from_static("http://[::1]:50051")
.connect()
.await?;
let channel = ServiceBuilder::new()
.layer(FastraceClientLayer)
.service(channel);
// Create client with the enhanced channel.
let mut client = YourServiceClient::new(channel);
// Make calls as usual.
let response = client.your_method(Request::new(YourRequest {})).await?;
Ok(())
}
Check out the examples directory for a complete ping/pong service example that demonstrates both client and server tracing.
To run the example:
Navigate to the example directory:
cd example
Start the server:
cargo run --bin server
In another terminal, run the client:
cargo run --bin client
Both applications will output trace information showing the request flow, including the propagated context.
FastraceClientLayer
detects if there's an active trace and adds a traceparent
HTTP header with the trace context.FastraceServerLayer
extracts the trace context from the traceparent
header and creates a new span as a child of the received context.This process ensures that all operations across services are properly connected in the resulting trace, providing visibility into the entire request lifecycle.
This project is licensed under the Apache-2.0 license.