This is an automated email from the ASF dual-hosted git repository.
kezhenxu94 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 a3317a8 Support for filter filtering of int type values (#7636)
a3317a8 is described below
commit a3317a8238493ee3da9b9ac8d02d207866388877
Author: YczYanchengzhe <[email protected]>
AuthorDate: Thu Sep 2 23:53:05 2021 +0800
Support for filter filtering of int type values (#7636)
---
CHANGES.md | 1 +
.../apache/skywalking/oal/rt/grammar/OALParser.g4 | 6 +-
.../skywalking/oal/rt/parser/OALListener.java | 5 ++
.../skywalking/oal/rt/parser/DeepAnalysisTest.java | 6 +-
.../skywalking/oal/rt/parser/ScriptParserTest.java | 18 ++++
.../{EqualMatch.java => NumberMatch.java} | 25 ++----
.../{EqualMatch.java => StringMatch.java} | 2 +-
.../core/analysis/metrics/PercentMetricsTest.java | 26 +++---
.../metrics/expression/NumberMatchTest.java | 96 ++++++++++++++++++++++
.../{EqualMatchTest.java => StringMatchTest.java} | 16 ++--
10 files changed, 158 insertions(+), 43 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index eb3fe2f..bbc698d 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 050defc..643e29f 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 4bc80ce..38cc775 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
@@ -115,6 +115,11 @@ public class OALListener extends OALParserBaseListener {
}
@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 1eb6fa5..58d353c 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<Expression> 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 10c9322..99ee17b 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
@@ -270,6 +270,24 @@ public class ScriptParserTest {
}
@Test
+ public void testParse10() throws IOException {
+ ScriptParser parser = ScriptParser.createFromScriptText(
+ "ClientCpm = from(ServiceInstanceRelation.*).filter(componentId ==
7).cpm();", TEST_SOURCE_PACKAGE);
+ List<AnalysisResult> 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<Expression> 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<Object> methodArgsExpressions = entryMethod.getArgsExpressions();
+ Assert.assertEquals(1, methodArgsExpressions.size());
+ }
+
+ @Test
public void testDisable() throws IOException {
ScriptParser parser =
ScriptParser.createFromScriptText("disable(segment);", TEST_SOURCE_PACKAGE);
DisableCollection collection = parser.parse().getDisableCollection();
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/NumberMatch.java
similarity index 61%
copy from
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/EqualMatch.java
copy to
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NumberMatch.java
index 32c8a00..17b3629 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/NumberMatch.java
@@ -6,37 +6,28 @@
* (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
+ * 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 java.util.Objects;
import
org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher;
-@FilterMatcher("stringMatch")
-public class EqualMatch {
-
- public boolean match(String left, String right) {
- if (left.startsWith("\"") && left.endsWith("\"")) {
- left = left.substring(1, left.length() - 1);
- }
+@FilterMatcher
+public class NumberMatch {
- if (right.startsWith("\"") && right.endsWith("\"")) {
- right = left.substring(1, right.length() - 1);
- }
-
- return Objects.equals(left, right);
+ public boolean match(int left, int right) {
+ return left == right;
}
- public boolean match(Object left, Object right) {
- return Objects.equals(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 32c8a00..d0b6b01 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 eec91eb..51a2dbc 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 0000000..2048f44
--- /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 bce0241..e3b665f 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