5个不稳定版本
0.3.2 | 2023年11月21日 |
---|---|
0.3.1 | 2023年11月18日 |
0.3.0 | 2023年11月13日 |
0.2.0 | 2022年8月13日 |
0.1.0 | 2022年8月9日 |
#350 in 调试
250KB
533 代码行
rust-opentelemetry-auto-span
用法
添加依赖项
[dependencies]
opentelemetry-auto-span = "0.3"
注释函数
use opentelemetry_auto_span::auto_span;
#[get("/user/{id}")]
#[auto_span]
async fn get_user(
id: web::Path<(i64,)>,
db: web::Data<sqlx::MySqlPool>,
) -> actix_web::Result<HttpResponse, Error> {
let user: User = sqlx::query_as("SELECT * FROM users WHERE id = ?")
.bind(id.into_inner().0)
.fetch_one(&**db)
.await?;
Ok(HttpResponse::Ok().json(&user))
}
然后,捕获以下信息
- 函数跨度(从
get_user
开始到结束) .await
跨度- 如果发生错误,则返回(在
.await?
)并由?
处理,记录错误
转换示例
使用 sqlx::query*
#[auto_span]
async fn get_user(
id: web::Path<(i64,)>,
db: web::Data<sqlx::MySqlPool>,
) -> actix_web::Result<HttpResponse, Error> {
let user: User = sqlx::query_as("SELECT * FROM users WHERE id = ?")
.bind(id.into_inner().0)
.fetch_one(&**db)
.await?;
Ok(HttpResponse::Ok().json(&user))
}
↓
async fn get_user(
id: web::Path<(i64,)>,
db: web::Data<sqlx::MySqlPool>,
) -> actix_web::Result<HttpResponse, Error> {
#[allow(unused_imports)]
use opentelemetry::trace::{Span as _, TraceContextExt as _, Tracer as _};
let __otel_auto_tracer = opentelemetry::global::tracer("");
let __otel_auto_ctx =
opentelemetry::Context::current_with_span(__otel_auto_tracer.start("fn:get_user"));
let __otel_auto_guard = __otel_auto_ctx.clone().attach();
let __otel_auto_span = __otel_auto_ctx.span();
let user: User = {
let __otel_auto_ctx =
opentelemetry::Context::current_with_span(__otel_auto_tracer.start("db"));
let __otel_auto_guard = __otel_auto_ctx.clone().attach();
let __otel_auto_span = __otel_auto_ctx.span();
{
__otel_auto_span.set_attribute(opentelemetry::KeyValue::new(
"db.statement",
"SELECT * FROM users WHERE id = ?",
));
sqlx::query_as("SELECT * FROM users WHERE id = ?")
}
.bind(id.into_inner().0)
.fetch_one(&**db)
.await
}
.map_err(|e| {
__otel_auto_span.set_status(::opentelemetry::trace::Status::error(format!("{}", e)));
e
})?;
Ok(HttpResponse::Ok().json(&user))
}
选项
使用
#[auto_span(debug)]
fn my_func() {}
名称 | 操作 |
---|---|
调试 | 将迁移的代码输出到 ./target/auto_span 或 /tmp/auto_span |
all_await | 为所有 await 生成跨度 |
依赖项
~2.7–4MB
~78K SLoC