This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/skywalking-graalvm-distro.git


The following commit(s) were added to refs/heads/main by this push:
     new d9c4ef2  Fix MAL test quality: eliminate vacuous agreements, fix 
histogram +Inf and rate window
d9c4ef2 is described below

commit d9c4ef2345c797e58e7ef48dc2e2334129234e18
Author: Wu Sheng <[email protected]>
AuthorDate: Sun Feb 22 07:57:00 2026 +0800

    Fix MAL test quality: eliminate vacuous agreements, fix histogram +Inf and 
rate window
    
    - Add guard in runAndCompare() to fail when both paths return EMPTY,
      preventing vacuous test agreements where wrong input masks real issues
    - Remove +Inf bucket from histogram test data (upstream receivers strip
      it before MAL engine; Java Double.parseDouble("+Inf") throws NFE)
    - Fix test timestamps from 2min to 10s gap so rate('PT15S') window
      contains the warmup data point and produces real rate values
    - Remove last groovy.lang.Closure overload from production SampleFamily
    - Add metricName propagation in Expression.run() for CounterWindow keying
    - Add ExpandoMetaClass bridging in test base for Groovy Path A Closure
      to functional interface conversion (SAM coercion doesn't work for
      interfaces extending Function/Predicate)
    
    1303 tests pass (1281 MAL + 19 LAL + 3 other), 0 failures.
---
 .../server/graalvm/mal/ActivemqClusterTest.java    |   2 +-
 .../graalvm/mal/ActivemqDestinationTest.java       |   2 +-
 .../oap/server/graalvm/mal/ApisixTest.java         |   6 +-
 .../server/graalvm/mal/BanyandbInstanceTest.java   |   2 +-
 .../server/graalvm/mal/BanyandbServiceTest.java    |   2 +-
 .../server/graalvm/mal/DynamodbEndpointTest.java   |   2 +-
 .../server/graalvm/mal/DynamodbServiceTest.java    |   2 +-
 .../graalvm/mal/ElasticsearchClusterTest.java      |   2 +-
 .../server/graalvm/mal/ElasticsearchIndexTest.java |   2 +-
 .../server/graalvm/mal/ElasticsearchNodeTest.java  |   2 +-
 .../server/graalvm/mal/EnvoySvcRelationTest.java   |   2 +-
 .../oap/server/graalvm/mal/EnvoyTest.java          |   2 +-
 .../oap/server/graalvm/mal/GoAgentTest.java        |   2 +-
 .../oap/server/graalvm/mal/GoRuntimeTest.java      |   2 +-
 .../server/graalvm/mal/IstioControlplaneTest.java  |   2 +-
 .../oap/server/graalvm/mal/JavaAgentTest.java      |   2 +-
 .../oap/server/graalvm/mal/K8sClusterTest.java     |   2 +-
 .../oap/server/graalvm/mal/K8sInstanceTest.java    |   2 +-
 .../oap/server/graalvm/mal/K8sNodeTest.java        |   2 +-
 .../oap/server/graalvm/mal/K8sServiceTest.java     |   2 +-
 .../oap/server/graalvm/mal/KafkaBrokerTest.java    |   2 +-
 .../oap/server/graalvm/mal/KongEndpointTest.java   |   2 +-
 .../oap/server/graalvm/mal/KongInstanceTest.java   |   2 +-
 .../oap/server/graalvm/mal/KongServiceTest.java    |   2 +-
 .../graalvm/mal/MALScriptComparisonBase.java       | 301 +++++++++++++++++++--
 .../oap/server/graalvm/mal/MongodbClusterTest.java |   2 +-
 .../oap/server/graalvm/mal/MongodbNodeTest.java    |   2 +-
 .../oap/server/graalvm/mal/MysqlInstanceTest.java  |   2 +-
 .../oap/server/graalvm/mal/MysqlServiceTest.java   |   2 +-
 .../server/graalvm/mal/NetworkProfilingTest.java   |   2 +-
 .../oap/server/graalvm/mal/NginxEndpointTest.java  |   2 +-
 .../oap/server/graalvm/mal/NginxInstanceTest.java  |   2 +-
 .../oap/server/graalvm/mal/NginxServiceTest.java   |   2 +-
 .../skywalking/oap/server/graalvm/mal/OapTest.java |   2 +-
 .../server/graalvm/mal/PostgresqlInstanceTest.java |   2 +-
 .../server/graalvm/mal/PostgresqlServiceTest.java  |   2 +-
 .../oap/server/graalvm/mal/RabbitmqNodeTest.java   |   2 +-
 .../server/graalvm/mal/SpringMicrometerTest.java   |   2 +-
 .../oap/server/graalvm/mal/TelegrafVmTest.java     |   2 +-
 .../skywalking/oap/server/graalvm/mal/VmTest.java  |   2 +-
 .../oap/server/graalvm/mal/WindowsTest.java        |   2 +-
 .../oap/server/graalvm/mal/ZabbixAgentTest.java    |   2 +-
 .../oap/meter/analyzer/dsl/Expression.java         |   7 +
 .../oap/meter/analyzer/dsl/SampleFamily.java       |  10 +-
 44 files changed, 334 insertions(+), 70 deletions(-)

diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqClusterTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqClusterTest.java
index 3b5a635..4f32ed5 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqClusterTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqClusterTest.java
@@ -49,7 +49,7 @@ class ActivemqClusterTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqDestinationTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqDestinationTest.java
index d319ff4..85bcf18 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqDestinationTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ActivemqDestinationTest.java
@@ -48,7 +48,7 @@ class ActivemqDestinationTest extends MALScriptComparisonBase 
{
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ApisixTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ApisixTest.java
index 1226d30..6d7c0e4 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ApisixTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ApisixTest.java
@@ -50,7 +50,7 @@ class ApisixTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
@@ -223,9 +223,9 @@ class ApisixTest extends MALScriptComparisonBase {
             final ImmutableMap<String, String> unmatched) {
         String[] les = {
             "0.005", "0.01", "0.025", "0.05", "0.1", "0.25",
-            "0.5", "1", "2.5", "5", "10", "+Inf"
+            "0.5", "1", "2.5", "5", "10"
         };
-        double[] vals = {10, 25, 50, 80, 120, 180, 220, 260, 285, 295, 299, 
300};
+        double[] vals = {10, 25, 50, 80, 120, 180, 220, 260, 285, 295, 299};
 
         // 2 sets (matched + unmatched) * 12 buckets each, with type="request"
         Sample[] samples = new Sample[les.length * 2];
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbInstanceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbInstanceTest.java
index 8b9fb97..b5e1ff4 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbInstanceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbInstanceTest.java
@@ -56,7 +56,7 @@ class BanyandbInstanceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbServiceTest.java
index 67a43ef..bfef83d 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/BanyandbServiceTest.java
@@ -56,7 +56,7 @@ class BanyandbServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbEndpointTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbEndpointTest.java
index 73e1bc5..a4e8113 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbEndpointTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbEndpointTest.java
@@ -61,7 +61,7 @@ class DynamodbEndpointTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbServiceTest.java
index 432ea2b..c36e45c 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/DynamodbServiceTest.java
@@ -57,7 +57,7 @@ class DynamodbServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchClusterTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchClusterTest.java
index 58fcb89..6da1d5f 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchClusterTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchClusterTest.java
@@ -51,7 +51,7 @@ class ElasticsearchClusterTest extends 
MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchIndexTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchIndexTest.java
index 5297455..9bbeae0 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchIndexTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchIndexTest.java
@@ -54,7 +54,7 @@ class ElasticsearchIndexTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchNodeTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchNodeTest.java
index f495748..f3ab3bc 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchNodeTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ElasticsearchNodeTest.java
@@ -60,7 +60,7 @@ class ElasticsearchNodeTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoySvcRelationTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoySvcRelationTest.java
index eb9093a..e7638f2 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoySvcRelationTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoySvcRelationTest.java
@@ -46,7 +46,7 @@ class EnvoySvcRelationTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoyTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoyTest.java
index f89c948..fbc911d 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoyTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/EnvoyTest.java
@@ -51,7 +51,7 @@ class EnvoyTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoAgentTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoAgentTest.java
index c61b44d..6905aa3 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoAgentTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoAgentTest.java
@@ -49,7 +49,7 @@ class GoAgentTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoRuntimeTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoRuntimeTest.java
index a7c24b7..1f6cc93 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoRuntimeTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/GoRuntimeTest.java
@@ -50,7 +50,7 @@ class GoRuntimeTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/IstioControlplaneTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/IstioControlplaneTest.java
index f44d61f..0a89de3 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/IstioControlplaneTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/IstioControlplaneTest.java
@@ -46,7 +46,7 @@ class IstioControlplaneTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/JavaAgentTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/JavaAgentTest.java
index 40eda5f..64bd8da 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/JavaAgentTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/JavaAgentTest.java
@@ -50,7 +50,7 @@ class JavaAgentTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sClusterTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sClusterTest.java
index b08a290..bac37cb 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sClusterTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sClusterTest.java
@@ -68,7 +68,7 @@ class K8sClusterTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @BeforeEach
     void setupK8sMocks() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sInstanceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sInstanceTest.java
index 46a7799..527c1b6 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sInstanceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sInstanceTest.java
@@ -63,7 +63,7 @@ class K8sInstanceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @BeforeEach
     void setupK8sMocks() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sNodeTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sNodeTest.java
index 5b5d411..e0cd438 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sNodeTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sNodeTest.java
@@ -47,7 +47,7 @@ class K8sNodeTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sServiceTest.java
index 252561f..b1e9a83 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/K8sServiceTest.java
@@ -65,7 +65,7 @@ class K8sServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @BeforeEach
     void setupK8sMocks() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KafkaBrokerTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KafkaBrokerTest.java
index bfdd011..2e88f5b 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KafkaBrokerTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KafkaBrokerTest.java
@@ -53,7 +53,7 @@ class KafkaBrokerTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongEndpointTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongEndpointTest.java
index d6e2e35..a47031e 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongEndpointTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongEndpointTest.java
@@ -47,7 +47,7 @@ class KongEndpointTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongInstanceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongInstanceTest.java
index 4ae516e..e4673ac 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongInstanceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongInstanceTest.java
@@ -51,7 +51,7 @@ class KongInstanceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongServiceTest.java
index 87caf75..ea8db3a 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/KongServiceTest.java
@@ -49,7 +49,7 @@ class KongServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
index 5fa284b..aeaf817 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MALScriptComparisonBase.java
@@ -21,9 +21,13 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import groovy.lang.Binding;
+import groovy.lang.Closure;
+import groovy.lang.ExpandoMetaClass;
 import groovy.lang.GString;
+import groovy.lang.GroovyObjectSupport;
 import groovy.lang.GroovyShell;
 import groovy.util.DelegatingScript;
+import io.vavr.Function2;
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -39,13 +43,21 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Stream;
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.skywalking.oap.meter.analyzer.dsl.DownsamplingType;
 import org.apache.skywalking.oap.meter.analyzer.dsl.Expression;
 import org.apache.skywalking.oap.meter.analyzer.dsl.ExpressionParsingContext;
+import org.apache.skywalking.oap.meter.analyzer.dsl.MalExpression;
 import org.apache.skywalking.oap.meter.analyzer.dsl.Result;
 import org.apache.skywalking.oap.meter.analyzer.dsl.Sample;
 import org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamily;
 import org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyBuilder;
+import 
org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyFunctions.DecorateFunction;
+import 
org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyFunctions.ForEachFunction;
+import 
org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyFunctions.PropertiesExtractor;
+import 
org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyFunctions.SampleFilter;
+import 
org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyFunctions.TagFunction;
 import org.apache.skywalking.oap.meter.analyzer.dsl.registry.ProcessRegistry;
 import org.apache.skywalking.oap.meter.analyzer.dsl.tagOpt.K8sRetagType;
 import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.MetricsRule;
@@ -69,6 +81,7 @@ import org.yaml.snakeyaml.Yaml;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
 
 /**
  * Base class for MAL comparison tests.
@@ -89,13 +102,17 @@ abstract class MALScriptComparisonBase {
     private static Map<String, String> MANIFEST;
     private static Map<String, String> EXPRESSION_HASHES;
 
+    /** Thread-local for Groovy adapter (Path A): passes sample data to 
ExpressionDelegate. */
+    private static final ThreadLocal<Map<String, SampleFamily>> GROOVY_DATA = 
new ThreadLocal<>();
+
     @BeforeAll
     static void initMeterEntity() {
         MeterEntity.setNamingControl(
             new NamingControl(512, 512, 512, new EndpointNameGrouping()));
-        MANIFEST = loadManifest();
+        MANIFEST = loadTranspiledManifest();
         EXPRESSION_HASHES = loadKeyValueManifest(
             "META-INF/mal-groovy-expression-hashes.txt");
+        extendSampleFamily();
     }
 
     @AfterAll
@@ -190,7 +207,7 @@ abstract class MALScriptComparisonBase {
             Instant.parse("2024-01-01T00:00:00Z").toEpochMilli());
         ImmutableMap<String, SampleFamily> input2 = buildInputForSamples(
             sampleNames, requiredLabels, 200.0,
-            Instant.parse("2024-01-01T00:02:00Z").toEpochMilli());
+            Instant.parse("2024-01-01T00:00:10Z").toEpochMilli());
 
         Expression precompiledExpr = loadPrecompiled(metricName, expression);
         runAndCompare(metricName, groovyExpr, precompiledExpr,
@@ -244,11 +261,18 @@ abstract class MALScriptComparisonBase {
         if (groovyResult.isSuccess()) {
             assertSamplesMatch(metricName,
                 groovyResult.getData(), precompiledResult.getData());
+        } else {
+            fail(metricName + ": both paths returned EMPTY — test input likely"
+                + " missing required tag values or labels"
+                + " (groovy=" + groovyResult.getError()
+                + ", precompiled=" + precompiledResult.getError() + ")");
         }
     }
 
     // ---------------------------------------------------------------
     // Path A: Fresh Groovy compilation (upstream DSL.parse replica)
+    // Wraps the DelegatingScript in a MalExpression adapter so it can
+    // be passed to the replacement Expression(metricName, literal, 
MalExpression).
     // ---------------------------------------------------------------
 
     @SuppressWarnings("rawtypes")
@@ -283,18 +307,31 @@ abstract class MALScriptComparisonBase {
 
         GroovyShell sh = new GroovyShell(new Binding(), cc);
         DelegatingScript script = (DelegatingScript) sh.parse(expression);
-        return new Expression(metricName, expression, script);
+
+        // Replicate upstream Expression.empower(): set delegate + extend 
Number
+        script.setDelegate(new GroovyExpressionDelegate(metricName, 
expression));
+        extendNumber(Number.class);
+
+        // Wrap DelegatingScript as MalExpression adapter
+        MalExpression adapter = data -> {
+            GROOVY_DATA.set(data);
+            try {
+                return (SampleFamily) script.run();
+            } finally {
+                GROOVY_DATA.remove();
+            }
+        };
+        return new Expression(metricName, expression, adapter);
     }
 
     // ---------------------------------------------------------------
-    // Path B: Pre-compiled class from manifest
+    // Path B: Transpiled MalExpression from manifest
     // ---------------------------------------------------------------
 
     /**
-     * Load pre-compiled class from manifest matching the given metric name
-     * and expression. Uses expression hash to resolve combination patterns
-     * where multiple expressions share the same metric name (within a file
-     * or across files like otel/telegraf/zabbix).
+     * Load transpiled MalExpression class from manifest matching the given
+     * metric name and expression. Uses expression hash to resolve combination
+     * patterns where multiple expressions share the same metric name.
      */
     private static Expression loadPrecompiled(final String metricName,
                                               final String expression) {
@@ -304,7 +341,7 @@ abstract class MALScriptComparisonBase {
         String className = MANIFEST.get(metricName);
         if (className != null
                 && expHash.equals(EXPRESSION_HASHES.get(metricName))) {
-            return loadScriptClass(metricName, className, expression);
+            return loadMalExpressionClass(metricName, className, expression);
         }
 
         // Try combination suffixes: metricName_1, metricName_2, ...
@@ -315,7 +352,7 @@ abstract class MALScriptComparisonBase {
                 break;
             }
             if (expHash.equals(EXPRESSION_HASHES.get(suffixed))) {
-                return loadScriptClass(metricName, className, expression);
+                return loadMalExpressionClass(metricName, className, 
expression);
             }
         }
 
@@ -324,20 +361,215 @@ abstract class MALScriptComparisonBase {
                 + " (expression hash: " + expHash + ")");
     }
 
-    private static Expression loadScriptClass(final String metricName,
-                                               final String className,
-                                               final String expression) {
+    private static Expression loadMalExpressionClass(final String metricName,
+                                                      final String className,
+                                                      final String expression) 
{
         try {
-            Class<?> scriptClass = Class.forName(className);
-            DelegatingScript script =
-                (DelegatingScript) 
scriptClass.getDeclaredConstructor().newInstance();
-            return new Expression(metricName, expression, script);
+            Class<?> exprClass = Class.forName(className);
+            MalExpression malExpr =
+                (MalExpression) 
exprClass.getDeclaredConstructor().newInstance();
+            return new Expression(metricName, expression, malExpr);
         } catch (Exception e) {
             throw new AssertionError(
-                "Failed to load pre-compiled class for " + metricName, e);
+                "Failed to load transpiled class for " + metricName, e);
+        }
+    }
+
+    // ---------------------------------------------------------------
+    // Groovy adapter helpers (replicate upstream Expression internals)
+    // ---------------------------------------------------------------
+
+    /**
+     * Replicates upstream Expression.ExpressionDelegate.
+     * Resolves sample name references via propertyMissing() from GROOVY_DATA 
thread-local.
+     */
+    @RequiredArgsConstructor
+    @SuppressWarnings("unused")
+    private static class GroovyExpressionDelegate extends GroovyObjectSupport {
+        public static final DownsamplingType AVG = DownsamplingType.AVG;
+        public static final DownsamplingType SUM = DownsamplingType.SUM;
+        public static final DownsamplingType LATEST = DownsamplingType.LATEST;
+        public static final DownsamplingType SUM_PER_MIN = 
DownsamplingType.SUM_PER_MIN;
+        public static final DownsamplingType MAX = DownsamplingType.MAX;
+        public static final DownsamplingType MIN = DownsamplingType.MIN;
+
+        private final String metricName;
+        private final String literal;
+
+        public SampleFamily propertyMissing(String sampleName) {
+            ExpressionParsingContext.get().ifPresent(ctx -> {
+                if (!ctx.getSamples().contains(sampleName)) {
+                    ctx.getSamples().add(sampleName);
+                }
+            });
+            Map<String, SampleFamily> sampleFamilies = GROOVY_DATA.get();
+            if (sampleFamilies == null) {
+                return SampleFamily.EMPTY;
+            }
+            if (sampleFamilies.containsKey(sampleName)) {
+                SampleFamily sf = sampleFamilies.get(sampleName);
+                sf.context.setMetricName(this.metricName);
+                return sf;
+            }
+            return SampleFamily.EMPTY;
+        }
+
+        public Number time() {
+            return Instant.now().getEpochSecond();
+        }
+    }
+
+    /**
+     * Replicates upstream Expression.extendNumber().
+     * Registers ExpandoMetaClass operations so Number + SampleFamily works in 
Groovy.
+     */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private static void extendNumber(Class clazz) {
+        ExpandoMetaClass expando = new ExpandoMetaClass(clazz, true, false);
+        expando.registerInstanceMethod("plus",
+            new NumberClosure((n, s) -> s.plus(n)));
+        expando.registerInstanceMethod("minus",
+            new NumberClosure((n, s) -> s.minus(n).negative()));
+        expando.registerInstanceMethod("multiply",
+            new NumberClosure((n, s) -> s.multiply(n)));
+        expando.registerInstanceMethod("div",
+            new NumberClosure((n, s) -> s.newValue(v -> n.doubleValue() / v)));
+        expando.initialize();
+    }
+
+    /** Minimal NumberClosure for Groovy adapter (same as upstream). */
+    private static class NumberClosure extends Closure<SampleFamily> {
+        private final Function2<Number, SampleFamily, SampleFamily> fn;
+
+        NumberClosure(Function2<Number, SampleFamily, SampleFamily> fn) {
+            super(null);
+            this.fn = fn;
+        }
+
+        @Override
+        public SampleFamily call(Object arguments) {
+            return fn.apply((Number) this.getDelegate(), (SampleFamily) 
arguments);
+        }
+
+        @Override
+        public Class[] getParameterTypes() {
+            return new Class[]{SampleFamily.class};
         }
     }
 
+    /**
+     * Register Closure-accepting overloads on SampleFamily via 
ExpandoMetaClass.
+     * This bridges Groovy script calls (tag(Closure), filter(Closure), etc.) 
to
+     * the Java functional interface methods (tag(TagFunction), 
filter(SampleFilter), etc.)
+     * on the GraalVM replacement SampleFamily.
+     *
+     * Only affects Groovy's method dispatch — transpiled Java code calls the
+     * functional interface methods directly via invokevirtual, bypassing 
MetaClass.
+     */
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private static void extendSampleFamily() {
+        ExpandoMetaClass emc = new ExpandoMetaClass(SampleFamily.class, true, 
false);
+
+        // tag(Closure) → tag(TagFunction)
+        emc.registerInstanceMethod("tag", new Closure<SampleFamily>(null) {
+            @Override
+            public SampleFamily call(Object arguments) {
+                SampleFamily self = (SampleFamily) getDelegate();
+                Closure<?> cl = (Closure<?>) arguments;
+                return self.tag((TagFunction) tags -> {
+                    Object result = cl.call(tags);
+                    return result instanceof Map ? (Map<String, String>) 
result : tags;
+                });
+            }
+
+            @Override
+            public Class[] getParameterTypes() {
+                return new Class[]{Closure.class};
+            }
+        });
+
+        // filter(Closure) → filter(SampleFilter)
+        emc.registerInstanceMethod("filter", new Closure<SampleFamily>(null) {
+            @Override
+            public SampleFamily call(Object arguments) {
+                SampleFamily self = (SampleFamily) getDelegate();
+                Closure<?> cl = (Closure<?>) arguments;
+                return self.filter((SampleFilter) labels -> {
+                    Object result = cl.call(labels);
+                    return result instanceof Boolean ? (Boolean) result : 
false;
+                });
+            }
+
+            @Override
+            public Class[] getParameterTypes() {
+                return new Class[]{Closure.class};
+            }
+        });
+
+        // forEach(List, Closure) → forEach(List, ForEachFunction)
+        emc.registerInstanceMethod("forEach", new Closure<SampleFamily>(null) {
+            @Override
+            public SampleFamily call(Object... args) {
+                SampleFamily self = (SampleFamily) getDelegate();
+                List<String> array = (List<String>) args[0];
+                Closure<?> cl = (Closure<?>) args[1];
+                return self.forEach(array, (ForEachFunction) (element, labels) 
->
+                    cl.call(element, labels));
+            }
+
+            @Override
+            public Class[] getParameterTypes() {
+                return new Class[]{List.class, Closure.class};
+            }
+        });
+
+        // decorate(Closure) → decorate(DecorateFunction)
+        emc.registerInstanceMethod("decorate", new Closure<SampleFamily>(null) 
{
+            @Override
+            public SampleFamily call(Object arguments) {
+                SampleFamily self = (SampleFamily) getDelegate();
+                Closure<?> cl = (Closure<?>) arguments;
+                return self.decorate((DecorateFunction) entity -> 
cl.call(entity));
+            }
+
+            @Override
+            public Class[] getParameterTypes() {
+                return new Class[]{Closure.class};
+            }
+        });
+
+        // instance(List, String, List, String, Layer, Closure) →
+        //   instance(List, String, List, String, Layer, PropertiesExtractor)
+        emc.registerInstanceMethod("instance", new Closure<SampleFamily>(null) 
{
+            @Override
+            public SampleFamily call(Object... args) {
+                SampleFamily self = (SampleFamily) getDelegate();
+                List<String> serviceKeys = (List<String>) args[0];
+                String serviceDelimiter = (String) args[1];
+                List<String> instanceKeys = (List<String>) args[2];
+                String instanceDelimiter = (String) args[3];
+                Layer layer = (Layer) args[4];
+                Closure<?> cl = (Closure<?>) args[5];
+                PropertiesExtractor pe = cl == null ? null : labels -> {
+                    Object r = cl.call(labels);
+                    return r instanceof Map ? (Map<String, String>) r : null;
+                };
+                return self.instance(serviceKeys, serviceDelimiter,
+                    instanceKeys, instanceDelimiter, layer, pe);
+            }
+
+            @Override
+            public Class[] getParameterTypes() {
+                return new Class[]{
+                    List.class, String.class, List.class, String.class,
+                    Layer.class, Closure.class
+                };
+            }
+        });
+
+        emc.initialize();
+    }
+
     private static String sha256(final String input) {
         try {
             MessageDigest md = MessageDigest.getInstance("SHA-256");
@@ -366,9 +598,9 @@ abstract class MALScriptComparisonBase {
                                           final long timestamp) {
         String[] les = {
             "0.005", "0.01", "0.025", "0.05", "0.1", "0.25",
-            "0.5", "1", "2.5", "5", "10", "+Inf"
+            "0.5", "1", "2.5", "5", "10"
         };
-        double[] vals = {10, 25, 50, 80, 120, 180, 220, 260, 285, 295, 299, 
300};
+        double[] vals = {10, 25, 50, 80, 120, 180, 220, 260, 285, 295, 299};
         Sample[] samples = new Sample[les.length];
         for (int i = 0; i < les.length; i++) {
             samples[i] = Sample.builder()
@@ -526,8 +758,33 @@ abstract class MALScriptComparisonBase {
     // Manifest loader
     // ---------------------------------------------------------------
 
-    private static Map<String, String> loadManifest() {
-        return loadKeyValueManifest("META-INF/mal-groovy-scripts.txt");
+    /** Load transpiled manifest: one FQCN per line, metric extracted from 
class name. */
+    private static Map<String, String> loadTranspiledManifest() {
+        Map<String, String> map = new HashMap<>();
+        try (InputStream is = MALScriptComparisonBase.class
+                .getClassLoader()
+                .getResourceAsStream("META-INF/mal-expressions.txt")) {
+            if (is == null) {
+                return map;
+            }
+            try (BufferedReader reader = new BufferedReader(
+                    new InputStreamReader(is, StandardCharsets.UTF_8))) {
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    line = line.trim();
+                    if (!line.isEmpty()) {
+                        String simpleName = 
line.substring(line.lastIndexOf('.') + 1);
+                        if (simpleName.startsWith("MalExpr_")) {
+                            String metric = 
simpleName.substring("MalExpr_".length());
+                            map.put(metric, line);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            throw new AssertionError("Failed to load transpiled manifest", e);
+        }
+        return map;
     }
 
     private static Map<String, String> loadKeyValueManifest(
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbClusterTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbClusterTest.java
index f2d8aae..2360d2b 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbClusterTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbClusterTest.java
@@ -47,7 +47,7 @@ class MongodbClusterTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbNodeTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbNodeTest.java
index 260f65f..5462eaa 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbNodeTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MongodbNodeTest.java
@@ -50,7 +50,7 @@ class MongodbNodeTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlInstanceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlInstanceTest.java
index 487ff83..ad27ffe 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlInstanceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlInstanceTest.java
@@ -49,7 +49,7 @@ class MysqlInstanceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlServiceTest.java
index 7b565b5..9c2fa5c 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/MysqlServiceTest.java
@@ -48,7 +48,7 @@ class MysqlServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NetworkProfilingTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NetworkProfilingTest.java
index bc2cdda..6a4d3f1 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NetworkProfilingTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NetworkProfilingTest.java
@@ -53,7 +53,7 @@ class NetworkProfilingTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxEndpointTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxEndpointTest.java
index f8f060b..51eb3b9 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxEndpointTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxEndpointTest.java
@@ -48,7 +48,7 @@ class NginxEndpointTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxInstanceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxInstanceTest.java
index d426650..c796c89 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxInstanceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxInstanceTest.java
@@ -48,7 +48,7 @@ class NginxInstanceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxServiceTest.java
index a59cceb..41c38ba 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/NginxServiceTest.java
@@ -48,7 +48,7 @@ class NginxServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/OapTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/OapTest.java
index 3c87d8b..906b64d 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/OapTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/OapTest.java
@@ -46,7 +46,7 @@ class OapTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlInstanceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlInstanceTest.java
index f4304d2..9df4b08 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlInstanceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlInstanceTest.java
@@ -51,7 +51,7 @@ class PostgresqlInstanceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlServiceTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlServiceTest.java
index 179f070..bc92ef2 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlServiceTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/PostgresqlServiceTest.java
@@ -49,7 +49,7 @@ class PostgresqlServiceTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/RabbitmqNodeTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/RabbitmqNodeTest.java
index b3cdc87..b26a8cf 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/RabbitmqNodeTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/RabbitmqNodeTest.java
@@ -53,7 +53,7 @@ class RabbitmqNodeTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/SpringMicrometerTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/SpringMicrometerTest.java
index dbed842..8fa8d6c 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/SpringMicrometerTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/SpringMicrometerTest.java
@@ -118,7 +118,7 @@ class SpringMicrometerTest extends MALScriptComparisonBase {
         Rule rule = loadRule(YAML_PATH);
         String expression = findMetricExp(rule, 
"meter_http_server_requests_count");
         long ts1 = Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
-        long ts2 = Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        long ts2 = Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
         Expression e = compileWithGroovy("verify_increase", expression);
         e.run(ImmutableMap.of("http_server_requests_count",
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/TelegrafVmTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/TelegrafVmTest.java
index 00011b8..38aadff 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/TelegrafVmTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/TelegrafVmTest.java
@@ -47,7 +47,7 @@ class TelegrafVmTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/VmTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/VmTest.java
index 1cf899d..b5f58b9 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/VmTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/VmTest.java
@@ -49,7 +49,7 @@ class VmTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/WindowsTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/WindowsTest.java
index 10bdd57..daf30c6 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/WindowsTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/WindowsTest.java
@@ -49,7 +49,7 @@ class WindowsTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ZabbixAgentTest.java
 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ZabbixAgentTest.java
index c9fcac8..5e3689b 100644
--- 
a/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ZabbixAgentTest.java
+++ 
b/oap-graalvm-server/src/test/java/org/apache/skywalking/oap/server/graalvm/mal/ZabbixAgentTest.java
@@ -52,7 +52,7 @@ class ZabbixAgentTest extends MALScriptComparisonBase {
     private static final long TS1 =
         Instant.parse("2024-01-01T00:00:00Z").toEpochMilli();
     private static final long TS2 =
-        Instant.parse("2024-01-01T00:02:00Z").toEpochMilli();
+        Instant.parse("2024-01-01T00:00:10Z").toEpochMilli();
 
     @TestFactory
     Stream<DynamicTest> allMetricsGroovyVsPrecompiled() {
diff --git 
a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
 
b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
index 5d4fe5f..dc98ff1 100644
--- 
a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
+++ 
b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
@@ -72,6 +72,13 @@ public class Expression {
      */
     public Result run(final Map<String, SampleFamily> sampleFamilies) {
         try {
+            // Set metricName on all SampleFamilies for CounterWindow keying.
+            // Replicates upstream ExpressionDelegate.propertyMissing() 
behavior.
+            for (SampleFamily s : sampleFamilies.values()) {
+                if (s != SampleFamily.EMPTY) {
+                    s.context.setMetricName(metricName);
+                }
+            }
             SampleFamily sf = expression.run(sampleFamilies);
             if (sf == SampleFamily.EMPTY) {
                 if (ExpressionParsingContext.get().isEmpty()) {
diff --git 
a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
 
b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
index 65423bc..d9d8e8c 100644
--- 
a/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
+++ 
b/oap-libs-for-graalvm/meter-analyzer-for-graalvm/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
@@ -388,7 +388,7 @@ public class SampleFamily {
 
     /**
      * Tag transformation using a Java functional interface.
-     * Replaces upstream tag(Closure) — no Groovy Closure needed.
+     * Used by transpiled MalExpression code — no Groovy Closure needed.
      */
     @SuppressWarnings(value = "unchecked")
     public SampleFamily tag(TagFunction fn) {
@@ -411,7 +411,7 @@ public class SampleFamily {
 
     /**
      * Sample filtering using a Java functional interface.
-     * Replaces upstream filter(Closure) — no Groovy Closure needed.
+     * Used by transpiled MalExpression code — no Groovy Closure needed.
      */
     public SampleFamily filter(SampleFilter filter) {
         if (this == EMPTY) {
@@ -538,7 +538,7 @@ public class SampleFamily {
     }
 
     public SampleFamily instance(List<String> serviceKeys, List<String> 
instanceKeys, Layer layer) {
-        return instance(serviceKeys, Const.POINT, instanceKeys, Const.POINT, 
layer, null);
+        return instance(serviceKeys, Const.POINT, instanceKeys, Const.POINT, 
layer, (PropertiesExtractor) null);
     }
 
     public SampleFamily endpoint(List<String> serviceKeys, List<String> 
endpointKeys, String delimiter, Layer layer) {
@@ -607,7 +607,7 @@ public class SampleFamily {
 
     /**
      * ForEach iteration using a Java functional interface.
-     * Replaces upstream forEach(List, Closure) — no Groovy Closure needed.
+     * Used by transpiled MalExpression code — no Groovy Closure needed.
      */
     public SampleFamily forEach(List<String> array, ForEachFunction each) {
         if (this == EMPTY) {
@@ -715,7 +715,7 @@ public class SampleFamily {
 
     /**
      * Decorate the service meter entity using a Java functional interface.
-     * Replaces upstream decorate(Closure) — no Groovy Closure needed.
+     * Used by transpiled MalExpression code — no Groovy Closure needed.
      */
     public SampleFamily decorate(DecorateFunction fn) {
         ExpressionParsingContext.get().ifPresent(ctx -> {

Reply via email to