MdcUtils.java
package no.nav.data.common.utils;
import no.nav.data.common.security.SecurityUtils;
import no.nav.data.common.security.dto.UserInfo;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import java.util.Optional;
import java.util.UUID;
public final class MdcUtils {
private MdcUtils() {
}
private static final String CORRELATION_ID = "correlationId";
private static final String CALL_ID = "callId";
private static final String USER_ID = "userId";
private static final String CONSUMER_ID = "consumerId";
private static final String CALLER_APP_ID = "callerAppId";
private static final String REQUEST_PATH = "RequestPath";
private static final String REQUEST_METHOD = "RequestMethod";
private static String createUUID() {
return UUID.randomUUID().toString();
}
public static String getOrGenerateCorrelationId() {
return Optional.ofNullable(MDC.get(CORRELATION_ID)).orElse(createUUID());
}
public static void createCorrelationId() {
MDC.put(CORRELATION_ID, createUUID());
}
public static void clearCorrelationId() {
MDC.remove(USER_ID);
}
public static String getCallId() {
return MDC.get(CALL_ID);
}
public static void setCallId(String correlationId) {
MDC.put(CALL_ID, correlationId);
}
public static void clearCallId() {
MDC.remove(CALL_ID);
}
public static String getUser() {
return MDC.get(USER_ID);
}
public static void setCallerFromSecurity(SecurityUtils securityUtils) {
setUser(getCurrentSecurityContextUser(securityUtils));
setCallerAppId(getCurrentSecurityContextCallerApp(securityUtils));
}
public static void setUser(String user) {
MDC.put(USER_ID, user);
}
public static void clearUser() {
MDC.remove(USER_ID);
}
public static void setConsumerId(String consumer) {
MDC.put(CONSUMER_ID, consumer);
}
public static void clearConsumerId() {
MDC.remove(CONSUMER_ID);
}
public static void setRequestPath(String path) {
MDC.put(REQUEST_PATH, path);
}
public static void clearRequestPath() {
MDC.remove(REQUEST_PATH);
}
public static void setRequestMethod(String method) {
MDC.put(REQUEST_METHOD, method);
}
public static void clearRequestMethod() {
MDC.remove(REQUEST_METHOD);
}
public static void setCallerAppId(String callerAppId){
MDC.put(CALLER_APP_ID, callerAppId);
}
public static void clearCallerAppId(){
MDC.remove(CALLER_APP_ID);
}
public static Runnable wrapAsync(Runnable runnable, String user) {
return () -> {
setUser(user);
setConsumerId(Constants.APP_ID);
createCorrelationId();
try {
runnable.run();
} finally {
clearMdc();
}
};
}
private static String getCurrentSecurityContextUser(SecurityUtils securityUtils) {
return securityUtils.getCurrentUser()
.map(userInfo -> StringUtils.isBlank(userInfo.getName()) ? userInfo.getAppName() : userInfo.getIdentName())
.orElse("no-auth");
}
private static String getCurrentSecurityContextCallerApp(SecurityUtils securityUtils) {
return securityUtils.getCurrentUser()
.map(UserInfo::getAppName)
.orElse("no-caller-app-id");
}
private static void clearMdc() {
clearCorrelationId();
clearCallId();
clearUser();
clearConsumerId();
clearRequestPath();
clearRequestMethod();
clearCallerAppId();
}
}