Merge branch 'RED-10681' into 'master'

RED-10681: Improve tracing to include metadata ids from RequestBody

Closes RED-10681

See merge request redactmanager/persistence-service!905
This commit is contained in:
Maverick Studer 2024-12-13 14:50:09 +01:00
commit 6d0354946a
2 changed files with 106 additions and 2 deletions

View File

@ -135,11 +135,14 @@ public class Application implements ApplicationContextAware {
@Override
public KeyValues getHighCardinalityKeyValues(ServerRequestObservationContext context) {
// Make sure that KeyValues entries are already sorted by name for better performance
return super.getHighCardinalityKeyValues(context)
.and(getValueFromPathVariableOrRequestParam(context, "dossierId"),
getValueFromPathVariableOrRequestParam(context, "dossierTemplateId"),
getValueFromPathVariableOrRequestParam(context, "fileId"));
getValueFromPathVariableOrRequestParam(context, "fileId"))
.and(getValueFromRequestAttribute(context, "dossierId"),
getValueFromRequestAttribute(context, "dossierTemplateId"),
getValueFromRequestAttribute(context, "fileId"));
}
@ -164,6 +167,13 @@ public class Application implements ApplicationContextAware {
.orElse(""));
}
private KeyValue getValueFromRequestAttribute(ServerRequestObservationContext context, String name) {
Object value = context.getCarrier().getAttribute(name);
return KeyValue.of(name, value == null ? "" : value.toString());
}
};
}

View File

@ -0,0 +1,94 @@
package com.iqser.red.service.peristence.v1.server;
import java.lang.reflect.Type;
import java.util.Map;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@ControllerAdvice
public class GenericRequestBodyAdvice implements RequestBodyAdvice {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public boolean supports(@NonNull MethodParameter methodParameter, @NonNull Type targetType, @NonNull Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public @NonNull HttpInputMessage beforeBodyRead(@NonNull HttpInputMessage inputMessage,
@NonNull MethodParameter parameter,
@NonNull Type targetType,
@NonNull Class<? extends HttpMessageConverter<?>> converterType) {
return inputMessage;
}
@Override
public @NonNull Object afterBodyRead(@NonNull Object body,
@NonNull HttpInputMessage inputMessage,
@NonNull MethodParameter parameter,
@NonNull Type targetType,
@NonNull Class<? extends HttpMessageConverter<?>> converterType) {
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attrs == null) {
return body;
}
HttpServletRequest request = attrs.getRequest();
try {
Map<String, Object> bodyMap = objectMapper.convertValue(body, new TypeReference<>() {
});
storeFieldIfPresent(bodyMap, "dossierId", request);
storeFieldIfPresent(bodyMap, "dossierTemplateId", request);
storeFieldIfPresent(bodyMap, "fileId", request);
} catch (Exception ignored) {
}
return body;
}
@Override
public Object handleEmptyBody(Object body,
@NonNull HttpInputMessage inputMessage,
@NonNull MethodParameter parameter,
@NonNull Type targetType,
@NonNull Class<? extends HttpMessageConverter<?>> converterType) {
return body;
}
private void storeFieldIfPresent(Map<String, Object> bodyMap, String fieldName, HttpServletRequest request) {
if (bodyMap.containsKey(fieldName)) {
Object value = bodyMap.get(fieldName);
if (value != null) {
request.setAttribute(fieldName, value.toString());
}
}
}
}