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