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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 019c6feb2e Isolate MAL CounterWindow cache by metric name. (#11526)
019c6feb2e is described below

commit 019c6feb2ef720cddf2a26a1dfcc531070330988
Author: weixiang1862 <652048...@qq.com>
AuthorDate: Sat Nov 11 00:09:37 2023 +0800

    Isolate MAL CounterWindow cache by metric name. (#11526)
---
 docs/en/changes/changes.md                         |  1 +
 .../skywalking/oap/meter/analyzer/Analyzer.java    |  2 +-
 .../oap/meter/analyzer/MetricConvert.java          |  2 +-
 .../skywalking/oap/meter/analyzer/dsl/DSL.java     |  5 +++--
 .../oap/meter/analyzer/dsl/Expression.java         | 24 ++++++++++++++--------
 .../skywalking/oap/meter/analyzer/dsl/Sample.java  |  8 ++++----
 .../oap/meter/analyzer/dsl/SampleFamily.java       | 12 +++++++++--
 .../oap/meter/analyzer/dsl/AggregationTest.java    |  2 +-
 .../oap/meter/analyzer/dsl/ArithmeticTest.java     |  2 +-
 .../oap/meter/analyzer/dsl/BasicTest.java          |  2 +-
 .../meter/analyzer/dsl/ExpressionParsingTest.java  |  2 +-
 .../oap/meter/analyzer/dsl/FilterTest.java         |  2 +-
 .../oap/meter/analyzer/dsl/FunctionTest.java       |  2 +-
 .../oap/meter/analyzer/dsl/IncreaseTest.java       |  2 +-
 .../oap/meter/analyzer/dsl/K8sTagTest.java         |  2 +-
 .../oap/meter/analyzer/dsl/ScopeTest.java          |  2 +-
 .../oap/meter/analyzer/dsl/TagFilterTest.java      |  2 +-
 .../oap/meter/analyzer/dsl/ValueFilterTest.java    |  2 +-
 18 files changed, 46 insertions(+), 30 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index c959d155eb..4b01ffcd4d 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -37,6 +37,7 @@
 * Support output key parameters in the booting logs.
 * Fix cannot query zipkin traces with `annotationQuery` parameter in the JDBC 
related storage.
 * Fix `limit` doesn't work for `findEndpoint` API in ES storage.
+* Isolate MAL CounterWindow cache by metric name.
 
 #### UI
 
diff --git 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
index a87bd47122..27a203c578 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java
@@ -84,7 +84,7 @@ public class Analyzer {
                                  final String filterExpression,
                                  final String expression,
                                  final MeterSystem meterSystem) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(metricName, expression);
         FilterExpression filter = null;
         if (!Strings.isNullOrEmpty(filterExpression)) {
             filter = new FilterExpression(filterExpression);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/MetricConvert.java
 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/MetricConvert.java
index beb56851c4..5c89f42b5e 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/MetricConvert.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/MetricConvert.java
@@ -120,7 +120,7 @@ public class MetricConvert {
     }
 
     private void handleInitExp(String exp) {
-        Expression e = DSL.parse(exp);
+        Expression e = DSL.parse(null, exp);
         final Result result = e.run(ImmutableMap.of());
         if (!result.isSuccess() && result.isThrowable()) {
             throw new ExpressionParsingException(
diff --git 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/DSL.java
 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/DSL.java
index be576f30a4..d824611be7 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/DSL.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/DSL.java
@@ -46,10 +46,11 @@ public final class DSL {
     /**
      * Parse string literal to Expression object, which can be reused.
      *
+     * @param metricName the name of metric defined in mal rule
      * @param expression string literal represents the DSL expression.
      * @return Expression object could be executed.
      */
-    public static Expression parse(final String expression) {
+    public static Expression parse(final String metricName, final String 
expression) {
         CompilerConfiguration cc = new CompilerConfiguration();
         cc.setScriptBaseClass(DelegatingScript.class.getName());
         ImportCustomizer icz = new ImportCustomizer();
@@ -82,6 +83,6 @@ public final class DSL {
 
         GroovyShell sh = new GroovyShell(new Binding(), cc);
         DelegatingScript script = (DelegatingScript) sh.parse(expression);
-        return new Expression(expression, script);
+        return new Expression(metricName, expression, script);
     }
 }
diff --git 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
index c10909fc63..6a7146e72a 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Expression.java
@@ -36,11 +36,14 @@ import lombok.extern.slf4j.Slf4j;
 public class Expression {
     private static final ThreadLocal<Map<String, SampleFamily>> 
PROPERTY_REPOSITORY = new ThreadLocal<>();
 
+    private final String metricName;
+
     private final String literal;
 
     private final DelegatingScript expression;
 
-    public Expression(final String literal, final DelegatingScript expression) 
{
+    public Expression(final String metricName, final String literal, final 
DelegatingScript expression) {
+        this.metricName = metricName;
         this.literal = literal;
         this.expression = expression;
         this.empower();
@@ -94,7 +97,7 @@ public class Expression {
     }
 
     private void empower() {
-        expression.setDelegate(new ExpressionDelegate(literal));
+        expression.setDelegate(new ExpressionDelegate(metricName, literal));
         extendNumber(Number.class);
     }
 
@@ -115,23 +118,26 @@ public class Expression {
         public static final DownsamplingType LATEST = DownsamplingType.LATEST;
         public static final DownsamplingType SUM_PER_MIN = 
DownsamplingType.SUM_PER_MIN;
 
+        private final String metricName;
         private final String literal;
 
-        public SampleFamily propertyMissing(String metricName) {
+        public SampleFamily propertyMissing(String sampleName) {
             ExpressionParsingContext.get().ifPresent(ctx -> {
-                if (!ctx.samples.contains(metricName)) {
-                    ctx.samples.add(metricName);
+                if (!ctx.samples.contains(sampleName)) {
+                    ctx.samples.add(sampleName);
                 }
             });
             Map<String, SampleFamily> sampleFamilies = 
PROPERTY_REPOSITORY.get();
             if (sampleFamilies == null) {
                 return SampleFamily.EMPTY;
             }
-            if (sampleFamilies.containsKey(metricName)) {
-                return sampleFamilies.get(metricName);
+            if (sampleFamilies.containsKey(sampleName)) {
+                SampleFamily sampleFamily = sampleFamilies.get(sampleName);
+                sampleFamily.context.setMetricName(this.metricName);
+                return sampleFamily;
             }
-            if (!ExpressionParsingContext.get().isPresent()) {
-                log.warn("{} referred by \"{}\" doesn't exist in {}", 
metricName, literal, sampleFamilies.keySet());
+            if (ExpressionParsingContext.get().isEmpty()) {
+                log.warn("{} referred by \"{}\" doesn't exist in {}", 
sampleName, literal, sampleFamilies.keySet());
             }
             return SampleFamily.EMPTY;
         }
diff --git 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Sample.java
 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Sample.java
index ded0dfdc16..9a6760fde6 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Sample.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/Sample.java
@@ -46,14 +46,14 @@ public class Sample {
         return toBuilder().value(transform.apply(value)).build();
     }
 
-    Sample increase(String range, Function2<Double, Long, Double> transform) {
-        Tuple2<Long, Double> i = CounterWindow.INSTANCE.increase(name, labels, 
value, Duration.parse(range).toMillis(), timestamp);
+    Sample increase(String range, String metricName, Function2<Double, Long, 
Double> transform) {
+        Tuple2<Long, Double> i = CounterWindow.INSTANCE.increase(metricName, 
labels, value, Duration.parse(range).toMillis(), timestamp);
         double nv = transform.apply(i._2, i._1);
         return newValue(ignored -> nv);
     }
 
-    Sample increase(Function2<Double, Long, Double> transform) {
-        Tuple2<Long, Double> i = CounterWindow.INSTANCE.pop(name, labels, 
value, timestamp);
+    Sample increase(String metricName, Function2<Double, Long, Double> 
transform) {
+        Tuple2<Long, Double> i = CounterWindow.INSTANCE.pop(metricName, 
labels, value, timestamp);
         double nv = transform.apply(i._2, i._1);
         return newValue(ignored -> nv);
     }
diff --git 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
index 638429ae5e..3a0f825ee0 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/dsl/SampleFamily.java
@@ -276,7 +276,11 @@ public class SampleFamily {
         return SampleFamily.build(
             this.context,
             Arrays.stream(samples)
-                  .map(sample -> sample.increase(range, (lowerBoundValue, 
unused) -> sample.value - lowerBoundValue))
+                  .map(sample -> sample.increase(
+                      range,
+                      context.metricName,
+                      (lowerBoundValue, unused) -> sample.value - 
lowerBoundValue
+                  ))
                   .toArray(Sample[]::new)
         );
     }
@@ -291,6 +295,7 @@ public class SampleFamily {
             Arrays.stream(samples)
                   .map(sample -> sample.increase(
                       range,
+                      context.metricName,
                       (lowerBoundValue, lowerBoundTime) -> {
                           final long timeDiff = (sample.timestamp - 
lowerBoundTime) / 1000;
                           return timeDiff < 1L ? 0.0 : (sample.value - 
lowerBoundValue) / timeDiff;
@@ -308,6 +313,7 @@ public class SampleFamily {
             this.context,
             Arrays.stream(samples)
                   .map(sample -> sample.increase(
+                      context.metricName,
                       (lowerBoundValue, lowerBoundTime) -> {
                           final long timeDiff = (sample.timestamp - 
lowerBoundTime) / 1000;
                           return timeDiff < 1L ? 0.0 : (sample.value - 
lowerBoundValue) / timeDiff;
@@ -637,7 +643,7 @@ public class SampleFamily {
      * The parsing context holds key results more than sample collection.
      */
     @ToString
-    @EqualsAndHashCode
+    @EqualsAndHashCode(exclude = "metricName")
     @Getter
     @Setter
     @Builder
@@ -651,6 +657,8 @@ public class SampleFamily {
                                  .build();
         }
 
+        private String metricName;
+
         @Builder.Default
         private Map<MeterEntity, Sample[]> meterSamples = new HashMap<>();
 
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/AggregationTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/AggregationTest.java
index 51bcd11b0f..4f48fdc267 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/AggregationTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/AggregationTest.java
@@ -157,7 +157,7 @@ public class AggregationTest {
                      String expression,
                      Result want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ArithmeticTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ArithmeticTest.java
index 4a2afe4c61..c625e24fb8 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ArithmeticTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ArithmeticTest.java
@@ -453,7 +453,7 @@ public class ArithmeticTest {
                      String expression,
                      Result want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/BasicTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/BasicTest.java
index 004b2d8b79..8d15df04cd 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/BasicTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/BasicTest.java
@@ -58,7 +58,7 @@ public class BasicTest {
                      String expression,
                      Result want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ExpressionParsingTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ExpressionParsingTest.java
index b93907057d..aa29299b01 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ExpressionParsingTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ExpressionParsingTest.java
@@ -95,7 +95,7 @@ public class ExpressionParsingTest {
                      String expression,
                      ExpressionParsingContext want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         ExpressionParsingContext r = null;
         try {
             r = e.parse();
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FilterTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FilterTest.java
index 7b73206807..1c54614ba1 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FilterTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FilterTest.java
@@ -85,7 +85,7 @@ public class FilterTest {
                      ImmutableMap<String, SampleFamily> input,
                      String expression,
                      Result want) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = e.run(input);
         assertThat(r).isEqualTo(want);
     }
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FunctionTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FunctionTest.java
index edc2e0a7f1..fef54b69a3 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FunctionTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/FunctionTest.java
@@ -122,7 +122,7 @@ public class FunctionTest {
                      String expression,
                      Result want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/IncreaseTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/IncreaseTest.java
index 56fca53bf6..fe15b0006d 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/IncreaseTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/IncreaseTest.java
@@ -218,7 +218,7 @@ public class IncreaseTest {
                      String expression,
                      List<Result> want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         CounterWindow.INSTANCE.reset();
         for (int i = 0; i < input.size(); i++) {
             Result r = null;
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/K8sTagTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/K8sTagTest.java
index 2c5fe6c86d..652d514517 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/K8sTagTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/K8sTagTest.java
@@ -270,7 +270,7 @@ public class K8sTagTest {
                      String expression,
                      Result want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ScopeTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ScopeTest.java
index 040b4e025e..1edb67bb92 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ScopeTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ScopeTest.java
@@ -614,7 +614,7 @@ public class ScopeTest {
                      final String expression,
                      final boolean isThrow,
                      final Map<MeterEntity, Sample[]> want) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/TagFilterTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/TagFilterTest.java
index 458e3d80ea..27d418ffab 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/TagFilterTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/TagFilterTest.java
@@ -120,7 +120,7 @@ public class TagFilterTest {
                      String expression,
                      Result want,
                      boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);
diff --git 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ValueFilterTest.java
 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ValueFilterTest.java
index 8cf82905a2..34c0657025 100644
--- 
a/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ValueFilterTest.java
+++ 
b/oap-server/analyzer/meter-analyzer/src/test/java/org/apache/skywalking/oap/meter/analyzer/dsl/ValueFilterTest.java
@@ -128,7 +128,7 @@ public class ValueFilterTest {
                      final String expression,
                      final Result want,
                      final boolean isThrow) {
-        Expression e = DSL.parse(expression);
+        Expression e = DSL.parse(name, expression);
         Result r = null;
         try {
             r = e.run(input);

Reply via email to