En utilisant Spring web, un simple OncePerRequestFilter
(voir ci-dessous) peuvent conserver un identifiant de demande pendant toute la durée de la demande. Stocker l'identifiant de la demande généré dans un attribut de la demande, l'ajouter au MDC de journalisation et le renvoyer dans un en-tête de réponse.
Je comprends que la pile webflux réactive est complètement différente, alors comment aborder cette question ?
J'ai trouvé https://github.com/spring-projects/spring-framework/issues/20239 mais il n'est pas clair ce qui est maintenant supporté ou non.
@Component
public class RequestIdFilter extends OncePerRequestFilter implements Ordered {
private static final String MDC_KEY = "requestId";
private static final String REQUEST_ATTRIBUTE_NAME = "requestId";
private static final String RESPONSE_HEADER_NAME = "X-Request-Id";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
var requestId = UUID.randomUUID().toString();
MDC.put(MDC_KEY, requestId);
request.setAttribute(REQUEST_ATTRIBUTE_NAME, requestId);
response.setHeader(RESPONSE_HEADER_NAME, requestId);
try {
filterChain.doFilter(request, response);
} finally {
MDC.remove(MDC_KEY);
}
}
@Override
public int getOrder() {
return requestIdProperties.getServerFilterOrder();
}
}