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
commit faf7d56af8fa13e5739464bff48d1690ff61f111 Author: Wu Sheng <[email protected]> AuthorDate: Mon Mar 2 22:14:35 2026 +0800 Update LAL CLAUDE.md to document LalRuntimeHelper and clean up Javadoc Co-Authored-By: Claude Opus 4.6 <[email protected]> --- oap-server/analyzer/log-analyzer/CLAUDE.md | 25 +++++++++++++++++----- .../analyzer/v2/compiler/rt/LalRuntimeHelper.java | 5 ++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/oap-server/analyzer/log-analyzer/CLAUDE.md b/oap-server/analyzer/log-analyzer/CLAUDE.md index 4e1dd62d44..2f1ed2ace6 100644 --- a/oap-server/analyzer/log-analyzer/CLAUDE.md +++ b/oap-server/analyzer/log-analyzer/CLAUDE.md @@ -36,6 +36,7 @@ oap-server/analyzer/log-analyzer/ rt/ LalExpressionPackageHolder.java — Class loading anchor (empty marker) BindingAware.java — Interface for consumers needing Binding access + LalRuntimeHelper.java — Static helpers called by generated code src/test/java/.../compiler/ LALScriptParserTest.java — 20 parser tests @@ -54,6 +55,7 @@ All v2 classes live under `org.apache.skywalking.oap.log.analyzer.v2.*` to avoid | Consumer classes | `org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.LalExpr_<N>_C<M>` | | Package holder | `org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.LalExpressionPackageHolder` | | Binding aware | `org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.BindingAware` | +| Runtime helper | `org.apache.skywalking.oap.log.analyzer.v2.compiler.rt.LalRuntimeHelper` | | Functional interface | `org.apache.skywalking.oap.log.analyzer.v2.dsl.LalExpression` | `<N>` is a global `AtomicInteger` counter. `<M>` is the consumer index within the script. @@ -95,7 +97,7 @@ Three classes are generated: // implements Consumer, BindingAware public void accept(Object arg) { ExtractorSpec _t = (ExtractorSpec) arg; - _t.service(toStr(getAt(binding.parsed(), "service"))); + _t.service(LalRuntimeHelper.toStr(LalRuntimeHelper.getAt(binding.parsed(), "service"))); } ``` @@ -122,13 +124,26 @@ Three classes are generated: ## Null-Safe String Conversion -Generated code uses `toStr()` instead of `String.valueOf()` for casting parsed values to String: -```java -private static String toStr(Object obj) { return obj == null ? null : String.valueOf(obj); } -``` +Generated code calls `LalRuntimeHelper.toStr()` instead of `String.valueOf()` for casting parsed values to String. This preserves Java `null` for missing fields (matching Groovy's `null as String` → `null` behavior), whereas `String.valueOf(null)` would produce the string `"null"`. +## Runtime Helpers (LalRuntimeHelper) + +All type coercion and field access logic lives in `LalRuntimeHelper` as `public static` methods, +called by generated code via FQCN. This avoids duplicating helper methods in every generated class. + +| Method | Purpose | +|--------|---------| +| `getAt(Object, String)` | Property/map access on parsed log data (`Binding.Parsed`, `Map`, or reflective field) | +| `toLong(Object)` | Number/String → `long` | +| `toInt(Object)` | Number/String → `int` | +| `toStr(Object)` | Null-safe `String.valueOf()` (returns `null` for null input) | +| `toBool(Object)` | Boolean coercion | +| `isTruthy(Object)` | Groovy-style truthiness (null/empty/zero → false) | +| `tagValue(Binding, String)` | Log tag lookup via protobuf `KeyStringValuePair` | +| `safeCall(Object, String)` | Safe navigation `?.method()` (toString, trim, isEmpty) | + ## Data-Driven Execution Tests `LALExpressionExecutionTest` loads LAL rules from YAML and mock input from `.input.data` files: diff --git a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java index cc5e0fccb9..3db295e401 100644 --- a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java +++ b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/v2/compiler/rt/LalRuntimeHelper.java @@ -23,9 +23,8 @@ import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair; import org.apache.skywalking.oap.log.analyzer.v2.dsl.Binding; /** - * Static helper methods called by v2-generated {@code LalExpression} and consumer classes. - * Centralizes type coercion and field access logic that was previously duplicated - * into every generated class via {@code addHelperMethods()}. + * Static helper methods for type coercion and field access, called by + * v2-generated {@code LalExpression} and consumer classes via FQCN static calls. */ public final class LalRuntimeHelper {
