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 2026/04/14 00:35:47 UTC

(skywalking-banyandb) branch e2e/add-no-duplicates-verification created (now 9c27cdac0)

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

wusheng pushed a change to branch e2e/add-no-duplicates-verification
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git


      at 9c27cdac0 feat(e2e): add noDuplicates verification to detect duplicate query results (#12253)

This branch includes the following new commits:

     new 9c27cdac0 feat(e2e): add noDuplicates verification to detect duplicate query results (#12253)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(skywalking-banyandb) 01/01: feat(e2e): add noDuplicates verification to detect duplicate query results (#12253)

Posted by wu...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch e2e/add-no-duplicates-verification
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git

commit 9c27cdac01b11d4f6ea911eebc77a4b77617b1da
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Tue Apr 14 08:35:27 2026 +0800

    feat(e2e): add noDuplicates verification to detect duplicate query results (#12253)
    
    Add `| noDuplicates` pipe function to all entity-level `contains` blocks
    in e2e expected YAML files, leveraging the new infra-e2e feature from
    apache/skywalking-infra-e2e#145. This ensures e2e tests will catch
    duplicate data in query results (services, instances, endpoints, traces,
    spans, dependencies, events, metrics, etc.), preventing regressions like
    the one reported in apache/skywalking#12219.
    
    Also bumps SW_INFRA_E2E_COMMIT, SW_OAP_COMMIT, and the GitHub Actions
    infra-e2e action to their latest versions.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <no...@anthropic.com>
---
 .github/workflows/e2e.yml                                             | 2 +-
 CHANGES.md                                                            | 1 +
 test/e2e-v2/cases/event/expected/events.yml                           | 2 +-
 test/e2e-v2/cases/lifecycle/expected/dependency-endpoint.yml          | 4 ++--
 test/e2e-v2/cases/lifecycle/expected/dependency-instance.yml          | 4 ++--
 test/e2e-v2/cases/lifecycle/expected/dependency-services.yml          | 4 ++--
 test/e2e-v2/cases/lifecycle/expected/trace-detail.yml                 | 2 +-
 test/e2e-v2/cases/lifecycle/expected/traces-list.yml                  | 2 +-
 test/e2e-v2/cases/log/expected/logs.yml                               | 2 +-
 test/e2e-v2/cases/log/expected/metrics-has-value.yml                  | 2 +-
 test/e2e-v2/cases/log/expected/service-endpoint.yml                   | 2 +-
 test/e2e-v2/cases/log/expected/service-instance.yml                   | 2 +-
 test/e2e-v2/cases/log/expected/service.yml                            | 2 +-
 test/e2e-v2/cases/profiling/trace/expected/profile-list-finished.yml  | 4 ++--
 test/e2e-v2/cases/profiling/trace/expected/profile-list-notified.yml  | 4 ++--
 .../e2e-v2/cases/profiling/trace/expected/profile-segment-analyze.yml | 4 ++--
 test/e2e-v2/cases/profiling/trace/expected/profile-segment-list.yml   | 4 ++--
 test/e2e-v2/cases/profiling/trace/expected/service-endpoint.yml       | 2 +-
 test/e2e-v2/cases/profiling/trace/expected/service-instance.yml       | 2 +-
 test/e2e-v2/cases/profiling/trace/expected/service.yml                | 2 +-
 test/e2e-v2/cases/profiling/trace/expected/traces-v2-list.yml         | 4 ++--
 test/e2e-v2/cases/rover/process/istio/banyandb/expected/process.yml   | 2 +-
 .../cases/rover/process/istio/banyandb/expected/service-instance.yml  | 2 +-
 test/e2e-v2/cases/rover/process/istio/banyandb/expected/service.yml   | 2 +-
 test/e2e-v2/cases/storage/expected/dependency-endpoint-consumer.yml   | 4 ++--
 test/e2e-v2/cases/storage/expected/dependency-endpoint-provider.yml   | 4 ++--
 test/e2e-v2/cases/storage/expected/dependency-instance.yml            | 4 ++--
 test/e2e-v2/cases/storage/expected/dependency-services-consumer.yml   | 4 ++--
 test/e2e-v2/cases/storage/expected/dependency-services-provider.yml   | 4 ++--
 test/e2e-v2/cases/storage/expected/event-list.yml                     | 2 +-
 test/e2e-v2/cases/storage/expected/layer.yml                          | 2 +-
 test/e2e-v2/cases/storage/expected/metrics-has-value-percentile.yml   | 2 +-
 test/e2e-v2/cases/storage/expected/metrics-has-value.yml              | 2 +-
 test/e2e-v2/cases/storage/expected/metrics-top-endpoint.yml           | 2 +-
 test/e2e-v2/cases/storage/expected/metrics-top-service.yml            | 2 +-
 test/e2e-v2/cases/storage/expected/service-endpoint-consumer.yml      | 2 +-
 test/e2e-v2/cases/storage/expected/service-endpoint-provider.yml      | 2 +-
 test/e2e-v2/cases/storage/expected/service-instance-consumer.yml      | 2 +-
 test/e2e-v2/cases/storage/expected/service-instance-provider.yml      | 2 +-
 test/e2e-v2/cases/storage/expected/service.yml                        | 2 +-
 test/e2e-v2/cases/storage/expected/traces-v2-list.yml                 | 4 ++--
 test/e2e-v2/cases/zipkin/expected/traces.yml                          | 4 ++--
 test/e2e-v2/script/env                                                | 4 ++--
 test/e2e-v2/script/prepare/setup-e2e-shell/install-e2e.sh             | 2 +-
 44 files changed, 60 insertions(+), 59 deletions(-)

diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 1ae3f940e..81ba74f61 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -111,7 +111,7 @@ jobs:
         run: |
           bash test/e2e-v2/cases/lifecycle/data-generator/gen.sh
       - name: ${{ matrix.test.name }}
-        uses: apache/skywalking-infra-e2e@e26033e1faaf865899c486ffe17dabdf17b90aae
+        uses: apache/skywalking-infra-e2e@ef073adb8b9e148e4eaf3f905fa4e238ee5cc7d6
         with:
           e2e-file: $GITHUB_WORKSPACE/${{ matrix.test.config }}
       - name: Fix directory permissions
diff --git a/CHANGES.md b/CHANGES.md
index be447f6eb..6c404a496 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -10,6 +10,7 @@ Release Notes.
 - Collect BanyanDB data on e2e test failure for CI debugging.
 - Add log query e2e test.
 - Sync lifecycle e2e test from SkyWalking stages test.
+- Add `noDuplicates` verification to all e2e expected files to detect duplicate data in query results.
 - Add periodic health check for property schema connection.
 - Persist segment end time in per-segment metadata so boundaries don't shift across restarts or config changes.
 - [Breaking Change] Remove etcd components. The property-based schema registry is now the only supported mode. 
diff --git a/test/e2e-v2/cases/event/expected/events.yml b/test/e2e-v2/cases/event/expected/events.yml
index 1a585a186..38d11ab1d 100644
--- a/test/e2e-v2/cases/event/expected/events.yml
+++ b/test/e2e-v2/cases/event/expected/events.yml
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 events:
-  {{- contains .events }}
+  {{- contains (.events | noDuplicates) }}
   - uuid: abcde
     source:
       service: e2e-service
diff --git a/test/e2e-v2/cases/lifecycle/expected/dependency-endpoint.yml b/test/e2e-v2/cases/lifecycle/expected/dependency-endpoint.yml
index d381b0733..0d946d7fb 100644
--- a/test/e2e-v2/cases/lifecycle/expected/dependency-endpoint.yml
+++ b/test/e2e-v2/cases/lifecycle/expected/dependency-endpoint.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "mock_a_service" }}.1_{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}
   name: /dubbox-case/case/dubbox-rest/404-test
   serviceid: {{ b64enc "mock_a_service" }}.1
@@ -36,7 +36,7 @@ nodes:
   isreal: false
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "mock_a_service" }}.1_{{ b64enc "/dubbox-case/case/dubbox-rest/404-test" }}
   sourcecomponents: []
   target: {{ b64enc "mock_b_service" }}.1_{{ b64enc "org.skywaking.apm.testcase.dubbo.services.GreetServiceImpl.doBusiness()" }}
diff --git a/test/e2e-v2/cases/lifecycle/expected/dependency-instance.yml b/test/e2e-v2/cases/lifecycle/expected/dependency-instance.yml
index 7792498d7..5e7b847f2 100644
--- a/test/e2e-v2/cases/lifecycle/expected/dependency-instance.yml
+++ b/test/e2e-v2/cases/lifecycle/expected/dependency-instance.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "mock_a_service" }}.1_{{ b64enc "mock_a_service_instance" }}
   name: mock_a_service_instance
   serviceid: {{ b64enc "mock_a_service" }}.1
@@ -30,7 +30,7 @@ nodes:
   isreal: true
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "mock_a_service" }}.1_{{ b64enc "mock_a_service_instance" }}
   sourcecomponents: []
   target: {{ b64enc "mock_b_service" }}.1_{{ b64enc "mock_b_service_instance" }}
diff --git a/test/e2e-v2/cases/lifecycle/expected/dependency-services.yml b/test/e2e-v2/cases/lifecycle/expected/dependency-services.yml
index d2d62e177..ebc9b150b 100644
--- a/test/e2e-v2/cases/lifecycle/expected/dependency-services.yml
+++ b/test/e2e-v2/cases/lifecycle/expected/dependency-services.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "User"}}.0
   name: User
   type: USER
@@ -36,7 +36,7 @@ nodes:
     - GENERAL
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "mock_a_service"}}.1
   sourcecomponents:
     - Dubbo
diff --git a/test/e2e-v2/cases/lifecycle/expected/trace-detail.yml b/test/e2e-v2/cases/lifecycle/expected/trace-detail.yml
index 2b8d68377..af0afbde0 100644
--- a/test/e2e-v2/cases/lifecycle/expected/trace-detail.yml
+++ b/test/e2e-v2/cases/lifecycle/expected/trace-detail.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 spans:
-  {{- contains .spans }}
+  {{- contains (.spans | noDuplicates) }}
   - traceid: {{ .traceid }}
     segmentid: {{ .segmentid }}
     spanid: {{ .spanid }}
diff --git a/test/e2e-v2/cases/lifecycle/expected/traces-list.yml b/test/e2e-v2/cases/lifecycle/expected/traces-list.yml
index 9c5e4f15f..e2f0a6243 100644
--- a/test/e2e-v2/cases/lifecycle/expected/traces-list.yml
+++ b/test/e2e-v2/cases/lifecycle/expected/traces-list.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 traces:
-{{- contains .traces }}
+{{- contains (.traces | noDuplicates) }}
 - segmentid: {{ notEmpty .segmentid }}
   endpointnames:
     - /dubbox-case/case/dubbox-rest/404-test
diff --git a/test/e2e-v2/cases/log/expected/logs.yml b/test/e2e-v2/cases/log/expected/logs.yml
index 8cb1e6569..28083a78b 100644
--- a/test/e2e-v2/cases/log/expected/logs.yml
+++ b/test/e2e-v2/cases/log/expected/logs.yml
@@ -16,7 +16,7 @@
 debuggingtrace: null
 errorreason: null
 logs:
-{{- contains .logs }}
+{{- contains (.logs | noDuplicates) }}
 - servicename: e2e-service-provider
   serviceid: {{ b64enc "e2e-service-provider" }}.1
   serviceinstancename: provider1
diff --git a/test/e2e-v2/cases/log/expected/metrics-has-value.yml b/test/e2e-v2/cases/log/expected/metrics-has-value.yml
index cae6688ae..3db0fd292 100644
--- a/test/e2e-v2/cases/log/expected/metrics-has-value.yml
+++ b/test/e2e-v2/cases/log/expected/metrics-has-value.yml
@@ -16,7 +16,7 @@
 debuggingtrace: null
 type: TIME_SERIES_VALUES
 results:
-  {{- contains .results }}
+  {{- contains (.results | noDuplicates) }}
   - metric:
       labels: []
     values:
diff --git a/test/e2e-v2/cases/log/expected/service-endpoint.yml b/test/e2e-v2/cases/log/expected/service-endpoint.yml
index 4efc7bb8a..79ae5615a 100644
--- a/test/e2e-v2/cases/log/expected/service-endpoint.yml
+++ b/test/e2e-v2/cases/log/expected/service-endpoint.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains .}}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "GET:/logs/trigger" }}
   name: GET:/logs/trigger
 {{- end}}
diff --git a/test/e2e-v2/cases/log/expected/service-instance.yml b/test/e2e-v2/cases/log/expected/service-instance.yml
index 5f03bc18e..cace0e3aa 100644
--- a/test/e2e-v2/cases/log/expected/service-instance.yml
+++ b/test/e2e-v2/cases/log/expected/service-instance.yml
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-{{- contains .}}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "provider1" }}
   name: {{ notEmpty .name }}
   attributes:
diff --git a/test/e2e-v2/cases/log/expected/service.yml b/test/e2e-v2/cases/log/expected/service.yml
index 75d0916f0..f92d14826 100644
--- a/test/e2e-v2/cases/log/expected/service.yml
+++ b/test/e2e-v2/cases/log/expected/service.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1
   name: e2e-service-provider
   group: ""
diff --git a/test/e2e-v2/cases/profiling/trace/expected/profile-list-finished.yml b/test/e2e-v2/cases/profiling/trace/expected/profile-list-finished.yml
index 25e7f8731..97ebf5dad 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/profile-list-finished.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/profile-list-finished.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ notEmpty .id }}
   serviceid: {{ b64enc "e2e-service-provider" }}.1
   servicename: ""
@@ -24,7 +24,7 @@
   dumpperiod: 500
   maxsamplingcount: 5
   logs:
-    {{- contains .logs }}
+    {{- contains (.logs | noDuplicates) }}
     - id: {{ notEmpty .id }}
       instanceid: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "provider1" }}
       operationtype: EXECUTION_FINISHED
diff --git a/test/e2e-v2/cases/profiling/trace/expected/profile-list-notified.yml b/test/e2e-v2/cases/profiling/trace/expected/profile-list-notified.yml
index faaaa0f03..bf5512980 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/profile-list-notified.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/profile-list-notified.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ notEmpty .id }}
   serviceid: {{ b64enc "e2e-service-provider" }}.1
   servicename: ""
@@ -24,7 +24,7 @@
   dumpperiod: 500
   maxsamplingcount: 5
   logs:
-    {{- contains .logs }}
+    {{- contains (.logs | noDuplicates) }}
     - id: {{ notEmpty .id }}
       instanceid: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "provider1" }}
       operationtype: NOTIFIED
diff --git a/test/e2e-v2/cases/profiling/trace/expected/profile-segment-analyze.yml b/test/e2e-v2/cases/profiling/trace/expected/profile-segment-analyze.yml
index 683e53961..8d08129ce 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/profile-segment-analyze.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/profile-segment-analyze.yml
@@ -15,9 +15,9 @@
 
 tip: null
 trees:
-  {{- contains .trees }}
+  {{- contains (.trees | noDuplicates) }}
   - elements:
-    {{- contains .elements }}
+    {{- contains (.elements | noDuplicates) }}
     - id: "{{ notEmpty .id }}"
       parentid: "{{ notEmpty .parentid }}"
       codesignature: "test.apache.skywalking.e2e.profile.ProfileController.createAuthor:-1"
diff --git a/test/e2e-v2/cases/profiling/trace/expected/profile-segment-list.yml b/test/e2e-v2/cases/profiling/trace/expected/profile-segment-list.yml
index 5c45b8e70..b514d4f67 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/profile-segment-list.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/profile-segment-list.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - traceid: {{ notEmpty .traceid }}
   instanceid: {{ notEmpty .instanceid }}
   instancename: provider1
@@ -22,7 +22,7 @@
   duration: {{ gt .duration 0 }}
   start: "{{ notEmpty .start }}"
   spans:
-  {{- contains .spans}}
+  {{- contains (.spans | noDuplicates) }}
   - spanid: {{ ge .spanid 0 }}
     parentspanid: {{ .parentspanid }}
     segmentid: {{ notEmpty .segmentid }}
diff --git a/test/e2e-v2/cases/profiling/trace/expected/service-endpoint.yml b/test/e2e-v2/cases/profiling/trace/expected/service-endpoint.yml
index eb6c74302..85d5ccaed 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/service-endpoint.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/service-endpoint.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "POST:/profile/{name}" }}
   name: POST:/profile/{name}
 {{- end}}
diff --git a/test/e2e-v2/cases/profiling/trace/expected/service-instance.yml b/test/e2e-v2/cases/profiling/trace/expected/service-instance.yml
index f32cc2b0f..257391609 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/service-instance.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/service-instance.yml
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "provider1" }}
   name: provider1
   attributes:
diff --git a/test/e2e-v2/cases/profiling/trace/expected/service.yml b/test/e2e-v2/cases/profiling/trace/expected/service.yml
index 75d0916f0..f92d14826 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/service.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/service.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1
   name: e2e-service-provider
   group: ""
diff --git a/test/e2e-v2/cases/profiling/trace/expected/traces-v2-list.yml b/test/e2e-v2/cases/profiling/trace/expected/traces-v2-list.yml
index f576ee635..ea58e727a 100644
--- a/test/e2e-v2/cases/profiling/trace/expected/traces-v2-list.yml
+++ b/test/e2e-v2/cases/profiling/trace/expected/traces-v2-list.yml
@@ -20,9 +20,9 @@ retrievedtimerange:
   endtime: {{ gt .endtime 0 }}
   {{- end }}
 traces:
-  {{- contains .traces }}
+  {{- contains (.traces | noDuplicates) }}
   - spans:
-    {{- contains .spans }}
+    {{- contains (.spans | noDuplicates) }}
     - traceid: {{ .traceid }}
       segmentid: {{ .segmentid }}
       spanid: {{ .spanid }}
diff --git a/test/e2e-v2/cases/rover/process/istio/banyandb/expected/process.yml b/test/e2e-v2/cases/rover/process/istio/banyandb/expected/process.yml
index 40481e0a6..3d64cac58 100644
--- a/test/e2e-v2/cases/rover/process/istio/banyandb/expected/process.yml
+++ b/test/e2e-v2/cases/rover/process/istio/banyandb/expected/process.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ notEmpty .id }}
   name: gunicorn
   serviceid: {{ b64enc "productpage.default" }}.1
diff --git a/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service-instance.yml b/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service-instance.yml
index 18d1d2c6e..318dbc3ea 100644
--- a/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service-instance.yml
+++ b/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service-instance.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ notEmpty .id }}
   name: {{ notEmpty .name }}
   attributes: []
diff --git a/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service.yml b/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service.yml
index 4eb9a19d6..5de38d7d8 100644
--- a/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service.yml
+++ b/test/e2e-v2/cases/rover/process/istio/banyandb/expected/service.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "details.default" }}.1
   name: details.default
   group: ""
diff --git a/test/e2e-v2/cases/storage/expected/dependency-endpoint-consumer.yml b/test/e2e-v2/cases/storage/expected/dependency-endpoint-consumer.yml
index f9d09d4c7..c7f6eecaa 100644
--- a/test/e2e-v2/cases/storage/expected/dependency-endpoint-consumer.yml
+++ b/test/e2e-v2/cases/storage/expected/dependency-endpoint-consumer.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "User" }}.0_{{ b64enc "User" }}
   name: User
   serviceid: {{ b64enc "User" }}.0
@@ -36,7 +36,7 @@ nodes:
   isreal: true
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "User" }}.0_{{ b64enc "User" }}
   sourcecomponents: []
   target: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "POST:/users" }}
diff --git a/test/e2e-v2/cases/storage/expected/dependency-endpoint-provider.yml b/test/e2e-v2/cases/storage/expected/dependency-endpoint-provider.yml
index 4454aaee7..c1e745751 100644
--- a/test/e2e-v2/cases/storage/expected/dependency-endpoint-provider.yml
+++ b/test/e2e-v2/cases/storage/expected/dependency-endpoint-provider.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "POST:/users" }}
   name: POST:/users
   serviceid: {{ b64enc "e2e-service-consumer" }}.1
@@ -30,7 +30,7 @@ nodes:
   isreal: true
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "POST:/users" }}
   sourcecomponents: []
   target: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "POST:/users" }}
diff --git a/test/e2e-v2/cases/storage/expected/dependency-instance.yml b/test/e2e-v2/cases/storage/expected/dependency-instance.yml
index cc0dc034c..091c40283 100644
--- a/test/e2e-v2/cases/storage/expected/dependency-instance.yml
+++ b/test/e2e-v2/cases/storage/expected/dependency-instance.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "consumer1" }}
   name: consumer1
   serviceid: {{ b64enc "e2e-service-consumer" }}.1
@@ -30,7 +30,7 @@ nodes:
   isreal: true
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "consumer1" }}
   sourcecomponents: []
   target: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "provider1" }}
diff --git a/test/e2e-v2/cases/storage/expected/dependency-services-consumer.yml b/test/e2e-v2/cases/storage/expected/dependency-services-consumer.yml
index dd34c4214..96e40e218 100644
--- a/test/e2e-v2/cases/storage/expected/dependency-services-consumer.yml
+++ b/test/e2e-v2/cases/storage/expected/dependency-services-consumer.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "User"}}.0
   name: User
   type: USER
@@ -36,7 +36,7 @@ nodes:
     - GENERAL
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "e2e-service-consumer"}}.1
   sourcecomponents:
     - SpringRestTemplate
diff --git a/test/e2e-v2/cases/storage/expected/dependency-services-provider.yml b/test/e2e-v2/cases/storage/expected/dependency-services-provider.yml
index cea9b393c..ca292cf30 100644
--- a/test/e2e-v2/cases/storage/expected/dependency-services-provider.yml
+++ b/test/e2e-v2/cases/storage/expected/dependency-services-provider.yml
@@ -15,7 +15,7 @@
 
 debuggingtrace: null
 nodes:
-{{- contains .nodes }}
+{{- contains (.nodes | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider"}}.1
   name: e2e-service-provider
   type: Tomcat
@@ -36,7 +36,7 @@ nodes:
     - VIRTUAL_DATABASE
 {{- end }}
 calls:
-{{- contains .calls }}
+{{- contains (.calls | noDuplicates) }}
 - source: {{ b64enc "e2e-service-consumer"}}.1
   sourcecomponents:
     - SpringRestTemplate
diff --git a/test/e2e-v2/cases/storage/expected/event-list.yml b/test/e2e-v2/cases/storage/expected/event-list.yml
index 931d86c56..73f80deb6 100644
--- a/test/e2e-v2/cases/storage/expected/event-list.yml
+++ b/test/e2e-v2/cases/storage/expected/event-list.yml
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 events:
-{{- contains .events }}
+{{- contains (.events | noDuplicates) }}
 - uuid: {{ notEmpty .uuid }}
   source:
     service: e2e-service-provider
diff --git a/test/e2e-v2/cases/storage/expected/layer.yml b/test/e2e-v2/cases/storage/expected/layer.yml
index fc77de897..d806bb8f4 100644
--- a/test/e2e-v2/cases/storage/expected/layer.yml
+++ b/test/e2e-v2/cases/storage/expected/layer.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - GENERAL
 - VIRTUAL_DATABASE
 {{- end }}
diff --git a/test/e2e-v2/cases/storage/expected/metrics-has-value-percentile.yml b/test/e2e-v2/cases/storage/expected/metrics-has-value-percentile.yml
index 2ca902c8b..59dc6d496 100644
--- a/test/e2e-v2/cases/storage/expected/metrics-has-value-percentile.yml
+++ b/test/e2e-v2/cases/storage/expected/metrics-has-value-percentile.yml
@@ -16,7 +16,7 @@
 debuggingtrace: null
 type: TIME_SERIES_VALUES
 results:
-  {{- contains .results }}
+  {{- contains (.results | noDuplicates) }}
   - metric:
       labels:
         {{- contains .metric.labels }}
diff --git a/test/e2e-v2/cases/storage/expected/metrics-has-value.yml b/test/e2e-v2/cases/storage/expected/metrics-has-value.yml
index cae6688ae..3db0fd292 100644
--- a/test/e2e-v2/cases/storage/expected/metrics-has-value.yml
+++ b/test/e2e-v2/cases/storage/expected/metrics-has-value.yml
@@ -16,7 +16,7 @@
 debuggingtrace: null
 type: TIME_SERIES_VALUES
 results:
-  {{- contains .results }}
+  {{- contains (.results | noDuplicates) }}
   - metric:
       labels: []
     values:
diff --git a/test/e2e-v2/cases/storage/expected/metrics-top-endpoint.yml b/test/e2e-v2/cases/storage/expected/metrics-top-endpoint.yml
index a89a98d72..11eeb9d66 100644
--- a/test/e2e-v2/cases/storage/expected/metrics-top-endpoint.yml
+++ b/test/e2e-v2/cases/storage/expected/metrics-top-endpoint.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - name: {{ notEmpty .name }}
   id: ""
   value: '{{- gt .value "0" }}'
diff --git a/test/e2e-v2/cases/storage/expected/metrics-top-service.yml b/test/e2e-v2/cases/storage/expected/metrics-top-service.yml
index 462af3495..f7a2373eb 100644
--- a/test/e2e-v2/cases/storage/expected/metrics-top-service.yml
+++ b/test/e2e-v2/cases/storage/expected/metrics-top-service.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - name: e2e-service-provider
   id: ""
   value: '{{- gt .value "0" }}'
diff --git a/test/e2e-v2/cases/storage/expected/service-endpoint-consumer.yml b/test/e2e-v2/cases/storage/expected/service-endpoint-consumer.yml
index cedf79a14..371e2c141 100644
--- a/test/e2e-v2/cases/storage/expected/service-endpoint-consumer.yml
+++ b/test/e2e-v2/cases/storage/expected/service-endpoint-consumer.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "POST:/users" }}
   name: POST:/users
 {{- end}}
diff --git a/test/e2e-v2/cases/storage/expected/service-endpoint-provider.yml b/test/e2e-v2/cases/storage/expected/service-endpoint-provider.yml
index 0303f5179..3edce1f0b 100644
--- a/test/e2e-v2/cases/storage/expected/service-endpoint-provider.yml
+++ b/test/e2e-v2/cases/storage/expected/service-endpoint-provider.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "POST:/users" }}
   name: POST:/users
 {{- end}}
\ No newline at end of file
diff --git a/test/e2e-v2/cases/storage/expected/service-instance-consumer.yml b/test/e2e-v2/cases/storage/expected/service-instance-consumer.yml
index dc2ac11db..f5108594a 100644
--- a/test/e2e-v2/cases/storage/expected/service-instance-consumer.yml
+++ b/test/e2e-v2/cases/storage/expected/service-instance-consumer.yml
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-consumer" }}.1_{{ b64enc "consumer1" }}
   name: consumer1
   attributes:
diff --git a/test/e2e-v2/cases/storage/expected/service-instance-provider.yml b/test/e2e-v2/cases/storage/expected/service-instance-provider.yml
index f32cc2b0f..257391609 100644
--- a/test/e2e-v2/cases/storage/expected/service-instance-provider.yml
+++ b/test/e2e-v2/cases/storage/expected/service-instance-provider.yml
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1_{{ b64enc "provider1" }}
   name: provider1
   attributes:
diff --git a/test/e2e-v2/cases/storage/expected/service.yml b/test/e2e-v2/cases/storage/expected/service.yml
index 8b2684e07..bbbacc75a 100644
--- a/test/e2e-v2/cases/storage/expected/service.yml
+++ b/test/e2e-v2/cases/storage/expected/service.yml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-{{- contains . }}
+{{- contains (. | noDuplicates) }}
 - id: {{ b64enc "e2e-service-provider" }}.1
   name: e2e-service-provider
   group: ""
diff --git a/test/e2e-v2/cases/storage/expected/traces-v2-list.yml b/test/e2e-v2/cases/storage/expected/traces-v2-list.yml
index 4e4e2ed60..c97502d23 100644
--- a/test/e2e-v2/cases/storage/expected/traces-v2-list.yml
+++ b/test/e2e-v2/cases/storage/expected/traces-v2-list.yml
@@ -20,9 +20,9 @@ retrievedtimerange:
   endtime: {{ gt .endtime 0 }}
   {{- end }}
 traces:
-  {{- contains .traces }}
+  {{- contains (.traces | noDuplicates) }}
 - spans:
-  {{- contains .spans }}
+  {{- contains (.spans | noDuplicates) }}
   - traceid: {{ .traceid }}
     segmentid: {{ .segmentid }}
     spanid: 0
diff --git a/test/e2e-v2/cases/zipkin/expected/traces.yml b/test/e2e-v2/cases/zipkin/expected/traces.yml
index bf05cea32..3e0636a76 100644
--- a/test/e2e-v2/cases/zipkin/expected/traces.yml
+++ b/test/e2e-v2/cases/zipkin/expected/traces.yml
@@ -13,9 +13,9 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-  {{- contains . }}
+  {{- contains (. | noDuplicates) }}
 -
-  {{- contains . }}
+  {{- contains (. | noDuplicates) }}
   - traceId: {{ notEmpty .traceId }}
     id: {{ notEmpty .id }}
     kind: SERVER
diff --git a/test/e2e-v2/script/env b/test/e2e-v2/script/env
index 33b27fad2..d8a14042f 100644
--- a/test/e2e-v2/script/env
+++ b/test/e2e-v2/script/env
@@ -26,8 +26,8 @@ SW_ROVER_COMMIT=4c0cb8429a96f190ea30eac1807008d523c749c3
 SW_AGENT_PHP_COMMIT=3192c553002707d344bd6774cfab5bc61f67a1d3
 SW_PREDICTOR_COMMIT=54a0197654a3781a6f73ce35146c712af297c994
 
-SW_OAP_COMMIT=6248d1b7259dd24cc8218a8513d14cf018c519f0
+SW_OAP_COMMIT=42c613bea94999a6cc8e805ed4c8c7659f3a735c
 SW_AGENT_E2E_SERVICE_PROVIDER_COMMIT=a2a67ca63084cddf82303155c185e3c24cf07eef
 SW_CTL_COMMIT=3b675df73824bbb80e6aabf6a95d110feb37b6b1
 SW_TRACE_MOCKER_COMMIT=a2a67ca63084cddf82303155c185e3c24cf07eef
-SW_INFRA_E2E_COMMIT=8c21e43e241a32a54bdf8eeceb9099eb27e5e9b4
+SW_INFRA_E2E_COMMIT=ef073adb8b9e148e4eaf3f905fa4e238ee5cc7d6
diff --git a/test/e2e-v2/script/prepare/setup-e2e-shell/install-e2e.sh b/test/e2e-v2/script/prepare/setup-e2e-shell/install-e2e.sh
index e0cd5a4fb..ea868a4ea 100644
--- a/test/e2e-v2/script/prepare/setup-e2e-shell/install-e2e.sh
+++ b/test/e2e-v2/script/prepare/setup-e2e-shell/install-e2e.sh
@@ -33,7 +33,7 @@ install_e2e() {
     exit 1
   fi
 
-  E2E_REVISION=${SW_INFRA_E2E_COMMIT:-8c21e43e241a32a54bdf8eeceb9099eb27e5e9b4}
+  E2E_REVISION=${SW_INFRA_E2E_COMMIT:-ef073adb8b9e148e4eaf3f905fa4e238ee5cc7d6}
 
   GO111MODULE=on go install "github.com/apache/skywalking-infra-e2e/cmd/e2e@${E2E_REVISION}"