Support for filter filtering of int type values (#7636)
This commit is contained in:
parent
7d428ecc2d
commit
a3317a8238
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue