From 00b4ad800d472f28a102df084043961b2c4bb99b Mon Sep 17 00:00:00 2001 From: Maverick Studer Date: Fri, 13 Dec 2024 14:50:09 +0100 Subject: [PATCH] RED-10681: Improve tracing to include metadata ids from RequestBody --- .../peristence/v1/server/Application.java | 14 ++- .../v1/server/GenericRequestBodyAdvice.java | 94 +++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/GenericRequestBodyAdvice.java diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java index 5252ec9c3..d79cb5801 100644 --- a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/Application.java @@ -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()); + } + }; } diff --git a/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/GenericRequestBodyAdvice.java b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/GenericRequestBodyAdvice.java new file mode 100644 index 000000000..0e0baeec0 --- /dev/null +++ b/persistence-service-v1/persistence-service-server-v1/src/main/java/com/iqser/red/service/peristence/v1/server/GenericRequestBodyAdvice.java @@ -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> converterType) { + + return true; + } + + + @Override + public @NonNull HttpInputMessage beforeBodyRead(@NonNull HttpInputMessage inputMessage, + @NonNull MethodParameter parameter, + @NonNull Type targetType, + @NonNull Class> converterType) { + + return inputMessage; + } + + + @Override + public @NonNull Object afterBodyRead(@NonNull Object body, + @NonNull HttpInputMessage inputMessage, + @NonNull MethodParameter parameter, + @NonNull Type targetType, + @NonNull Class> converterType) { + + ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attrs == null) { + return body; + } + + HttpServletRequest request = attrs.getRequest(); + + try { + Map 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> converterType) { + + return body; + } + + + private void storeFieldIfPresent(Map bodyMap, String fieldName, HttpServletRequest request) { + + if (bodyMap.containsKey(fieldName)) { + Object value = bodyMap.get(fieldName); + if (value != null) { + request.setAttribute(fieldName, value.toString()); + } + } + } + +}