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 -> {

Reply via email to