Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

引子

萌叔在阅读tailsamplingprocessor源码时,发现channel的一种有趣的玩法,这里记录一下

FIFO 队列

tailsamplingprocessor中通过NumTraces
设置内存中最多保存的trace的数量,
超过这个阈值,就从按照先进先出的原则,删除最先进入队列的trace

// NumTraces is the number of traces kept on memory. Typically most of the data
// of a trace is released after a sampling decision is taken.
NumTraces uint64 `mapstructure:"num_traces"`

processor.go

    postDeletion := false
    currTime := time.Now()
    for !postDeletion {
        select {
        case tsp.deleteChan <- id:
            postDeletion = true
        default:
            traceKeyToDrop := <-tsp.deleteChan
            tsp.dropTrace(traceKeyToDrop, currTime)
        }
    }

channel刚好满足这个特性,
如果tsp.deleteChan 没有满, 则往tsp.deleteChan写入一个traceID;
如果tsp.deleteChan已经装满,则从队列(tsp.deleteChan)中取出头部元素,
其实就是最先进入队列的traceID,将其对应的trace信息从内存中删除(tsp.dropTrace())。


微信公众号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注