首页/云/可观测性速查/Span 属性与事件

Span 属性与事件

属性(attributes)是键值元数据,用于过滤与聚合;事件(events)是带时间戳的节点记录,典型用途是记录异常堆栈与关键里程碑。

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

Span 属性与事件是什么

Span 是链路里的一个操作单元,它随身携带两类补充信息:属性(attributes)是键值元数据,随 span 一起存储,用于筛选、聚合与关联;事件(events)是挂在这个 span 时间轴上的带时间戳节点,典型用途是记录异常堆栈、缓存命中或重试这类「某个时刻发生了什么」。属性面向统计,事件面向过程还原,二者混用会同时抬高存储与查询成本。

基本信息

适用平台OpenTelemetry 各语言 SDK,语义约定 1.x
属性类型字符串、布尔、数值、数组(各语言支持略有差异)
事件结构名称 + 时间戳 + 可选属性集合
常见用途属性做过滤分组,事件做异常与里程碑记录

典型使用场景

  • 标记请求语义:写入 HTTP 方法与状态码,让链路可按接口维度筛选
  • 记录业务主键:订单号、任务 ID 放进事件,排障时不污染标签体系
  • 异常留证:捕获异常后记录事件并附带堆栈,同时把 span 状态标记为错误
  • 记录关键节点:缓存命中、重试次数、外部调用耗时作为事件节点
  • 灰度与版本关联:把版本、环境写进资源属性或 span 属性,便于按版本对比

属性与事件用法

属性与事件用法
span.set_attribute("http.request.method", "POST")        # 语义约定字段名
span.set_attribute("http.response.status_code", 500)
span.set_attribute("order.channel", "wechat")              # 低基数才适合做属性

span.add_event("cache.miss", {"key": "sku:100"})           # 事件记录过程节点
span.add_event("exception", {"stack": traceback_text})     # 异常建议同时置 Error 状态

# 高基数字段(订单号、请求 ID)优先放事件或日志,不要当属性

属性与事件的取舍

维度属性 attributes事件 events
存储位置与 span 同一行,随 span 一起索引挂在 span 时间轴上,可多条
主要用途过滤、分组、聚合统计还原过程与记录异常细节
基数容忍度低基数,高基数会放大存储可承载单次请求的高基数值
典型字段服务、版本、状态码、环境异常堆栈、重试、缓存命中
语义约定给出了字段名的标准写法,尽量沿用(如 http.request.method),自造字段名会让跨服务查询与现成看板都失效。
手机号、令牌、身份证等敏感信息不要写入属性或事件:链路数据往往保留时间长、访问范围宽,一旦写入等于扩大了数据暴露面。

易错点

  • 把大对象(完整响应体)序列化成属性值会显著放大存储,长文本应留在日志侧
  • 异常被捕获后只 add_event 不设置 span 状态,链路详情看着正常,统计「失败链路」时整批遗漏
  • 属性名同一含义多种写法(status_code 与 http.status_code 并存)会让看板出现双份分组
  • 把订单号这类高基数值塞进属性,序列与索引规模随业务量膨胀,查询也变慢

数据来源与参考

  • OpenTelemetry 官方文档 · Span Attributes / Events
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌