我实际上只是在尝试对应用程序中的错误跟踪进行采样,但是我已经在我的应用程序中设置了一个概率采样器参数集,该参数在开始时对跨度进行采样,然后其余跨度遵循相同的模式,因此我尝试使用在Jaeger中强制采样选项,但它似乎并未覆盖由是否采样的初始跨度所做出的原始决定。请在这里帮助我。
答案 0 :(得分:0)
Jaeger客户端实现所谓的基于头的采样,其中在调用树的根部做出采样决策,并将其与跟踪上下文一起传播到树下。这样做是为了确保对给定迹线的所有跨度(或没有跨度)进行一致的采样,因为我们不想使硬币在每个节点处翻转,并最终出现部分/断线。在基于头的采样系统中实现错误采样实际上是不可能的。想象您的服务正在调用成功返回的服务A,然后再返回错误的服务B。假设未对跟踪的根进行采样(因为否则会正常捕获错误)。这意味着,当您知道来自B的错误时,A的整个子树已经被执行,并且由于先前的不采样决定,所有范围都被丢弃了。 B处的子树也已完成执行。此时,您唯一可以采样的是当前服务的跨度。您还可以通过响应呼叫者来实现采样决策的反向传播。因此,在最佳情况下,您可能会最终获得整个采样的子分支,并且如果跟踪从上方继续(例如通过重试),可能会在将来分支。但是您永远无法捕获完整的跟踪,有时B失败的原因是因为A(成功地)返回了一些导致稍后出错的数据。
请注意,今天的OpenTracing或OpenTelemetry不支持反向传播,但是W3C跟踪上下文工作组的上次会议已经讨论了反向传播。
实现抽样的另一种方法是基于尾巴的抽样,这是当今一些商业供应商采用的技术,例如Lightstep,DataDog。它也在Jaeger的路线图上(我们现在在Uber正在研究它)。对于基于尾部的采样,将从应用程序中捕获100%的跨度,但仅将其存储在收集层的内存中,直到收集完整的跟踪并做出采样决策为止。决策代码现在具有更多信息,包括错误,异常延迟等。如果我们决定对跟踪进行采样,则仅将其转移到磁盘存储中,否则我们将其从内存中逐出,因此只需要保持跨度即可在内存中平均停留几秒钟。基于尾的采样会给被跟踪的应用带来更大的性能损失,因为100%的流量需要通过跟踪工具进行配置。
您可以在我的书(https://www.shkuro.com/books/2019-mastering-distributed-tracing/)的第3章或很棒的论文中了解有关基于头和基于尾的采样的更多信息,“那么,您想跟踪分布式系统吗?来自多年实践经验的设计见解”。,作者:Raja R. Sambasivan,Rodrigo Fonseca,Ilari Shafer和Gregory R. Ganger(http://www.pdl.cmu.edu/PDL-FTP/SelfStar/CMU-PDL-14-102.pdf)。