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);