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 2022/01/06 07:11:27 UTC

[skywalking] branch master updated: Fix query sort metrics failure in H2 storage (#8393)

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 e97b2d2  Fix query sort metrics failure in H2 storage (#8393)
e97b2d2 is described below

commit e97b2d2165703c9d5bcdb0556134aa7cbd1382f5
Author: mrproliu <74...@qq.com>
AuthorDate: Thu Jan 6 15:11:05 2022 +0800

    Fix query sort metrics failure in H2 storage (#8393)
    
    * Fix sort metrics failured in H2 storage
    
    * Fix postgre DB
---
 CHANGES.md                                         |   1 +
 .../plugin/jdbc/h2/dao/H2AggregationQueryDAO.java  |   3 +-
 .../dao/PostgreSQLAggregationQueryDAO.java         |   2 +-
 .../postgresql/dao/PostgreSQLMetricsQueryDAO.java  |   2 +-
 test/e2e-v2/cases/storage/es/e2e.yaml              |  88 +----------------
 .../storage/expected/metrics-top-service-sla.yml   |  25 +++++
 test/e2e-v2/cases/storage/h2/e2e.yaml              |  88 +----------------
 test/e2e-v2/cases/storage/influxdb/e2e.yaml        |  88 +----------------
 test/e2e-v2/cases/storage/iotdb/e2e.yaml           |  88 +----------------
 test/e2e-v2/cases/storage/mysql/e2e.yaml           |  88 +----------------
 test/e2e-v2/cases/storage/opensearch/e2e.yaml      |  88 +----------------
 test/e2e-v2/cases/storage/postgres/e2e.yaml        |  88 +----------------
 test/e2e-v2/cases/storage/storage-cases.yaml       | 104 +++++++++++++++++++++
 test/e2e-v2/cases/storage/tidb/e2e.yaml            |  88 +----------------
 14 files changed, 149 insertions(+), 692 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 78dd266..0aa1be8 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -23,6 +23,7 @@ Release Notes.
 * Upgrade H2 version to 2.0.202 to fix CVE-2021-23463.
 * Extend column name override mechanism working for `ValueColumnMetadata`.
 * Introduce new concept `Layer` and removed `NodeType`. More details refer to [v9-version-upgrade](https://skywalking.apache.org/docs/main/latest/en/faq/v9-version-upgrade/).
+* Fix query sort metrics failure in H2 Storage.
 
 #### UI
 
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AggregationQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AggregationQueryDAO.java
index 97fddf5..897c66c 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AggregationQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2AggregationQueryDAO.java
@@ -61,8 +61,7 @@ public class H2AggregationQueryDAO implements IAggregationQueryDAO {
             });
         }
         sql.append(" group by ").append(Metrics.ENTITY_ID);
-        sql.append(")  as T order by ")
-           .append(valueColumnName)
+        sql.append(")  as T order by result")
            .append(metrics.getOrder().equals(Order.ASC) ? " asc" : " desc")
            .append(" limit ")
            .append(metrics.getTopN());
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLAggregationQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLAggregationQueryDAO.java
index a29ba34..6ad6eb3 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLAggregationQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLAggregationQueryDAO.java
@@ -33,7 +33,7 @@ public class PostgreSQLAggregationQueryDAO extends H2AggregationQueryDAO {
         StringBuilder sql = new StringBuilder();
         sql.append("select * from (select avg(")
                 .append(valueColumnName)
-                .append(") as value,")
+                .append(") as result,")
                 .append(Metrics.ENTITY_ID)
                 .append(" from ")
                 .append(metricsName)
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLMetricsQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLMetricsQueryDAO.java
index 8c7a4d9..3606da6 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLMetricsQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/postgresql/dao/PostgreSQLMetricsQueryDAO.java
@@ -31,6 +31,6 @@ public class PostgreSQLMetricsQueryDAO extends H2MetricsQueryDAO {
     @Override
     protected StringBuilder buildMetricsValueSql(String op, String valueColumnName, String conditionName) {
         return new StringBuilder(
-                "select " + Metrics.ENTITY_ID + " id, " + op + "(" + valueColumnName + ") as value from " + conditionName + " where ");
+                "select " + Metrics.ENTITY_ID + " id, " + op + "(" + valueColumnName + ") as result from " + conditionName + " where ");
     }
 }
diff --git a/test/e2e-v2/cases/storage/es/e2e.yaml b/test/e2e-v2/cases/storage/es/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/es/e2e.yaml
+++ b/test/e2e-v2/cases/storage/es/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/expected/metrics-top-service-sla.yml b/test/e2e-v2/cases/storage/expected/metrics-top-service-sla.yml
new file mode 100644
index 0000000..462af34
--- /dev/null
+++ b/test/e2e-v2/cases/storage/expected/metrics-top-service-sla.yml
@@ -0,0 +1,25 @@
+# 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.
+
+{{- contains . }}
+- name: e2e-service-provider
+  id: ""
+  value: '{{- gt .value "0" }}'
+  refid: ~
+- name: e2e-service-consumer
+  id: ""
+  value: '{{- gt .value "0" }}'
+  refid: ~
+{{- end }}
diff --git a/test/e2e-v2/cases/storage/h2/e2e.yaml b/test/e2e-v2/cases/storage/h2/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/h2/e2e.yaml
+++ b/test/e2e-v2/cases/storage/h2/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/influxdb/e2e.yaml b/test/e2e-v2/cases/storage/influxdb/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/influxdb/e2e.yaml
+++ b/test/e2e-v2/cases/storage/influxdb/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/iotdb/e2e.yaml b/test/e2e-v2/cases/storage/iotdb/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/iotdb/e2e.yaml
+++ b/test/e2e-v2/cases/storage/iotdb/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/mysql/e2e.yaml b/test/e2e-v2/cases/storage/mysql/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/mysql/e2e.yaml
+++ b/test/e2e-v2/cases/storage/mysql/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/opensearch/e2e.yaml b/test/e2e-v2/cases/storage/opensearch/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/opensearch/e2e.yaml
+++ b/test/e2e-v2/cases/storage/opensearch/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/postgres/e2e.yaml b/test/e2e-v2/cases/storage/postgres/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/postgres/e2e.yaml
+++ b/test/e2e-v2/cases/storage/postgres/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/storage-cases.yaml b/test/e2e-v2/cases/storage/storage-cases.yaml
new file mode 100644
index 0000000..83bafdd
--- /dev/null
+++ b/test/e2e-v2/cases/storage/storage-cases.yaml
@@ -0,0 +1,104 @@
+# 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.
+
+cases:
+  # service list
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
+    expected: expected/service.yml
+  # service metrics
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics top --name service_sla 5
+    expected: expected/metrics-top-service-sla.yml
+  # service endpoint
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
+    expected: expected/service-endpoint.yml
+  # service endpoint metrics
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  #  dependency service
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
+    expected: expected/dependency-services.yml
+  # service instance list
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
+    expected: expected/service-instance.yml
+  # service instance jvm metrics
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+
+  # trace segment list
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
+    expected: expected/traces-list.yml
+  # native tracing: trace detail
+  - query: |
+      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
+        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
+          | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
+      )
+    expected: expected/trace-info-detail.yml
+
+  # native event: event list
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
+    expected: expected/event-list.yml
+
+  # native profile: create task
+  - query: |
+      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
+        profile create --service-name=e2e-service-provider \
+          --endpoint-name=POST:/info \
+          --start-time=$((($(date +%s)+5)*1000)) \
+          --duration=1 --min-duration-threshold=0 \
+          --dump-period=10 --max-sampling-count=9
+    expected: expected/profile-create.yml
+  # native profile: sleep to wait agent notices and query profile list
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
+    expected: expected/profile-list.yml
+
+  # native profile: sleep to wait segment report and query profiled segment list
+  - query: |
+      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
+        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
+      )
+    expected: expected/profile-segment-list.yml
+
+  # native profile: query profiled segment
+  - query: |
+      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
+        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
+          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
+        ) | yq e '.[0].segmentid' - \
+      )
+    expected: expected/profile-segment-detail.yml
+
+  # native profile: query profiled segment analyze
+  - query: |
+      segmentid=$( \
+        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
+          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
+        ) | yq e '.[0].segmentid' - \
+      );
+      start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
+      end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
+      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
+    expected: expected/profile-segment-analyze.yml
+
+  - query: |
+      curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
+      sleep 5;
+      swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
+        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
+          | yq e '.traces[0].traceids[0]' - \
+      )
+    expected: expected/trace-users-detail.yml
diff --git a/test/e2e-v2/cases/storage/tidb/e2e.yaml b/test/e2e-v2/cases/storage/tidb/e2e.yaml
index 73f746c..7255ea3 100644
--- a/test/e2e-v2/cases/storage/tidb/e2e.yaml
+++ b/test/e2e-v2/cases/storage/tidb/e2e.yaml
@@ -41,89 +41,5 @@ verify:
     # the interval between two retries, in millisecond.
     interval: 10s
   cases:
-    # service list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
-      expected: ../expected/service.yml
-    # service metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name service_sla --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    # service endpoint
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql endpoint list --keyword=info --service-name=e2e-service-provider
-      expected: ../expected/service-endpoint.yml
-    # service endpoint metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name endpoint_cpm --endpoint-name=POST:/info --service-name=e2e-service-provider |yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-    #  dependency service
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql dependency service --service-name="e2e-service-provider"
-      expected: ../expected/dependency-services.yml
-    # service instance list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance list --service-name=e2e-service-provider
-      expected: ../expected/service-instance.yml
-    # service instance jvm metrics
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name instance_jvm_thread_live_count --instance-name=provider1 --service-name=e2e-service-provider | yq e 'to_entries' -
-      expected: ../expected/metrics-has-value.yml
-
-    # trace segment list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls
-      expected: ../expected/traces-list.yml
-    # native tracing: trace detail
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls \
-            | yq e '.traces | select(.[].endpointnames[0]=="POST:/info") | .[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-info-detail.yml
-
-    # native event: event list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql event list
-      expected: ../expected/event-list.yml
-
-    # native profile: create task
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql \
-          profile create --service-name=e2e-service-provider \
-            --endpoint-name=POST:/info \
-            --start-time=$((($(date +%s)+5)*1000)) \
-            --duration=1 --min-duration-threshold=0 \
-            --dump-period=10 --max-sampling-count=9
-      expected: ../expected/profile-create.yml
-    # native profile: sleep to wait agent notices and query profile list
-    - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list -service-name=e2e-service-provider --endpoint-name=POST:/info
-      expected: ../expected/profile-list.yml
-
-    # native profile: sleep to wait segment report and query profiled segment list
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-        )
-      expected: ../expected/profile-segment-list.yml
-
-    # native profile: query profiled segment
-    - query: |
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        )
-      expected: ../expected/profile-segment-detail.yml
-
-    # native profile: query profiled segment analyze
-    - query: |
-        segmentid=$( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile segment-list --task-id=$( \
-            swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile list --service-name=e2e-service-provider --endpoint-name=POST:/info | yq e '.[0].id' - \
-          ) | yq e '.[0].segmentid' - \
-        );
-        start=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].starttime' -);
-        end=$(swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-segment --segment-id=$segmentid|yq e '.spans.[0].endtime' -);
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql profile profiled-analyze --segment-id=$segmentid --time-ranges=$(echo $start"-"$end)
-      expected: ../expected/profile-segment-analyze.yml
-
-    - query: |
-        curl -s -XPOST http://${provider_host}:${provider_9090}/users -d '{"id":"123","name":"SinglesBar"}' -H "Content-Type: application/json" > /dev/null;
-        sleep 5;
-        swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace $( \
-          swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql trace ls --order startTime --service-name "e2e-service-provider" --endpoint-name "POST:/users" \
-            | yq e '.traces[0].traceids[0]' - \
-        )
-      expected: ../expected/trace-users-detail.yml
+    - includes:
+      - ../storage-cases.yaml
\ No newline at end of file