概述
应用性能监控(APM)提供了分布式链路追踪能力,能够帮助用户自动构建每次请求的完整路径,实现一站式全链路问题分析,提高定位问题的效率。应用接入 APM 以后,会基于用户请求向 APM 系统上报链路信息,链路信息以 Trace 和 Span 的形式承载。当业务规模增长时,往 APM 上报的链路信息会随之增长,与此同时,使用 APM 的成本费用也会随之增加。
Trace 代表一条完整的链路,描述一次用户请求多个分布式应用中经过的路径;
Span 代表链路中的一个环节,可以是一次 RPC 调用、一次 HTTP 调用、一次消息发送,也可以是应用内部的一次本地函数调用。
在实际使用场景中,不是每一条 Trace 都值得被 APM 系统记录,因为分布式系统之间的相互调用会产生大量重复的链路信息。特别是在系统健康运行的时候,重复而冗余的链路信息对于用户分析性能问题并不会带来太大的价值。采样(Sampling)的引入,可以减少重复的链路信息,从而帮助用户将关注的重点放在更有价值的数据上,同时降低 APM 的使用成本。
常见的采样方案
采样的本质,是从大量数据中选择一部分数据进行观察和分析,以理解系统整体的行为或特性。体现在 APM 系统中,采样针对的是链路数据,这代表没有被选择到的链路数据可以不被采集,或者采集后直接被丢弃。具体哪一些链路数据被选择,在不同的采样方案,会存在比较大的差异。根据 APM 系统的特点,采样策略的引入,需要考虑到如下几个重要的方面:
链路完整性。一条完整的链路(Trace)包含多个跟踪单元(Span),如果采样导致一条链路中的部分 Span 被丢弃,链路的完整性就会被打破,整条链路数据都会失去价值。
指标正确性。各种统计指标不要因为采样策略的引入而出现偏差,包括吞吐量、响应时间、错误率、应用健康状态等等。
保留高价值数据。在真实的分布式系统中,偶尔会出现一些关注度非常高的链路数据,需要采样策略能够选择性的保留这些数据。其中最典型的例子就是错误调用和慢调用,当一条链路中存在错慢调用的时候,不能被采样策略丢弃。
结合这几项普遍的需求,基于数据的选择和采样时机,APM 领域诞生了2种典型的采样方案。
头部采样(Head Based Sampling)
基本概念
头部采样是指在请求进入分布式系统的入口处进行采样决策,随着请求在不同应用之间的流转,采样决策会一直保持传播,从而保证每一个环节都遵循相同的行为。在系统入口处,一旦决定对某个请求进行采样,整条链路都可以完整的保留下来。
实现原理
头部采样的实现比较简单,使用通用的链路传播协议,例如 OpenTelemetry 默认使用的 W3C 链路上下文标准,都针对头采样方案提供了支持。APM 系统只需要基于链路传播协议,在提供给应用接入的探针或 SDK 中进行简单的处理,就能实现头部采样。但头部采样可能会导致某些重要事件或异常的遗漏,因为采样决策是在请求开始时就已经确定的,无法根据请求在处理过程中的实际情况进行调整。
例如,当用户请求进入分布式系统后,基于预设的采样规则,做出的决策是:此条链路不采样。但在接下来的环节,这条链路上出现了一个数据库慢调用,SQL 执行的时长超过了3秒。这本应用是一个值得重点分析的重要事件,但因为采样策略的引入,导致整条链路都被丢弃了。
此外,在 APM 系统中,链路数据和统计指标之间是存在相互关系的,例如统计某一个接口的响应耗时99分位数,往往依赖于 APM 服务端基于收到的链路进行计算。头部采样会导致指标数据跟真实情况发生非常大的偏离。
尾部采样(Tail Based Sampling)
尾部采样是指在请求完成后再进行采样决策。APM 系统会先临时收集所有链路数据,然后在请求完成后根据实际情况(如请求的响应时间、错误状态等)决定保留哪一些链路。
尾部采样的优点是能够更好地捕获重要事件和异常,也可以确保统计指标的准确性。但尾部采样需要 APM 系统在服务端引入额外的存储和计算资源,来临时保存所有请求的链路数据,实现比较复杂。在常见的开源 APM 项目中,对于尾部采样的实现,都没有提供完整的实现方式。
采样方案总结
类别 | 头部采样 | 尾部采样 |
决策时间点 | 在请求入口处决策 | 在请求完成之后再决策 |
决策者 | APM 的客户端,也就是应用侧 | APM 服务端 |
实现方式 | 未采样的数据不上报到 APM 服务端 | 全量上报,APM服务端再基于链路的特点决定是否保存 |
链路完整性 | 满足 | 满足 |
保留错慢请求 | 不满足 | 满足 |
指标正确性 | 在大多数情况下不满足,特别是 APM 服务端通过链路数据进行指标统计的场景。 | 满足 |
实现复杂度 | 低 | 高 |
总的来说,头部采样和尾部采样各有优缺点,需要根据实际的业务需求和系统状况进行选择。但站在 APM 使用者的角度,建议使用尾部采样方案,对于分析应用性能和排查问题能够提供更好的帮助。
在腾讯云 APM 中开启采样策略
基于尾部采样方案在分析应用性能和排查问题方面的优势,腾讯云应用性能监控(APM)实现了完整了尾部采样方案,能够在降低数据存储量的同时,确保错慢链路完整保存,并确保所有指标数据的正确。合理的使用采样策略,不仅可以降低 APM 的使用成本,而且对于 APM 的使用体验不会带来明显的影响。此外,APM 提供的采样策略适用于所有语言编写的应用,也适用于所有接入方案。
说明:
在按量付费模式下,应用性能监控(APM)的计费项包括上报费用和链路存储费用,详情请参考 APM 按量付费介绍。在 APM 控制台开启采样策略以后,可以降低链路存储费用,最高可以降低90%。但因为尾部采样方案需要全量上报数据,以确保指标的正确性以及错慢链路完整保存,开启采样策略并不能降低上报费用。
套餐包(预付费)模式下,采样率将被固定在10%,详情请参考 APM 套餐包介绍。
目前采样策略需要通过开白名单的形式提供,请您通过 提交工单 进行申请。申请完成后,在 应用性能监控 > 系统配置 中将展示采样配置。
配置全局采样比例
1. 登录 腾讯云可观测平台 控制台。
2. 在左侧菜单栏中选择应用性能监控 > 系统配置,进入采样配置页面。
3. 在全局采样配置模块,点击编辑。
4. 填写采样百分比,有效的采样百分比在10%到100%之间。
说明:
请根据实际情况配置是否保存错误链路,以及慢调用保存阈值。如果链路上存在错误的调用或慢调用,整条链路都会被完整保存。推荐开启保存错误链路,并将慢调用保存阈值设置在500ms到2000ms之间。
配置全采样接口
当全局采样比例小于100%的时候,可以自定义需要全采样的接口,如果链路经过了需要全采样的接口,整条链路都会被完整保存。
1. 点击新增全采样接口。
2. 在对话框中输入策略名,并指定需要进行全采样的接口。
如果在策略中指定了具体的应用,可以不填写接口匹配规则,此时代表经过此应用的所有链路都会被完整保存。您可以基于精确匹配、前缀匹配以及后缀匹配来指定接口。在实际使用场景中,可以将关注度比较高的重要接口定义为全采样接口,确保不错过任何一条针对重要接口的调用。
说明:
对全局采样比例和全采样接口的更新,都可以即时生效。