Как правильно настроить MDC для входа в grpc-java с помощью ServerInterceptor? - PullRequest
0 голосов
/ 31 мая 2019

Я хочу использовать ThreadContext из log4j2 для установки ключей контекста MDC, таких как request-id, user-id, для отслеживания информации запроса в журналах для отладки.

Я написал MdcInterceptor, который выполняет следующее:

public class MdcInterceptor implements ServerInterceptor {

    @Override
    public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
                                                                 ServerCallHandler<ReqT, RespT> next) {
        ThreadContext.put("rid", generateId());
        return next.startCall(call, headers);
    }
}

К сожалению, это не работает, так как кажется, что разные колбэки могут вызываться из разных потоков из сервера-исполнителя с разными ThreadContext с.

Я нашел какое-то решение, опубликованное здесь https://github.com/grpc/grpc-java/issues/1949#issuecomment-226884288, которое говорит, что ThreadContext должно быть установлено при каждом обратном вызове в SimpleForwardingServerCallListener.

Дело в том, что в моем случае некоторая дополнительная информация должна быть добавлена, если возможно, в другой UserInfoInterceptor, который вызывается после MdcInterceptor (некоторая информация для аутентифицированного пользователя, которая требует проверки токена и т. Д.). Как правильно добавить эту информацию в область запроса ThreadContext?

Является ли опубликованное решение единственным возможным вариантом? Кажется немного странным, что я помещаю блок try-finally вокруг каждого супер-вызова в SimpleForwardingServerCallListener, не говоря уже о том, что я должен устанавливать контекст не один раз, а в каждом обратном вызове.

1 Ответ

0 голосов
/ 31 мая 2019

Вы можете использовать io.grpc.Context , который обрабатывает распространение специфической информации RPC в ваши обратные вызовы. Перед вызовом любого из событий на ClientCall.ListenerStreamObserver) библиотека gRPC установит правильный контекст. Рэй Цанг сделал хороший пример того, как использовать API.

...