You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by lu...@apache.org on 2022/04/30 09:03:34 UTC

[skywalking] 15/24: support metadata-v2

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

lujiajing pushed a commit to branch banyandb-integration-stream
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit fa24b07b79e5c64db282891a7b613fcfd9a2880b
Author: Megrez Lu <lu...@gmail.com>
AuthorDate: Wed Jan 19 23:06:51 2022 +0800

    support metadata-v2
---
 ...aller.java => BanyanDBAggregationQueryDAO.java} |  29 ++--
 .../plugin/banyandb/BanyanDBIndexInstaller.java    |   3 +
 .../plugin/banyandb/BanyanDBMetricsQueryDAO.java   |  51 +++++++
 .../banyandb/BanyanDBStorageBuilderFactory.java    |  26 +++-
 .../plugin/banyandb/BanyanDBStorageClient.java     |   8 +-
 .../plugin/banyandb/BanyanDBStorageProvider.java   |  18 ++-
 ...aller.java => BanyanDBTopNRecordsQueryDAO.java} |  29 ++--
 .../storage/plugin/banyandb/StreamMetaInfo.java    | 103 +++-----------
 .../plugin/banyandb/schema/AlarmRecordBuilder.java |  10 +-
 .../schema/BanyanDBStorageDataBuilder.java         |  14 +-
 .../schema/BrowserErrorLogRecordBuilder.java       |   8 +-
 ... EndpointRelationServerSideMetricsBuilder.java} |  22 +--
 .../plugin/banyandb/schema/EventBuilder.java       |   8 +-
 .../plugin/banyandb/schema/LogRecordBuilder.java   |   8 +-
 .../storage/plugin/banyandb/schema/Metadata.java   |  52 +++++--
 .../schema/NetworkAddressAliasBuilder.java         |   8 +-
 .../schema/ProfileTaskLogRecordBuilder.java        |   8 +-
 .../banyandb/schema/ProfileTaskRecordBuilder.java  |   6 +-
 .../schema/ProfileThreadSnapshotRecordBuilder.java |   8 +-
 .../banyandb/schema/SegmentRecordBuilder.java      |   8 +-
 ...eInstanceRelationClientSideMetricsBuilder.java} |  24 ++--
 ...eInstanceRelationServerSideMetricsBuilder.java} |  24 ++--
 ...> ServiceRelationClientSideMetricsBuilder.java} |  22 +--
 ...> ServiceRelationServerSideMetricsBuilder.java} |  22 +--
 .../plugin/banyandb/schema/UITemplateBuilder.java  |   8 +-
 .../BanyanDBHistoryDeleteDAO.java}                 |  25 +---
 .../banyandb/stream/BanyanDBManagementDAO.java     |  10 +-
 .../banyandb/stream/BanyanDBMetadataQueryDAO.java  | 103 +++++---------
 .../plugin/banyandb/stream/BanyanDBStorageDAO.java |  57 ++++++++
 .../banyandb/stream/BanyanDBTopologyQueryDAO.java  | 155 +++++++++++++++++++++
 .../stream/BanyanDBUITemplateManagementDAO.java    |   3 +-
 .../metadata/index_rules/segment/db.instance.json  |   5 +-
 .../segment/{db.instance.json => db.type.json}     |   7 +-
 .../segment/{db.instance.json => duration.json}    |   9 +-
 .../segment/{db.instance.json => endpoint_id.json} |   7 +-
 .../segment/{db.instance.json => http.method.json} |   7 +-
 .../segment/{db.instance.json => mq.broker.json}   |   7 +-
 .../segment/{db.instance.json => mq.queue.json}    |   7 +-
 .../segment/{db.instance.json => mq.topic.json}    |   7 +-
 .../segment/{db.instance.json => status_code.json} |   7 +-
 .../metadata/index_rules/segment/trace_id.json     |  12 ++
 .../db.instance.json => ui_template/disabled.json} |   7 +-
 .../db.instance.json => ui_template/name.json}     |   7 +-
 .../src/main/resources/metadata/ui_template.json   |  50 +++++++
 44 files changed, 640 insertions(+), 379 deletions(-)

diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBAggregationQueryDAO.java
similarity index 50%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBAggregationQueryDAO.java
index ffc5aaf586..771ec36bb4 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBAggregationQueryDAO.java
@@ -18,27 +18,18 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 
-import org.apache.skywalking.oap.server.core.storage.StorageException;
-import org.apache.skywalking.oap.server.core.storage.model.Model;
-import org.apache.skywalking.oap.server.core.storage.model.ModelInstaller;
-import org.apache.skywalking.oap.server.library.client.Client;
-import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.apache.skywalking.oap.server.core.query.input.Duration;
+import org.apache.skywalking.oap.server.core.query.input.TopNCondition;
+import org.apache.skywalking.oap.server.core.query.type.KeyValue;
+import org.apache.skywalking.oap.server.core.query.type.SelectedRecord;
+import org.apache.skywalking.oap.server.core.storage.query.IAggregationQueryDAO;
 
-public class BanyanDBIndexInstaller extends ModelInstaller {
-    public BanyanDBIndexInstaller(Client client, ModuleManager moduleManager) {
-        super(client, moduleManager);
-    }
-
-    @Override
-    protected boolean isExists(Model model) throws StorageException {
-        return false;
-    }
+import java.io.IOException;
+import java.util.List;
 
+public class BanyanDBAggregationQueryDAO implements IAggregationQueryDAO {
     @Override
-    protected void createTable(Model model) throws StorageException {
-        StreamMetaInfo metaInfo = StreamMetaInfo.addModel(model);
-        if (metaInfo != null) {
-            ((BanyanDBStorageClient) client).createStream(metaInfo);
-        }
+    public List<SelectedRecord> sortMetrics(TopNCondition condition, String valueColumnName, Duration duration, List<KeyValue> additionalConditions) throws IOException {
+        return null;
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
index ffc5aaf586..c9566b1549 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
@@ -18,12 +18,14 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.model.Model;
 import org.apache.skywalking.oap.server.core.storage.model.ModelInstaller;
 import org.apache.skywalking.oap.server.library.client.Client;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+@Slf4j
 public class BanyanDBIndexInstaller extends ModelInstaller {
     public BanyanDBIndexInstaller(Client client, ModuleManager moduleManager) {
         super(client, moduleManager);
@@ -38,6 +40,7 @@ public class BanyanDBIndexInstaller extends ModelInstaller {
     protected void createTable(Model model) throws StorageException {
         StreamMetaInfo metaInfo = StreamMetaInfo.addModel(model);
         if (metaInfo != null) {
+            log.info("install index {}", model.getName());
             ((BanyanDBStorageClient) client).createStream(metaInfo);
         }
     }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBMetricsQueryDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBMetricsQueryDAO.java
new file mode 100644
index 0000000000..96a12760f9
--- /dev/null
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBMetricsQueryDAO.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.storage.plugin.banyandb;
+
+import org.apache.skywalking.oap.server.core.query.input.Duration;
+import org.apache.skywalking.oap.server.core.query.input.MetricsCondition;
+import org.apache.skywalking.oap.server.core.query.type.HeatMap;
+import org.apache.skywalking.oap.server.core.query.type.MetricsValues;
+import org.apache.skywalking.oap.server.core.storage.query.IMetricsQueryDAO;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+public class BanyanDBMetricsQueryDAO implements IMetricsQueryDAO {
+    @Override
+    public long readMetricsValue(MetricsCondition condition, String valueColumnName, Duration duration) throws IOException {
+        return 0;
+    }
+
+    @Override
+    public MetricsValues readMetricsValues(MetricsCondition condition, String valueColumnName, Duration duration) throws IOException {
+        return null;
+    }
+
+    @Override
+    public List<MetricsValues> readLabeledMetricsValues(MetricsCondition condition, String valueColumnName, List<String> labels, Duration duration) throws IOException {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public HeatMap readHeatMap(MetricsCondition condition, String valueColumnName, Duration duration) throws IOException {
+        return null;
+    }
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageBuilderFactory.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageBuilderFactory.java
index b87d3d1dc5..0cb10763eb 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageBuilderFactory.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageBuilderFactory.java
@@ -18,11 +18,17 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.alarm.AlarmRecord;
 import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic;
 import org.apache.skywalking.oap.server.core.analysis.manual.log.LogRecord;
 import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint.EndpointRelationServerSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.instance.ServiceInstanceRelationClientSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.instance.ServiceInstanceRelationServerSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.service.ServiceRelationClientSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.service.ServiceRelationServerSideMetrics;
 import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord;
 import org.apache.skywalking.oap.server.core.analysis.manual.service.ServiceTraffic;
 import org.apache.skywalking.oap.server.core.browser.manual.errorlog.BrowserErrorLogRecord;
@@ -37,6 +43,7 @@ import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder;
 import org.apache.skywalking.oap.server.core.storage.type.StorageBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.AlarmRecordBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.BrowserErrorLogRecordBuilder;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.EndpointRelationServerSideMetricsBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.EventBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.LogRecordBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.Metadata;
@@ -45,9 +52,16 @@ import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ProfileTa
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ProfileTaskRecordBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ProfileThreadSnapshotRecordBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.SegmentRecordBuilder;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ServiceInstanceRelationClientSideMetricsBuilder;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ServiceInstanceRelationServerSideMetricsBuilder;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ServiceRelationClientSideMetricsBuilder;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.ServiceRelationServerSideMetricsBuilder;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.UITemplateBuilder;
 
+@Slf4j
 public class BanyanDBStorageBuilderFactory implements StorageBuilderFactory {
+    private static final StorageBuilderFactory FALLBACK = new StorageBuilderFactory.Default();
+
     @Override
     public BuilderTemplateDefinition builderTemplate() {
         return new BuilderTemplateDefinition(StorageHashMapBuilder.class.getName(), "metrics-builder");
@@ -81,8 +95,18 @@ public class BanyanDBStorageBuilderFactory implements StorageBuilderFactory {
             return Metadata.EndpointTrafficBuilder.class;
         } else if (NetworkAddressAlias.class.equals(dataType)) {
             return NetworkAddressAliasBuilder.class;
+        } else if (EndpointRelationServerSideMetrics.class.equals(dataType)) {
+            return EndpointRelationServerSideMetricsBuilder.class;
+        } else if (ServiceRelationServerSideMetrics.class.equals(dataType)) {
+            return ServiceRelationServerSideMetricsBuilder.class;
+        } else if (ServiceRelationClientSideMetrics.class.equals(dataType)) {
+            return ServiceRelationClientSideMetricsBuilder.class;
+        } else if (ServiceInstanceRelationServerSideMetrics.class.equals(dataType)) {
+            return ServiceInstanceRelationServerSideMetricsBuilder.class;
+        } else if (ServiceInstanceRelationClientSideMetrics.class.equals(dataType)) {
+            return ServiceInstanceRelationClientSideMetricsBuilder.class;
         }
 
-        throw new UnsupportedOperationException("unsupported storage type");
+        return FALLBACK.builderOf(dataType, defaultBuilder);
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
index 2ee45b12f0..7d61e4e085 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageClient.java
@@ -31,9 +31,6 @@ import org.apache.skywalking.oap.server.library.client.healthcheck.HealthCheckab
 import org.apache.skywalking.oap.server.library.util.HealthChecker;
 
 import java.io.IOException;
-import java.time.Instant;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
 
 /**
  * BanyanDBStorageClient is a simple wrapper for the underlying {@link BanyanDBClient},
@@ -71,10 +68,7 @@ public class BanyanDBStorageClient implements Client, HealthCheckable {
     public void createStream(StreamMetaInfo streamMetaInfo) {
         Stream stm = this.client.define(streamMetaInfo.getStream());
         if (stm != null) {
-            // TODO: should be fixed in SDK
-            this.client.defineIndexRules(stm, ZonedDateTime.from(Instant.now()),
-                    ZonedDateTime.of(2099, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC),
-                    streamMetaInfo.getIndexRules().toArray(new IndexRule[]{}));
+            this.client.defineIndexRules(stm, streamMetaInfo.getIndexRules().toArray(new IndexRule[]{}));
         }
     }
 
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
index 64f8e96cbf..6d4340e48d 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBStorageProvider.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.config.ConfigService;
 import org.apache.skywalking.oap.server.core.storage.IBatchDAO;
+import org.apache.skywalking.oap.server.core.storage.IHistoryDeleteDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilderFactory;
 import org.apache.skywalking.oap.server.core.storage.StorageDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageModule;
@@ -30,11 +31,15 @@ import org.apache.skywalking.oap.server.core.storage.model.ModelCreator;
 import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskLogQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.profile.IProfileTaskQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.profile.IProfileThreadSnapshotQueryDAO;
+import org.apache.skywalking.oap.server.core.storage.query.IAggregationQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.IAlarmQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.IBrowserLogQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.IEventQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.ILogQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO;
+import org.apache.skywalking.oap.server.core.storage.query.IMetricsQueryDAO;
+import org.apache.skywalking.oap.server.core.storage.query.ITopNRecordsQueryDAO;
+import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO;
 import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO;
 import org.apache.skywalking.oap.server.library.module.ModuleConfig;
 import org.apache.skywalking.oap.server.library.module.ModuleDefine;
@@ -45,6 +50,7 @@ import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBA
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBBatchDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBBrowserLogQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBEventQueryDAO;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBHistoryDeleteDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBLogQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBMetadataQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBNetworkAddressAliasDAO;
@@ -52,6 +58,7 @@ import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBP
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBProfileTaskQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBProfileThreadSnapshotQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBStorageDAO;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBTopologyQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBTraceQueryDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.BanyanDBUITemplateManagementDAO;
 import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
@@ -88,25 +95,28 @@ public class BanyanDBStorageProvider extends ModuleProvider {
 
         this.client = new BanyanDBStorageClient(config.getHost(), config.getPort(), config.getGroup());
 
+        // Stream
         this.registerServiceImplementation(IBatchDAO.class, new BanyanDBBatchDAO(client, config.getMaxBulkSize(), config.getFlushInterval(), config.getConcurrentWriteThreads()));
         this.registerServiceImplementation(StorageDAO.class, new BanyanDBStorageDAO(client));
-
         this.registerServiceImplementation(INetworkAddressAliasDAO.class, new BanyanDBNetworkAddressAliasDAO(client));
-
         this.registerServiceImplementation(ITraceQueryDAO.class, new BanyanDBTraceQueryDAO(client));
         this.registerServiceImplementation(IBrowserLogQueryDAO.class, new BanyanDBBrowserLogQueryDAO(client));
         this.registerServiceImplementation(IMetadataQueryDAO.class, new BanyanDBMetadataQueryDAO(client));
         this.registerServiceImplementation(IAlarmQueryDAO.class, new BanyanDBAlarmQueryDAO(client));
         this.registerServiceImplementation(ILogQueryDAO.class, new BanyanDBLogQueryDAO(client));
-
         this.registerServiceImplementation(IProfileTaskQueryDAO.class, new BanyanDBProfileTaskQueryDAO(client));
         this.registerServiceImplementation(IProfileTaskLogQueryDAO.class, new BanyanDBProfileTaskLogQueryDAO(client, this.config.getFetchTaskLogMaxSize()));
         this.registerServiceImplementation(
                 IProfileThreadSnapshotQueryDAO.class, new BanyanDBProfileThreadSnapshotQueryDAO(client));
         this.registerServiceImplementation(UITemplateManagementDAO.class, new BanyanDBUITemplateManagementDAO(client));
-
         this.registerServiceImplementation(IEventQueryDAO.class, new BanyanDBEventQueryDAO(client));
+        this.registerServiceImplementation(ITopologyQueryDAO.class, new BanyanDBTopologyQueryDAO(client));
 
+        // TODO: metrics
+        this.registerServiceImplementation(IHistoryDeleteDAO.class, new BanyanDBHistoryDeleteDAO());
+        this.registerServiceImplementation(IMetricsQueryDAO.class, new BanyanDBMetricsQueryDAO());
+        this.registerServiceImplementation(IAggregationQueryDAO.class, new BanyanDBAggregationQueryDAO());
+        this.registerServiceImplementation(ITopNRecordsQueryDAO.class, new BanyanDBTopNRecordsQueryDAO());
     }
 
     @Override
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBTopNRecordsQueryDAO.java
similarity index 50%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBTopNRecordsQueryDAO.java
index ffc5aaf586..97f549ddfb 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBTopNRecordsQueryDAO.java
@@ -18,27 +18,18 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 
-import org.apache.skywalking.oap.server.core.storage.StorageException;
-import org.apache.skywalking.oap.server.core.storage.model.Model;
-import org.apache.skywalking.oap.server.core.storage.model.ModelInstaller;
-import org.apache.skywalking.oap.server.library.client.Client;
-import org.apache.skywalking.oap.server.library.module.ModuleManager;
+import org.apache.skywalking.oap.server.core.query.input.Duration;
+import org.apache.skywalking.oap.server.core.query.input.TopNCondition;
+import org.apache.skywalking.oap.server.core.query.type.SelectedRecord;
+import org.apache.skywalking.oap.server.core.storage.query.ITopNRecordsQueryDAO;
 
-public class BanyanDBIndexInstaller extends ModelInstaller {
-    public BanyanDBIndexInstaller(Client client, ModuleManager moduleManager) {
-        super(client, moduleManager);
-    }
-
-    @Override
-    protected boolean isExists(Model model) throws StorageException {
-        return false;
-    }
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 
+public class BanyanDBTopNRecordsQueryDAO implements ITopNRecordsQueryDAO {
     @Override
-    protected void createTable(Model model) throws StorageException {
-        StreamMetaInfo metaInfo = StreamMetaInfo.addModel(model);
-        if (metaInfo != null) {
-            ((BanyanDBStorageClient) client).createStream(metaInfo);
-        }
+    public List<SelectedRecord> readSampledRecords(TopNCondition condition, String valueColumnName, Duration duration) throws IOException {
+        return Collections.emptyList();
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/StreamMetaInfo.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/StreamMetaInfo.java
index 1fbf2eb636..9dda0ead72 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/StreamMetaInfo.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/StreamMetaInfo.java
@@ -24,7 +24,7 @@ import com.google.protobuf.util.JsonFormat;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.skywalking.banyandb.database.v1.metadata.BanyandbMetadata;
+import org.apache.skywalking.banyandb.database.v1.BanyandbDatabase;
 import org.apache.skywalking.banyandb.v1.client.metadata.Duration;
 import org.apache.skywalking.banyandb.v1.client.metadata.IndexRule;
 import org.apache.skywalking.banyandb.v1.client.metadata.Stream;
@@ -46,6 +46,8 @@ public class StreamMetaInfo {
     public static final String TAG_FAMILY_SEARCHABLE = "searchable";
     public static final String TAG_FAMILY_DATA = "data";
 
+    public static final String ID = "id";
+
     private static final Map<String, StreamMetaInfo> STREAMS = new HashMap<>();
 
     private final Model model;
@@ -62,35 +64,33 @@ public class StreamMetaInfo {
     private final List<IndexRule> indexRules;
 
     public static StreamMetaInfo addModel(Model model) {
-        BanyandbMetadata.Stream pbStream = parseStreamFromJSON(model.getName());
+        BanyandbDatabase.Stream pbStream = parseStreamFromJSON(model.getName());
         if (pbStream == null) {
-            log.warn("fail to find the stream schema {}", model.getName());
+            log.warn("fail to find stream schema {}", model.getName());
             return null;
         }
-        BanyandbMetadata.Duration duration = pbStream.getOpts().getTtl();
-        Duration ttl = fromProtobuf(duration);
+        BanyandbDatabase.Duration duration = pbStream.getOpts().getTtl();
+        Duration ttl = Duration.fromProtobuf(duration);
         final Stream stream = new Stream(pbStream.getMetadata().getName(), pbStream.getOpts().getShardNum(), ttl);
 
         List<IndexRule> indexRules = new ArrayList<>();
 
         stream.setEntityTagNames(pbStream.getEntity().getTagNamesList());
-        for (BanyandbMetadata.TagFamilySpec pbTagFamilySpec : pbStream.getTagFamiliesList()) {
-            final TagFamilySpec tagFamilySpec = new TagFamilySpec(pbTagFamilySpec.getName());
-            final boolean needIndexParse = pbTagFamilySpec.getName().equals(TAG_FAMILY_SEARCHABLE);
-            for (final BanyandbMetadata.TagSpec pbTagSpec : pbTagFamilySpec.getTagsList()) {
-                tagFamilySpec.addTagSpec(parseTagSpec(pbTagSpec));
-
-                // if the tag family equals to "searchable", build index rules
-                if (needIndexParse) {
-                    BanyandbMetadata.IndexRule pbIndexRule = parseIndexRulesFromJSON(model.getName(), pbTagSpec.getName());
+
+
+        for (BanyandbDatabase.TagFamilySpec pbTagFamilySpec : pbStream.getTagFamiliesList()) {
+            final TagFamilySpec tagFamilySpec = TagFamilySpec.fromProtobuf(pbTagFamilySpec);
+            stream.addTagFamilySpec(tagFamilySpec);
+
+            // if the tag family equals to "searchable", build index rules
+            if (tagFamilySpec.getTagFamilyName().equals(TAG_FAMILY_SEARCHABLE)) {
+                for (final TagFamilySpec.TagSpec tagSpec : tagFamilySpec.getTagSpecs()) {
+                    BanyandbDatabase.IndexRule pbIndexRule = parseIndexRulesFromJSON(model.getName(), tagSpec.getTagName());
                     if (pbIndexRule == null) {
-                        log.warn("fail to find the index rule for {}", pbTagSpec.getName());
+                        log.warn("fail to find the index rule for {}", tagSpec.getTagName());
                         continue;
                     }
-                    IndexRule.IndexType indexType = fromProtobuf(pbIndexRule.getType());
-                    IndexRule.IndexLocation indexLocation = fromProtobuf(pbIndexRule.getLocation());
-                    IndexRule indexRule = new IndexRule(pbIndexRule.getMetadata().getName(), indexType, indexLocation);
-                    indexRule.setTags(new ArrayList<>(pbIndexRule.getTagsList()));
+                    IndexRule indexRule = IndexRule.fromProtobuf(pbIndexRule);
                     indexRules.add(indexRule);
                 }
             }
@@ -99,31 +99,14 @@ public class StreamMetaInfo {
         return StreamMetaInfo.builder().model(model).stream(stream).indexRules(indexRules).build();
     }
 
-    private static TagFamilySpec.TagSpec parseTagSpec(BanyandbMetadata.TagSpec pbTagSpec) {
-        switch (pbTagSpec.getType()) {
-            case TAG_TYPE_INT:
-                return TagFamilySpec.TagSpec.newIntTag(pbTagSpec.getName());
-            case TAG_TYPE_INT_ARRAY:
-                return TagFamilySpec.TagSpec.newIntArrayTag(pbTagSpec.getName());
-            case TAG_TYPE_STRING:
-                return TagFamilySpec.TagSpec.newStringTag(pbTagSpec.getName());
-            case TAG_TYPE_STRING_ARRAY:
-                return TagFamilySpec.TagSpec.newStringArrayTag(pbTagSpec.getName());
-            case TAG_TYPE_DATA_BINARY:
-                return TagFamilySpec.TagSpec.newBinaryTag(pbTagSpec.getName());
-            default:
-                throw new IllegalArgumentException("unrecognized tag type");
-        }
-    }
-
-    private static BanyandbMetadata.Stream parseStreamFromJSON(String name) {
+    private static BanyandbDatabase.Stream parseStreamFromJSON(String name) {
         try {
             InputStream is = StreamMetaInfo.class.getClassLoader().getResourceAsStream("metadata/" + name + ".json");
             if (is == null) {
                 return null;
             }
             String result = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
-            BanyandbMetadata.Stream.Builder b = BanyandbMetadata.Stream.newBuilder();
+            BanyandbDatabase.Stream.Builder b = BanyandbDatabase.Stream.newBuilder();
             JsonFormat.parser().merge(result, b);
             return b.build();
         } catch (IOException ioEx) {
@@ -132,7 +115,7 @@ public class StreamMetaInfo {
         }
     }
 
-    private static BanyandbMetadata.IndexRule parseIndexRulesFromJSON(String streamName, String name) {
+    private static BanyandbDatabase.IndexRule parseIndexRulesFromJSON(String streamName, String name) {
         try {
             InputStream is = StreamMetaInfo.class.getClassLoader().getResourceAsStream(String.join("/",
                     new String[]{"metadata", "index_rules", streamName, name + ".json"}));
@@ -140,7 +123,7 @@ public class StreamMetaInfo {
                 return null;
             }
             String result = CharStreams.toString(new InputStreamReader(is, Charsets.UTF_8));
-            BanyandbMetadata.IndexRule.Builder b = BanyandbMetadata.IndexRule.newBuilder();
+            BanyandbDatabase.IndexRule.Builder b = BanyandbDatabase.IndexRule.newBuilder();
             JsonFormat.parser().merge(result, b);
             return b.build();
         } catch (IOException ioEx) {
@@ -148,44 +131,4 @@ public class StreamMetaInfo {
             return null;
         }
     }
-
-    // TODO: change modifier to public in SDK
-    static Duration fromProtobuf(BanyandbMetadata.Duration duration) {
-        switch (duration.getUnit()) {
-            case DURATION_UNIT_DAY:
-                return Duration.ofDays(duration.getVal());
-            case DURATION_UNIT_HOUR:
-                return Duration.ofHours(duration.getVal());
-            case DURATION_UNIT_MONTH:
-                return Duration.ofMonths(duration.getVal());
-            case DURATION_UNIT_WEEK:
-                return Duration.ofWeeks(duration.getVal());
-            default:
-                throw new IllegalArgumentException("unrecognized DurationUnit");
-        }
-    }
-
-    // TODO: change modifier to public in SDK
-    private static IndexRule.IndexType fromProtobuf(BanyandbMetadata.IndexRule.Type type) {
-        switch (type) {
-            case TYPE_TREE:
-                return IndexRule.IndexType.TREE;
-            case TYPE_INVERTED:
-                return IndexRule.IndexType.INVERTED;
-            default:
-                throw new IllegalArgumentException("unrecognized index type");
-        }
-    }
-
-    // TODO: change modifier to public in SDK
-    private static IndexRule.IndexLocation fromProtobuf(BanyandbMetadata.IndexRule.Location loc) {
-        switch (loc) {
-            case LOCATION_GLOBAL:
-                return IndexRule.IndexLocation.GLOBAL;
-            case LOCATION_SERIES:
-                return IndexRule.IndexLocation.SERIES;
-            default:
-                throw new IllegalArgumentException("unrecognized index location");
-        }
-    }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/AlarmRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/AlarmRecordBuilder.java
index a8a2863306..260fc17664 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/AlarmRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/AlarmRecordBuilder.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.alarm.AlarmRecord;
@@ -33,8 +33,8 @@ public class AlarmRecordBuilder extends BanyanDBStorageDataBuilder<AlarmRecord>
     );
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(AlarmRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(2);
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(AlarmRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(2);
         searchable.add(TagAndValue.longField(entity.getScope()));
         searchable.add(TagAndValue.longField(entity.getStartTime()));
         searchable.addAll(filterSearchableTags(entity.getTags(), INDEXED_TAGS));
@@ -42,8 +42,8 @@ public class AlarmRecordBuilder extends BanyanDBStorageDataBuilder<AlarmRecord>
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(AlarmRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>(6);
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(AlarmRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> data = new ArrayList<>(6);
         data.add(TagAndValue.stringField(entity.getName()));
         data.add(TagAndValue.stringField(entity.getId0()));
         data.add(TagAndValue.stringField(entity.getId1()));
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BanyanDBStorageDataBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BanyanDBStorageDataBuilder.java
index 03ee0328f3..814f3149f7 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BanyanDBStorageDataBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BanyanDBStorageDataBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.StreamWrite;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
@@ -55,17 +55,17 @@ public abstract class BanyanDBStorageDataBuilder<T extends StorageData> implemen
         return null;
     }
 
-    protected List<SerializableTag<Banyandb.TagValue>> filterSearchableTags(List<Tag> rawTags, List<String> indexTags) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> filterSearchableTags(List<Tag> rawTags, List<String> indexTags) {
         if (rawTags == null) {
             return Collections.emptyList();
         }
-        Map<String, SerializableTag<Banyandb.TagValue>> map = new HashMap<>();
+        Map<String, SerializableTag<BanyandbModel.TagValue>> map = new HashMap<>();
         for (final Tag tag : rawTags) {
             map.put(tag.getKey().toLowerCase(), TagAndValue.stringField(tag.getValue()));
         }
-        final List<SerializableTag<Banyandb.TagValue>> tags = new ArrayList<>();
+        final List<SerializableTag<BanyandbModel.TagValue>> tags = new ArrayList<>();
         for (String indexedTag : indexTags) {
-            SerializableTag<Banyandb.TagValue> tag = map.get(indexedTag);
+            SerializableTag<BanyandbModel.TagValue> tag = map.get(indexedTag);
             if (tag == null) {
                 tags.add(TagAndValue.nullField());
             } else {
@@ -80,9 +80,9 @@ public abstract class BanyanDBStorageDataBuilder<T extends StorageData> implemen
         return entity.id();
     }
 
-    abstract protected List<SerializableTag<Banyandb.TagValue>> searchableTags(T entity);
+    abstract protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(T entity);
 
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(T entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(T entity) {
         return Collections.emptyList();
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BrowserErrorLogRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BrowserErrorLogRecordBuilder.java
index 98b9bd0e6b..034565249b 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BrowserErrorLogRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/BrowserErrorLogRecordBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.browser.manual.errorlog.BrowserErrorLogRecord;
@@ -29,8 +29,8 @@ import java.util.List;
 
 public class BrowserErrorLogRecordBuilder extends BanyanDBStorageDataBuilder<BrowserErrorLogRecord> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(BrowserErrorLogRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>();
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(BrowserErrorLogRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
         searchable.add(TagAndValue.stringField(entity.getUniqueId()));
         searchable.add(TagAndValue.stringField(entity.getServiceId()));
         searchable.add(TagAndValue.stringField(entity.getServiceVersionId()));
@@ -40,7 +40,7 @@ public class BrowserErrorLogRecordBuilder extends BanyanDBStorageDataBuilder<Bro
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(BrowserErrorLogRecord entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(BrowserErrorLogRecord entity) {
         return Collections.singletonList(TagAndValue.binaryField(entity.getDataBinary()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EndpointRelationServerSideMetricsBuilder.java
similarity index 57%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EndpointRelationServerSideMetricsBuilder.java
index 83bf0abfab..ec25c79e10 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EndpointRelationServerSideMetricsBuilder.java
@@ -18,27 +18,27 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
-import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint.EndpointRelationServerSideMetrics;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class NetworkAddressAliasBuilder extends BanyanDBStorageDataBuilder<NetworkAddressAlias> {
+public class EndpointRelationServerSideMetricsBuilder extends BanyanDBStorageDataBuilder<EndpointRelationServerSideMetrics> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(NetworkAddressAlias entity) {
-        return Collections.singletonList(TagAndValue.longField(entity.getLastUpdateTimeBucket()));
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(EndpointRelationServerSideMetrics entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
+        searchable.add(TagAndValue.stringField(entity.getSourceEndpoint()));
+        searchable.add(TagAndValue.stringField(entity.getDestEndpoint()));
+        searchable.add(TagAndValue.stringField(entity.getEntityId()));
+        return searchable;
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(NetworkAddressAlias entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
-        data.add(TagAndValue.stringField(entity.getAddress()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceId()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceInstanceId()));
-        return data;
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(EndpointRelationServerSideMetrics entity) {
+        return Collections.singletonList(TagAndValue.longField(entity.getComponentId()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EventBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EventBuilder.java
index bc604776c9..512fe2aa5c 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EventBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/EventBuilder.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.source.Event;
@@ -29,8 +29,8 @@ import java.util.List;
 
 public class EventBuilder extends BanyanDBStorageDataBuilder<Event> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(Event entity) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(8);
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(Event entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(8);
         searchable.add(TagAndValue.stringField(entity.getUuid()));
         searchable.add(TagAndValue.stringField(entity.getService()));
         searchable.add(TagAndValue.stringField(entity.getServiceInstance()));
@@ -43,7 +43,7 @@ public class EventBuilder extends BanyanDBStorageDataBuilder<Event> {
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(Event entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(Event entity) {
         return ImmutableList.of(
                 TagAndValue.stringField(entity.getMessage()),
                 TagAndValue.stringField(entity.getParameters())
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/LogRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/LogRecordBuilder.java
index 02809d68aa..8fddd927a4 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/LogRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/LogRecordBuilder.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.analysis.manual.log.LogRecord;
@@ -33,8 +33,8 @@ public class LogRecordBuilder extends BanyanDBStorageDataBuilder<LogRecord> {
     );
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(LogRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>();
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(LogRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
         searchable.add(TagAndValue.stringField(entity.getUniqueId()));
         searchable.add(TagAndValue.stringField(entity.getServiceId()));
         searchable.add(TagAndValue.stringField(entity.getServiceInstanceId()));
@@ -48,7 +48,7 @@ public class LogRecordBuilder extends BanyanDBStorageDataBuilder<LogRecord> {
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(LogRecord entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(LogRecord entity) {
         return ImmutableList.of(
                 TagAndValue.stringField(entity.getContent()),
                 TagAndValue.longField(entity.getContentType()),
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/Metadata.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/Metadata.java
index 66f3218965..545cd507d6 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/Metadata.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/Metadata.java
@@ -18,9 +18,10 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
 import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic;
 import org.apache.skywalking.oap.server.core.analysis.manual.service.ServiceTraffic;
@@ -29,39 +30,68 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import static org.apache.skywalking.oap.server.core.Const.DOUBLE_COLONS_SPLIT;
+
 public class Metadata {
     public static class ServiceTrafficBuilder extends BanyanDBStorageDataBuilder<ServiceTraffic> {
         @Override
-        protected List<SerializableTag<Banyandb.TagValue>> searchableTags(ServiceTraffic entity) {
-            List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(3);
-            searchable.add(TagAndValue.stringField(entity.getName()));
-            searchable.add(TagAndValue.longField(entity.getNodeType().value()));
+        protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ServiceTraffic entity) {
+            final String serviceName = entity.getName();
+            entity.setShortName(serviceName);
+            if (entity.isNormal()) {
+                int groupIdx = serviceName.indexOf(DOUBLE_COLONS_SPLIT);
+                if (groupIdx > 0) {
+                    entity.setGroup(serviceName.substring(0, groupIdx));
+                    entity.setShortName(serviceName.substring(groupIdx + 2));
+                }
+            }
+            List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(4);
+            // 0 - serviceName
+            searchable.add(TagAndValue.stringField(serviceName));
+            // 1 - serviceID
+            searchable.add(TagAndValue.stringField(entity.getServiceId()));
+            // 2 - layer
+            Layer layer = entity.getLayer();
+            searchable.add(TagAndValue.longField(layer != null ? layer.value() : Layer.UNDEFINED.value()));
+            // 3 - group
             searchable.add(TagAndValue.stringField(entity.getGroup()));
             return searchable;
         }
+
+        @Override
+        protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ServiceTraffic entity) {
+            // shortName
+            return Collections.singletonList(TagAndValue.stringField(entity.getShortName()));
+        }
     }
 
     public static class EndpointTrafficBuilder extends BanyanDBStorageDataBuilder<EndpointTraffic> {
         @Override
-        protected List<SerializableTag<Banyandb.TagValue>> searchableTags(EndpointTraffic entity) {
-            List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(2);
-            searchable.add(TagAndValue.stringField(entity.getServiceId()));
+        protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(EndpointTraffic entity) {
+            List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(2);
+            // 0 - name
             searchable.add(TagAndValue.stringField(entity.getName()));
+            // 1 - serviceID
+            searchable.add(TagAndValue.stringField(entity.getServiceId()));
             return searchable;
         }
     }
 
     public static class InstanceTrafficBuilder extends BanyanDBStorageDataBuilder<InstanceTraffic> {
         @Override
-        protected List<SerializableTag<Banyandb.TagValue>> searchableTags(InstanceTraffic entity) {
-            List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(2);
+        protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(InstanceTraffic entity) {
+            List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(3);
+            // serviceID
             searchable.add(TagAndValue.stringField(entity.getServiceId()));
+            // lastPingTimestamp
             searchable.add(TagAndValue.longField(entity.getLastPingTimestamp()));
+            // ID: we have to duplicate "ID" here for query
+            searchable.add(TagAndValue.stringField(entity.id()));
             return searchable;
         }
 
         @Override
-        protected List<SerializableTag<Banyandb.TagValue>> dataTags(InstanceTraffic entity) {
+        protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(InstanceTraffic entity) {
             return Collections.singletonList(TagAndValue.binaryField(
                     entity.serialize().build().toByteArray()
             ));
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
index 83bf0abfab..ee85a50b03 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
@@ -29,13 +29,13 @@ import java.util.List;
 
 public class NetworkAddressAliasBuilder extends BanyanDBStorageDataBuilder<NetworkAddressAlias> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(NetworkAddressAlias entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(NetworkAddressAlias entity) {
         return Collections.singletonList(TagAndValue.longField(entity.getLastUpdateTimeBucket()));
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(NetworkAddressAlias entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(NetworkAddressAlias entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> data = new ArrayList<>();
         data.add(TagAndValue.stringField(entity.getAddress()));
         data.add(TagAndValue.stringField(entity.getRepresentServiceId()));
         data.add(TagAndValue.stringField(entity.getRepresentServiceInstanceId()));
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskLogRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskLogRecordBuilder.java
index 888cac6b10..a0cab9c112 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskLogRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskLogRecordBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.profile.ProfileTaskLogRecord;
@@ -29,13 +29,13 @@ import java.util.List;
 
 public class ProfileTaskLogRecordBuilder extends BanyanDBStorageDataBuilder<ProfileTaskLogRecord> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(ProfileTaskLogRecord entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ProfileTaskLogRecord entity) {
         return Collections.singletonList(TagAndValue.longField(entity.getOperationTime()));
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(ProfileTaskLogRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ProfileTaskLogRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> data = new ArrayList<>();
         data.add(TagAndValue.stringField(entity.getTaskId()));
         data.add(TagAndValue.stringField(entity.getInstanceId()));
         data.add(TagAndValue.longField(entity.getOperationType()));
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskRecordBuilder.java
index b107cadc31..bc91290976 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileTaskRecordBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.profile.ProfileTaskRecord;
@@ -28,8 +28,8 @@ import java.util.List;
 
 public class ProfileTaskRecordBuilder extends BanyanDBStorageDataBuilder<ProfileTaskRecord> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(ProfileTaskRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(9);
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ProfileTaskRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(9);
         searchable.add(TagAndValue.stringField(entity.id()));
         searchable.add(TagAndValue.stringField(entity.getServiceId()));
         searchable.add(TagAndValue.stringField(entity.getEndpointName()));
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileThreadSnapshotRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileThreadSnapshotRecordBuilder.java
index 10032246ec..28c0ba5f38 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileThreadSnapshotRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ProfileThreadSnapshotRecordBuilder.java
@@ -18,7 +18,7 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.profile.ProfileThreadSnapshotRecord;
@@ -29,8 +29,8 @@ import java.util.List;
 
 public class ProfileThreadSnapshotRecordBuilder extends BanyanDBStorageDataBuilder<ProfileThreadSnapshotRecord> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(ProfileThreadSnapshotRecord entity) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(4);
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ProfileThreadSnapshotRecord entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(4);
         searchable.add(TagAndValue.stringField(entity.getTaskId()));
         searchable.add(TagAndValue.stringField(entity.getSegmentId()));
         searchable.add(TagAndValue.longField(entity.getDumpTime()));
@@ -39,7 +39,7 @@ public class ProfileThreadSnapshotRecordBuilder extends BanyanDBStorageDataBuild
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(ProfileThreadSnapshotRecord entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ProfileThreadSnapshotRecord entity) {
         return Collections.singletonList(TagAndValue.binaryField(entity.getStackBinary()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/SegmentRecordBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/SegmentRecordBuilder.java
index a87dc9aa86..0aa54cd3c1 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/SegmentRecordBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/SegmentRecordBuilder.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord;
@@ -40,8 +40,8 @@ public class SegmentRecordBuilder extends BanyanDBStorageDataBuilder<SegmentReco
     );
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(SegmentRecord segmentRecord) {
-        List<SerializableTag<Banyandb.TagValue>> searchable = new ArrayList<>(10);
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(SegmentRecord segmentRecord) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>(10);
         searchable.add(TagAndValue.stringField(segmentRecord.getTraceId()));
         searchable.add(TagAndValue.stringField(segmentRecord.getServiceId()));
         searchable.add(TagAndValue.stringField(segmentRecord.getServiceInstanceId()));
@@ -54,7 +54,7 @@ public class SegmentRecordBuilder extends BanyanDBStorageDataBuilder<SegmentReco
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(SegmentRecord entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(SegmentRecord entity) {
         return Collections.singletonList(TagAndValue.binaryField(entity.getDataBinary()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceInstanceRelationClientSideMetricsBuilder.java
similarity index 52%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceInstanceRelationClientSideMetricsBuilder.java
index 83bf0abfab..e940f6d291 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceInstanceRelationClientSideMetricsBuilder.java
@@ -18,27 +18,29 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
-import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.instance.ServiceInstanceRelationClientSideMetrics;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class NetworkAddressAliasBuilder extends BanyanDBStorageDataBuilder<NetworkAddressAlias> {
+public class ServiceInstanceRelationClientSideMetricsBuilder extends BanyanDBStorageDataBuilder<ServiceInstanceRelationClientSideMetrics> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(NetworkAddressAlias entity) {
-        return Collections.singletonList(TagAndValue.longField(entity.getLastUpdateTimeBucket()));
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ServiceInstanceRelationClientSideMetrics entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
+        searchable.add(TagAndValue.stringField(entity.getSourceServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getSourceServiceInstanceId()));
+        searchable.add(TagAndValue.stringField(entity.getDestServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getDestServiceInstanceId()));
+        searchable.add(TagAndValue.stringField(entity.getEntityId()));
+        return searchable;
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(NetworkAddressAlias entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
-        data.add(TagAndValue.stringField(entity.getAddress()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceId()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceInstanceId()));
-        return data;
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ServiceInstanceRelationClientSideMetrics entity) {
+        return Collections.singletonList(TagAndValue.longField(entity.getComponentId()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceInstanceRelationServerSideMetricsBuilder.java
similarity index 52%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceInstanceRelationServerSideMetricsBuilder.java
index 83bf0abfab..43495bc148 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceInstanceRelationServerSideMetricsBuilder.java
@@ -18,27 +18,29 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
-import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.instance.ServiceInstanceRelationServerSideMetrics;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class NetworkAddressAliasBuilder extends BanyanDBStorageDataBuilder<NetworkAddressAlias> {
+public class ServiceInstanceRelationServerSideMetricsBuilder extends BanyanDBStorageDataBuilder<ServiceInstanceRelationServerSideMetrics> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(NetworkAddressAlias entity) {
-        return Collections.singletonList(TagAndValue.longField(entity.getLastUpdateTimeBucket()));
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ServiceInstanceRelationServerSideMetrics entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
+        searchable.add(TagAndValue.stringField(entity.getSourceServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getSourceServiceInstanceId()));
+        searchable.add(TagAndValue.stringField(entity.getDestServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getDestServiceInstanceId()));
+        searchable.add(TagAndValue.stringField(entity.getEntityId()));
+        return searchable;
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(NetworkAddressAlias entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
-        data.add(TagAndValue.stringField(entity.getAddress()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceId()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceInstanceId()));
-        return data;
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ServiceInstanceRelationServerSideMetrics entity) {
+        return Collections.singletonList(TagAndValue.longField(entity.getComponentId()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceRelationClientSideMetricsBuilder.java
similarity index 57%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceRelationClientSideMetricsBuilder.java
index 83bf0abfab..3d50dde043 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceRelationClientSideMetricsBuilder.java
@@ -18,27 +18,27 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
-import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.service.ServiceRelationClientSideMetrics;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class NetworkAddressAliasBuilder extends BanyanDBStorageDataBuilder<NetworkAddressAlias> {
+public class ServiceRelationClientSideMetricsBuilder extends BanyanDBStorageDataBuilder<ServiceRelationClientSideMetrics> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(NetworkAddressAlias entity) {
-        return Collections.singletonList(TagAndValue.longField(entity.getLastUpdateTimeBucket()));
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ServiceRelationClientSideMetrics entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
+        searchable.add(TagAndValue.stringField(entity.getSourceServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getDestServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getEntityId()));
+        return searchable;
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(NetworkAddressAlias entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
-        data.add(TagAndValue.stringField(entity.getAddress()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceId()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceInstanceId()));
-        return data;
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ServiceRelationClientSideMetrics entity) {
+        return Collections.singletonList(TagAndValue.longField(entity.getComponentId()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceRelationServerSideMetricsBuilder.java
similarity index 57%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceRelationServerSideMetricsBuilder.java
index 83bf0abfab..92a9a13fb9 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/NetworkAddressAliasBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/ServiceRelationServerSideMetricsBuilder.java
@@ -18,27 +18,27 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
-import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.service.ServiceRelationServerSideMetrics;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-public class NetworkAddressAliasBuilder extends BanyanDBStorageDataBuilder<NetworkAddressAlias> {
+public class ServiceRelationServerSideMetricsBuilder extends BanyanDBStorageDataBuilder<ServiceRelationServerSideMetrics> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(NetworkAddressAlias entity) {
-        return Collections.singletonList(TagAndValue.longField(entity.getLastUpdateTimeBucket()));
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(ServiceRelationServerSideMetrics entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> searchable = new ArrayList<>();
+        searchable.add(TagAndValue.stringField(entity.getSourceServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getDestServiceId()));
+        searchable.add(TagAndValue.stringField(entity.getEntityId()));
+        return searchable;
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(NetworkAddressAlias entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
-        data.add(TagAndValue.stringField(entity.getAddress()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceId()));
-        data.add(TagAndValue.stringField(entity.getRepresentServiceInstanceId()));
-        return data;
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(ServiceRelationServerSideMetrics entity) {
+        return Collections.singletonList(TagAndValue.longField(entity.getComponentId()));
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/UITemplateBuilder.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/UITemplateBuilder.java
index 41104ee588..6b53a63174 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/UITemplateBuilder.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/schema/UITemplateBuilder.java
@@ -19,7 +19,7 @@
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.schema;
 
 import com.google.common.collect.ImmutableList;
-import org.apache.skywalking.banyandb.v1.Banyandb;
+import org.apache.skywalking.banyandb.model.v1.BanyandbModel;
 import org.apache.skywalking.banyandb.v1.client.SerializableTag;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
 import org.apache.skywalking.oap.server.core.management.ui.template.UITemplate;
@@ -29,7 +29,7 @@ import java.util.List;
 
 public class UITemplateBuilder extends BanyanDBStorageDataBuilder<UITemplate> {
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> searchableTags(UITemplate entity) {
+    protected List<SerializableTag<BanyandbModel.TagValue>> searchableTags(UITemplate entity) {
         return ImmutableList.of(
                 TagAndValue.stringField(entity.getName()),
                 TagAndValue.longField(entity.getDisabled())
@@ -37,8 +37,8 @@ public class UITemplateBuilder extends BanyanDBStorageDataBuilder<UITemplate> {
     }
 
     @Override
-    protected List<SerializableTag<Banyandb.TagValue>> dataTags(UITemplate entity) {
-        List<SerializableTag<Banyandb.TagValue>> data = new ArrayList<>();
+    protected List<SerializableTag<BanyandbModel.TagValue>> dataTags(UITemplate entity) {
+        List<SerializableTag<BanyandbModel.TagValue>> data = new ArrayList<>();
         data.add(TagAndValue.stringField(entity.getType()));
         data.add(TagAndValue.stringField(entity.getConfiguration()));
         data.add(TagAndValue.longField(entity.getActivated()));
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBHistoryDeleteDAO.java
similarity index 53%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBHistoryDeleteDAO.java
index ffc5aaf586..0133d30e3d 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBIndexInstaller.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBHistoryDeleteDAO.java
@@ -16,29 +16,16 @@
  *
  */
 
-package org.apache.skywalking.oap.server.storage.plugin.banyandb;
+package org.apache.skywalking.oap.server.storage.plugin.banyandb.stream;
 
-import org.apache.skywalking.oap.server.core.storage.StorageException;
+import org.apache.skywalking.oap.server.core.storage.IHistoryDeleteDAO;
 import org.apache.skywalking.oap.server.core.storage.model.Model;
-import org.apache.skywalking.oap.server.core.storage.model.ModelInstaller;
-import org.apache.skywalking.oap.server.library.client.Client;
-import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
-public class BanyanDBIndexInstaller extends ModelInstaller {
-    public BanyanDBIndexInstaller(Client client, ModuleManager moduleManager) {
-        super(client, moduleManager);
-    }
-
-    @Override
-    protected boolean isExists(Model model) throws StorageException {
-        return false;
-    }
+import java.io.IOException;
 
+public class BanyanDBHistoryDeleteDAO implements IHistoryDeleteDAO {
     @Override
-    protected void createTable(Model model) throws StorageException {
-        StreamMetaInfo metaInfo = StreamMetaInfo.addModel(model);
-        if (metaInfo != null) {
-            ((BanyanDBStorageClient) client).createStream(metaInfo);
-        }
+    public void deleteHistory(Model model, String timeBucketColumnName, int ttl) throws IOException {
+        // do thing since we currently do not support deletion
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBManagementDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBManagementDAO.java
index 7e37288428..1990181804 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBManagementDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBManagementDAO.java
@@ -30,6 +30,9 @@ import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageC
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.BanyanDBStorageDataBuilder;
 
 import java.io.IOException;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
 import java.util.Collections;
 
 /**
@@ -38,6 +41,9 @@ import java.util.Collections;
  * @param <T> The only ManagementData we have now is {@link UITemplate}
  */
 public class BanyanDBManagementDAO<T extends ManagementData> extends AbstractBanyanDBDAO implements IManagementDAO {
+    private final static long START_TIME_MILLI =
+            ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0,
+                    ZoneOffset.UTC).toInstant().toEpochMilli();
     private final BanyanDBStorageDataBuilder<T> storageBuilder;
 
     public BanyanDBManagementDAO(BanyanDBStorageClient client, BanyanDBStorageDataBuilder<T> storageBuilder) {
@@ -50,7 +56,7 @@ public class BanyanDBManagementDAO<T extends ManagementData> extends AbstractBan
         // ensure only insert once
         StreamQueryResponse resp = query(UITemplate.INDEX_NAME,
                 Collections.singletonList(UITemplate.NAME),
-                new TimestampRange(0L, 2L),
+                new TimestampRange(START_TIME_MILLI, Instant.now().toEpochMilli()),
                 new QueryBuilder() {
                     @Override
                     public void apply(StreamQuery query) {
@@ -65,7 +71,7 @@ public class BanyanDBManagementDAO<T extends ManagementData> extends AbstractBan
         StreamWrite.StreamWriteBuilder streamWrite = this.storageBuilder
                 .entity2Storage((T) storageData)
                 .name(model.getName())
-                .timestamp(1L);
+                .timestamp(Instant.now().toEpochMilli());
         getClient().write(streamWrite.build());
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBMetadataQueryDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBMetadataQueryDAO.java
index fdc1ccb71f..b9fc53258c 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBMetadataQueryDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBMetadataQueryDAO.java
@@ -22,19 +22,17 @@ import com.google.common.collect.ImmutableList;
 import com.google.gson.JsonElement;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
-import org.apache.skywalking.banyandb.v1.client.PairQueryCondition;
 import org.apache.skywalking.banyandb.v1.client.RowEntity;
 import org.apache.skywalking.banyandb.v1.client.StreamQuery;
 import org.apache.skywalking.banyandb.v1.client.StreamQueryResponse;
 import org.apache.skywalking.banyandb.v1.client.TagAndValue;
-import org.apache.skywalking.oap.server.core.analysis.NodeType;
+import org.apache.skywalking.oap.server.core.analysis.Layer;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic;
 import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic;
 import org.apache.skywalking.oap.server.core.analysis.manual.service.ServiceTraffic;
 import org.apache.skywalking.oap.server.core.query.enumeration.Language;
 import org.apache.skywalking.oap.server.core.query.type.Attribute;
-import org.apache.skywalking.oap.server.core.query.type.Database;
 import org.apache.skywalking.oap.server.core.query.type.Endpoint;
 import org.apache.skywalking.oap.server.core.query.type.Service;
 import org.apache.skywalking.oap.server.core.query.type.ServiceInstance;
@@ -42,6 +40,7 @@ import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData;
 import org.apache.skywalking.oap.server.core.storage.query.IMetadataQueryDAO;
 import org.apache.skywalking.oap.server.library.util.StringUtil;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageClient;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.StreamMetaInfo;
 
 import java.io.IOException;
 import java.util.Collections;
@@ -61,12 +60,15 @@ public class BanyanDBMetadataQueryDAO extends AbstractBanyanDBDAO implements IMe
     }
 
     @Override
-    public List<Service> getAllServices(String group) throws IOException {
+    public List<Service> listServices(final String layer, final String group) throws IOException {
         StreamQueryResponse resp = query(ServiceTraffic.INDEX_NAME,
-                ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.NODE_TYPE, ServiceTraffic.GROUP),
+                ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.LAYER, ServiceTraffic.GROUP),
                 new QueryBuilder() {
                     @Override
                     public void apply(StreamQuery query) {
+                        if (StringUtil.isNotEmpty(layer)) {
+                            query.appendCondition(eq(ServiceTraffic.LAYER, Layer.valueOf(layer).value()));
+                        }
                         if (StringUtil.isNotEmpty(group)) {
                             query.appendCondition(eq(ServiceTraffic.GROUP, group));
                         }
@@ -77,13 +79,13 @@ public class BanyanDBMetadataQueryDAO extends AbstractBanyanDBDAO implements IMe
     }
 
     @Override
-    public List<Service> getAllBrowserServices() throws IOException {
+    public List<Service> getServices(String serviceId) throws IOException {
         StreamQueryResponse resp = query(ServiceTraffic.INDEX_NAME,
-                ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.NODE_TYPE, ServiceTraffic.GROUP),
+                ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.LAYER, ServiceTraffic.GROUP),
                 new QueryBuilder() {
                     @Override
                     public void apply(StreamQuery query) {
-                        query.appendCondition(eq(ServiceTraffic.NODE_TYPE, NodeType.Browser.value()));
+                        query.appendCondition(eq(ServiceTraffic.SERVICE_ID, serviceId));
                     }
                 });
 
@@ -91,53 +93,41 @@ public class BanyanDBMetadataQueryDAO extends AbstractBanyanDBDAO implements IMe
     }
 
     @Override
-    public List<Database> getAllDatabases() throws IOException {
-        StreamQueryResponse resp = query(ServiceTraffic.INDEX_NAME, ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.NODE_TYPE),
+    public List<ServiceInstance> listInstances(long startTimestamp, long endTimestamp, String serviceId) throws IOException {
+        StreamQueryResponse resp = query(InstanceTraffic.INDEX_NAME,
+                ImmutableList.of(InstanceTraffic.SERVICE_ID, InstanceTraffic.LAST_PING_TIME_BUCKET),
                 new QueryBuilder() {
                     @Override
                     public void apply(StreamQuery query) {
-                        query.appendCondition(eq(ServiceTraffic.NODE_TYPE, (long) NodeType.Database.value()));
-                    }
-                });
+                        query.setDataProjections(Collections.singletonList("data_binary"));
 
-        return resp.getElements().stream().map(new DatabaseDeserializer()).collect(Collectors.toList());
-    }
+                        final long startMinuteTimeBucket = TimeBucket.getMinuteTimeBucket(startTimestamp);
+                        final long endMinuteTimeBucket = TimeBucket.getMinuteTimeBucket(endTimestamp);
 
-    @Override
-    public List<Service> searchServices(NodeType nodeType, String keyword) throws IOException {
-        StreamQueryResponse resp = query(ServiceTraffic.INDEX_NAME,
-                ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.NODE_TYPE, ServiceTraffic.GROUP),
-                new QueryBuilder() {
-                    @Override
-                    public void apply(StreamQuery query) {
-                        query.appendCondition(eq(ServiceTraffic.NODE_TYPE, nodeType.value()));
+                        query.appendCondition(gte(InstanceTraffic.LAST_PING_TIME_BUCKET, startMinuteTimeBucket));
+                        query.appendCondition(lte(InstanceTraffic.LAST_PING_TIME_BUCKET, endMinuteTimeBucket));
+                        query.appendCondition(eq(InstanceTraffic.SERVICE_ID, serviceId));
                     }
                 });
 
-        return resp.getElements().stream().map(new ServiceDeserializer())
-                .filter(s -> s.getName().contains(keyword)) // TODO: support analyzer in database
-                .collect(Collectors.toList());
+        return resp.getElements().stream().map(new ServiceInstanceDeserializer()).collect(Collectors.toList());
     }
 
     @Override
-    public Service searchService(NodeType nodeType, String serviceCode) throws IOException {
-        StreamQueryResponse resp = query(ServiceTraffic.INDEX_NAME,
-                ImmutableList.of(ServiceTraffic.NAME, ServiceTraffic.NODE_TYPE, ServiceTraffic.GROUP),
-                new QueryBuilder() {
+    public ServiceInstance getInstance(String instanceId) throws IOException {
+        StreamQueryResponse resp = query(InstanceTraffic.INDEX_NAME,
+                ImmutableList.of(InstanceTraffic.NAME, InstanceTraffic.SERVICE_ID), new QueryBuilder() {
                     @Override
                     public void apply(StreamQuery query) {
-                        query.appendCondition(PairQueryCondition.StringQueryCondition.eq("searchable", ServiceTraffic.NAME, serviceCode));
-                        query.appendCondition(PairQueryCondition.LongQueryCondition.eq("searchable", ServiceTraffic.NODE_TYPE, (long) nodeType.value()));
-                        // only get one
-                        query.setLimit(1);
+                        query.appendCondition(eq(StreamMetaInfo.ID, instanceId));
                     }
                 });
 
-        return resp.getElements().stream().map(new ServiceDeserializer()).findAny().orElse(null);
+        return resp.getElements().stream().map(new ServiceInstanceDeserializer()).findFirst().orElse(null);
     }
 
     @Override
-    public List<Endpoint> searchEndpoint(String keyword, String serviceId, int limit) throws IOException {
+    public List<Endpoint> findEndpoint(String keyword, String serviceId, int limit) throws IOException {
         StreamQueryResponse resp = query(EndpointTraffic.INDEX_NAME,
                 ImmutableList.of(EndpointTraffic.NAME, EndpointTraffic.SERVICE_ID), new QueryBuilder() {
                     @Override
@@ -150,38 +140,6 @@ public class BanyanDBMetadataQueryDAO extends AbstractBanyanDBDAO implements IMe
                 .limit(limit).collect(Collectors.toList());
     }
 
-    @Override
-    public List<ServiceInstance> getServiceInstances(long startTimestamp, long endTimestamp, String serviceId) throws IOException {
-        StreamQueryResponse resp = query(InstanceTraffic.INDEX_NAME,
-                ImmutableList.of(InstanceTraffic.SERVICE_ID, InstanceTraffic.LAST_PING_TIME_BUCKET),
-                new QueryBuilder() {
-                    @Override
-                    public void apply(StreamQuery query) {
-                        query.setDataProjections(Collections.singletonList("data_binary"));
-
-                        final long startMinuteTimeBucket = TimeBucket.getMinuteTimeBucket(startTimestamp);
-                        final long endMinuteTimeBucket = TimeBucket.getMinuteTimeBucket(endTimestamp);
-
-                        query.appendCondition(gte(InstanceTraffic.LAST_PING_TIME_BUCKET, startMinuteTimeBucket));
-                        query.appendCondition(lte(InstanceTraffic.LAST_PING_TIME_BUCKET, endMinuteTimeBucket));
-                        query.appendCondition(eq(InstanceTraffic.SERVICE_ID, serviceId));
-                    }
-                });
-
-        return resp.getElements().stream().map(new ServiceInstanceDeserializer()).collect(Collectors.toList());
-    }
-
-    public static class DatabaseDeserializer implements RowEntityDeserializer<Database> {
-        @Override
-        public Database apply(RowEntity row) {
-            Database database = new Database();
-            final List<TagAndValue<?>> searchable = row.getTagFamilies().get(0);
-            database.setId(row.getId());
-            database.setName((String) searchable.get(0).getValue());
-            return database;
-        }
-    }
-
     public static class EndpointDeserializer implements RowEntityDeserializer<Endpoint> {
         @Override
         public Endpoint apply(RowEntity row) {
@@ -198,9 +156,13 @@ public class BanyanDBMetadataQueryDAO extends AbstractBanyanDBDAO implements IMe
         public Service apply(RowEntity row) {
             Service service = new Service();
             final List<TagAndValue<?>> searchable = row.getTagFamilies().get(0);
-            service.setId(row.getId());
             service.setName((String) searchable.get(0).getValue());
-            service.setGroup((String) searchable.get(2).getValue());
+            service.setId((String) searchable.get(1).getValue());
+            String layerName = Layer.valueOf(((Number) searchable.get(2).getValue()).intValue()).name();
+            service.getLayers().add(layerName);
+            service.setGroup((String) searchable.get(3).getValue());
+            final List<TagAndValue<?>> data = row.getTagFamilies().get(1);
+            service.setShortName((String) data.get(0).getValue());
             return service;
         }
     }
@@ -218,6 +180,7 @@ public class BanyanDBMetadataQueryDAO extends AbstractBanyanDBDAO implements IMe
                     instanceTraffic.deserialize(remoteData);
                     serviceInstance.setName(instanceTraffic.getName());
                     serviceInstance.setId(instanceTraffic.getServiceId());
+                    serviceInstance.setLayer(instanceTraffic.getLayer().name());
 
                     if (instanceTraffic.getProperties() != null) {
                         for (Map.Entry<String, JsonElement> property : instanceTraffic.getProperties().entrySet()) {
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBStorageDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBStorageDAO.java
index 98f31ebd7e..3c3b4b4a6c 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBStorageDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBStorageDAO.java
@@ -23,16 +23,25 @@ import org.apache.skywalking.oap.server.core.analysis.config.NoneStream;
 import org.apache.skywalking.oap.server.core.analysis.management.ManagementData;
 import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics;
 import org.apache.skywalking.oap.server.core.analysis.record.Record;
+import org.apache.skywalking.oap.server.core.analysis.topn.TopN;
 import org.apache.skywalking.oap.server.core.storage.AbstractDAO;
 import org.apache.skywalking.oap.server.core.storage.IManagementDAO;
 import org.apache.skywalking.oap.server.core.storage.IMetricsDAO;
 import org.apache.skywalking.oap.server.core.storage.INoneStreamDAO;
 import org.apache.skywalking.oap.server.core.storage.IRecordDAO;
 import org.apache.skywalking.oap.server.core.storage.StorageDAO;
+import org.apache.skywalking.oap.server.core.storage.model.Model;
 import org.apache.skywalking.oap.server.core.storage.type.StorageBuilder;
+import org.apache.skywalking.oap.server.library.client.request.InsertRequest;
+import org.apache.skywalking.oap.server.library.client.request.UpdateRequest;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageClient;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.schema.BanyanDBStorageDataBuilder;
 
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
 @Slf4j
 public class BanyanDBStorageDAO extends AbstractDAO<BanyanDBStorageClient> implements StorageDAO {
     public BanyanDBStorageDAO(BanyanDBStorageClient client) {
@@ -41,11 +50,59 @@ public class BanyanDBStorageDAO extends AbstractDAO<BanyanDBStorageClient> imple
 
     @Override
     public IMetricsDAO newMetricsDao(StorageBuilder storageBuilder) {
+        // SKIP:
+        // 1. OAL runtime metrics builder
+        // 2. Analysis Function builder
+        if (storageBuilder.getClass().getName().startsWith("org.apache.skywalking.oap.server.core.")) {
+            log.warn("metrics builder {} is not supported yet", storageBuilder.getClass());
+            return new IMetricsDAO() {
+                @Override
+                public List<Metrics> multiGet(Model model, List<Metrics> metrics) throws IOException {
+                    return Collections.emptyList();
+                }
+
+                @Override
+                public InsertRequest prepareBatchInsert(Model model, Metrics metrics) throws IOException {
+                    return new InsertRequest() {
+                    };
+                }
+
+                @Override
+                public UpdateRequest prepareBatchUpdate(Model model, Metrics metrics) throws IOException {
+                    return new UpdateRequest() {
+                    };
+                }
+            };
+        }
         return new BanyanDBMetricsDAO<>((BanyanDBStorageDataBuilder<Metrics>) storageBuilder);
     }
 
     @Override
     public IRecordDAO newRecordDao(StorageBuilder storageBuilder) {
+        try {
+            final Class<?> returnType = storageBuilder.getClass().getDeclaredMethod("storage2Entity", Map.class).getReturnType();
+            // FIXME: this is currently a hack to avoid TopN insertion since we will impl TopN later in BanyanDB side
+            if (TopN.class.isAssignableFrom(returnType)) {
+                return new IRecordDAO() {
+                    @Override
+                    public InsertRequest prepareBatchInsert(Model model, Record record) throws IOException {
+                        return new InsertRequest() {
+                        };
+                    }
+                };
+            } else if (returnType.getName().equals("org.apache.skywalking.oap.server.storage.plugin.zipkin.ZipkinSpanRecord")) {
+                // SKIP ZipkinSpanRecord
+                return new IRecordDAO() {
+                    @Override
+                    public InsertRequest prepareBatchInsert(Model model, Record record) throws IOException {
+                        return new InsertRequest() {
+                        };
+                    }
+                };
+            }
+        } catch (NoSuchMethodException ex) {
+            log.error("fail to get declared method");
+        }
         return new BanyanDBRecordDAO<>((BanyanDBStorageDataBuilder<Record>) storageBuilder);
     }
 
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBTopologyQueryDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBTopologyQueryDAO.java
new file mode 100644
index 0000000000..f574e9b24a
--- /dev/null
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBTopologyQueryDAO.java
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.storage.plugin.banyandb.stream;
+
+import org.apache.skywalking.oap.server.core.UnexpectedException;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint.EndpointRelationServerSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.instance.ServiceInstanceRelationClientSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.instance.ServiceInstanceRelationServerSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.service.ServiceRelationClientSideMetrics;
+import org.apache.skywalking.oap.server.core.analysis.manual.relation.service.ServiceRelationServerSideMetrics;
+import org.apache.skywalking.oap.server.core.query.type.Call;
+import org.apache.skywalking.oap.server.core.source.DetectPoint;
+import org.apache.skywalking.oap.server.core.storage.query.ITopologyQueryDAO;
+import org.apache.skywalking.oap.server.library.util.CollectionUtils;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageClient;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class BanyanDBTopologyQueryDAO extends AbstractBanyanDBDAO implements ITopologyQueryDAO {
+    public BanyanDBTopologyQueryDAO(BanyanDBStorageClient client) {
+        super(client);
+    }
+
+    @Override
+    public List<Call.CallDetail> loadServiceRelationsDetectedAtServerSide(long startTB, long endTB, List<String> serviceIds) throws IOException {
+        if (CollectionUtils.isEmpty(serviceIds)) {
+            throw new UnexpectedException("Service id is empty");
+        }
+
+        return loadServiceCalls(
+                ServiceRelationServerSideMetrics.INDEX_NAME, startTB, endTB,
+                ServiceRelationServerSideMetrics.SOURCE_SERVICE_ID,
+                ServiceRelationServerSideMetrics.DEST_SERVICE_ID, serviceIds, DetectPoint.SERVER
+        );
+    }
+
+    @Override
+    public List<Call.CallDetail> loadServiceRelationDetectedAtClientSide(long startTB, long endTB, List<String> serviceIds) throws IOException {
+        if (CollectionUtils.isEmpty(serviceIds)) {
+            throw new UnexpectedException("Service id is empty");
+        }
+
+        return loadServiceCalls(
+                ServiceRelationClientSideMetrics.INDEX_NAME, startTB, endTB,
+                ServiceRelationClientSideMetrics.SOURCE_SERVICE_ID,
+                ServiceRelationClientSideMetrics.DEST_SERVICE_ID, serviceIds, DetectPoint.CLIENT
+        );
+    }
+
+    @Override
+    public List<Call.CallDetail> loadServiceRelationsDetectedAtServerSide(long startTB, long endTB) throws IOException {
+        return loadServiceCalls(
+                ServiceRelationServerSideMetrics.INDEX_NAME, startTB, endTB,
+                ServiceRelationServerSideMetrics.SOURCE_SERVICE_ID,
+                ServiceRelationServerSideMetrics.DEST_SERVICE_ID, new ArrayList<>(0), DetectPoint.SERVER
+        );
+    }
+
+    @Override
+    public List<Call.CallDetail> loadServiceRelationDetectedAtClientSide(long startTB, long endTB) throws IOException {
+        return loadServiceCalls(
+                ServiceRelationClientSideMetrics.INDEX_NAME, startTB, endTB,
+                ServiceRelationClientSideMetrics.SOURCE_SERVICE_ID,
+                ServiceRelationClientSideMetrics.DEST_SERVICE_ID, new ArrayList<>(0), DetectPoint.CLIENT
+        );
+    }
+
+    @Override
+    public List<Call.CallDetail> loadInstanceRelationDetectedAtServerSide(String clientServiceId, String serverServiceId, long startTB, long endTB) throws IOException {
+        return loadServiceInstanceCalls(
+                ServiceInstanceRelationServerSideMetrics.INDEX_NAME, startTB, endTB,
+                ServiceInstanceRelationServerSideMetrics.SOURCE_SERVICE_ID,
+                ServiceInstanceRelationServerSideMetrics.DEST_SERVICE_ID, clientServiceId, serverServiceId,
+                DetectPoint.SERVER
+        );
+    }
+
+    @Override
+    public List<Call.CallDetail> loadInstanceRelationDetectedAtClientSide(String clientServiceId, String serverServiceId, long startTB, long endTB) throws IOException {
+        return loadServiceInstanceCalls(
+                ServiceInstanceRelationClientSideMetrics.INDEX_NAME, startTB, endTB,
+                ServiceInstanceRelationClientSideMetrics.SOURCE_SERVICE_ID,
+                ServiceInstanceRelationClientSideMetrics.DEST_SERVICE_ID, clientServiceId, serverServiceId,
+                DetectPoint.CLIENT
+        );
+    }
+
+    @Override
+    public List<Call.CallDetail> loadEndpointRelation(long startTB, long endTB, String destEndpointId) throws IOException {
+        List<Call.CallDetail> calls = loadEndpointFromSide(
+                EndpointRelationServerSideMetrics.INDEX_NAME, startTB, endTB,
+                EndpointRelationServerSideMetrics.SOURCE_ENDPOINT,
+                EndpointRelationServerSideMetrics.DEST_ENDPOINT, destEndpointId, false
+        );
+        calls.addAll(
+                loadEndpointFromSide(EndpointRelationServerSideMetrics.INDEX_NAME, startTB, endTB,
+                        EndpointRelationServerSideMetrics.SOURCE_ENDPOINT,
+                        EndpointRelationServerSideMetrics.DEST_ENDPOINT, destEndpointId, true
+                ));
+        return calls;
+    }
+
+    private List<Call.CallDetail> loadServiceCalls(String tableName,
+                                                   long startTB,
+                                                   long endTB,
+                                                   String sourceCName,
+                                                   String destCName,
+                                                   List<String> serviceIds,
+                                                   DetectPoint detectPoint) throws IOException {
+        // TODO: we will impl this method after we support `OR`
+        return Collections.emptyList();
+    }
+
+    private List<Call.CallDetail> loadServiceInstanceCalls(String tableName,
+                                                           long startTB,
+                                                           long endTB,
+                                                           String sourceCName,
+                                                           String descCName,
+                                                           String sourceServiceId,
+                                                           String destServiceId,
+                                                           DetectPoint detectPoint) throws IOException {
+        // TODO: we will impl this method after we support `OR`
+        return Collections.emptyList();
+    }
+
+    private List<Call.CallDetail> loadEndpointFromSide(String tableName,
+                                                       long startTB,
+                                                       long endTB,
+                                                       String sourceCName,
+                                                       String destCName,
+                                                       String id,
+                                                       boolean isSourceId) throws IOException {
+        // TODO: we will impl this method after we support `OR`
+        return Collections.emptyList();
+    }
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBUITemplateManagementDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBUITemplateManagementDAO.java
index 1d9f977b0a..7888b0f56e 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBUITemplateManagementDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBUITemplateManagementDAO.java
@@ -35,6 +35,7 @@ import org.apache.skywalking.oap.server.library.util.BooleanUtils;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageClient;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -79,7 +80,7 @@ public class BanyanDBUITemplateManagementDAO extends AbstractBanyanDBDAO impleme
                 .dataTag(Tag.stringField(uiTemplate.getConfiguration()))
                 // data - activated
                 .dataTag(Tag.longField(uiTemplate.getActivated()))
-                .timestamp(1L)
+                .timestamp(Instant.now().toEpochMilli())
                 .elementId(uiTemplate.id())
                 .build();
         getClient().write(request);
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
index 662cff2eac..d1b85c2be2 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
@@ -1,7 +1,6 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_db.instance",
     "group": "default"
   },
   "tags": [
@@ -10,4 +9,4 @@
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.type.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.type.json
index 662cff2eac..479751ba13 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.type.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_db.type",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "db.type"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/duration.json
similarity index 61%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/duration.json
index 662cff2eac..9ae7387089 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/duration.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_duration",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "duration"
   ],
-  "type": "TYPE_INVERTED",
+  "type": "TYPE_TREE",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/endpoint_id.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/endpoint_id.json
index 662cff2eac..ca368266a8 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/endpoint_id.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_endpoint_id",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "endpoint_id"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/http.method.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/http.method.json
index 662cff2eac..3b5794ec09 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/http.method.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_http.method",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "http.method"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.broker.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.broker.json
index 662cff2eac..4dca9074a5 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.broker.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_mq.broker",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "mq.broker"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.queue.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.queue.json
index 662cff2eac..1b3126e056 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.queue.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_mq.queue",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "mq.queue"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.topic.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.topic.json
index 662cff2eac..ddae44b1a1 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/mq.topic.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_mq.topic",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "mq.topic"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/status_code.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/status_code.json
index 662cff2eac..3e472a1669 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/status_code.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "segment_status_code",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "status_code"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/trace_id.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/trace_id.json
new file mode 100644
index 0000000000..3ac579999c
--- /dev/null
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/trace_id.json
@@ -0,0 +1,12 @@
+{
+  "metadata": {
+    "name": "segment_trace_id",
+    "group": "default"
+  },
+  "tags": [
+    "trace_id"
+  ],
+  "type": "TYPE_TREE",
+  "location": "LOCATION_GLOBAL",
+  "updated_at": "2021-04-15T01:30:15.01Z"
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/ui_template/disabled.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/ui_template/disabled.json
index 662cff2eac..9146c34d11 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/ui_template/disabled.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "ui_template_disabled",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "disabled"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/ui_template/name.json
similarity index 73%
copy from oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
copy to oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/ui_template/name.json
index 662cff2eac..067ca7f123 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/segment/db.instance.json
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/index_rules/ui_template/name.json
@@ -1,13 +1,12 @@
 {
   "metadata": {
-    "id": 1,
-    "name": "db.instance",
+    "name": "ui_template_name",
     "group": "default"
   },
   "tags": [
-    "db.instance"
+    "name"
   ],
   "type": "TYPE_INVERTED",
   "location": "LOCATION_SERIES",
   "updated_at": "2021-04-15T01:30:15.01Z"
-}
\ No newline at end of file
+}
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/ui_template.json b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/ui_template.json
new file mode 100644
index 0000000000..e2a404ff5f
--- /dev/null
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/resources/metadata/ui_template.json
@@ -0,0 +1,50 @@
+{
+  "metadata": {
+    "name": "ui_template",
+    "group": "default"
+  },
+  "tag_families": [
+    {
+      "name": "data",
+      "tags": [
+        {
+          "name": "type",
+          "type": "TAG_TYPE_STRING"
+        },
+        {
+          "name": "configuration",
+          "type": "TAG_TYPE_STRING"
+        },
+        {
+          "name": "activated",
+          "type": "TAG_TYPE_INT"
+        }
+      ]
+    },
+    {
+      "name": "searchable",
+      "tags": [
+        {
+          "name": "name",
+          "type": "TAG_TYPE_STRING"
+        },
+        {
+          "name": "disabled",
+          "type": "TAG_TYPE_INT"
+        }
+      ]
+    }
+  ],
+  "entity": {
+    "tag_names": [
+    ]
+  },
+  "opts": {
+    "shard_num": 2,
+    "ttl": {
+      "val": 52000,
+      "unit": "DURATION_UNIT_WEEK"
+    }
+  },
+  "updated_at_nanoseconds": "2021-04-15T01:30:15.01Z"
+}
\ No newline at end of file