- 分布模式 (always on):当热力图中没有任何选区时,会显示当前 span 集合中每个 attribute 的值分布。适合用来发现占主导地位或异常稀少的值 (基数离群值) 。
- 比较模式:在热力图上拖出一个矩形,将其中的 spans (Selection) 与其余所有 spans (Background) 进行比较。适合用于定位偏差。
- 迭代式下钻:点击任意条形即可按该值进行过滤 (或排除) 。热力图会基于过滤后的 span 集合重新渲染,因此你可以不断缩小范围,直到原因一目了然。
前置条件
入门
- 在 数据源 下拉菜单中,选择一个包含链路追踪数据的 source。source 的名称可以任意;关键是它必须配置为 Trace 类型。Event Deltas 选项卡仅对这类 source 启用。
- 在 分析模式 部分,点击 Event Deltas 选项卡。
热力图
- X axis:时间
- Y axis:数值,默认为 span 耗时 (毫秒,对数刻度)
分布模式:基数离群值
- 高值:哪些服务、端点、状态码或主机主导了你的 span 集合?这通常会显示出某个租户、版本或路由承载了大部分流量。
- 低值:那些确实出现但出现频率很低的值。某个仅出现在
0.5%span 中的状态码,或某台几乎不出现的主机,可能才是最值得关注的信号。长尾往往是回归问题和异常行为的藏身之处。
比较模式:偏离正常情况之处
用例 1:回归前 vs 回归后
SpanKind、SpanName 和 ScopeName 都显示出明显的橙绿分化,对应较慢的 Selection 和健康的 Background。结合来看,它们勾勒出了拐点处究竟发生了什么变化。
当你想问“发生了什么变化?”时,这就是合适的形态。还有一种更紧凑的变体,流程相同:当一小团慢速 span 出现在原本平静的带状区域中时 (例如右边缘的短暂突发,或稳定时段中间的一簇) ,就只围绕那一簇画一个小框。形态不同,问题也随之变化:竖向长条是在问 时间上发生了什么变化;而聚焦的小框是在问 这个簇有什么特别之处。
用例 2:慢与快
迭代式下钻
- 过滤:仅保留具有该值的 span
- 排除:移除具有该值的 span
- 复制:将该值复制到剪贴板
聚合后的 Other (N) 桶会折叠低频值,因此不可点击。若要过滤该桶中的某个特定值,请直接使用搜索栏。
自定义热力图
| 参数 | 默认值 | 说明 |
|---|---|---|
| 标度 | 对数 | 对数适合处理跨度较大的延迟范围;线性更适合范围较窄且分布均匀的情况。 |
| 值 | (Duration)/1e6 | 可使用任意数值表达式:响应大小、错误率,或自定义 span 属性。 |
| 计数 | count() | 用于着色的聚合。可切换为 avg(), sum(), p95(), 或 countDistinct(field) 这类表达式。 |
- 当延迟区间较窄时,将标度切换为线性 (例如某个服务的 spans 都在 5 到 50 ms 之间) 。对数标度会把垂直空间浪费在没有数据的高值区间。
- 在 Y 轴上绘制耗时之外的其他指标。 将 值 设为
SpanAttributes.http.response.size,可帮助你分析缓慢且体积大的响应;像if(StatusCode = 'Error', 1, 0)这样的表达式,则可绘制各个服务随时间变化的错误频率。 - 按计数以外的指标着色。 将 计数 设为
p95(Duration)后,每个分桶都会按尾部延迟着色,而不是按数量着色,从而凸显那些在基于计数的视图中容易被掩盖的少见但高延迟区域。countDistinct(TraceId)则可在单个 trace 产生大量 spans 时,区分 trace 量与 span 量。
高效使用技巧
- 先过滤到单个服务。 不同服务之间的延迟差异很大,混在一起会掩盖真正的信号。开始前,先用搜索栏将范围缩小到一个
ServiceName(或一个端点) ,这样热力图和分布反映的才是可相互比较的数据总体。 - 选择视觉对比清晰的区间。 比较模式在 Selection 带与 Background 有明显差异时效果最好,例如从某个容易识别的时刻开始的性能退化区间,或者与主体明显分离的慢尾。与其余数据高度重叠的选择,往往暴露出来的是噪声,而不是真正的偏差。
- 反复执行:过滤、热力图、再过滤。 单次选择很少能直接定位根因。把第一次比较当作一个假设,对差异最大的值添加过滤器,然后重新查看新的热力图和分布。经过两三轮迭代,通常就能将一次回归缩小到一两个属性。
- 在不做选择时使用分布模式,适用于暂时还看不出明显对比的情况 (你知道存在问题,但热力图看起来很均匀) 。先应用一个假设性过滤器,比如只看错误 span、只看客户端 span,或只看某一个端点,然后让属性分布先帮你找出影响最大的值,再去绘制任何矩形。