写
Grpc reporter
调用grpc客户端发送span,打印error。
func (r *Reporter) send(ctx context.Context, spans []*model.Span, process *model.Process) error {
spans, process = addProcessTags(spans, process, r.agentTags)
batch := model.Batch{Spans: spans, Process: process}
req := &api_v2.PostSpansRequest{Batch: batch}
_, err := r.collector.PostSpans(ctx, req)
if err != nil {
r.logger.Error("Could not send spans over gRPC", zap.Error(err))
}
return err
}
metric reporter
通过metric发送span的数目,失败的span数量。
// EmitBatch emits batch to collector.
func (r *MetricsReporter) EmitBatch(ctx context.Context, batch *jaeger.Batch) error {
size := int64(0)
if batch != nil {
size = int64(len(batch.GetSpans()))
}
err := r.wrapped.EmitBatch(ctx, batch)
updateMetrics(r.metrics[jaegerBatches], size, err)
return err
}
client-metrics
记录当前agent连接的client数量。
记录client发过来的metric信息:
- 由于queue满了而被丢弃的span数量等
读
processor
三种processor,不同的协议和端口。
var defaultProcessors = []struct {
model Model
protocol Protocol
port int
}{
{model: "zipkin", protocol: "compact", port: ports.AgentZipkinThriftCompactUDP},
{model: "jaeger", protocol: "compact", port: ports.AgentJaegerThriftCompactUDP},
{model: "jaeger", protocol: "binary", port: ports.AgentJaegerThriftBinaryUDP},
}
defaultQueueSize = 1000
defaultMaxPacketSize = 65000
defaultServerWorkers = 10
UDPServer
每个processor都会创建一个udpserver。
- 创建udp连接
- 设置 socket buffer size。
bufferedServer
-
开一个goroutine,从udp中读取数据,封装成readbuf,塞进chan,通过pool缓存readbuf。
type ReadBuf struct { bytes []byte n int }
readbuf
每次都直接 make 64kb 的 []byte 切片。 (因为client定时发送,连接数不多)
var readBufPool = &sync.Pool{
New: func() interface{} {
return &ReadBuf{bytes: make([]byte, maxPacketSize)}
},
}
通过覆盖旧数据,重复利用 []byte。
ThriftProcessor
开 10个goroutine,从bufferedServer读取数据。
写入thrift.TProtocol,通过processor发送。
通过pool处理thrift.TProtocol。