#open-telemetry #tracing #spans #instrumentation #helper #trace #context

tracing-opentelemetry-instrumentation-sdk

基于 tracing 包构建OpenTelemetry仪表化的辅助工具集

16个版本 (7个重大变更)

0.19.0 2024年6月30日
0.18.0 2024年3月9日
0.16.0 2023年12月30日
0.15.0 2023年11月25日
0.12.0 2023年7月2日

#112调试

Download history 7151/week @ 2024-04-29 8190/week @ 2024-05-06 8919/week @ 2024-05-13 7778/week @ 2024-05-20 8255/week @ 2024-05-27 10113/week @ 2024-06-03 10073/week @ 2024-06-10 9741/week @ 2024-06-17 9866/week @ 2024-06-24 10092/week @ 2024-07-01 10183/week @ 2024-07-08 10312/week @ 2024-07-15 11550/week @ 2024-07-22 36971/week @ 2024-07-29 33351/week @ 2024-08-05 55668/week @ 2024-08-12

每月下载量 137,919
11 个包中 使用 (直接使用4个)

CC0 许可

31KB
487

tracing-opentelemetry-instrumentation-sdk

提供一组基于 OpenTelemetrytracing 包构建仪表化的辅助工具,并遵循 OpenTelemetry 跟踪语义约定

PS:欢迎贡献(错误报告、改进、功能等)

调用者侧的调用仪表化由以下步骤组成

  • 使用所有属性(一些设置为 Empty)开始一个跨度
  • 将传播数据(如果支持)注入调用(通过头部)
  • 执行调用
  • 使用响应(状态等)更新跨度的属性

调用者侧的调用仪表化由以下步骤组成

  • 提取传播信息(从头部)(如果支持)并创建一个OpenTelemetry上下文
  • 使用所有属性(一些设置为 Empty)开始一个跨度
  • 将上下文作为父项附加到跨度上
  • 执行处理
  • 使用响应(状态等)更新跨度的属性

这些包提供提取/注入上下文信息、开始和更新跨度以及处理期间检索上下文或trace_id的辅助工具(例如,将trace_id注入日志、错误消息等)。

  let trace_id = tracing_opentelemetry_instrumentation_sdk::find_current_trace_id();
  //json!({ "error" :  "xxxxxx", "trace_id": trace_id})

辅助工具可以直接使用,也可以用于构建基于它的中间件(例如:axum-tracing-opentelemetrytonic-tracing-opentelemetry是构建在为http提供的辅助工具之上的中间件(功能 & crate))

注意事项

  • tracing-opentelemetry扩展了tracing以与OpenTelemetry交互。但有一些限制
    • 在关闭跟踪跨度时创建OpenTelemetry的跨度。因此,不要尝试从跟踪跨度内部与OpenTelemetry Span(或SpanBuilder)交互。
    • OpenTelemetry父上下文(以及trace_id)在NEW跨度上创建,或从父跨度继承。创建后可以覆盖父上下文,但在那时之前,trace_idNEW的,因此跟踪的日志可能在NEW事件上报告为空或尚未设置的trace_id,直到更新为止。
    • 要从跟踪的跨度定义OpenTelemetry的跨度类型、名称等,使用特殊的记录名称:otel.nameotel.kind,...
    • tracing的跨度中记录应在创建时定义。因此,某些字段以值tracing::field::Empty创建,然后进行更新。
  • 使用目标otel::tracing(以及级别trace)创建跟踪,以有一个启用/禁用的通用方式

仪器提示

直到每个crate都被仪器化

使用tracing::instrumented(无传播 & 无更新在响应上)

// basic handmade span far to be compliant with
//[opentelemetry-specification/.../database.md](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.22.0/specification/trace/semantic_conventions/database.md)
fn make_otel_span(db_operation: &str) -> tracing::Span {
    // NO parsing of statement to extract information, not recommended by Specification and time-consuming
    // warning: providing the statement could leek information
    tracing_opentelemetry_instrumentation_sdk::otel_trace_span!(
        "DB request",
        db.system = "postgresql",
        // db.statement = stmt,
        db.operation = db_operation,
        otel.name = db_operation, // should be <db.operation> <db.name>.<db.sql.table>,
        otel.kind = "CLIENT",
        otel.status_code = tracing::field::Empty,
    )
}


      // Insert or update
        sqlx::query!(
                "INSERT INTO ...",
                id,
                sub_key,
                result,
            )
            .execute(&*self.pool)
            .instrument(make_otel_span("INSERT"))
            .await
            .map_err(...)?;

依赖关系

~4.5–6MB
~109K SLoC