You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by dg...@apache.org on 2023/12/13 08:08:16 UTC

(unomi) 01/01: UNOMI-811: change log message for invalid event + add debug information on invalid event type.

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 <dg...@jahia.com>
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;
+    }
 }