добавление метрик на сервер grpc с помощью google.golang.org/grpc/stats

# #api #go #grpc #metrics

#API #Вперед #grpc #метрика

Вопрос:

Я использую grpc/статистику.Обработчик для измерения времени жизни запроса grpc. Я передаю этикетку для метрики «прометей» в трейлере. Как я могу удалить этот трейлер, чтобы не отправлять его клиенту?

 type connInfo struct {  beginTime time.Time  label string }  type Stats struct {  connInfo sync.Map   metrics *metrics.Metrics  logger *log.Logger }  func New(metrics *metrics.Metrics, logger *log.Logger) *Stats {  return amp;Stats{  connInfo: sync.Map{},   metrics: metrics,  logger: logger,  } }  func (h *Stats) TagRPC(ctx context.Context, _ *stats.RPCTagInfo) context.Context {  return ctx }  func (h *Stats) HandleRPC(ctx context.Context, s stats.RPCStats) {  if trailer, ok := s.(*stats.OutTrailer); ok {  remoteAddr := string(stats.Tags(ctx))  connInfoInterface, ok := h.connInfo.Load(remoteAddr)  if !ok {  h.logger.Warn(ctx, "start time was not set")  return  }  connInfo := connInfoInterface.(*connInfo)  connInfo.label = trailer.Trailer.Get(remoteAddr)[0]  } }  func (h *Stats) TagConn(ctx context.Context, s *stats.ConnTagInfo) context.Context {  ctx = stats.SetIncomingTags(ctx, []byte(s.RemoteAddr.String()))  return ctx }  func (h *Stats) HandleConn(ctx context.Context, s stats.ConnStats) {  remoteAddr := string(stats.Tags(ctx))  switch s.(type) {  case *stats.ConnBegin:  h.connInfo.Store(remoteAddr, amp;connInfo{beginTime: time.Now()})  case *stats.ConnEnd:  fmt.Printf("client disconnected")  connInfoInterface, ok := h.connInfo.LoadAndDelete(remoteAddr)  if !ok {  h.logger.Warn(ctx, "begin time not setted")  }  connInfo, ok := connInfoInterface.(*connInfo)  if !ok {  h.logger.Warn(ctx, "wrong convertations")  }  h.metrics.ConnectionTime.With(metrics.MakeLabels(connInfo.label)).Observe(time.Since(connInfo.beginTime).Seconds())  } }  

отправка трейлера с этикеткой

 remoteAddr := string(stats.Tags(ctx))  if remoteAddr != "" {  stream.SetTrailer(metadata.New(map[string]string{remoteAddr: metrics.ServiceTypeSpeechRecognizeGRPC}))  }  

Существуют ли какие-либо другие способы передачи информации из обработчика grpc в grpc/статистику.Хэндлкон?