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

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

上级 7d428ecc
......@@ -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
......
......@@ -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)
;
......
......@@ -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");
......
......@@ -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);
......
......@@ -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<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);
......
/*
* 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;
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("\"")) {
......
......@@ -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);
......
/*
* 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;
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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册