From 39440c4250495df108581d6523af6774954963de Mon Sep 17 00:00:00 2001 From: mjok Date: Mon, 29 Jun 2020 14:38:20 +0300 Subject: [PATCH] #8 Auto filter logic --- .../com/jkoolcloud/remora/AdviceRegistry.java | 38 +++++++++++++++++++ .../remora/advices/BaseTransformers.java | 13 ++++--- ...eredOutEntryStack.java => EmptyStack.java} | 4 +- .../remora/core/output/ChronicleOutput.java | 10 +++-- .../remora/filters/FilterManager.java | 6 +++ remora-websphere/pom.xml | 10 ++--- 6 files changed, 66 insertions(+), 15 deletions(-) rename remora-core/src/main/java/com/jkoolcloud/remora/core/{FilteredOutEntryStack.java => EmptyStack.java} (86%) diff --git a/remora-core/src/main/java/com/jkoolcloud/remora/AdviceRegistry.java b/remora-core/src/main/java/com/jkoolcloud/remora/AdviceRegistry.java index 7595a2a..a2f1f2c 100644 --- a/remora-core/src/main/java/com/jkoolcloud/remora/AdviceRegistry.java +++ b/remora-core/src/main/java/com/jkoolcloud/remora/AdviceRegistry.java @@ -21,14 +21,24 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import com.jkoolcloud.remora.advices.BaseTransformers; import com.jkoolcloud.remora.advices.RemoraAdvice; +import com.jkoolcloud.remora.filters.AdviceFilter; +import com.jkoolcloud.remora.filters.FilterManager; +import com.jkoolcloud.remora.filters.LimitingFilter; public enum AdviceRegistry { INSTANCE; + public static final String AUTO_LIMITING_FILTER = "AUTO_LIMITING_FILTER"; + public static final int FILTER_ADVANCE = 2; + public static final int INITIAL_FILTER_EVERY_N_TH = 256; + public static final int RELEASE_TIME_SEC = 60; private List adviceList = new ArrayList<>(50); private Map adviceMap = new HashMap<>(50); @@ -60,4 +70,32 @@ public BaseTransformers getBaseTransformerByName(String name) throws ClassNotFou } } + public static void limit() { + LimitingFilter limitingFilter = (LimitingFilter) FilterManager.INSTANCE.get(AUTO_LIMITING_FILTER); + if (limitingFilter == null) { + + limitingFilter = new LimitingFilter(); + limitingFilter.everyNth = INITIAL_FILTER_EVERY_N_TH * FILTER_ADVANCE; + FilterManager.INSTANCE.add(AUTO_LIMITING_FILTER, limitingFilter); + } + AdviceFilter filter = FilterManager.INSTANCE.get(AUTO_LIMITING_FILTER); + AdviceRegistry.INSTANCE.adviceList.stream() + .filter(advice -> !((BaseTransformers) advice).filters.contains(filter)) + .forEach(advice -> ((BaseTransformers) advice).filters.add(filter)); + + ((LimitingFilter) limitingFilter).everyNth /= FILTER_ADVANCE; + ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); + + executorService.scheduleAtFixedRate(AdviceRegistry::release, 0, RELEASE_TIME_SEC, TimeUnit.SECONDS); + } + + public static void release() { + LimitingFilter limitingFilter = (LimitingFilter) FilterManager.INSTANCE.get(AUTO_LIMITING_FILTER); + limitingFilter.everyNth *= FILTER_ADVANCE; + if (limitingFilter.everyNth > INITIAL_FILTER_EVERY_N_TH) { + AdviceRegistry.INSTANCE.adviceList.stream().map(advice -> (BaseTransformers) advice) + .forEach(advice -> advice.filters.remove(limitingFilter)); + } + } + } diff --git a/remora-core/src/main/java/com/jkoolcloud/remora/advices/BaseTransformers.java b/remora-core/src/main/java/com/jkoolcloud/remora/advices/BaseTransformers.java index ba7e299..02a2fc0 100644 --- a/remora-core/src/main/java/com/jkoolcloud/remora/advices/BaseTransformers.java +++ b/remora-core/src/main/java/com/jkoolcloud/remora/advices/BaseTransformers.java @@ -29,8 +29,8 @@ import com.jkoolcloud.remora.AdviceRegistry; import com.jkoolcloud.remora.RemoraConfig; import com.jkoolcloud.remora.core.CallStack; +import com.jkoolcloud.remora.core.EmptyStack; import com.jkoolcloud.remora.core.EntryDefinition; -import com.jkoolcloud.remora.core.FilteredOutEntryStack; import com.jkoolcloud.remora.core.output.OutputManager; import com.jkoolcloud.remora.filters.AdviceFilter; @@ -150,7 +150,7 @@ public static void fillDefaultValuesAfter(EntryDefinition entryDefinition, long entryDefinition.addProperty("PARENT", lastEntryDefinition.getId()); } } - if (!entryDefinition.isTransparent() && !(stackThreadLocal.get() instanceof FilteredOutEntryStack)) { + if (!entryDefinition.isTransparent() && !(stackThreadLocal.get() instanceof EmptyStack)) { OutputManager.send(entryDefinition); } } @@ -167,7 +167,6 @@ public static void handleInstrumentedMethodException(EntryDefinition entryDefini public static long fillDefaultValuesBefore(EntryDefinition entryDefinition, ThreadLocal> stackThreadLocal, Object thiz, Method method, TaggedLogger logger) { - invokeOnIntercept(entryDefinition.getAdviceClassClass(), thiz, method); if (entryDefinition.isChained()) { return 0; } @@ -201,7 +200,7 @@ public static long fillDefaultValuesBefore(EntryDefinition entryDefinition, if (getAdviceInstance(entryDefinition.getAdviceClassClass()).sendStackTrace) { entryDefinition.setStackTrace(getStackTrace()); } - if (!entryDefinition.isTransparent() || !(stackThreadLocal.get() instanceof FilteredOutEntryStack)) { + if (!entryDefinition.isTransparent() || !(stackThreadLocal.get() instanceof EmptyStack)) { OutputManager.send(entryDefinition); } } catch (Throwable t) { @@ -395,6 +394,10 @@ private static T getAdviceInstance(Class tClass) public static boolean intercept(Class tClass, Object thiz, Method method, TaggedLogger logger, Object... arguments) { + invokeOnIntercept(tClass, thiz, method); + if (stackThreadLocal.get() instanceof EmptyStack) { + return false; + } if (!getAdviceInstance(tClass).enabled) { return false; } @@ -402,7 +405,7 @@ public static boolean intercept(Class tClass, Object if (!filter.intercept(thiz, method, arguments)) { if (filter.excludeWholeStack()) { if (stackThreadLocal.get() == null || stackThreadLocal.get().isEmpty()) { - stackThreadLocal.set(new FilteredOutEntryStack(logger, callStackLimit)); + stackThreadLocal.set(new EmptyStack(logger, callStackLimit)); } } return false; diff --git a/remora-core/src/main/java/com/jkoolcloud/remora/core/FilteredOutEntryStack.java b/remora-core/src/main/java/com/jkoolcloud/remora/core/EmptyStack.java similarity index 86% rename from remora-core/src/main/java/com/jkoolcloud/remora/core/FilteredOutEntryStack.java rename to remora-core/src/main/java/com/jkoolcloud/remora/core/EmptyStack.java index e7ea836..1e119f8 100644 --- a/remora-core/src/main/java/com/jkoolcloud/remora/core/FilteredOutEntryStack.java +++ b/remora-core/src/main/java/com/jkoolcloud/remora/core/EmptyStack.java @@ -18,8 +18,8 @@ import org.tinylog.TaggedLogger; -public class FilteredOutEntryStack extends CallStack { - public FilteredOutEntryStack(TaggedLogger logger, int limit) { +public class EmptyStack extends CallStack { + public EmptyStack(TaggedLogger logger, int limit) { super(logger, limit); push(new EntryDefinition.DummyEntryDefinition()); } diff --git a/remora-core/src/main/java/com/jkoolcloud/remora/core/output/ChronicleOutput.java b/remora-core/src/main/java/com/jkoolcloud/remora/core/output/ChronicleOutput.java index cb91398..c4a67de 100644 --- a/remora-core/src/main/java/com/jkoolcloud/remora/core/output/ChronicleOutput.java +++ b/remora-core/src/main/java/com/jkoolcloud/remora/core/output/ChronicleOutput.java @@ -27,6 +27,7 @@ import org.tinylog.Logger; import org.tinylog.TaggedLogger; +import com.jkoolcloud.remora.AdviceRegistry; import com.jkoolcloud.remora.Remora; import com.jkoolcloud.remora.RemoraConfig; import com.jkoolcloud.remora.core.EntryDefinition; @@ -123,8 +124,11 @@ public void onReleased(int cycle, File file) { } queueWorkers = new ThreadPoolExecutor(workerSize, workerSize, 0, TimeUnit.MILLISECONDS, - new ArrayBlockingQueue<>(intermediateQueueSize), threadFactory, - (r, executor) -> ScheduledQueueErrorReporter.intermediateQueueFailCount.incrementAndGet()); + new ArrayBlockingQueue<>(intermediateQueueSize), threadFactory, (r, executor) -> { + ScheduledQueueErrorReporter.intermediateQueueFailCount.incrementAndGet(); + logger.warn("Limiting advices, Overfilled queue"); + AdviceRegistry.limit(); + }); } @@ -165,7 +169,7 @@ public ExcerptAppender getAppender() { public ChronicleAppenderThread(Runnable r, ExcerptAppender appender) { super(r); - threadAppender = appender; + threadAppender = appender; } } } diff --git a/remora-core/src/main/java/com/jkoolcloud/remora/filters/FilterManager.java b/remora-core/src/main/java/com/jkoolcloud/remora/filters/FilterManager.java index ebc9f81..0cd0893 100644 --- a/remora-core/src/main/java/com/jkoolcloud/remora/filters/FilterManager.java +++ b/remora-core/src/main/java/com/jkoolcloud/remora/filters/FilterManager.java @@ -35,6 +35,12 @@ public void add(String filterName, StatisticEnabledFilter filter) { filters.put(filterName, filter); } + public void add(String filterName, AdviceFilter filter) { + if (filter instanceof StatisticEnabledFilter) { + add(filterName, filter); + } + } + public AdviceFilter get(String filterName) { return filters.get(filterName); } diff --git a/remora-websphere/pom.xml b/remora-websphere/pom.xml index 4a7af5d..ceba695 100644 --- a/remora-websphere/pom.xml +++ b/remora-websphere/pom.xml @@ -37,11 +37,11 @@ https://github.com/Nastel/ - ${websphere.install.dir}//lib//com.ibm.jaxws.thinclient_8.5.0.jar - ${websphere.install.dir}//lib//com.ibm.ws.runtime.jar - ${websphere.install.dir}//lib//com.ibm.ws.webcontainer.jar - ${websphere.install.dir}//lib//rsahelpers.jar - ${websphere.install.dir}//lib//com.ibm.ws.admin.core.jar + ${websphere.install.dir}\runtimes\com.ibm.jaxws.thinclient_8.5.0.jar + ${websphere.install.dir}\plugins\com.ibm.ws.runtime.jar + ${websphere.install.dir}\plugins\com.ibm.ws.webcontainer.jar + ${websphere.install.dir}\lib\rsahelpers.jar + ${websphere.install.dir}\plugins\com.ibm.ws.admin.core.jar