采样创建TraceSegment
默认情况下,每个请求都应该生成一条完整的 Trace。但在面对海量请求时这就会给网络和存储带来更多的压力,浪费很多资源。为了解决这个问题,几乎所有的 Trace 系统都会支持采样的功能。Skywalking agent 中采样的控制大致如下所示:

详情请看:Skywalking的埋点-Agent动态采样控制
基于时间窗口控制采样率
SamplingService 负责控制采样率,其内部实现是时间窗口+计数器的方式;当进入新时间窗口的时候:
- 计数器重置清0
-
每一个采样,计数器+1,当达到阈值后,不再采样,直到下一个时间窗口重置
image.png
收集TraceSegment
简单来说 TracingContext 通过 stopSpan() 方法关闭最后一个 Span 时,会调用 finish() 方法关闭相应的 TraceSegment,同时会通知TraceSegmentServiceClient(gRPC)或者KafkaTraceSegmentServiceClient(Kafka)对这个TraceSegment进行收集,存放到一个缓冲区中,进而发送到后端的 OAP 集群
这个缓冲队列有长度限制(300*5),当因消费慢引发队列满的情况下,其逻辑是再尝试加入队列3次,如果还不成功,则丢弃当前TraceSegment.
发送Trace
XXXSegmentServiceClient有一个消费线程,不停的拉取缓冲队列中的数据,
- 如果是TraceSegmentServiceClient,则通过gRPC发送给后端OAP
- 如果是KafkaTraceSegmentServiceClient,则丢到Kafka中。

网友评论