全链路追踪 0 篇文章

SLF4J MDC 在全链路跟踪中的应用

经常做线上问题排查的可能会有感受,由于日志打印一般是无序的,多线程下想要串行拿到一次请求中的相关日志简直是大海捞针。那么 MDC 是一种很好的解决办法。SLF4J 的 MDCSLF4J 提供了 MDC(MappedDiagnosticContexts)功能,它的实现也是利用了 ThreadLocal 机制。在代码中,只需要将指定的值 put 到线程上下文的 Map 中,然后在对应的地方使用 get 方法获取对应的值,从而达到自

自适应采样算法在全链路跟踪中的应用

自适应采样算法在全链路跟踪中的应用
在实际生产环境中,全链路跟踪框架如果对每个请求都开启跟踪,必然会对系统的性能带来一定的压力。与此同时,庞大的数据量也会占用大量的存储资源,使用全量采样的场景很有限,大部分应用接入链路跟踪的初衷是错误异常分析或者样本查看。为了消除全量采样给系统带来的影响,设置采样率是一个很好的办法。采样率通常是一个概率值,取值在 0 到 1 之间,例如设置采样率为 0.5 的话表示只对 50% 的请求进行采样。在之前的采样算法之蓄水

调用链跨线程传递 ThreadLocal 对象

调用链跨线程传递 ThreadLocal 对象
在全链路跟踪框架中,Trace 信息的传递功能是基于 ThreadLocal 的。但实际业务中可能会使用异步调用,这样就会丢失 Trace 信息,破坏了链路的完整性。在同一线程中 trace 信息的传递流程使用代码模拟如下:ThreadLocal<String>traceContext=newThreadLocal<>();StringtraceId=Tracer.startServer();traceConte

采样算法之蓄水池算法

全链路跟踪框架 Hunter 中原先的采样算法在高并发的情况下会出现问题,原有代码如下:protectedbooleandoSampled(finalfloatsampleRate){finalSpanCollectorMetricHandlermetricHandler=getMetricHandler();finallongcollectedCount=metricHandler.getCollec

基于 Hunter 的 Thrift RPC 调用链跟踪

基于 Hunter 的 Thrift RPC 调用链跟踪
Hunter 是我司自研的全链路跟踪框架,最近有集成 Thrift 的改造需求,先来看看通信链路传递信息的大致架构。##通信链路信息传递首先对于远程通信的链路埋点来说,有两个关键信息需要传递,即 traceId 与 spanId(parentspanId)。通信方式目前 Hunter 只支持 Http 一种。而 Http 利用 header 来传递 trace 信息也十分方便(traceId,spanId)。Client 端采用封装