oparl-service/oparl-server/src/main/java/de/twomartens/oparlservice/interceptors/TraceIdInterceptor.java

86 lines
2.5 KiB
Java

package de.twomartens.oparlservice.interceptors;
import lombok.NoArgsConstructor;
import org.slf4j.MDC;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
@Component
@NoArgsConstructor
public class TraceIdInterceptor extends HandlerInterceptorAdapter
implements ClientHttpRequestInterceptor {
private static final String LOGGER_TRACE_ID = "TraceID";
private static final String HEADER_FIELD_TRACE_ID = "X-TraceId";
/**
* Gets the TraceId from the MDC or create a new one and put it to the MDC
*/
public String getTraceId() {
String traceId = MDC.get(LOGGER_TRACE_ID);
if (traceId == null || traceId.trim().isEmpty()) {
traceId = UUID.randomUUID().toString();
MDC.put(LOGGER_TRACE_ID, traceId);
}
return traceId;
}
/**
* A failsafe method to set a TraceId to the MDC.
*
* @param traceId should be a traceId, if it is null or empty a new one will be created.
*/
public void setOrCreateTraceId(String traceId) {
if (traceId == null || traceId.trim().isEmpty()) {
traceId = UUID.randomUUID().toString();
}
MDC.put(LOGGER_TRACE_ID, traceId);
}
/**
* Removes the traceId from the MDC.
*/
public void resetTraceId() {
MDC.remove(LOGGER_TRACE_ID);
}
/**
* Creates a new traceId for this thread.
*
* An old one will be overwritten!
*/
public void createNewTraceId() {
resetTraceId();
getTraceId();
}
// client interceptor web
@Override
public ClientHttpResponse intercept(
HttpRequest request,
byte[] body,
ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().add(HEADER_FIELD_TRACE_ID, getTraceId());
return execution.execute(request, body);
}
// server interceptor web
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String traceId = request.getHeader(HEADER_FIELD_TRACE_ID);
setOrCreateTraceId(traceId);
response.addHeader(HEADER_FIELD_TRACE_ID, getTraceId());
return true;
}
}