func()

in internal/beater/interceptors/metrics.go [46:94]


func (m *metricsInterceptor) Interceptor() grpc.UnaryServerInterceptor {
	return func(
		ctx context.Context,
		req interface{},
		info *grpc.UnaryServerInfo,
		handler grpc.UnaryHandler,
	) (interface{}, error) {
		var legacyMetricsPrefix string

		switch info.FullMethod {
		case "/opentelemetry.proto.collector.metrics.v1.MetricsService/Export":
			legacyMetricsPrefix = "apm-server.otlp.grpc.metrics."
		case "/opentelemetry.proto.collector.trace.v1.TraceService/Export":
			legacyMetricsPrefix = "apm-server.otlp.grpc.traces."
		case "/opentelemetry.proto.collector.logs.v1.LogsService/Export":
			legacyMetricsPrefix = "apm-server.otlp.grpc.logs."
		default:
			m.logger.With(
				"grpc.request.method", info.FullMethod,
			).Warn("metrics registry missing")
			return handler(ctx, req)
		}

		m.inc(legacyMetricsPrefix, request.IDRequestCount)
		defer m.inc(legacyMetricsPrefix, request.IDResponseCount)

		start := time.Now()
		resp, err := handler(ctx, req)
		duration := time.Since(start)
		m.getHistogram(requestDurationHistogram, metric.WithUnit("ms")).Record(context.Background(), duration.Milliseconds())

		responseID := request.IDResponseValidCount
		if err != nil {
			responseID = request.IDResponseErrorsCount
			if s, ok := status.FromError(err); ok {
				switch s.Code() {
				case codes.Unauthenticated:
					m.inc(legacyMetricsPrefix, request.IDResponseErrorsUnauthorized)
				case codes.DeadlineExceeded, codes.Canceled:
					m.inc(legacyMetricsPrefix, request.IDResponseErrorsTimeout)
				case codes.ResourceExhausted:
					m.inc(legacyMetricsPrefix, request.IDResponseErrorsRateLimit)
				}
			}
		}
		m.inc(legacyMetricsPrefix, responseID)
		return resp, err
	}
}