From a3317a8238493ee3da9b9ac8d02d207866388877 Mon Sep 17 00:00:00 2001 From: YczYanchengzhe <45945752+YczYanchengzhe@users.noreply.github.com> Date: Thu, 2 Sep 2021 23:53:05 +0800 Subject: [PATCH] Support for filter filtering of int type values (#7636) --- CHANGES.md | 1 + .../skywalking/oal/rt/grammar/OALParser.g4 | 6 +- .../skywalking/oal/rt/parser/OALListener.java | 5 + .../oal/rt/parser/DeepAnalysisTest.java | 6 +- .../oal/rt/parser/ScriptParserTest.java | 18 ++++ .../metrics/expression/NumberMatch.java | 33 +++++++ .../{EqualMatch.java => StringMatch.java} | 2 +- .../analysis/metrics/PercentMetricsTest.java | 26 ++--- .../metrics/expression/NumberMatchTest.java | 96 +++++++++++++++++++ ...ualMatchTest.java => StringMatchTest.java} | 16 ++-- 10 files changed, 183 insertions(+), 26 deletions(-) create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java rename oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/{EqualMatch.java => StringMatch.java} (98%) create mode 100644 oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java rename oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/{EqualMatchTest.java => StringMatchTest.java} (79%) diff --git a/CHANGES.md b/CHANGES.md index eb3fe2f714..bbc698d8b6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -50,6 +50,7 @@ Release Notes. * Fix `LoggingConfigWatcher` return `watch.value` would not consistent with the real configuration content. * Fix `ZookeeperConfigWatcherRegister.readConfig()` could cause `NPE` when `data.getData()` is null. * Support nacos grouped dynamic configurations. +* Support for filter function filtering of int type values. #### UI diff --git a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4 b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4 index 050defc2f4..643e29fccd 100644 --- a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4 +++ b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4 @@ -93,7 +93,7 @@ literalExpression ; expression - : booleanMatch | stringMatch | greaterMatch | lessMatch | greaterEqualMatch | lessEqualMatch | notEqualMatch | booleanNotEqualMatch | likeMatch | inMatch | containMatch | notContainMatch + : booleanMatch | numberMatch | stringMatch | greaterMatch | lessMatch | greaterEqualMatch | lessEqualMatch | notEqualMatch | booleanNotEqualMatch | likeMatch | inMatch | containMatch | notContainMatch ; containMatch @@ -108,6 +108,10 @@ booleanMatch : conditionAttributeStmt DUALEQUALS booleanConditionValue ; +numberMatch + : conditionAttributeStmt DUALEQUALS numberConditionValue + ; + stringMatch : conditionAttributeStmt DUALEQUALS (stringConditionValue | enumConditionValue) ; diff --git a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java index 4bc80ce7e8..38cc775099 100644 --- a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java +++ b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/parser/OALListener.java @@ -114,6 +114,11 @@ public class OALListener extends OALParserBaseListener { conditionExpression.setExpressionType("booleanMatch"); } + @Override + public void enterNumberMatch(OALParser.NumberMatchContext ctx) { + conditionExpression.setExpressionType("numberMatch"); + } + @Override public void enterStringMatch(OALParser.StringMatchContext ctx) { conditionExpression.setExpressionType("stringMatch"); diff --git a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java index 1eb6fa524d..58d353ce74 100644 --- a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java +++ b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/DeepAnalysisTest.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.util.List; import org.apache.skywalking.oap.server.core.analysis.metrics.expression.BooleanMatch; import org.apache.skywalking.oap.server.core.analysis.metrics.expression.BooleanNotEqualMatch; -import org.apache.skywalking.oap.server.core.analysis.metrics.expression.EqualMatch; +import org.apache.skywalking.oap.server.core.analysis.metrics.expression.StringMatch; import org.apache.skywalking.oap.server.core.analysis.metrics.expression.NotEqualMatch; import org.apache.skywalking.oap.server.core.annotation.AnnotationScan; import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine; @@ -127,7 +127,7 @@ public class DeepAnalysisTest { List filterExpressions = result.getFilterExpressions(); Assert.assertEquals(1, filterExpressions.size()); Expression filterExpression = filterExpressions.get(0); - Assert.assertEquals(EqualMatch.class.getName(), filterExpression.getExpressionObject()); + Assert.assertEquals(StringMatch.class.getName(), filterExpression.getExpressionObject()); Assert.assertEquals("source.getName()", filterExpression.getLeft()); Assert.assertEquals("\"/service/prod/save\"", filterExpression.getRight()); } @@ -157,7 +157,7 @@ public class DeepAnalysisTest { result.addFilterExpressionsParserResult(new ConditionExpression("stringMatch", "type", "")); result = analysis.analysis(result); assertTrue(result.getFilterExpressions().size() > 0); - assertEquals(EqualMatch.class.getName(), result.getFilterExpressions().get(0).getExpressionObject()); + assertEquals(StringMatch.class.getName(), result.getFilterExpressions().get(0).getExpressionObject()); assertEquals("source.getType()", result.getFilterExpressions().get(0).getLeft()); result.setFilterExpressions(null); diff --git a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java index 10c9322c06..99ee17b58a 100644 --- a/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java +++ b/oap-server/oal-rt/src/test/java/org/apache/skywalking/oal/rt/parser/ScriptParserTest.java @@ -269,6 +269,24 @@ public class ScriptParserTest { Assert.assertEquals(1, methodArgsExpressions.size()); } + @Test + public void testParse10() throws IOException { + ScriptParser parser = ScriptParser.createFromScriptText( + "ClientCpm = from(ServiceInstanceRelation.*).filter(componentId == 7).cpm();", TEST_SOURCE_PACKAGE); + List results = parser.parse().getMetricsStmts(); + AnalysisResult clientCpm = results.get(0); + Assert.assertEquals("ClientCpm", clientCpm.getMetricsName()); + Assert.assertEquals("ServiceInstanceRelation", clientCpm.getSourceName()); + Assert.assertEquals("[*]", clientCpm.getSourceAttribute().toString()); + final List filterExpressions = clientCpm.getFilterExpressions(); + Assert.assertEquals(1, filterExpressions.size()); + Assert.assertEquals("source.getComponentId()", filterExpressions.get(0).getLeft()); + Assert.assertEquals("cpm", clientCpm.getAggregationFunctionName()); + EntryMethod entryMethod = clientCpm.getEntryMethod(); + List methodArgsExpressions = entryMethod.getArgsExpressions(); + Assert.assertEquals(1, methodArgsExpressions.size()); + } + @Test public void testDisable() throws IOException { ScriptParser parser = ScriptParser.createFromScriptText("disable(segment);", TEST_SOURCE_PACKAGE); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java new file mode 100644 index 0000000000..17b3629cf2 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.skywalking.oap.server.core.analysis.metrics.expression; + +import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher; + +@FilterMatcher +public class NumberMatch { + + public boolean match(int left, int right) { + return left == right; + } + + public boolean match(long left, long right) { + return left == right; + } + +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatch.java similarity index 98% rename from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatch.java index 32c8a0091c..d0b6b01825 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatch.java @@ -22,7 +22,7 @@ import java.util.Objects; import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher; @FilterMatcher("stringMatch") -public class EqualMatch { +public class StringMatch { public boolean match(String left, String right) { if (left.startsWith("\"") && left.endsWith("\"")) { diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java index eec91eb697..51a2dbc655 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java @@ -18,7 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; -import org.apache.skywalking.oap.server.core.analysis.metrics.expression.EqualMatch; +import org.apache.skywalking.oap.server.core.analysis.metrics.expression.StringMatch; import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData; import org.junit.Assert; import org.junit.Test; @@ -27,18 +27,18 @@ public class PercentMetricsTest { @Test public void testEntranceCombine() { PercentMetricsImpl impl = new PercentMetricsImpl(); - impl.combine(new EqualMatch().match(true, true)); - impl.combine(new EqualMatch().match(true, false)); - impl.combine(new EqualMatch().match(true, false)); + impl.combine(new StringMatch().match(true, true)); + impl.combine(new StringMatch().match(true, false)); + impl.combine(new StringMatch().match(true, false)); impl.calculate(); Assert.assertEquals(3333, impl.getValue()); impl = new PercentMetricsImpl(); - impl.combine(new EqualMatch().match(true, true)); - impl.combine(new EqualMatch().match(true, true)); - impl.combine(new EqualMatch().match(true, false)); + impl.combine(new StringMatch().match(true, true)); + impl.combine(new StringMatch().match(true, true)); + impl.combine(new StringMatch().match(true, false)); impl.calculate(); @@ -48,14 +48,14 @@ public class PercentMetricsTest { @Test public void testSelfCombine() { PercentMetricsImpl impl = new PercentMetricsImpl(); - impl.combine(new EqualMatch().match(true, true)); - impl.combine(new EqualMatch().match(true, false)); - impl.combine(new EqualMatch().match(true, false)); + impl.combine(new StringMatch().match(true, true)); + impl.combine(new StringMatch().match(true, false)); + impl.combine(new StringMatch().match(true, false)); PercentMetricsImpl impl2 = new PercentMetricsImpl(); - impl2.combine(new EqualMatch().match(true, true)); - impl2.combine(new EqualMatch().match(true, true)); - impl2.combine(new EqualMatch().match(true, false)); + impl2.combine(new StringMatch().match(true, true)); + impl2.combine(new StringMatch().match(true, true)); + impl2.combine(new StringMatch().match(true, false)); impl.combine(impl2); diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java new file mode 100644 index 0000000000..2048f4451f --- /dev/null +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatchTest.java @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.skywalking.oap.server.core.analysis.metrics.expression; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; + +public class NumberMatchTest { + + @Test + public void integerShouldEqual() { + Integer a = 334; + Integer b = 334; + boolean match = new NumberMatch().match(a, b); + assertTrue(match); + + a = -123; + b = -123; + match = new NumberMatch().match(a, b); + assertTrue(match); + + a = -122; + b = -123; + match = new NumberMatch().match(a, b); + assertFalse(match); + + a = -123; + b = -122; + match = new NumberMatch().match(a, b); + assertFalse(match); + } + + @Test + public void intShouldEqual() { + int a = 334; + int b = 334; + boolean match = new NumberMatch().match(a, b); + assertTrue(match); + + a = -123; + b = -123; + match = new NumberMatch().match(a, b); + assertTrue(match); + + a = -122; + b = -123; + match = new NumberMatch().match(a, b); + assertFalse(match); + + a = -123; + b = -122; + match = new NumberMatch().match(a, b); + assertFalse(match); + } + + @Test + public void longShouldEqual() { + long a = 21474836478L; + long b = 21474836478L; + boolean match = new NumberMatch().match(a, b); + assertTrue(match); + + a = -21474836478L; + b = -21474836479L; + match = new NumberMatch().match(a, b); + assertFalse(match); + + Long c = -123L; + Long d = -123L; + match = new NumberMatch().match(c, d); + assertTrue(match); + + c = -21474836478L; + d = -21474836479L; + match = new NumberMatch().match(c, d); + assertFalse(match); + } + +} \ No newline at end of file diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatchTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatchTest.java similarity index 79% rename from oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatchTest.java rename to oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatchTest.java index bce02419b0..e3b665feac 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatchTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/StringMatchTest.java @@ -23,13 +23,13 @@ import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -public class EqualMatchTest { +public class StringMatchTest { @Test public void integerShouldEqualWhenLargerThan128() { Integer a = 334; Integer b = 334; - boolean match = new EqualMatch().match(a, b); + boolean match = new StringMatch().match(a, b); assertTrue(match); } @@ -37,7 +37,7 @@ public class EqualMatchTest { public void longShouldEqualWhenLargerThan128() { Long a = 334L; Long b = 334L; - boolean match = new EqualMatch().match(a, b); + boolean match = new StringMatch().match(a, b); assertTrue(match); } @@ -45,7 +45,7 @@ public class EqualMatchTest { public void doubleShouldEqualWhenLargerThan128() { Double a = 334.0; Double b = 334.0; - boolean match = new EqualMatch().match(a, b); + boolean match = new StringMatch().match(a, b); assertTrue(match); } @@ -53,14 +53,14 @@ public class EqualMatchTest { public void floatShouldEqualWhenLargerThan128() { Float a = 334.0F; Float b = 334.0F; - boolean match = new EqualMatch().match(a, b); + boolean match = new StringMatch().match(a, b); assertTrue(match); } @Test public void stringShouldEqual() { - assertTrue(new EqualMatch().match("\"a\"", "a")); - assertTrue(new EqualMatch().match("a", "a")); - assertFalse(new EqualMatch().match("\"a\"", "ab")); + assertTrue(new StringMatch().match("\"a\"", "a")); + assertTrue(new StringMatch().match("a", "a")); + assertFalse(new StringMatch().match("\"a\"", "ab")); } } \ No newline at end of file -- GitLab