This is an automated email from the ASF dual-hosted git repository. dgriffon pushed a commit to branch improve-event-logging in repository https://gitbox.apache.org/repos/asf/unomi.git
commit 1b6193ccb95978d9896c7614bdd265b56f077685 Author: david.griffon <[email protected]> AuthorDate: Wed Dec 13 09:08:07 2023 +0100 UNOMI-811: change log message for invalid event + add debug information on invalid event type. --- .../unomi/schema/impl/SchemaServiceImpl.java | 1 + .../deserializers/ContextRequestDeserializer.java | 13 ++------- .../EventsCollectorRequestDeserializer.java | 9 ++----- .../java/org/apache/unomi/utils/HttpUtils.java | 31 +++++++++++++++++++--- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java b/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java index ca54fd243..437274c76 100644 --- a/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java +++ b/extensions/json-schema/services/src/main/java/org/apache/unomi/schema/impl/SchemaServiceImpl.java @@ -139,6 +139,7 @@ public class SchemaServiceImpl implements SchemaService { } } } catch (ValidationException e) { + logger.debug("Validation error : {}", e.getMessage()); Set<ValidationError> errors = buildCustomErrorMessage(e.getMessage()); String eventTypeOrErrorKey = eventType != null ? eventType : GENERIC_ERROR_KEY; if (errorsPerEventType.containsKey(eventTypeOrErrorKey)) { diff --git a/rest/src/main/java/org/apache/unomi/rest/deserializers/ContextRequestDeserializer.java b/rest/src/main/java/org/apache/unomi/rest/deserializers/ContextRequestDeserializer.java index 12ba8347d..4dba00ab0 100644 --- a/rest/src/main/java/org/apache/unomi/rest/deserializers/ContextRequestDeserializer.java +++ b/rest/src/main/java/org/apache/unomi/rest/deserializers/ContextRequestDeserializer.java @@ -23,12 +23,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.node.ArrayNode; import org.apache.unomi.api.ContextRequest; -import org.apache.unomi.api.Event; import org.apache.unomi.api.Item; import org.apache.unomi.api.Profile; import org.apache.unomi.api.services.PersonalizationService; import org.apache.unomi.rest.exception.InvalidRequestException; import org.apache.unomi.schema.api.SchemaService; +import org.apache.unomi.utils.HttpUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,16 +87,7 @@ public class ContextRequestDeserializer extends StdDeserializer<ContextRequest> } final JsonNode eventsNode = node.get("events"); if (eventsNode instanceof ArrayNode) { - ArrayNode events = (ArrayNode) eventsNode; - List<Event> filteredEvents = new ArrayList<>(); - for (JsonNode event : events) { - if (schemaService.isEventValid(event.toString())) { - filteredEvents.add(jsonParser.getCodec().treeToValue(event, Event.class)); - } else { - logger.error("An event was rejected - switch to DEBUG log level for more information"); - } - } - cr.setEvents(filteredEvents); + cr.setEvents(HttpUtils.filterValidEvents((ArrayNode) eventsNode, schemaService, jsonParser)); } final JsonNode filtersNode = node.get("filters"); if (filtersNode instanceof ArrayNode) { diff --git a/rest/src/main/java/org/apache/unomi/rest/deserializers/EventsCollectorRequestDeserializer.java b/rest/src/main/java/org/apache/unomi/rest/deserializers/EventsCollectorRequestDeserializer.java index b20d6bf07..b55e4f8c5 100644 --- a/rest/src/main/java/org/apache/unomi/rest/deserializers/EventsCollectorRequestDeserializer.java +++ b/rest/src/main/java/org/apache/unomi/rest/deserializers/EventsCollectorRequestDeserializer.java @@ -26,6 +26,7 @@ import org.apache.unomi.api.Event; import org.apache.unomi.api.EventsCollectorRequest; import org.apache.unomi.rest.exception.InvalidRequestException; import org.apache.unomi.schema.api.SchemaService; +import org.apache.unomi.utils.HttpUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,13 +63,7 @@ public class EventsCollectorRequestDeserializer extends StdDeserializer<EventsCo List<Event> filteredEvents = new ArrayList<>(); final JsonNode eventsNode = node.get("events"); if (eventsNode instanceof ArrayNode) { - for (JsonNode event : eventsNode) { - if (schemaService.isEventValid(event.toString())) { - filteredEvents.add(jsonParser.getCodec().treeToValue(event, Event.class)); - } else { - logger.error("An event was rejected - switch to DEBUG log level for more information"); - } - } + filteredEvents.addAll(HttpUtils.filterValidEvents((ArrayNode) eventsNode, schemaService, jsonParser)); } EventsCollectorRequest eventsCollectorRequest = new EventsCollectorRequest(); final JsonNode sessionId = node.get("sessionId"); diff --git a/rest/src/main/java/org/apache/unomi/utils/HttpUtils.java b/rest/src/main/java/org/apache/unomi/utils/HttpUtils.java index 678f3f0d4..87572eb22 100644 --- a/rest/src/main/java/org/apache/unomi/utils/HttpUtils.java +++ b/rest/src/main/java/org/apache/unomi/utils/HttpUtils.java @@ -17,24 +17,36 @@ package org.apache.unomi.utils; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; import org.apache.commons.lang3.StringUtils; +import org.apache.unomi.api.Event; import org.apache.unomi.api.Profile; import org.apache.unomi.api.services.ConfigSharingService; +import org.apache.unomi.schema.api.SchemaService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; import java.util.Enumeration; +import java.util.List; /** * This is duplicate of the class from the wab bundle, the original file will be removed once endpoints forwarded */ public class HttpUtils { + private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class); private static final int MAX_COOKIE_AGE_IN_SECONDS = 60 * 60 * 24 * 365; // 1 year /** * Utility to dump request info for a given http request. + * * @param httpServletRequest request to dump * @return the info as a String */ @@ -87,21 +99,34 @@ public class HttpUtils { /** * Return the cookie string for the given profile * We can't use the build in NewCookie jax-rs object as it does not support the SameSite value. - * @param profile to parse + * + * @param profile to parse * @param configSharingService shared config location. * @return the cookie string to set in the header. */ public static String getProfileCookieString(Profile profile, ConfigSharingService configSharingService, boolean isSecure) { final String profileIdCookieDomain = (String) configSharingService.getProperty("profileIdCookieDomain"); final String profileIdCookieName = (String) configSharingService.getProperty("profileIdCookieName"); - final Integer profileIdCookieMaxAgeInSeconds = (Integer) configSharingService.getProperty("profileIdCookieMaxAgeInSeconds") ; + final Integer profileIdCookieMaxAgeInSeconds = (Integer) configSharingService.getProperty("profileIdCookieMaxAgeInSeconds"); final Boolean profileIdCookieHttpOnly = (Boolean) configSharingService.getProperty("profileIdCookieHttpOnly"); return profileIdCookieName + "=" + profile.getItemId() + "; Path=/" + "; Max-Age=" + profileIdCookieMaxAgeInSeconds + - (StringUtils.isNotBlank(profileIdCookieDomain) ? ("; Domain=" + profileIdCookieDomain) : "") + + (StringUtils.isNotBlank(profileIdCookieDomain) ? ("; Domain=" + profileIdCookieDomain) : "") + "; SameSite=Lax" + (isSecure ? "; Secure" : "") + (profileIdCookieHttpOnly ? "; HttpOnly" : ""); } + + public static List<Event> filterValidEvents(ArrayNode eventsNode, SchemaService schemaService, JsonParser jsonParser) throws JsonProcessingException { + List<Event> filteredEvents = new ArrayList<>(); + for (JsonNode event : eventsNode) { + if (schemaService.isEventValid(event.toString())) { + filteredEvents.add(jsonParser.getCodec().treeToValue(event, Event.class)); + } else { + logger.error("An event was rejected - switch to DEBUG log level for more information OR test the payload of your event against the \"validateEvent\" endpoint."); + } + } + return filteredEvents; + } }
