未验证 提交 a3317a82 编写于 作者: Y YczYanchengzhe 提交者: GitHub

Support for filter filtering of int type values (#7636)

上级 7d428ecc
...@@ -50,6 +50,7 @@ Release Notes. ...@@ -50,6 +50,7 @@ Release Notes.
* Fix `LoggingConfigWatcher` return `watch.value` would not consistent with the real configuration content. * Fix `LoggingConfigWatcher` return `watch.value` would not consistent with the real configuration content.
* Fix `ZookeeperConfigWatcherRegister.readConfig()` could cause `NPE` when `data.getData()` is null. * Fix `ZookeeperConfigWatcherRegister.readConfig()` could cause `NPE` when `data.getData()` is null.
* Support nacos grouped dynamic configurations. * Support nacos grouped dynamic configurations.
* Support for filter function filtering of int type values.
#### UI #### UI
......
...@@ -93,7 +93,7 @@ literalExpression ...@@ -93,7 +93,7 @@ literalExpression
; ;
expression 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 containMatch
...@@ -108,6 +108,10 @@ booleanMatch ...@@ -108,6 +108,10 @@ booleanMatch
: conditionAttributeStmt DUALEQUALS booleanConditionValue : conditionAttributeStmt DUALEQUALS booleanConditionValue
; ;
numberMatch
: conditionAttributeStmt DUALEQUALS numberConditionValue
;
stringMatch stringMatch
: conditionAttributeStmt DUALEQUALS (stringConditionValue | enumConditionValue) : conditionAttributeStmt DUALEQUALS (stringConditionValue | enumConditionValue)
; ;
......
...@@ -114,6 +114,11 @@ public class OALListener extends OALParserBaseListener { ...@@ -114,6 +114,11 @@ public class OALListener extends OALParserBaseListener {
conditionExpression.setExpressionType("booleanMatch"); conditionExpression.setExpressionType("booleanMatch");
} }
@Override
public void enterNumberMatch(OALParser.NumberMatchContext ctx) {
conditionExpression.setExpressionType("numberMatch");
}
@Override @Override
public void enterStringMatch(OALParser.StringMatchContext ctx) { public void enterStringMatch(OALParser.StringMatchContext ctx) {
conditionExpression.setExpressionType("stringMatch"); conditionExpression.setExpressionType("stringMatch");
......
...@@ -22,7 +22,7 @@ import java.io.IOException; ...@@ -22,7 +22,7 @@ import java.io.IOException;
import java.util.List; 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.BooleanMatch;
import org.apache.skywalking.oap.server.core.analysis.metrics.expression.BooleanNotEqualMatch; 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.analysis.metrics.expression.NotEqualMatch;
import org.apache.skywalking.oap.server.core.annotation.AnnotationScan; import org.apache.skywalking.oap.server.core.annotation.AnnotationScan;
import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine; import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
...@@ -127,7 +127,7 @@ public class DeepAnalysisTest { ...@@ -127,7 +127,7 @@ public class DeepAnalysisTest {
List<Expression> filterExpressions = result.getFilterExpressions(); List<Expression> filterExpressions = result.getFilterExpressions();
Assert.assertEquals(1, filterExpressions.size()); Assert.assertEquals(1, filterExpressions.size());
Expression filterExpression = filterExpressions.get(0); 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("source.getName()", filterExpression.getLeft());
Assert.assertEquals("\"/service/prod/save\"", filterExpression.getRight()); Assert.assertEquals("\"/service/prod/save\"", filterExpression.getRight());
} }
...@@ -157,7 +157,7 @@ public class DeepAnalysisTest { ...@@ -157,7 +157,7 @@ public class DeepAnalysisTest {
result.addFilterExpressionsParserResult(new ConditionExpression("stringMatch", "type", "")); result.addFilterExpressionsParserResult(new ConditionExpression("stringMatch", "type", ""));
result = analysis.analysis(result); result = analysis.analysis(result);
assertTrue(result.getFilterExpressions().size() > 0); 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()); assertEquals("source.getType()", result.getFilterExpressions().get(0).getLeft());
result.setFilterExpressions(null); result.setFilterExpressions(null);
......
...@@ -269,6 +269,24 @@ public class ScriptParserTest { ...@@ -269,6 +269,24 @@ public class ScriptParserTest {
Assert.assertEquals(1, methodArgsExpressions.size()); 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<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 @Test
public void testDisable() throws IOException { public void testDisable() throws IOException {
ScriptParser parser = ScriptParser.createFromScriptText("disable(segment);", TEST_SOURCE_PACKAGE); ScriptParser parser = ScriptParser.createFromScriptText("disable(segment);", TEST_SOURCE_PACKAGE);
......
/*
* 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;
}
}
...@@ -22,7 +22,7 @@ import java.util.Objects; ...@@ -22,7 +22,7 @@ import java.util.Objects;
import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher; import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher;
@FilterMatcher("stringMatch") @FilterMatcher("stringMatch")
public class EqualMatch { public class StringMatch {
public boolean match(String left, String right) { public boolean match(String left, String right) {
if (left.startsWith("\"") && left.endsWith("\"")) { if (left.startsWith("\"") && left.endsWith("\"")) {
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
package org.apache.skywalking.oap.server.core.analysis.metrics; 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.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
...@@ -27,18 +27,18 @@ public class PercentMetricsTest { ...@@ -27,18 +27,18 @@ public class PercentMetricsTest {
@Test @Test
public void testEntranceCombine() { public void testEntranceCombine() {
PercentMetricsImpl impl = new PercentMetricsImpl(); PercentMetricsImpl impl = new PercentMetricsImpl();
impl.combine(new EqualMatch().match(true, true)); impl.combine(new StringMatch().match(true, true));
impl.combine(new EqualMatch().match(true, false)); impl.combine(new StringMatch().match(true, false));
impl.combine(new EqualMatch().match(true, false)); impl.combine(new StringMatch().match(true, false));
impl.calculate(); impl.calculate();
Assert.assertEquals(3333, impl.getValue()); Assert.assertEquals(3333, impl.getValue());
impl = new PercentMetricsImpl(); impl = new PercentMetricsImpl();
impl.combine(new EqualMatch().match(true, true)); impl.combine(new StringMatch().match(true, true));
impl.combine(new EqualMatch().match(true, true)); impl.combine(new StringMatch().match(true, true));
impl.combine(new EqualMatch().match(true, false)); impl.combine(new StringMatch().match(true, false));
impl.calculate(); impl.calculate();
...@@ -48,14 +48,14 @@ public class PercentMetricsTest { ...@@ -48,14 +48,14 @@ public class PercentMetricsTest {
@Test @Test
public void testSelfCombine() { public void testSelfCombine() {
PercentMetricsImpl impl = new PercentMetricsImpl(); PercentMetricsImpl impl = new PercentMetricsImpl();
impl.combine(new EqualMatch().match(true, true)); impl.combine(new StringMatch().match(true, true));
impl.combine(new EqualMatch().match(true, false)); impl.combine(new StringMatch().match(true, false));
impl.combine(new EqualMatch().match(true, false)); impl.combine(new StringMatch().match(true, false));
PercentMetricsImpl impl2 = new PercentMetricsImpl(); PercentMetricsImpl impl2 = new PercentMetricsImpl();
impl2.combine(new EqualMatch().match(true, true)); impl2.combine(new StringMatch().match(true, true));
impl2.combine(new EqualMatch().match(true, true)); impl2.combine(new StringMatch().match(true, true));
impl2.combine(new EqualMatch().match(true, false)); impl2.combine(new StringMatch().match(true, false));
impl.combine(impl2); impl.combine(impl2);
......
/*
* 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
...@@ -23,13 +23,13 @@ import org.junit.Test; ...@@ -23,13 +23,13 @@ import org.junit.Test;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
public class EqualMatchTest { public class StringMatchTest {
@Test @Test
public void integerShouldEqualWhenLargerThan128() { public void integerShouldEqualWhenLargerThan128() {
Integer a = 334; Integer a = 334;
Integer b = 334; Integer b = 334;
boolean match = new EqualMatch().match(a, b); boolean match = new StringMatch().match(a, b);
assertTrue(match); assertTrue(match);
} }
...@@ -37,7 +37,7 @@ public class EqualMatchTest { ...@@ -37,7 +37,7 @@ public class EqualMatchTest {
public void longShouldEqualWhenLargerThan128() { public void longShouldEqualWhenLargerThan128() {
Long a = 334L; Long a = 334L;
Long b = 334L; Long b = 334L;
boolean match = new EqualMatch().match(a, b); boolean match = new StringMatch().match(a, b);
assertTrue(match); assertTrue(match);
} }
...@@ -45,7 +45,7 @@ public class EqualMatchTest { ...@@ -45,7 +45,7 @@ public class EqualMatchTest {
public void doubleShouldEqualWhenLargerThan128() { public void doubleShouldEqualWhenLargerThan128() {
Double a = 334.0; Double a = 334.0;
Double b = 334.0; Double b = 334.0;
boolean match = new EqualMatch().match(a, b); boolean match = new StringMatch().match(a, b);
assertTrue(match); assertTrue(match);
} }
...@@ -53,14 +53,14 @@ public class EqualMatchTest { ...@@ -53,14 +53,14 @@ public class EqualMatchTest {
public void floatShouldEqualWhenLargerThan128() { public void floatShouldEqualWhenLargerThan128() {
Float a = 334.0F; Float a = 334.0F;
Float b = 334.0F; Float b = 334.0F;
boolean match = new EqualMatch().match(a, b); boolean match = new StringMatch().match(a, b);
assertTrue(match); assertTrue(match);
} }
@Test @Test
public void stringShouldEqual() { public void stringShouldEqual() {
assertTrue(new EqualMatch().match("\"a\"", "a")); assertTrue(new StringMatch().match("\"a\"", "a"));
assertTrue(new EqualMatch().match("a", "a")); assertTrue(new StringMatch().match("a", "a"));
assertFalse(new EqualMatch().match("\"a\"", "ab")); assertFalse(new StringMatch().match("\"a\"", "ab"));
} }
} }
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册