首页/云/可观测性速查/手动埋点:业务关键路径补 span

手动埋点:业务关键路径补 span

自动埋点覆盖框架层,业务语义(下单、扣库存、对账)要手动补:显式命名、设属性、标记状态,才能让链路对业务可读。

可观测性速查云更新于 2026-10-13

手动埋点是什么

自动埋点覆盖的是框架层(HTTP 请求、数据库调用、消息收发),业务语义(下单、扣库存、对账)必须手动补:显式起一个命名清晰的 span、设置业务属性、标记成功或失败状态,并在异常时记录异常对象。只有补上这一层,链路才不只是「调了哪些接口」,而是「业务发生了什么」。

基本信息

核心 APItracer.start_as_current_span(name)
命名习惯动作 + 对象(order.create)
属性span.set_attribute(key, value)
状态span.set_status(StatusCode.ERROR, desc)
异常span.record_exception(e)
命名要求低基数,避免拼入 ID

典型使用场景

  • 给关键业务动作(下单、支付、发券)补 span,便于按业务维度分析耗时
  • 在异常分支标记状态并记录异常,让错误请求在链路里一眼可见
  • 为外部依赖调用(下游 HTTP、第三方支付)补 span,区分自身与外部耗时
  • 给 span 附上业务属性(渠道、商品类型),支持按维度筛选
  • 定位「总耗时长但框架 span 都很短」的间隙到底花在哪
  • 排查跨服务问题时,用带业务语义的 span 名替代模糊的「调用了接口」

Python 手动埋点

Python 手动埋点
tracer = trace.get_tracer("orders")

with tracer.start_as_current_span("order.create") as span:
    span.set_attribute("order.type", "flash_sale")   # 业务属性
    try:
        order_id = create_order(req)
        span.set_attribute("order.result", "created")
    except StockOut as e:
        span.set_status(Status(StatusCode.ERROR, "stock out"))
        span.record_exception(e)                    # 记录异常对象
        raise

常用操作

操作方法用途
起 spanstart_as_current_span创建并挂到当前上下文
加属性set_attribute补充业务维度
标状态set_status区分成功与失败
记异常record_exception保留异常类型与堆栈
加事件add_event标记关键时间点
手动 span 命名用「动作 + 对象」(order.create、stock.hold),保持低基数便于聚合;把订单号拼进 span 名会让统计失去意义。
属性与 span 名的取舍:命名要低基数,取值多样的信息放进属性,这样既能聚合又保留明细。
异常要同时 set_status 与 record_exception:只设状态会丢失异常信息,只记异常则状态仍显示成功。
手动 span 应包裹真正有意义的业务边界,而不是每行代码都加一个,过细的粒度会让链路图难以阅读。

易错点

  • 把整个大循环包在一个 span 里粒度太粗,定位不到具体阶段
  • 手动 span 忘记挂到当前上下文(未用 start_as_current)会形成平行树,父子关系断裂
  • 把订单号、请求 ID 拼进 span 名会让序列基数爆炸,统计与展示都失去意义
  • 只在成功路径埋点、异常分支不标状态,会导致错误请求在链路分析里被当成正常
  • 属性值类型不一致(有时数字有时字符串)会让下游按属性筛选失效

数据来源与参考

  • OpenTelemetry 官方文档 · Manual instrumentation
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌