You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/11/01 01:49:05 UTC

[skywalking] branch master updated: support oal list includes and excludes & add tags to some source (#5739)

This is an automated email from the ASF dual-hosted git repository.

wusheng 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 9b6386f  support oal list includes and excludes & add tags to some source (#5739)
9b6386f is described below

commit 9b6386f31c16b6129c3284c1326a66ce88ee8a6e
Author: Evan <31...@users.noreply.github.com>
AuthorDate: Sun Nov 1 09:48:48 2020 +0800

    support oal list includes and excludes & add tags to some source (#5739)
    
    * add oal excludes and includes to support tags
    Co-authored-by: 吴晟 Wu Sheng <wu...@foxmail.com>
---
 docs/en/concepts-and-designs/oal.md                | 26 ++++++-----
 docs/en/concepts-and-designs/scope-definitions.md  |  4 ++
 .../listener/MultiScopesAnalysisListener.java      |  1 +
 .../trace/parser/listener/SourceBuilder.java       | 13 ++++++
 .../apache/skywalking/oal/rt/grammar/OALLexer.g4   |  2 +
 .../apache/skywalking/oal/rt/grammar/OALParser.g4  | 10 ++++-
 .../skywalking/oal/rt/parser/OALListener.java      | 10 +++++
 .../metrics/expression/ContainMatch.java}          | 51 ++++++----------------
 .../metrics/expression/NotContainMatch.java}       | 51 ++++++----------------
 .../skywalking/oap/server/core/source/All.java     |  4 ++
 .../oap/server/core/source/Endpoint.java           |  4 ++
 .../skywalking/oap/server/core/source/Service.java |  5 +++
 .../oap/server/core/source/ServiceInstance.java    |  4 ++
 .../metrics/expression/ContainMatchTest.java}      | 51 ++++++----------------
 .../metrics/expression/NotContainMatchTest.java}   | 50 ++++++---------------
 .../listener/MultiScopesAnalysisListenerTest.java  |  9 ++++
 16 files changed, 135 insertions(+), 160 deletions(-)

diff --git a/docs/en/concepts-and-designs/oal.md b/docs/en/concepts-and-designs/oal.md
index fb8c920..35a1b2e 100644
--- a/docs/en/concepts-and-designs/oal.md
+++ b/docs/en/concepts-and-designs/oal.md
@@ -34,7 +34,7 @@ Read [Scope Definitions](scope-definitions.md), you can find all existing Scopes
 Use filter to build the conditions for the value of fields, by using field name and expression. 
 
 The expressions support to link by `and`, `or` and `(...)`. 
-The OPs support `==`, `!=`, `>`, `<`, `>=`, `<=`, `in [...]` ,`like %...`, `like ...%` and `like %...%`, with type detection based of field type. Trigger compile
+The OPs support `==`, `!=`, `>`, `<`, `>=`, `<=`, `in [...]` ,`like %...`, `like ...%` , `like %...%` , `contain` and `not contain`, with type detection based of field type. Trigger compile
  or code generation error if incompatible. 
 
 ## Aggregation Function
@@ -105,33 +105,39 @@ In default, no one is being disable.
 
 ## Examples
 ```
-// Caculate p99 of both Endpoint1 and Endpoint2
+// Calculate p99 of both Endpoint1 and Endpoint2
 endpoint_p99 = from(Endpoint.latency).filter(name in ("Endpoint1", "Endpoint2")).summary(0.99)
 
-// Caculate p99 of Endpoint name started with `serv`
+// Calculate p99 of Endpoint name started with `serv`
 serv_Endpoint_p99 = from(Endpoint.latency).filter(name like "serv%").summary(0.99)
 
-// Caculate the avg response time of each Endpoint
+// Calculate the avg response time of each Endpoint
 endpoint_avg = from(Endpoint.latency).avg()
 
-// Caculate the p50, p75, p90, p95 and p99 of each Endpoint by 50 ms steps.
+// Calculate the p50, p75, p90, p95 and p99 of each Endpoint by 50 ms steps.
 endpoint_percentile = from(Endpoint.latency).percentile(10)
 
-// Caculate the percent of response status is true, for each service.
+// Calculate the percent of response status is true, for each service.
 endpoint_success = from(Endpoint.*).filter(status == true).percent()
 
-// Caculate the sum of response code in [404, 500, 503], for each service.
+// Calculate the sum of response code in [404, 500, 503], for each service.
 endpoint_abnormal = from(Endpoint.*).filter(responseCode in [404, 500, 503]).sum()
 
-// Caculate the sum of request type in [RequestType.PRC, RequestType.gRPC], for each service.
+// Calculate the sum of request type in [RequestType.PRC, RequestType.gRPC], for each service.
 endpoint_rpc_calls_sum = from(Endpoint.*).filter(type in [RequestType.PRC, RequestType.gRPC]).sum()
 
-// Caculate the sum of endpoint name in ["/v1", "/v2"], for each service.
+// Calculate the sum of endpoint name in ["/v1", "/v2"], for each service.
 endpoint_url_sum = from(Endpoint.*).filter(endpointName in ["/v1", "/v2"]).sum()
 
-// Caculate the sum of calls for each service.
+// Calculate the sum of calls for each service.
 endpoint_calls = from(Endpoint.*).sum()
 
+// Calculate the CPM with the GET method for each service.The value is made up with `tagKey:tagValue`.
+service_cpm_http_get = from(Service.*).filter(tags contain "http.method:GET").cpm()
+
+// Calculate the CPM with the HTTP method except for the GET method for each service.The value is made up with `tagKey:tagValue`.
+service_cpm_http_other = from(Service.*).filter(tags not contain "http.method:GET").cpm()
+
 disable(segment);
 disable(endpoint_relation_server_side);
 disable(top_n_database_statement);
diff --git a/docs/en/concepts-and-designs/scope-definitions.md b/docs/en/concepts-and-designs/scope-definitions.md
index f0063c9..b340fd8 100644
--- a/docs/en/concepts-and-designs/scope-definitions.md
+++ b/docs/en/concepts-and-designs/scope-definitions.md
@@ -12,6 +12,7 @@ By using Aggregation Function, the requests will group by time and **Group Key(s
 | status  | Represent whether success or fail of the request.  |   | bool(true for success)  |
 | responseCode | Represent the response code of HTTP response, if this request is the HTTP call. e.g. 200, 404, 302| | int |
 | type | Represent the type of each request. Such as: Database, HTTP, RPC, gRPC. | | enum |
+| tags | Represent the labels of each request and each value is made up with the `TagKey:TagValue` in the segment. | | `List<String>` |
 
 ### SCOPE `Service`
 
@@ -27,6 +28,7 @@ Calculate the metrics data from each request of the service.
 | status | Represent whether success or fail of the request. | | bool(true for success)  |
 | responseCode | Represent the response code of HTTP response, if this request is the HTTP call | | int|
 | type | Represent the type of each request. Such as: Database, HTTP, RPC, gRPC. | | enum |
+| tags | Represent the labels of each request and each value is made up with the `TagKey:TagValue` in the segment. | | `List<String>` |
 
 ### SCOPE `ServiceInstance`
 
@@ -42,6 +44,7 @@ Calculate the metrics data from each request of the service instance.
 | status | Represent whether success or fail of the request. | | bool(true for success) |
 | responseCode | Represent the response code of HTTP response, if this request is the HTTP call. | | int |
 | type | Represent the type of each request. Such as: Database, HTTP, RPC, gRPC. | | enum |
+| tags | Represent the labels of each request and each value is made up with the `TagKey:TagValue` in the segment. | | `List<String>` |
 
 #### Secondary scopes of `ServiceInstance` 
 
@@ -113,6 +116,7 @@ Calculate the metrics data from each request of the endpoint in the service.
 | status | Represent whether success or fail of the request.| | bool(true for success) |
 | responseCode | Represent the response code of HTTP response, if this request is the HTTP call. | | int |
 | type | Represent the type of each request. Such as: Database, HTTP, RPC, gRPC. | | enum |
+| tags | Represent the labels of each request and each value is made up with the `TagKey:TagValue` in the segment. | | `List<String>` |
 
 ### SCOPE `ServiceRelation`
 
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
index 90854c7..2c938d7 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/MultiScopesAnalysisListener.java
@@ -245,6 +245,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
                     log.warn("span {} has illegal status code {}", span, tag.getValue());
                 }
             }
+            sourceBuilder.setTag(tag);
         });
 
         sourceBuilder.setStatus(!span.getIsError());
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
index c985eb3..21c878e 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SourceBuilder.java
@@ -18,9 +18,12 @@
 
 package org.apache.skywalking.oap.server.analyzer.provider.trace.parser.listener;
 
+import java.util.ArrayList;
+import java.util.List;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
+import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
 import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.analysis.NodeType;
 import org.apache.skywalking.oap.server.core.config.NamingControl;
@@ -120,6 +123,8 @@ class SourceBuilder {
     @Getter
     @Setter
     private long timeBucket;
+    @Getter
+    private final List<String> tags = new ArrayList<>();
 
     /**
      * The global level metrics source
@@ -134,6 +139,7 @@ class SourceBuilder {
         all.setResponseCode(responseCode);
         all.setType(type);
         all.setTimeBucket(timeBucket);
+        all.setTags(tags);
         return all;
     }
 
@@ -150,6 +156,7 @@ class SourceBuilder {
         service.setStatus(status);
         service.setResponseCode(responseCode);
         service.setType(type);
+        service.setTags(tags);
         service.setTimeBucket(timeBucket);
         return service;
     }
@@ -190,6 +197,7 @@ class SourceBuilder {
         serviceInstance.setStatus(status);
         serviceInstance.setResponseCode(responseCode);
         serviceInstance.setType(type);
+        serviceInstance.setTags(tags);
         serviceInstance.setTimeBucket(timeBucket);
         return serviceInstance;
     }
@@ -232,6 +240,7 @@ class SourceBuilder {
         endpoint.setStatus(status);
         endpoint.setResponseCode(responseCode);
         endpoint.setType(type);
+        endpoint.setTags(tags);
         endpoint.setTimeBucket(timeBucket);
         return endpoint;
     }
@@ -294,4 +303,8 @@ class SourceBuilder {
         databaseAccess.setTimeBucket(timeBucket);
         return databaseAccess;
     }
+
+    public void setTag(KeyStringValuePair tag) {
+        tags.add(tag.getKey().trim() + ":" + tag.getValue().trim());
+    }
 }
diff --git a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4 b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
index 316b558..339d9c7 100644
--- a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
+++ b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
@@ -90,6 +90,8 @@ LESS_EQUAL:                          '<=';
 NOT_EQUAL:                           '!=';
 LIKE:                                'like';
 IN:                                  'in';
+CONTAIN:                            'contain';
+NOT_CONTAIN:                        'not contain';
 
 // Literals
 
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 0296571..f0871fa 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
@@ -90,7 +90,15 @@ literalExpression
     ;
 
 expression
-    : booleanMatch | stringMatch | greaterMatch | lessMatch | greaterEqualMatch | lessEqualMatch | notEqualMatch | booleanNotEqualMatch | likeMatch | inMatch
+    : booleanMatch | stringMatch | greaterMatch | lessMatch | greaterEqualMatch | lessEqualMatch | notEqualMatch | booleanNotEqualMatch | likeMatch | inMatch | containMatch | notContainMatch
+    ;
+
+containMatch
+    : conditionAttribute CONTAIN stringConditionValue
+    ;
+
+notContainMatch
+    : conditionAttribute NOT_CONTAIN stringConditionValue
     ;
 
 booleanMatch
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 be94cca..61d001a 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
@@ -154,6 +154,16 @@ public class OALListener extends OALParserBaseListener {
     }
 
     @Override
+    public void enterContainMatch(final OALParser.ContainMatchContext ctx) {
+        conditionExpression.setExpressionType("containMatch");
+    }
+
+    @Override
+    public void enterNotContainMatch(final OALParser.NotContainMatchContext ctx) {
+        conditionExpression.setExpressionType("notContainMatch");
+    }
+
+    @Override
     public void enterInMatch(final OALParser.InMatchContext ctx) {
         conditionExpression.setExpressionType("inMatch");
     }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java
similarity index 50%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java
index c9070ef..14898e0 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatch.java
@@ -16,44 +16,21 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source;
+package org.apache.skywalking.oap.server.core.analysis.metrics.expression;
 
-import lombok.Getter;
-import lombok.Setter;
+import java.util.List;
+import java.util.Objects;
+import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher;
 
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ALL;
-
-@ScopeDeclaration(id = ALL, name = "All")
-public class All extends Source {
-    @Override
-    public int scope() {
-        return DefaultScopeDefine.ALL;
-    }
-
-    @Override
-    public String getEntityId() {
-        return "";
+@FilterMatcher
+public class ContainMatch {
+    public boolean match(List<String> left, String right) {
+        if (Objects.isNull(left)) {
+            return false;
+        }
+        if (right.startsWith("\"") && right.endsWith("\"")) {
+            right = right.substring(1, right.length() - 1);
+        }
+        return left.contains(right);
     }
-
-    @Getter
-    @Setter
-    private String name;
-    @Getter
-    @Setter
-    private String serviceInstanceName;
-    @Getter
-    @Setter
-    private String endpointName;
-    @Getter
-    @Setter
-    private int latency;
-    @Getter
-    @Setter
-    private boolean status;
-    @Getter
-    @Setter
-    private int responseCode;
-    @Getter
-    @Setter
-    private RequestType type;
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java
similarity index 50%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java
index c9070ef..bac24e5 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatch.java
@@ -16,44 +16,21 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source;
+package org.apache.skywalking.oap.server.core.analysis.metrics.expression;
 
-import lombok.Getter;
-import lombok.Setter;
+import java.util.List;
+import java.util.Objects;
+import org.apache.skywalking.oap.server.core.analysis.metrics.annotation.FilterMatcher;
 
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ALL;
-
-@ScopeDeclaration(id = ALL, name = "All")
-public class All extends Source {
-    @Override
-    public int scope() {
-        return DefaultScopeDefine.ALL;
-    }
-
-    @Override
-    public String getEntityId() {
-        return "";
+@FilterMatcher
+public class NotContainMatch {
+    public boolean match(List<String> left, String right) {
+        if (Objects.isNull(left)) {
+            return false;
+        }
+        if (right.startsWith("\"") && right.endsWith("\"")) {
+            right = right.substring(1, right.length() - 1);
+        }
+        return !left.contains(right);
     }
-
-    @Getter
-    @Setter
-    private String name;
-    @Getter
-    @Setter
-    private String serviceInstanceName;
-    @Getter
-    @Setter
-    private String endpointName;
-    @Getter
-    @Setter
-    private int latency;
-    @Getter
-    @Setter
-    private boolean status;
-    @Getter
-    @Setter
-    private int responseCode;
-    @Getter
-    @Setter
-    private RequestType type;
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
index c9070ef..7c81c47 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import java.util.List;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -56,4 +57,7 @@ public class All extends Source {
     @Getter
     @Setter
     private RequestType type;
+    @Getter
+    @Setter
+    private List<String> tags;
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
index 058db36..5d8babc 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import java.util.List;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
@@ -75,6 +76,9 @@ public class Endpoint extends Source {
     @Getter
     @Setter
     private RequestType type;
+    @Getter
+    @Setter
+    private List<String> tags;
 
     @Override
     public void prepare() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
index 8c1f888..c720ab7 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Service.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import java.util.List;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
@@ -64,4 +65,8 @@ public class Service extends Source {
     @Getter
     @Setter
     private RequestType type;
+    @Getter
+    @Setter
+    private List<String> tags;
+
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
index 43e3b96..a428c58 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstance.java
@@ -18,6 +18,7 @@
 
 package org.apache.skywalking.oap.server.core.source;
 
+import java.util.List;
 import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
@@ -67,6 +68,9 @@ public class ServiceInstance extends Source {
     @Getter
     @Setter
     private RequestType type;
+    @Getter
+    @Setter
+    private List<String> tags;
 
     @Override
     public void prepare() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java
similarity index 50%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
copy to oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java
index c9070ef..148ec6e 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/ContainMatchTest.java
@@ -16,44 +16,19 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source;
+package org.apache.skywalking.oap.server.core.analysis.metrics.expression;
 
-import lombok.Getter;
-import lombok.Setter;
+import java.util.Arrays;
+import org.junit.Assert;
+import org.junit.Test;
 
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ALL;
-
-@ScopeDeclaration(id = ALL, name = "All")
-public class All extends Source {
-    @Override
-    public int scope() {
-        return DefaultScopeDefine.ALL;
-    }
-
-    @Override
-    public String getEntityId() {
-        return "";
+public class ContainMatchTest {
+    @Test
+    public void match() {
+        ContainMatch containMatch = new ContainMatch();
+        Assert.assertFalse(containMatch.match(null, "http.method:GET"));
+        Assert.assertTrue(containMatch.match(Arrays.asList("http.method:GET", "http.method:POST"), "http.method:GET"));
+        Assert.assertFalse(
+            containMatch.match(Arrays.asList("http.method:GET", "http.method:POST"), "http.method:PUT"));
     }
-
-    @Getter
-    @Setter
-    private String name;
-    @Getter
-    @Setter
-    private String serviceInstanceName;
-    @Getter
-    @Setter
-    private String endpointName;
-    @Getter
-    @Setter
-    private int latency;
-    @Getter
-    @Setter
-    private boolean status;
-    @Getter
-    @Setter
-    private int responseCode;
-    @Getter
-    @Setter
-    private RequestType type;
-}
+}
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatchTest.java
similarity index 50%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
copy to oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatchTest.java
index c9070ef..0ecf1cf 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/All.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/expression/NotContainMatchTest.java
@@ -16,44 +16,20 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.source;
+package org.apache.skywalking.oap.server.core.analysis.metrics.expression;
 
-import lombok.Getter;
-import lombok.Setter;
+import java.util.Arrays;
+import org.junit.Assert;
+import org.junit.Test;
 
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.ALL;
+public class NotContainMatchTest {
 
-@ScopeDeclaration(id = ALL, name = "All")
-public class All extends Source {
-    @Override
-    public int scope() {
-        return DefaultScopeDefine.ALL;
+    @Test
+    public void match() {
+        NotContainMatch notContainMatch = new NotContainMatch();
+        Assert.assertFalse(notContainMatch.match(null, "http.method:GET"));
+        Assert.assertFalse(
+            notContainMatch.match(Arrays.asList("http.method:GET", "http.method:POST"), "http.method:GET"));
+        Assert.assertTrue(notContainMatch.match(Arrays.asList("http.method:GET", "http.method:POST"), "http.method:PUT"));
     }
-
-    @Override
-    public String getEntityId() {
-        return "";
-    }
-
-    @Getter
-    @Setter
-    private String name;
-    @Getter
-    @Setter
-    private String serviceInstanceName;
-    @Getter
-    @Setter
-    private String endpointName;
-    @Getter
-    @Setter
-    private int latency;
-    @Getter
-    @Setter
-    private boolean status;
-    @Getter
-    @Setter
-    private int responseCode;
-    @Getter
-    @Setter
-    private RequestType type;
-}
+}
\ No newline at end of file
diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
index 7cdd71d..0b443eb 100644
--- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
+++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListenerTest.java
@@ -190,6 +190,10 @@ public class MultiScopesAnalysisListenerTest {
                                           .setIsError(true)
                                           .setSpanType(SpanType.Entry)
                                           .setSpanLayer(SpanLayer.RPCFramework)
+                                          .addTags(KeyStringValuePair.newBuilder()
+                                                                     .setKey("http.method")
+                                                                     .setValue("GET")
+                                                                     .build())
                                           .addRefs(
                                               SegmentReference.newBuilder()
                                                               .setRefType(RefType.CrossProcess)
@@ -226,6 +230,11 @@ public class MultiScopesAnalysisListenerTest {
         Assert.assertEquals(serviceInstance.getName(), serviceInstanceRelation.getDestServiceInstanceName());
         Assert.assertEquals("downstream-endpoint", endpointRelation.getEndpoint());
         Assert.assertEquals(endpoint.getName(), endpointRelation.getChildEndpoint());
+        // tags test
+        Assert.assertEquals("http.method:GET", all.getTags().get(0));
+        Assert.assertEquals("http.method:GET", service.getTags().get(0));
+        Assert.assertEquals("http.method:GET", serviceInstance.getTags().get(0));
+        Assert.assertEquals("http.method:GET", endpoint.getTags().get(0));
     }
 
     /**