开源项目教程:tracing-opentelemetry-instrumentation-sdk
项目介绍
tracing-opentelemetry-instrumentation-sdk
是一个 Rust 库集合,旨在帮助开发者在使用 tracing
和 OpenTelemetry
进行应用监控和追踪时更加便捷。该项目提供了多种工具和中间件,支持与 axum
框架的集成,以及一个用于本地开发和演示的假 OpenTelemetry 收集器。
项目快速启动
以下是一个简单的快速启动示例,展示如何在本地环境中启动并使用 tracing-opentelemetry-instrumentation-sdk
。
安装依赖
首先,确保你已经安装了 Rust 和 Cargo。然后,将以下依赖添加到你的 Cargo.toml
文件中:
[dependencies]
axum = "0.6"
tracing = "0.1"
tracing-opentelemetry = "0.17"
tracing-subscriber = "0.3"
初始化追踪
在你的主应用程序文件中,初始化 tracing
和 OpenTelemetry
:
use axum::{routing::get, Router};
use tracing_subscriber::prelude::*;
use tracing_opentelemetry::OpenTelemetryLayer;
use opentelemetry::sdk::trace::Tracer;
#[tokio::main]
async fn main() {
// 初始化 tracing
let tracer = opentelemetry::sdk::trace::Tracer::default();
let telemetry = OpenTelemetryLayer::new(tracer);
tracing_subscriber::registry()
.with(telemetry)
.init();
// 创建一个简单的 axum 服务器
let app = Router::new().route("/", get(|| async { "Hello, world!" }));
// 启动服务器
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}
运行 Jaeger
为了在本地查看追踪数据,你需要运行 Jaeger。可以使用以下命令启动 Jaeger:
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-e COLLECTOR_OTLP_ENABLED=true \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 9411:9411 \
jaegertracing/all-in-one:1.49
启动后,访问 http://localhost:16686
即可查看 Jaeger UI。
应用案例和最佳实践
案例1:HTTP 服务监控
使用 axum-tracing-opentelemetry
中间件来监控 HTTP 服务的请求和响应。
use axum::{routing::get, Router};
use tracing_opentelemetry::OpenTelemetryLayer;
use opentelemetry::sdk::trace::Tracer;
use axum_tracing_opentelemetry::AxumLayer;
#[tokio::main]
async fn main() {
let tracer = opentelemetry::sdk::trace::Tracer::default();
let telemetry = OpenTelemetryLayer::new(tracer);
tracing_subscriber::registry()
.with(telemetry)
.init();
let app = Router::new()
.route("/", get(|| async { "Hello, world!" }))
.layer(AxumLayer::new());
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(app.into_make_service())
.await