jaeger-agent

253 阅读1分钟

截屏2022-04-01 下午5.19.40.png

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数量等

截屏2022-04-01 下午5.20.07.png

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。