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),自造字段名会让跨服务查询与现成看板都失效。
手机号、令牌、身份证等敏感信息不要写入属性或事件:链路数据往往保留时间长、访问范围宽,一旦写入等于扩大了数据暴露面。