code: func RegisterInterceptor(s ServiceInfoProvider, i *Interceptor) (err error) {
  	if i.trackPeers {
  		return nil
  	}
  
  	infos := s.GetServiceInfo()
  	for sn, info := range infos {
  		for _, m := range info.Methods {
  			t := handlerType(m.IsClientStream, m.IsServerStream)
  
  			for c := uint32(0); c <= 15; c++ {
  				requestLabels := prometheus.Labels{
  					"service": sn,
  					"handler": m.Name,
  					"code":    codes.Code(c).String(),
  					"type":    t,
  				}
  				messageLabels := prometheus.Labels{
  					"service": sn,
  					"handler": m.Name,
  				}
  
  				// server
  				if _, err = i.monitoring.server.errors.GetMetricWith(requestLabels); err != nil {
  					return err
  				}
  				if _, err = i.monitoring.server.requestsTotal.GetMetricWith(requestLabels); err != nil {
  					return err
  				}
  				if _, err = i.monitoring.server.requestDuration.GetMetricWith(requestLabels); err != nil {
  					return err
  				}
  				if m.IsClientStream {
  					if _, err = i.monitoring.server.messagesReceived.GetMetricWith(messageLabels); err != nil {
  						return err
  					}
  				}
  				if m.IsServerStream {
  					if _, err = i.monitoring.server.messagesSend.GetMetricWith(messageLabels); err != nil {
  						return err
  					}
  				}
  			}
  		}
  	}
  	return nil
  }
docs: // RegisterInterceptor preallocates possible dimensions of every metric.
  // If peer tracking is enabled, nothing will happen.
  // If you register interceptor very frequently (for example during tests) it can allocate huge amount of memory.