#open-telemetry #tracing #logging #logging-tracing #spans #helper #auto

opentelemetry-auto-span

opentelemetry跟踪的辅助库

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 调试

Apache-2.0

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