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/22 03:24:43 UTC

[skywalking] 22/22: support UI Template

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 f54cafb0b6dce8c1707c8165d38b5b9b07b3b9af
Author: Megrez Lu <lu...@gmail.com>
AuthorDate: Fri Apr 22 11:18:03 2022 +0800

    support UI Template
---
 .../plugin/banyandb/BanyanDBIndexInstaller.java    |   4 +-
 .../plugin/banyandb/BanyanDBManagementDAO.java     |   4 +-
 .../plugin/banyandb/BanyanDBStorageClient.java     |  60 +++++++++++-
 .../plugin/banyandb/BanyanDBStorageProvider.java   |   2 +-
 .../measure/BanyanDBUITemplateManagementDAO.java   | 108 +++++++++++++++++++--
 .../banyandb/stream/AbstractBanyanDBDAO.java       |   7 +-
 6 files changed, 163 insertions(+), 22 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/BanyanDBIndexInstaller.java
index d894c9990a..32f3480769 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
@@ -31,6 +31,8 @@ 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 java.io.IOException;
+
 @Slf4j
 public class BanyanDBIndexInstaller extends ModelInstaller {
     private final ConfigService configService;
@@ -75,7 +77,7 @@ public class BanyanDBIndexInstaller extends ModelInstaller {
             } else if (!model.isTimeSeries()) { // UITemplate
                 log.info("skip property index {}", model.getName());
             }
-        } catch (BanyanDBException ex) {
+        } catch (IOException ex) {
             throw new StorageException("fail to install schema", ex);
         }
     }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBManagementDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBManagementDAO.java
index 080bf4577a..44a5f91874 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBManagementDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/BanyanDBManagementDAO.java
@@ -1,6 +1,7 @@
 package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.analysis.management.ManagementData;
 import org.apache.skywalking.oap.server.core.storage.IManagementDAO;
 import org.apache.skywalking.oap.server.core.storage.model.Model;
@@ -9,12 +10,13 @@ import org.apache.skywalking.oap.server.core.storage.type.StorageBuilder;
 import java.io.IOException;
 
 @RequiredArgsConstructor
+@Slf4j
 public class BanyanDBManagementDAO implements IManagementDAO {
     private final BanyanDBStorageClient client;
     private final StorageBuilder<ManagementData> storageBuilder;
 
     @Override
     public void insert(Model model, ManagementData storageData) throws IOException {
-
+        log.info("insert Model {}", model);
     }
 }
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 dd92c6fd08..2df53a2ed9 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
@@ -18,12 +18,14 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb;
 
+import io.grpc.Status;
 import org.apache.skywalking.banyandb.v1.client.BanyanDBClient;
 import org.apache.skywalking.banyandb.v1.client.StreamBulkWriteProcessor;
 import org.apache.skywalking.banyandb.v1.client.StreamQuery;
 import org.apache.skywalking.banyandb.v1.client.StreamQueryResponse;
 import org.apache.skywalking.banyandb.v1.client.StreamWrite;
 import org.apache.skywalking.banyandb.v1.client.grpc.exception.BanyanDBException;
+import org.apache.skywalking.banyandb.v1.client.metadata.Property;
 import org.apache.skywalking.banyandb.v1.client.metadata.Stream;
 import org.apache.skywalking.oap.server.library.client.Client;
 import org.apache.skywalking.oap.server.library.client.healthcheck.DelegatedHealthChecker;
@@ -31,6 +33,8 @@ 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.util.Collections;
+import java.util.List;
 
 /**
  * BanyanDBStorageClient is a simple wrapper for the underlying {@link BanyanDBClient},
@@ -54,19 +58,67 @@ public class BanyanDBStorageClient implements Client, HealthCheckable {
         this.client.close();
     }
 
-    public StreamQueryResponse query(StreamQuery streamQuery) throws BanyanDBException {
+    public List<Property> listProperties(String group, String name) throws IOException {
+        try {
+            List<Property> properties = this.client.findProperties(group, name);
+            this.healthChecker.health();
+            return properties;
+        } catch (BanyanDBException ex) {
+            if (ex.getStatus().equals(Status.Code.NOT_FOUND)) {
+                this.healthChecker.health();
+                return Collections.emptyList();
+            }
+
+            healthChecker.unHealth(ex);
+            throw new IOException("fail to list properties", ex);
+        }
+    }
+
+    public Property queryProperty(String group, String name, String id) throws IOException {
+        try {
+            Property p = this.client.findProperty(group, name, id);
+            this.healthChecker.health();
+            return p;
+        } catch (BanyanDBException ex) {
+            if (ex.getStatus().equals(Status.Code.NOT_FOUND)) {
+                this.healthChecker.health();
+                return null;
+            }
+
+            healthChecker.unHealth(ex);
+            throw new IOException("fail to query property", ex);
+        }
+    }
+
+    public StreamQueryResponse query(StreamQuery streamQuery) throws IOException {
         try {
             StreamQueryResponse response = this.client.query(streamQuery);
             this.healthChecker.health();
             return response;
         } catch (BanyanDBException ex) {
             healthChecker.unHealth(ex);
-            throw ex;
+            throw new IOException("fail to query stream", ex);
+        }
+    }
+
+    public void define(Property property) throws IOException {
+        try {
+            this.client.save(property);
+            this.healthChecker.health();
+        } catch (BanyanDBException ex) {
+            healthChecker.unHealth(ex);
+            throw new IOException("fail to define property", ex);
         }
     }
 
-    public void define(Stream stream) throws BanyanDBException {
-        this.client.define(stream);
+    public void define(Stream stream) throws IOException {
+        try {
+            this.client.define(stream);
+            this.healthChecker.health();
+        } catch (BanyanDBException ex) {
+            healthChecker.unHealth(ex);
+            throw new IOException("fail to define stream", ex);
+        }
     }
 
     public void write(StreamWrite streamWrite) {
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 88a81d3372..26c0e8d501 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
@@ -115,7 +115,7 @@ public class BanyanDBStorageProvider extends ModuleProvider {
         this.registerServiceImplementation(IProfileTaskQueryDAO.class, new BanyanDBProfileTaskQueryDAO());
         this.registerServiceImplementation(IProfileTaskLogQueryDAO.class, new BanyanDBProfileTaskLogQueryDAO(client, this.config.getFetchTaskLogMaxSize()));
         this.registerServiceImplementation(IProfileThreadSnapshotQueryDAO.class, new BanyanDBProfileThreadSnapshotQueryDAO(client));
-        this.registerServiceImplementation(UITemplateManagementDAO.class, new BanyanDBUITemplateManagementDAO());
+        this.registerServiceImplementation(UITemplateManagementDAO.class, new BanyanDBUITemplateManagementDAO(client));
         this.registerServiceImplementation(IEventQueryDAO.class, new BanyanDBEventQueryDAO());
         this.registerServiceImplementation(ITopologyQueryDAO.class, new BanyanDBTopologyQueryDAO());
         this.registerServiceImplementation(IEBPFProfilingTaskDAO.class, new BanyanDBEBPFProfilingTaskDAO());
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBUITemplateManagementDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBUITemplateManagementDAO.java
index efbd9ce106..dba7844413 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBUITemplateManagementDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/measure/BanyanDBUITemplateManagementDAO.java
@@ -18,38 +18,128 @@
 
 package org.apache.skywalking.oap.server.storage.plugin.banyandb.measure;
 
+import lombok.extern.slf4j.Slf4j;
+import org.apache.skywalking.banyandb.v1.client.TagAndValue;
+import org.apache.skywalking.banyandb.v1.client.metadata.Property;
+import org.apache.skywalking.oap.server.core.management.ui.template.UITemplate;
 import org.apache.skywalking.oap.server.core.query.input.DashboardSetting;
 import org.apache.skywalking.oap.server.core.query.type.DashboardConfiguration;
 import org.apache.skywalking.oap.server.core.query.type.TemplateChangeStatus;
 import org.apache.skywalking.oap.server.core.storage.management.UITemplateManagementDAO;
+import org.apache.skywalking.oap.server.library.util.BooleanUtils;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageClient;
+import org.apache.skywalking.oap.server.storage.plugin.banyandb.stream.AbstractBanyanDBDAO;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class BanyanDBUITemplateManagementDAO extends AbstractBanyanDBDAO implements UITemplateManagementDAO {
+    private static final String GROUP = "sw";
+
+    public BanyanDBUITemplateManagementDAO(BanyanDBStorageClient client) {
+        super(client);
+    }
 
-public class BanyanDBUITemplateManagementDAO implements UITemplateManagementDAO {
     @Override
     public DashboardConfiguration getTemplate(String id) throws IOException {
-        return null;
+        Property p = getClient().queryProperty(GROUP, UITemplate.INDEX_NAME, id);
+        if (p == null) {
+            return null;
+        }
+        return fromEntity(parse(p));
     }
 
     @Override
     public List<DashboardConfiguration> getAllTemplates(Boolean includingDisabled) throws IOException {
-        return Collections.emptyList();
+        List<Property> propertyList = getClient().listProperties(GROUP, UITemplate.INDEX_NAME);
+        return propertyList.stream().map(p -> fromEntity(parse(p)))
+                .filter(conf -> includingDisabled || !conf.isDisabled())
+                .collect(Collectors.toList());
     }
 
     @Override
-    public TemplateChangeStatus addTemplate(DashboardSetting setting) throws IOException {
-        return null;
+    public TemplateChangeStatus addTemplate(DashboardSetting setting) {
+        Property newTemplate = convert(setting.toEntity());
+        try {
+            this.getClient().define(newTemplate);
+            return TemplateChangeStatus.builder()
+                    .status(true)
+                    .id(newTemplate.id())
+                    .build();
+        } catch (IOException ioEx) {
+            log.error("fail to add new template", ioEx);
+            return TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't add a new template")
+                    .build();
+        }
     }
 
     @Override
-    public TemplateChangeStatus changeTemplate(DashboardSetting setting) throws IOException {
-        return null;
+    public TemplateChangeStatus changeTemplate(DashboardSetting setting) {
+        Property newTemplate = convert(setting.toEntity());
+        try {
+            this.getClient().define(newTemplate);
+            return TemplateChangeStatus.builder()
+                    .status(true)
+                    .id(newTemplate.id())
+                    .build();
+        } catch (IOException ioEx) {
+            log.error("fail to modify the template", ioEx);
+            return TemplateChangeStatus.builder().status(false).id(setting.getId()).message("Can't change an existed template")
+                    .build();
+        }
     }
 
     @Override
     public TemplateChangeStatus disableTemplate(String id) throws IOException {
-        return null;
+        Property oldProperty = this.getClient().queryProperty(GROUP, UITemplate.INDEX_NAME, id);
+        if (oldProperty == null) {
+            return TemplateChangeStatus.builder().status(false).id(id).message("Can't find the template")
+                    .build();
+        }
+        UITemplate uiTemplate = parse(oldProperty);
+        uiTemplate.setDisabled(BooleanUtils.FALSE);
+        try {
+            this.getClient().define(convert(uiTemplate));
+            return TemplateChangeStatus.builder()
+                    .status(true)
+                    .id(uiTemplate.id())
+                    .build();
+        } catch (IOException ioEx) {
+            log.error("fail to disable the template", ioEx);
+            return TemplateChangeStatus.builder().status(false).id(uiTemplate.id()).message("Can't disable the template")
+                    .build();
+        }
+    }
+
+    public DashboardConfiguration fromEntity(UITemplate uiTemplate) {
+        DashboardConfiguration conf = new DashboardConfiguration();
+        conf.fromEntity(uiTemplate);
+        return conf;
+    }
+
+    public UITemplate parse(Property property) {
+        UITemplate uiTemplate = new UITemplate();
+        uiTemplate.setTemplateId(property.id());
+
+        for (TagAndValue<?> tagAndValue : property.tags()) {
+            if (tagAndValue.getTagName().equals(UITemplate.CONFIGURATION)) {
+                uiTemplate.setConfiguration((String) tagAndValue.getValue());
+            } else if (tagAndValue.getTagName().equals(UITemplate.DISABLED)) {
+                uiTemplate.setDisabled(((Number) tagAndValue.getValue()).intValue());
+            } else if (tagAndValue.getTagName().equals(UITemplate.UPDATE_TIME)) {
+                uiTemplate.setUpdateTime(((Number) tagAndValue.getValue()).longValue());
+            }
+        }
+        return uiTemplate;
+    }
+
+    public Property convert(UITemplate uiTemplate) {
+        return Property.create(GROUP, UITemplate.INDEX_NAME, uiTemplate.id())
+                .addTag(TagAndValue.newStringTag(UITemplate.CONFIGURATION, uiTemplate.getConfiguration()))
+                .addTag(TagAndValue.newLongTag(UITemplate.DISABLED, uiTemplate.getDisabled()))
+                .addTag(TagAndValue.newLongTag(UITemplate.UPDATE_TIME, uiTemplate.getUpdateTime()))
+                .build();
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/AbstractBanyanDBDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/AbstractBanyanDBDAO.java
index c40ac35924..53e8cc4f80 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/AbstractBanyanDBDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/AbstractBanyanDBDAO.java
@@ -22,7 +22,6 @@ import org.apache.skywalking.banyandb.v1.client.PairQueryCondition;
 import org.apache.skywalking.banyandb.v1.client.StreamQuery;
 import org.apache.skywalking.banyandb.v1.client.StreamQueryResponse;
 import org.apache.skywalking.banyandb.v1.client.TimestampRange;
-import org.apache.skywalking.banyandb.v1.client.grpc.exception.BanyanDBException;
 import org.apache.skywalking.oap.server.core.storage.AbstractDAO;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.BanyanDBStorageClient;
 import org.apache.skywalking.oap.server.storage.plugin.banyandb.MetadataRegistry;
@@ -55,11 +54,7 @@ public abstract class AbstractBanyanDBDAO extends AbstractDAO<BanyanDBStorageCli
 
         builder.apply(query);
 
-        try {
-            return getClient().query(query);
-        } catch (BanyanDBException ex) {
-            throw new IOException(ex);
-        }
+        return getClient().query(query);
     }
 
     protected abstract static class QueryBuilder {