diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/ObserverEvent.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/ObserverEvent.java index 41cdbbe8b..648a6e6bd 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/ObserverEvent.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/ObserverEvent.java @@ -1,5 +1,12 @@ package li.strolch.agent.api; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.joining; + +import java.util.List; +import java.util.Map; + +import li.strolch.model.StrolchElement; import li.strolch.model.StrolchRootElement; import li.strolch.utils.collections.MapOfLists; @@ -7,4 +14,29 @@ public class ObserverEvent { public MapOfLists added = new MapOfLists<>(); public MapOfLists updated = new MapOfLists<>(); public MapOfLists removed = new MapOfLists<>(); + + @Override + public String toString() { + String added = this.added.isEmpty() ? "0" : collectSizes(this.added); + String updated = this.updated.isEmpty() ? "0" : collectSizes(this.updated); + String removed = this.removed.isEmpty() ? "0" : collectSizes(this.removed); + return "ObserverEvent{added=" + added + ", updated=" + updated + ", removed=" + removed + "}"; + } + + private String collectSizes(MapOfLists added) { + return added.stream() + .map(entry -> entry.getKey() + "=[" + collectSizeByType(entry) + "]") + .collect(joining(",")); + } + + private static String collectSizeByType(Map.Entry> entry) { + String sizeByType = entry.getValue() + .stream() + .collect(groupingBy(StrolchElement::getType)) + .entrySet() + .stream() + .map(e -> e.getKey() + "=" + e.getValue().size()) + .collect(joining(",")); + return sizeByType; + } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/DefaultObserverHandler.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/DefaultObserverHandler.java index 81baebbd9..e7e294051 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/DefaultObserverHandler.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/DefaultObserverHandler.java @@ -18,6 +18,7 @@ package li.strolch.agent.impl; import static li.strolch.model.Tags.AGENT; import static li.strolch.runtime.StrolchConstants.SYSTEM_USER_AGENT; import static li.strolch.utils.collections.SynchronizedCollections.synchronizedMapOfLists; +import static li.strolch.utils.helper.StringHelper.formatNanoDuration; import java.text.MessageFormat; import java.util.ArrayList; @@ -87,6 +88,8 @@ public class DefaultObserverHandler implements ObserverHandler { try { ObserverEvent event = this.eventQueue.takeFirst(); + long start = System.nanoTime(); + for (String key : event.added.keySet()) { List list = event.added.getList(key); if (list != null) @@ -103,6 +106,10 @@ public class DefaultObserverHandler implements ObserverHandler { notifyRemove(key, list); } + long durationNanos = System.nanoTime() - start; + if (durationNanos >= 250000000L) + logger.warn("Observer update for event " + event + " took " + formatNanoDuration(durationNanos)); + } catch (InterruptedException e) { if (this.run) logger.error("Failed to do updates!", e);