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/06/22 01:11:02 UTC

[skywalking] branch master updated: Reduce the length of metric name (#4936)

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 e143ae6  Reduce the length of metric name (#4936)
e143ae6 is described below

commit e143ae62eb8a2300b124f345b235bb1e3eb3c139
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Mon Jun 22 09:10:51 2020 +0800

    Reduce the length of metric name (#4936)
---
 .../main/resources/fetcher-prom-rules/self.yaml    | 10 ++--
 .../main/resources/ui-initialized-templates.yml    |  6 +--
 .../apache/skywalking/e2e/SimpleQueryClient.java   | 58 ++++++++++++++++++++
 .../skywalking/e2e/metrics/MetricsQuery.java       | 21 ++++++++
 .../e2e/metrics/ReadLabeledMetricsData.java        | 28 ++++++++++
 .../apache/skywalking/e2e/metrics/ReadMetrics.java | 27 ++++++++++
 .../skywalking/e2e/metrics/ReadMetricsData.java    | 26 +++++++++
 .../skywalking/e2e/metrics/ReadMetricsQuery.java   | 43 +++++++++++++++
 .../skywalking/e2e/service/ServicesMatcher.java    |  4 ++
 .../src/main/resources/read-labeled-metrics.gql}   | 55 +++++++++----------
 .../src/main/resources/read-metrics.gql}           | 49 +++++++----------
 .../e2e-test/docker/simple/auth/docker-compose.yml |  2 +
 .../e2e-test/docker/simple/jdk/docker-compose.yml  |  3 ++
 .../e2e-test/docker/simple/ssl/docker-compose.yml  |  2 +
 .../e2e-test/docker/storage/docker-compose.es6.yml |  2 +
 .../e2e-test/docker/storage/docker-compose.es7.yml |  2 +
 .../docker/storage/docker-compose.influxdb.yml     |  2 +
 .../docker/storage/docker-compose.mysql.yml        |  2 +
 .../apache/skywalking/e2e/simple/SimpleE2E.java    | 63 +++++++++++++++++++++-
 .../apache/skywalking/e2e/storage/StorageE2E.java  | 61 ++++++++++++++++++++-
 .../resources/expected/simple/so11y-instances.yml} | 29 ++--------
 .../resources/expected/simple/so11y-services.yml}  | 27 +---------
 22 files changed, 400 insertions(+), 122 deletions(-)

diff --git a/oap-server/server-bootstrap/src/main/resources/fetcher-prom-rules/self.yaml b/oap-server/server-bootstrap/src/main/resources/fetcher-prom-rules/self.yaml
index 2a703c0..f0f0368 100644
--- a/oap-server/server-bootstrap/src/main/resources/fetcher-prom-rules/self.yaml
+++ b/oap-server/server-bootstrap/src/main/resources/fetcher-prom-rules/self.yaml
@@ -241,7 +241,7 @@ metricsRules:
             - service
           instance:
             - instance
-  - name: instance_persistence_timer_execute_latency_percentile
+  - name: instance_persistence_execute_percentile
     scope: SERVICE_INSTANCE
     operation: avgHistogramPercentile
     percentiles: [50, 70, 90, 99]
@@ -254,7 +254,7 @@ metricsRules:
             - service
           instance:
             - instance
-  - name: instance_persistence_timer_prepare_latency_percentile
+  - name: instance_persistence_prepare_percentile
     scope: SERVICE_INSTANCE
     operation: avgHistogramPercentile
     percentiles: [50, 70, 90, 99]
@@ -267,7 +267,7 @@ metricsRules:
             - service
           instance:
             - instance
-  - name: instance_persistence_timer_bulk_error_count
+  - name: instance_persistence_error_count
     scope: SERVICE_INSTANCE
     operation: avg
     sources:
@@ -279,7 +279,7 @@ metricsRules:
             - service
           instance:
             - instance
-  - name: instance_persistence_timer_execute_count
+  - name: instance_persistence_execute_count
     scope: SERVICE_INSTANCE
     operation: avg
     sources:
@@ -291,7 +291,7 @@ metricsRules:
             - service
           instance:
             - instance
-  - name: instance_persistence_timer_prepare_count
+  - name: instance_persistence_prepare_count
     scope: SERVICE_INSTANCE
     operation: avg
     sources:
diff --git a/oap-server/server-bootstrap/src/main/resources/ui-initialized-templates.yml b/oap-server/server-bootstrap/src/main/resources/ui-initialized-templates.yml
index 20dd897..0a2dcfd 100644
--- a/oap-server/server-bootstrap/src/main/resources/ui-initialized-templates.yml
+++ b/oap-server/server-bootstrap/src/main/resources/ui-initialized-templates.yml
@@ -1025,7 +1025,7 @@ templates:
                   "entityType": "ServiceInstance",
                   "independentSelector": false,
                   "metricType": "REGULAR_VALUE",
-                  "metricName": "meter_instance_persistence_timer_prepare_count,meter_instance_persistence_timer_execute_count,meter_instance_persistence_timer_bulk_error_count",
+                  "metricName": "meter_instance_persistence_prepare_count,meter_instance_persistence_execute_count,meter_instance_persistence_error_count",
                   "queryMetricType": "readMetricsValues",
                   "chartType": "ChartBar",
                   "unit": "Per 5 Minutes"
@@ -1040,7 +1040,7 @@ templates:
                   "unit": "Millisecond",
                   "queryMetricType": "readLabeledMetricsValues",
                   "chartType": "ChartLine",
-                  "metricName": "meter_instance_persistence_timer_prepare_latency_percentile",
+                  "metricName": "meter_instance_persistence_prepare_percentile",
                   "metricLabels": "50,70,90,99",
                   "labelsIndex": "50,70,90,99"
                 },
@@ -1051,7 +1051,7 @@ templates:
                   "entityType": "ServiceInstance",
                   "independentSelector": false,
                   "metricType": "LABELED_VALUE",
-                  "metricName": "meter_instance_persistence_timer_execute_latency_percentile",
+                  "metricName": "meter_instance_persistence_execute_percentile",
                   "queryMetricType": "readLabeledMetricsValues",
                   "chartType": "ChartLine",
                   "metricLabels": "50,70,90,99",
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/SimpleQueryClient.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/SimpleQueryClient.java
index 32b2771..5287dc3 100644
--- a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/SimpleQueryClient.java
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/SimpleQueryClient.java
@@ -29,6 +29,10 @@ import org.apache.skywalking.e2e.metrics.Metrics;
 import org.apache.skywalking.e2e.metrics.MetricsData;
 import org.apache.skywalking.e2e.metrics.MetricsQuery;
 import org.apache.skywalking.e2e.metrics.MultiMetricsData;
+import org.apache.skywalking.e2e.metrics.ReadLabeledMetricsData;
+import org.apache.skywalking.e2e.metrics.ReadMetricsQuery;
+import org.apache.skywalking.e2e.metrics.ReadMetrics;
+import org.apache.skywalking.e2e.metrics.ReadMetricsData;
 import org.apache.skywalking.e2e.service.Service;
 import org.apache.skywalking.e2e.service.ServicesData;
 import org.apache.skywalking.e2e.service.ServicesQuery;
@@ -52,7 +56,10 @@ import org.springframework.http.RequestEntity;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.client.RestTemplate;
 
+import lombok.extern.slf4j.Slf4j;
+
 @SuppressWarnings("UnstableApiUsage")
+@Slf4j
 public class SimpleQueryClient {
     protected final RestTemplate restTemplate = new RestTemplate();
 
@@ -253,4 +260,55 @@ public class SimpleQueryClient {
         return Objects.requireNonNull(responseEntity.getBody()).getData().getMetrics();
     }
 
+    public ReadMetrics readMetrics(final ReadMetricsQuery query) throws Exception {
+        final URL queryFileUrl = Resources.getResource("read-metrics.gql");
+        final String queryString = Resources.readLines(queryFileUrl, StandardCharsets.UTF_8)
+                                            .stream()
+                                            .filter(it -> !it.startsWith("#"))
+                                            .collect(Collectors.joining())
+                                            .replace("{step}", query.step())
+                                            .replace("{start}", query.start())
+                                            .replace("{end}", query.end())
+                                            .replace("{metricsName}", query.metricsName())
+                                            .replace("{serviceName}", query.serviceName())
+                                            .replace("{instanceName}", query.instanceName());
+        LOGGER.info("Query: {}", queryString);
+        final ResponseEntity<GQLResponse<ReadMetricsData>> responseEntity = restTemplate.exchange(
+            new RequestEntity<>(queryString, HttpMethod.POST, URI.create(endpointUrl)),
+            new ParameterizedTypeReference<GQLResponse<ReadMetricsData>>() {
+            }
+        );
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new RuntimeException("Response status != 200, actual: " + responseEntity.getStatusCode());
+        }
+
+        return Objects.requireNonNull(responseEntity.getBody()).getData().getReadMetricsValues();
+    }
+
+    public List<ReadMetrics> readLabeledMetrics(final ReadMetricsQuery query) throws Exception {
+        final URL queryFileUrl = Resources.getResource("read-labeled-metrics.gql");
+        final String queryString = Resources.readLines(queryFileUrl, StandardCharsets.UTF_8)
+                                            .stream()
+                                            .filter(it -> !it.startsWith("#"))
+                                            .collect(Collectors.joining())
+                                            .replace("{step}", query.step())
+                                            .replace("{start}", query.start())
+                                            .replace("{end}", query.end())
+                                            .replace("{metricsName}", query.metricsName())
+                                            .replace("{serviceName}", query.serviceName())
+                                            .replace("{instanceName}", query.instanceName());
+        LOGGER.info("Query: {}", queryString);
+        final ResponseEntity<GQLResponse<ReadLabeledMetricsData>> responseEntity = restTemplate.exchange(
+            new RequestEntity<>(queryString, HttpMethod.POST, URI.create(endpointUrl)),
+            new ParameterizedTypeReference<GQLResponse<ReadLabeledMetricsData>>() {
+            }
+        );
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new RuntimeException("Response status != 200, actual: " + responseEntity.getStatusCode());
+        }
+
+        return Objects.requireNonNull(responseEntity.getBody()).getData().getReadLabeledMetricsValues();
+    }
 }
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java
index 9f719a1..97f8e27 100644
--- a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java
@@ -96,6 +96,27 @@ public class MetricsQuery extends AbstractQuery<MetricsQuery> {
         SERVICE_INSTANCE_RELATION_SERVER_CPM
     };
 
+    public static String METER_INSTANCE_CPU_PERCENTAGE = "meter_instance_cpu_percentage";
+    public static String METER_INSTANCE_JVM_MEMORY_BYTES_USED = "meter_instance_jvm_memory_bytes_used";
+    public static String METER_INSTANCE_TRACE_COUNT = "meter_instance_trace_count";
+    public static String METER_INSTANCE_METRICS_FIRST_AGGREGATION = "meter_instance_metrics_first_aggregation";
+    public static String METER_INSTANCE_PERSISTENCE_PREPARE_COUNT = "meter_instance_persistence_prepare_count";
+    public static String METER_INSTANCE_PERSISTENCE_EXECUTE_COUNT = "meter_instance_persistence_execute_count";
+
+    public static String[] ALL_SO11Y_LINER_METRICS = {
+        METER_INSTANCE_CPU_PERCENTAGE,
+        METER_INSTANCE_JVM_MEMORY_BYTES_USED,
+        METER_INSTANCE_TRACE_COUNT,
+        METER_INSTANCE_METRICS_FIRST_AGGREGATION,
+        METER_INSTANCE_PERSISTENCE_PREPARE_COUNT,
+        METER_INSTANCE_PERSISTENCE_EXECUTE_COUNT 
+    };
+
+    public static String METER_INSTANCE_PERSISTENCE_EXECUTE_PERCENTILE = "meter_instance_persistence_execute_percentile";
+
+    public static String[] ALL_SO11Y_LABELED_METRICS = {
+        METER_INSTANCE_PERSISTENCE_EXECUTE_PERCENTILE
+    };
     private String id;
     private String metricsName;
 
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadLabeledMetricsData.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadLabeledMetricsData.java
new file mode 100644
index 0000000..98f4665
--- /dev/null
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadLabeledMetricsData.java
@@ -0,0 +1,28 @@
+/*
+ * 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.e2e.metrics;
+
+import java.util.List;
+
+import lombok.Data;
+
+@Data
+public class ReadLabeledMetricsData {
+    private List<ReadMetrics> readLabeledMetricsValues;
+}
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetrics.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetrics.java
new file mode 100644
index 0000000..dd85079
--- /dev/null
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetrics.java
@@ -0,0 +1,27 @@
+/*
+ * 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.e2e.metrics;
+
+import lombok.Data;
+
+@Data
+public class ReadMetrics {
+    private String label;
+    private Metrics values;
+}
\ No newline at end of file
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetricsData.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetricsData.java
new file mode 100644
index 0000000..140db40
--- /dev/null
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetricsData.java
@@ -0,0 +1,26 @@
+/*
+ * 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.e2e.metrics;
+
+import lombok.Data;
+
+@Data
+public class ReadMetricsData {
+    private ReadMetrics readMetricsValues;
+}
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetricsQuery.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetricsQuery.java
new file mode 100644
index 0000000..f1b4077
--- /dev/null
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/ReadMetricsQuery.java
@@ -0,0 +1,43 @@
+/*
+ * 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.e2e.metrics;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.apache.skywalking.e2e.AbstractQuery;
+
+@Data
+@Accessors(fluent = true)
+@EqualsAndHashCode(callSuper = true)
+public class ReadMetricsQuery extends AbstractQuery<ReadMetricsQuery> {
+
+    public static String METER_INSTANCE_CPU_PERCENTAGE = "meter_instance_cpu_percentage";
+
+    public static String[] ALL_SO11Y_LINER_METRICS = {
+        METER_INSTANCE_CPU_PERCENTAGE
+    };
+
+    private String metricsName;
+
+    private String serviceName;
+
+    private String instanceName;
+
+}
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/service/ServicesMatcher.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/service/ServicesMatcher.java
index cde40d5..38cc9d9 100644
--- a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/service/ServicesMatcher.java
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/service/ServicesMatcher.java
@@ -21,11 +21,13 @@ package org.apache.skywalking.e2e.service;
 import java.util.LinkedList;
 import java.util.List;
 import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.fail;
 
 @Data
+@Slf4j
 public class ServicesMatcher {
     private List<ServiceMatcher> services;
 
@@ -34,6 +36,8 @@ public class ServicesMatcher {
     }
 
     public void verify(final List<Service> services) {
+        
+        LOGGER.info("services:{} matchers:{}", services, this.getServices());
         assertThat(services).hasSameSizeAs(this.getServices());
 
         for (int i = 0; i < getServices().size(); i++) {
diff --git a/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml b/test/e2e/e2e-data/src/main/resources/read-labeled-metrics.gql
similarity index 52%
copy from test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
copy to test/e2e/e2e-data/src/main/resources/read-labeled-metrics.gql
index b80079a..4bdc36f 100644
--- a/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
+++ b/test/e2e/e2e-data/src/main/resources/read-labeled-metrics.gql
@@ -13,33 +13,28 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-version: '2.1'
-
-services:
-  es:
-    image: elastic/elasticsearch:6.3.2
-    expose:
-      - 9200
-    networks:
-      - e2e
-    environment:
-      - discovery.type=single-node
-      - cluster.routing.allocation.disk.threshold_enabled=false
-    healthcheck:
-      test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/9200"]
-      interval: 5s
-      timeout: 60s
-      retries: 120
-
-  oap:
-    extends:
-      file: ../base-compose.yml
-      service: oap
-    environment:
-      SW_STORAGE: elasticsearch
-    depends_on:
-      es:
-        condition: service_healthy
-
-networks:
-  e2e:
+{
+  "query":"query queryData($condition: MetricsCondition!, $labels: [String!]!, $duration: Duration!) {\n  readLabeledMetricsValues: readLabeledMetricsValues(\n    condition: $condition,\n    labels: $labels,\n    duration: $duration) {\n    label\n    values {\n      values {value}\n    }\n  }}",
+  "variables":{
+    "duration":{
+      "start":"{start}",
+      "end":"{end}",
+      "step":"{step}"
+    },
+    "condition":{
+      "name":"{metricsName}",
+      "entity":{
+        "scope":"ServiceInstance",
+        "serviceName":"{serviceName}",
+        "serviceInstanceName":"{instanceName}",
+        "normal":true
+      }
+    },
+    "labels":[
+      "50",
+      "70",
+      "90",
+      "99"
+    ]
+  }
+}
\ No newline at end of file
diff --git a/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml b/test/e2e/e2e-data/src/main/resources/read-metrics.gql
similarity index 56%
copy from test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
copy to test/e2e/e2e-data/src/main/resources/read-metrics.gql
index b80079a..5889e80 100644
--- a/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
+++ b/test/e2e/e2e-data/src/main/resources/read-metrics.gql
@@ -13,33 +13,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-version: '2.1'
-
-services:
-  es:
-    image: elastic/elasticsearch:6.3.2
-    expose:
-      - 9200
-    networks:
-      - e2e
-    environment:
-      - discovery.type=single-node
-      - cluster.routing.allocation.disk.threshold_enabled=false
-    healthcheck:
-      test: ["CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/9200"]
-      interval: 5s
-      timeout: 60s
-      retries: 120
-
-  oap:
-    extends:
-      file: ../base-compose.yml
-      service: oap
-    environment:
-      SW_STORAGE: elasticsearch
-    depends_on:
-      es:
-        condition: service_healthy
-
-networks:
-  e2e:
+{
+   "query":"query queryData($condition: MetricsCondition!, $duration: Duration!) {\n  readMetricsValues: readMetricsValues(condition: $condition, duration: $duration) {\n    label\n    values {\n      values {value}\n    }\n  }}",
+   "variables":{
+      "duration":{
+         "start":"{start}",
+         "end":"{end}",
+         "step":"{step}"
+      },
+      "condition":{
+         "name":"{metricsName}",
+         "entity":{
+            "scope":"ServiceInstance",
+            "serviceName":"{serviceName}",
+            "serviceInstanceName":"{instanceName}",
+            "normal":true
+         }
+      }
+   }
+}
\ No newline at end of file
diff --git a/test/e2e/e2e-test/docker/simple/auth/docker-compose.yml b/test/e2e/e2e-test/docker/simple/auth/docker-compose.yml
index 444e982..c816f30 100644
--- a/test/e2e/e2e-test/docker/simple/auth/docker-compose.yml
+++ b/test/e2e/e2e-test/docker/simple/auth/docker-compose.yml
@@ -22,6 +22,8 @@ services:
       service: oap
     environment:
       SW_AUTHENTICATION: test-token
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
 
   ui:
     extends:
diff --git a/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml b/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
index 562ed61..9985b8a 100644
--- a/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
+++ b/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
@@ -17,6 +17,9 @@ version: '2.1'
 
 services:
   oap:
+    environment:
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
     extends:
       file: ../../base-compose.yml
       service: oap
diff --git a/test/e2e/e2e-test/docker/simple/ssl/docker-compose.yml b/test/e2e/e2e-test/docker/simple/ssl/docker-compose.yml
index 97bd397..ae608d1 100644
--- a/test/e2e/e2e-test/docker/simple/ssl/docker-compose.yml
+++ b/test/e2e/e2e-test/docker/simple/ssl/docker-compose.yml
@@ -27,6 +27,8 @@ services:
       SW_CORE_GRPC_SSL_KEY_PATH: /skywalking/certs/server-key.pem
       SW_CORE_GRPC_SSL_CERT_CHAIN_PATH: /skywalking/certs/server.crt
       SW_CORE_GRPC_SSL_TRUSTED_CA_PATH: /skywalking/certs/ca.crt
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
 
   ui:
     extends:
diff --git a/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml b/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
index b80079a..e937609 100644
--- a/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
+++ b/test/e2e/e2e-test/docker/storage/docker-compose.es6.yml
@@ -37,6 +37,8 @@ services:
       service: oap
     environment:
       SW_STORAGE: elasticsearch
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
     depends_on:
       es:
         condition: service_healthy
diff --git a/test/e2e/e2e-test/docker/storage/docker-compose.es7.yml b/test/e2e/e2e-test/docker/storage/docker-compose.es7.yml
index 858a528..a9c9744 100644
--- a/test/e2e/e2e-test/docker/storage/docker-compose.es7.yml
+++ b/test/e2e/e2e-test/docker/storage/docker-compose.es7.yml
@@ -37,6 +37,8 @@ services:
       service: oap-es7
     environment:
       SW_STORAGE: elasticsearch7
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
     depends_on:
       es:
         condition: service_healthy
diff --git a/test/e2e/e2e-test/docker/storage/docker-compose.influxdb.yml b/test/e2e/e2e-test/docker/storage/docker-compose.influxdb.yml
index 377ea79..184fa08 100644
--- a/test/e2e/e2e-test/docker/storage/docker-compose.influxdb.yml
+++ b/test/e2e/e2e-test/docker/storage/docker-compose.influxdb.yml
@@ -34,6 +34,8 @@ services:
       service: oap
     environment:
       SW_STORAGE: influxdb
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
     depends_on:
       influxdb:
         condition: service_healthy
diff --git a/test/e2e/e2e-test/docker/storage/docker-compose.mysql.yml b/test/e2e/e2e-test/docker/storage/docker-compose.mysql.yml
index 0491780..096d71b 100644
--- a/test/e2e/e2e-test/docker/storage/docker-compose.mysql.yml
+++ b/test/e2e/e2e-test/docker/storage/docker-compose.mysql.yml
@@ -38,6 +38,8 @@ services:
       service: oap
     environment:
       SW_STORAGE: mysql
+      SW_PROMETHEUS_FETCHER_ACTIVE: "true"
+      SW_TELEMETRY: prometheus
     depends_on:
       mysql:
         condition: service_healthy
diff --git a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java
index d124897..67af388 100644
--- a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java
+++ b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java
@@ -19,6 +19,8 @@
 package org.apache.skywalking.e2e.simple;
 
 import java.util.List;
+import java.util.stream.Collectors;
+
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.e2e.annotation.ContainerHostAndPort;
 import org.apache.skywalking.e2e.annotation.DockerCompose;
@@ -29,6 +31,8 @@ import org.apache.skywalking.e2e.metrics.AtLeastOneOfMetricsMatcher;
 import org.apache.skywalking.e2e.metrics.Metrics;
 import org.apache.skywalking.e2e.metrics.MetricsQuery;
 import org.apache.skywalking.e2e.metrics.MetricsValueMatcher;
+import org.apache.skywalking.e2e.metrics.ReadMetrics;
+import org.apache.skywalking.e2e.metrics.ReadMetricsQuery;
 import org.apache.skywalking.e2e.retryable.RetryableTest;
 import org.apache.skywalking.e2e.service.Service;
 import org.apache.skywalking.e2e.service.ServicesMatcher;
@@ -63,6 +67,8 @@ import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_INSTANC
 import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_METRICS;
 import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_RELATION_CLIENT_METRICS;
 import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_RELATION_SERVER_METRICS;
+import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LINER_METRICS;
+import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LABELED_METRICS;
 import static org.apache.skywalking.e2e.utils.Times.now;
 import static org.apache.skywalking.e2e.utils.Yamls.load;
 
@@ -126,11 +132,12 @@ public class SimpleE2E extends SkyWalkingTestAdapter {
     public void tearDown() {
         trafficController.stop();
     }
-
+     
     @RetryableTest
     void services() throws Exception {
-        final List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now()));
+        List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now()));
 
+        services = services.stream().filter(s -> !s.getLabel().equals("oap-server")).collect(Collectors.toList());
         LOGGER.info("services: {}", services);
 
         load("expected/simple/services.yml").as(ServicesMatcher.class).verify(services);
@@ -185,6 +192,58 @@ public class SimpleE2E extends SkyWalkingTestAdapter {
 
         verifyServiceInstanceRelationMetrics(topology.getCalls());
     }
+    
+    @RetryableTest
+    void so11y() throws Exception {
+        List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now()));
+
+        services = services.stream().filter(s -> s.getLabel().equals("oap-server")).collect(Collectors.toList());
+        LOGGER.info("services: {}", services);
+        load("expected/simple/so11y-services.yml").as(ServicesMatcher.class).verify(services);
+        for (final Service service : services) {
+            final Instances instances = graphql.instances(
+                new InstancesQuery().serviceId(service.getKey()).start(startTime).end(now())
+            );
+
+            LOGGER.info("instances: {}", instances);
+
+            load("expected/simple/so11y-instances.yml").as(InstancesMatcher.class).verify(instances);
+            for (Instance instance : instances.getInstances()) {
+                for (String metricsName : ALL_SO11Y_LINER_METRICS) {
+                    LOGGER.info("verifying service instance response time: {}", instance);
+                    final ReadMetrics instanceMetrics = graphql.readMetrics(
+                        new ReadMetricsQuery().stepByMinute().metricsName(metricsName)
+                            .serviceName(service.getLabel()).instanceName(instance.getLabel())
+                    );
+    
+                    LOGGER.info("{}: {}", metricsName, instanceMetrics);
+                    final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher();
+                    final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher();
+                    greaterThanZero.setValue("gt 0");
+                    instanceRespTimeMatcher.setValue(greaterThanZero);
+                    instanceRespTimeMatcher.verify(instanceMetrics.getValues());
+                }
+                for (String metricsName : ALL_SO11Y_LABELED_METRICS) {
+                    LOGGER.info("verifying service instance response time: {}", instance);
+                    final List<ReadMetrics> instanceMetrics = graphql.readLabeledMetrics(
+                        new ReadMetricsQuery().stepByMinute().metricsName(metricsName)
+                            .serviceName(service.getLabel()).instanceName(instance.getLabel())
+                    );
+    
+                    LOGGER.info("{}: {}", metricsName, instanceMetrics);
+                    Metrics allValues = new Metrics();
+                    for (ReadMetrics readMetrics : instanceMetrics) {
+                        allValues.getValues().addAll(readMetrics.getValues().getValues());
+                    }
+                    final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher();
+                    final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher();
+                    greaterThanZero.setValue("gt 0");
+                    instanceRespTimeMatcher.setValue(greaterThanZero);
+                    instanceRespTimeMatcher.verify(allValues);
+                }
+            }
+        }
+    }
 
     private Instances verifyServiceInstances(final Service service) throws Exception {
         final Instances instances = graphql.instances(
diff --git a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/storage/StorageE2E.java b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/storage/StorageE2E.java
index 082e5f9..d9da649 100644
--- a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/storage/StorageE2E.java
+++ b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/storage/StorageE2E.java
@@ -21,6 +21,8 @@ package org.apache.skywalking.e2e.storage;
 import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.e2e.UIConfigurationManagementClient;
 import org.apache.skywalking.e2e.annotation.ContainerHostAndPort;
@@ -38,6 +40,8 @@ import org.apache.skywalking.e2e.metrics.AtLeastOneOfMetricsMatcher;
 import org.apache.skywalking.e2e.metrics.Metrics;
 import org.apache.skywalking.e2e.metrics.MetricsQuery;
 import org.apache.skywalking.e2e.metrics.MetricsValueMatcher;
+import org.apache.skywalking.e2e.metrics.ReadMetrics;
+import org.apache.skywalking.e2e.metrics.ReadMetricsQuery;
 import org.apache.skywalking.e2e.retryable.RetryableTest;
 import org.apache.skywalking.e2e.service.Service;
 import org.apache.skywalking.e2e.service.ServicesMatcher;
@@ -73,6 +77,8 @@ import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_INSTANC
 import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_METRICS;
 import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_RELATION_CLIENT_METRICS;
 import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SERVICE_RELATION_SERVER_METRICS;
+import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LINER_METRICS;
+import static org.apache.skywalking.e2e.metrics.MetricsQuery.ALL_SO11Y_LABELED_METRICS;
 import static org.apache.skywalking.e2e.utils.Times.now;
 import static org.apache.skywalking.e2e.utils.Yamls.load;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -112,8 +118,9 @@ public class StorageE2E extends SkyWalkingTestAdapter {
 
     @RetryableTest
     void services() throws Exception {
-        final List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now()));
+        List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now()));
 
+        services = services.stream().filter(s -> !s.getLabel().equals("oap-server")).collect(Collectors.toList());
         LOGGER.info("services: {}", services);
 
         load("expected/storage/services.yml").as(ServicesMatcher.class).verify(services);
@@ -219,6 +226,58 @@ public class StorageE2E extends SkyWalkingTestAdapter {
         verifyTemplates("expected/storage/dashboardConfiguration-disable.yml");
     }
 
+    @RetryableTest
+    void so11y() throws Exception {
+        List<Service> services = graphql.services(new ServicesQuery().start(startTime).end(now()));
+
+        services = services.stream().filter(s -> s.getLabel().equals("oap-server")).collect(Collectors.toList());
+        LOGGER.info("services: {}", services);
+        load("expected/simple/so11y-services.yml").as(ServicesMatcher.class).verify(services);
+        for (final Service service : services) {
+            final Instances instances = graphql.instances(
+                new InstancesQuery().serviceId(service.getKey()).start(startTime).end(now())
+            );
+
+            LOGGER.info("instances: {}", instances);
+
+            load("expected/simple/so11y-instances.yml").as(InstancesMatcher.class).verify(instances);
+            for (Instance instance : instances.getInstances()) {
+                for (String metricsName : ALL_SO11Y_LINER_METRICS) {
+                    LOGGER.info("verifying service instance response time: {}", instance);
+                    final ReadMetrics instanceMetrics = graphql.readMetrics(
+                        new ReadMetricsQuery().stepByMinute().metricsName(metricsName)
+                            .serviceName(service.getLabel()).instanceName(instance.getLabel())
+                    );
+    
+                    LOGGER.info("{}: {}", metricsName, instanceMetrics);
+                    final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher();
+                    final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher();
+                    greaterThanZero.setValue("gt 0");
+                    instanceRespTimeMatcher.setValue(greaterThanZero);
+                    instanceRespTimeMatcher.verify(instanceMetrics.getValues());
+                }
+                for (String metricsName : ALL_SO11Y_LABELED_METRICS) {
+                    LOGGER.info("verifying service instance response time: {}", instance);
+                    final List<ReadMetrics> instanceMetrics = graphql.readLabeledMetrics(
+                        new ReadMetricsQuery().stepByMinute().metricsName(metricsName)
+                            .serviceName(service.getLabel()).instanceName(instance.getLabel())
+                    );
+    
+                    LOGGER.info("{}: {}", metricsName, instanceMetrics);
+                    Metrics allValues = new Metrics();
+                    for (ReadMetrics readMetrics : instanceMetrics) {
+                        allValues.getValues().addAll(readMetrics.getValues().getValues());
+                    }
+                    final AtLeastOneOfMetricsMatcher instanceRespTimeMatcher = new AtLeastOneOfMetricsMatcher();
+                    final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher();
+                    greaterThanZero.setValue("gt 0");
+                    instanceRespTimeMatcher.setValue(greaterThanZero);
+                    instanceRespTimeMatcher.verify(allValues);
+                }
+            }
+        }
+    }
+
     private Instances verifyServiceInstances(final Service service) throws Exception {
         final Instances instances = graphql.instances(
             new InstancesQuery().serviceId(service.getKey()).start(startTime).end(now())
diff --git a/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml b/test/e2e/e2e-test/src/test/resources/expected/simple/so11y-instances.yml
similarity index 66%
copy from test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
copy to test/e2e/e2e-test/src/test/resources/expected/simple/so11y-instances.yml
index 562ed61..7de572a 100644
--- a/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
+++ b/test/e2e/e2e-test/src/test/resources/expected/simple/so11y-instances.yml
@@ -13,29 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-version: '2.1'
-
-services:
-  oap:
-    extends:
-      file: ../../base-compose.yml
-      service: oap
-
-  ui:
-    extends:
-      file: ../../base-compose.yml
-      service: ui
-    depends_on:
-      oap:
-        condition: service_healthy
-
-  provider:
-    extends:
-      file: ../../base-compose.yml
-      service: provider
-    depends_on:
-      oap:
-        condition: service_healthy
-
-networks:
-  e2e:
+instances:
+  - key: not null
+    label: not null
diff --git a/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml b/test/e2e/e2e-test/src/test/resources/expected/simple/so11y-services.yml
similarity index 67%
copy from test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
copy to test/e2e/e2e-test/src/test/resources/expected/simple/so11y-services.yml
index 562ed61..c19deb2 100644
--- a/test/e2e/e2e-test/docker/simple/jdk/docker-compose.yml
+++ b/test/e2e/e2e-test/src/test/resources/expected/simple/so11y-services.yml
@@ -13,29 +13,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-version: '2.1'
-
 services:
-  oap:
-    extends:
-      file: ../../base-compose.yml
-      service: oap
-
-  ui:
-    extends:
-      file: ../../base-compose.yml
-      service: ui
-    depends_on:
-      oap:
-        condition: service_healthy
-
-  provider:
-    extends:
-      file: ../../base-compose.yml
-      service: provider
-    depends_on:
-      oap:
-        condition: service_healthy
-
-networks:
-  e2e:
+  - key: not null
+    label: "oap-server"