This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch groovy-replace
in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/groovy-replace by this push:
new 8f02a2f805 Make LAL DSL wrapper immutable by removing mutable ctx field
8f02a2f805 is described below
commit 8f02a2f805dfb109f4b276a6efd9ff9bcc128a93
Author: Wu Sheng <[email protected]>
AuthorDate: Tue Mar 3 21:23:07 2026 +0800
Make LAL DSL wrapper immutable by removing mutable ctx field
Remove bind()/evaluate() two-phase pattern from DSL. The mutable
ExecutionContext field made DSL unsafe for concurrent use. Now
evaluate(ExecutionContext) takes ctx as a parameter, matching the
stateless pattern already used by MAL and Hierarchy v2 runtimes.
Update LogFilterListener to store per-request contexts in a list
and pass each to the corresponding DSL.evaluate(ctx) call.
Update LogTestQuery to use the new single-call API.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
.../skywalking/oap/log/analyzer/v2/dsl/DSL.java | 17 +++------------
.../provider/log/listener/LogFilterListener.java | 25 ++++++++++++++--------
.../oap/query/graphql/resolver/LogTestQuery.java | 3 +--
3 files changed, 20 insertions(+), 25 deletions(-)
diff --git
a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
index e5da0404b0..bb131e6c26 100644
---
a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
+++
b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/dsl/DSL.java
@@ -32,21 +32,14 @@ import
org.apache.skywalking.oap.server.library.module.ModuleStartException;
*
* <p>One DSL instance is created per LAL rule entry defined in a {@code .yaml}
* config file under {@code lal/}. Instances are compiled once at startup and
- * reused for every incoming log.
- *
- * <p>Runtime (per-log execution):
- * <ol>
- * <li>{@link #bind(ExecutionContext)} — stores the current execution
context.</li>
- * <li>{@link #evaluate()} — invokes the compiled {@link
LalExpression#execute},
- * passing the {@link FilterSpec} and {@link ExecutionContext}
explicitly.</li>
- * </ol>
+ * reused for every incoming log. This class is immutable and thread-safe —
+ * per-log state is passed as a parameter to {@link
#evaluate(ExecutionContext)}.
*/
@Slf4j
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class DSL {
private final LalExpression expression;
private final FilterSpec filterSpec;
- private ExecutionContext ctx;
public static DSL of(final ModuleManager moduleManager,
final LogAnalyzerModuleConfig config,
@@ -70,11 +63,7 @@ public class DSL {
}
}
- public void bind(final ExecutionContext ctx) {
- this.ctx = ctx;
- }
-
- public void evaluate() {
+ public void evaluate(final ExecutionContext ctx) {
expression.execute(filterSpec, ctx);
}
}
diff --git
a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/log/listener/LogFilterListener.java
b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/log/listener/LogFilterListener.java
index 5de656a0e4..6ba5461616 100644
---
a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/log/listener/LogFilterListener.java
+++
b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/provider/log/listener/LogFilterListener.java
@@ -19,12 +19,12 @@
package org.apache.skywalking.oap.log.analyzer.v2.provider.log.listener;
import com.google.protobuf.Message;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.stream.Collectors;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
@@ -64,26 +64,33 @@ import
org.apache.skywalking.oap.server.library.module.ModuleStartException;
* and organizes them by {@link Layer}.
*/
@Slf4j
-@RequiredArgsConstructor
public class LogFilterListener implements LogAnalysisListener {
- private final Collection<DSL> dsls;
+ private final List<DSL> dsls;
+ private List<ExecutionContext> contexts;
+
+ LogFilterListener(final Collection<DSL> dsls) {
+ this.dsls = new ArrayList<>(dsls);
+ }
@Override
public void build() {
- dsls.forEach(dsl -> {
+ for (int i = 0; i < dsls.size(); i++) {
try {
- dsl.evaluate();
+ dsls.get(i).evaluate(contexts.get(i));
} catch (final Exception e) {
- log.warn("Failed to evaluate dsl: {}", dsl, e);
+ log.warn("Failed to evaluate dsl: {}", dsls.get(i), e);
}
- });
+ }
}
@Override
public LogAnalysisListener parse(final LogData.Builder logData,
final Message extraLog) {
- dsls.forEach(dsl -> dsl.bind(new
ExecutionContext().log(logData.build())
- .extraLog(extraLog)));
+ final LogData log = logData.build();
+ contexts = new ArrayList<>(dsls.size());
+ for (int i = 0; i < dsls.size(); i++) {
+ contexts.add(new ExecutionContext().log(log).extraLog(extraLog));
+ }
return this;
}
diff --git
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogTestQuery.java
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogTestQuery.java
index 79ac073251..e537613422 100644
---
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogTestQuery.java
+++
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogTestQuery.java
@@ -78,8 +78,7 @@ public class LogTestQuery implements GraphQLQueryResolver {
ctx.logContainer(new AtomicReference<>());
ctx.metricsContainer(new ArrayList<>());
- dsl.bind(ctx);
- dsl.evaluate();
+ dsl.evaluate(ctx);
final LogTestResponse.LogTestResponseBuilder builder =
LogTestResponse.builder();
ctx.logContainer().map(AtomicReference::get).ifPresent(it -> {