diff --git a/docker_compose/credit_tracker_config.env b/docker_compose/credit_tracker_config.env
index f21fa97..7678f1a 100644
--- a/docker_compose/credit_tracker_config.env
+++ b/docker_compose/credit_tracker_config.env
@@ -1,5 +1,5 @@
#commons
-APP_VERSION=1.16
+APP_VERSION=1.17
REGISTRY_URL=rh8-vm3.nbki.msk:5000
JMX_PORT=
JMX_HOSTNAME=
diff --git a/pom.xml b/pom.xml
index aa60f04..f2f11fe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
ru.nbch
credit-tracker
- 1.16
+ 1.17
credit_tracker
Credit Tracker Application
diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java
index 2fa0db6..7b33f68 100644
--- a/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java
+++ b/src/main/java/ru/nbch/credit_tracker/config/rest/filters/HttpLoggingFilter.java
@@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.config.rest.filters;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
import lombok.extern.slf4j.Slf4j;
@@ -12,11 +13,18 @@ import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
+import ru.nbch.credit_tracker.config.rest.wrappers.CachedHttpRequestWrapper;
+import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
+import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
+import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
+import static org.apache.commons.lang3.StringUtils.isBlank;
+import static org.apache.commons.lang3.StringUtils.isNotBlank;
+
@Component
@Slf4j
@Order(0)
@@ -25,6 +33,12 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
private static final Set SENSITIVE_HEADERS = Set.of("authorization", "cookie", "set-cookie");
private static final int MAX_BODY = 10 * 1024;
+ private final IXmlProcessor xmlProcessor;
+
+ public HttpLoggingFilter(IXmlProcessor xmlProcessor) {
+ this.xmlProcessor = xmlProcessor;
+ }
+
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getRequestURI();
@@ -38,7 +52,7 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
long startNs = System.nanoTime();
- ContentCachingRequestWrapper req = wrapRequest(request);
+ HttpServletRequestWrapper req = wrapRequest(request);
ContentCachingResponseWrapper resp = new ContentCachingResponseWrapper(response);
String correlationId = Optional.ofNullable(request.getHeader("X-Correlation-Id"))
@@ -46,14 +60,15 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
.orElse(UUID.randomUUID().toString());
resp.setHeader("X-Correlation-Id", correlationId);
- logIncomingRequest(req, correlationId);
+ String memberCode = parseMemberCode(req);
+ logIncomingRequest(req, correlationId, memberCode);
try {
chain.doFilter(req, resp);
} finally {
long tookMs = (System.nanoTime() - startNs) / 1_000_000;
- Map reqParams = paramsMap(req);
+ Map reqParams = paramsMap(req, memberCode);
Map reqHeaders = headersMap(req);
Map respHeaders = headersMap(resp);
@@ -62,10 +77,9 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
mask(respHeaders);
log.info(
- "HTTP (RESPONSE) {} {}{} | status={} | took={}ms | cid={} | reqHeaders={} | reqParams={} | respHeaders={}",
+ "HTTP (RESPONSE) {} {} | status={} | took={}ms | cid={} | reqHeaders={} | reqParams={} | respHeaders={}",
req.getMethod(),
req.getRequestURI(),
- req.getQueryString() == null ? "" : "?" + req.getQueryString(),
resp.getStatus(),
tookMs,
correlationId,
@@ -78,34 +92,75 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
}
}
+ private String parseMemberCode(HttpServletRequestWrapper req) {
+ String memberCode = null;
+ if (!(req instanceof CachedHttpRequestWrapper)) {
+ return null;
+ }
- private void logIncomingRequest(ContentCachingRequestWrapper req, String correlationId) {
- Map reqParams = paramsMap(req);
+ String body = ((CachedHttpRequestWrapper) req).getBody();
+ if (isBlank(body)) {
+ return null;
+ }
+ switch (req.getRequestURI()) {
+ case "/api/v1/signal/active_packages":
+ try {
+ MonitoringActivePackagesRequest activePackagesRequest = xmlProcessor.read(body, MonitoringActivePackagesRequest.class);
+ if (activePackagesRequest != null && isNotBlank(activePackagesRequest.getUserId())) {
+ memberCode = activePackagesRequest.getUserId().substring(0, 6);
+ }
+ } catch (Exception e) {
+ memberCode = null;
+ }
+ break;
+ case "/api/v1/signal/all_packages":
+ try {
+ MonitoringAllPackagesRequest allPackagesRequest = xmlProcessor.read(body, MonitoringAllPackagesRequest.class);
+ if (allPackagesRequest != null && isNotBlank(allPackagesRequest.getUserId())) {
+ memberCode = allPackagesRequest.getUserId().substring(0, 6);
+ }
+ } catch (Exception e) {
+ memberCode = null;
+ }
+ break;
+ default:
+ break;
+ }
+ return memberCode;
+ }
+
+ private void logIncomingRequest(HttpServletRequestWrapper req, String correlationId, String memberCode) {
+ Map reqParams = paramsMap(req, memberCode);
Map reqHeaders = headersMap(req);
mask(reqHeaders);
log.info(
- "HTTP (REQUEST) {} {}{} | cid={} | reqHeaders={} | reqParams={}",
+ "HTTP (REQUEST) {} {} | cid={} | reqHeaders={} | reqParams={}",
req.getMethod(),
req.getRequestURI(),
- req.getQueryString() == null ? "" : "?" + req.getQueryString(),
correlationId,
reqHeaders,
reqParams
);
}
- private static ContentCachingRequestWrapper wrapRequest(HttpServletRequest request) {
- return (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY);
+ private static HttpServletRequestWrapper wrapRequest(HttpServletRequest request) throws IOException {
+ return switch (request.getRequestURI()) {
+ case "/api/v1/signal/active_packages", "/api/v1/signal/all_packages" ->
+ new CachedHttpRequestWrapper(request);
+ default ->
+ (request instanceof ContentCachingRequestWrapper c) ? c : new ContentCachingRequestWrapper(request, MAX_BODY);
+ };
}
+
private static Map headersMap(HttpServletRequest req) {
return Collections.list(req.getHeaderNames()).stream()
.collect(Collectors.toMap(h -> h, req::getHeader, (a, b) -> a, LinkedHashMap::new));
}
- private Map paramsMap(ContentCachingRequestWrapper req) {
+ private static Map paramsMap(HttpServletRequestWrapper req, String memberCode) {
Map paramsMap = new LinkedHashMap<>();
req.getParameterMap().forEach((k, v) -> {
String params = String.join(", ", v);
@@ -120,6 +175,11 @@ public class HttpLoggingFilter extends OncePerRequestFilter {
} catch (Exception e) {
// ignore
}
+
+ if (memberCode != null) {
+ paramsMap.put("memberCode", memberCode);
+ }
+
return paramsMap;
}
diff --git a/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java b/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java
new file mode 100644
index 0000000..bf2517a
--- /dev/null
+++ b/src/main/java/ru/nbch/credit_tracker/config/rest/wrappers/CachedHttpRequestWrapper.java
@@ -0,0 +1,47 @@
+package ru.nbch.credit_tracker.config.rest.wrappers;
+
+import jakarta.servlet.ReadListener;
+import jakarta.servlet.ServletInputStream;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import lombok.Getter;
+import org.apache.commons.io.IOUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+@Getter
+public class CachedHttpRequestWrapper extends HttpServletRequestWrapper {
+ private final String body;
+
+
+ public CachedHttpRequestWrapper(HttpServletRequest request) throws IOException {
+ super(request);
+ body = IOUtils.toString(request.getReader());
+ }
+
+ @Override
+ public ServletInputStream getInputStream() {
+ ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(getBody().getBytes());
+ return new ServletInputStream() {
+ public int read() {
+ return byteArrayInputStream.read();
+ }
+
+ @Override
+ public boolean isFinished() {
+ return false;
+ }
+
+ @Override
+ public boolean isReady() {
+ return false;
+ }
+
+ @Override
+ public void setReadListener(ReadListener listener) {
+ }
+ };
+ }
+
+}
diff --git a/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java b/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java
index f9fdca5..3e6e435 100644
--- a/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java
+++ b/src/main/java/ru/nbch/credit_tracker/config/xml/XmlConfig.java
@@ -6,6 +6,8 @@ import org.springframework.context.annotation.Configuration;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.external_response.monitoring_report_file.SgnlReportMonitorigSetupError;
import ru.nbch.credit_tracker.entities.external_response.online_report.SgnlOnlineReport;
+import ru.nbch.credit_tracker.entities.user_request.active_packages.MonitoringActivePackagesRequest;
+import ru.nbch.credit_tracker.entities.user_request.all_packages.MonitoringAllPackagesRequest;
import ru.nbch.credit_tracker.entities.user_response.errors.MonitoringError;
import ru.nbch.credit_tracker.entities.user_response.success.MonitoringSetupResponse;
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
@@ -26,6 +28,8 @@ public class XmlConfig {
// unmarshalling classes
SgnlOnlineReport.class,
SgnlReportMonitorigSetupError.class,
+ MonitoringActivePackagesRequest.class,
+ MonitoringAllPackagesRequest.class,
// marshalling classes
MonitoringError.class,
MonitoringSetupResponse.class);