From c11f7074ffd0ec3f39b83758e42f312fd25d64db Mon Sep 17 00:00:00 2001 From: Ben Donnelly Date: Tue, 27 Jun 2023 10:10:45 +0100 Subject: [PATCH] feat(evaluator): make evaluators lazy --- .../agent/api/plugin}/AbstractEvaluator.java | 6 +- .../deep/agent/api/plugin/LazyEvaluator.java | 62 +++++++++++++++++++ .../deep/agent/tracepoint/cf/CFEvaluator.java | 2 +- .../evaluator/NashornReflectEvaluator.java | 1 + .../agent/tracepoint/handler/Callback.java | 5 +- 5 files changed, 71 insertions(+), 5 deletions(-) rename {agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator => agent-api/src/main/java/com/intergral/deep/agent/api/plugin}/AbstractEvaluator.java (92%) create mode 100644 agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/AbstractEvaluator.java b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/AbstractEvaluator.java similarity index 92% rename from agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/AbstractEvaluator.java rename to agent-api/src/main/java/com/intergral/deep/agent/api/plugin/AbstractEvaluator.java index e048dcf..f5b5030 100644 --- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/AbstractEvaluator.java +++ b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/AbstractEvaluator.java @@ -15,11 +15,13 @@ * along with this program. If not, see . */ -package com.intergral.deep.agent.tracepoint.evaluator; +package com.intergral.deep.agent.api.plugin; -import com.intergral.deep.agent.api.plugin.IEvaluator; import java.util.Map; +/** + * This allows for common handling for object to boolean expressions. + */ public abstract class AbstractEvaluator implements IEvaluator { @Override diff --git a/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java new file mode 100644 index 0000000..c40c40d --- /dev/null +++ b/agent-api/src/main/java/com/intergral/deep/agent/api/plugin/LazyEvaluator.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2023 Intergral GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.intergral.deep.agent.api.plugin; + +import java.util.Map; + +/** + * This type allows the evaluator to be loaded only if it is needed. ie. if we have no watches or conditions there is no need for an + * evaluator. + */ +public class LazyEvaluator extends AbstractEvaluator { + + private static final Exception NO_EVALUATOR_EXCEPTION = new RuntimeException( + "No evaluator available."); + private final IEvaluatorLoader loader; + private IEvaluator evaluator; + + public LazyEvaluator(final IEvaluatorLoader loader) { + this.loader = loader; + } + + private IEvaluator load() { + if (this.evaluator == null) { + try { + this.evaluator = this.loader.load(); + } catch (Exception e) { + this.evaluator = new AbstractEvaluator() { + @Override + public Object evaluateExpression(final String expression, final Map values) throws Throwable { + throw NO_EVALUATOR_EXCEPTION; + } + }; + } + } + return this.evaluator; + } + + @Override + public Object evaluateExpression(final String expression, final Map values) throws Throwable { + return load().evaluateExpression(expression, values); + } + + public interface IEvaluatorLoader { + + IEvaluator load(); + } +} diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java b/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java index e62496d..3834f4f 100644 --- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java +++ b/agent/src/main/java/com/intergral/deep/agent/tracepoint/cf/CFEvaluator.java @@ -17,7 +17,7 @@ package com.intergral.deep.agent.tracepoint.cf; -import com.intergral.deep.agent.tracepoint.evaluator.AbstractEvaluator; +import com.intergral.deep.agent.api.plugin.AbstractEvaluator; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java b/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java index 58bc48a..66ad4e3 100644 --- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java +++ b/agent/src/main/java/com/intergral/deep/agent/tracepoint/evaluator/NashornReflectEvaluator.java @@ -17,6 +17,7 @@ package com.intergral.deep.agent.tracepoint.evaluator; +import com.intergral.deep.agent.api.plugin.AbstractEvaluator; import com.intergral.deep.agent.api.plugin.IEvaluator; import java.lang.reflect.Method; import java.util.HashMap; diff --git a/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java b/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java index 26b2448..3b913d9 100644 --- a/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java +++ b/agent/src/main/java/com/intergral/deep/agent/tracepoint/handler/Callback.java @@ -19,6 +19,7 @@ import com.intergral.deep.agent.Utils; import com.intergral.deep.agent.api.plugin.IEvaluator; +import com.intergral.deep.agent.api.plugin.LazyEvaluator; import com.intergral.deep.agent.push.PushService; import com.intergral.deep.agent.settings.Settings; import com.intergral.deep.agent.tracepoint.TracepointConfigService; @@ -88,7 +89,7 @@ public static void callBackCF(final List bpIds, final int lineNo, final Map variables) { try { - final IEvaluator evaluator = CFUtils.findCfEval(variables); + final IEvaluator evaluator = new LazyEvaluator(() -> CFUtils.findCfEval(variables)); commonCallback(bpIds, filename, lineNo, variables, evaluator, CFFrameProcessor::new); } catch (Throwable t) { LOGGER.debug("Unable to process tracepoint {}:{}", filename, lineNo, t); @@ -109,7 +110,7 @@ public static void callBack(final List bpIds, final int lineNo, final Map variables) { try { - final IEvaluator evaluator = EvaluatorService.createEvaluator(); + final IEvaluator evaluator = new LazyEvaluator(EvaluatorService::createEvaluator); commonCallback(bpIds, filename, lineNo, variables, evaluator, FrameProcessor::new); } catch (Throwable t) { LOGGER.debug("Unable to process tracepoint {}:{}", filename, lineNo, t);