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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new f7da99d632 Add more model installation log info for OAP storage 
initialization. (#13094)
f7da99d632 is described below

commit f7da99d6324b44bfdd5d83915512245887d5f827
Author: Wan Kai <[email protected]>
AuthorDate: Mon Mar 10 11:01:32 2025 +0800

    Add more model installation log info for OAP storage initialization. 
(#13094)
---
 docs/en/changes/changes.md                         |  3 +-
 .../server/core/storage/model/ModelInstaller.java  | 60 ++++++++++++++++-----
 .../plugin/banyandb/BanyanDBIndexInstaller.java    | 62 +++++++++++++++++++---
 .../elasticsearch/base/StorageEsInstaller.java     | 59 ++++++++++++++++++--
 .../plugin/jdbc/common/JDBCTableInstaller.java     | 41 ++++++++++++--
 5 files changed, 194 insertions(+), 31 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 4e4272b310..fa05f8d7f2 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -77,7 +77,8 @@
 * Optimize metrics cache loading when trace latency greater than cache 
timeout. 
 * Allow calling `lang.groovy.GString` in DSL.
 * BanyanDB: fix alarm query result without sort. 
-* Add a component ID for Virtual thread executor
+* Add a component ID for Virtual thread executor.
+* Add more model installation log info for OAP storage initialization.
 
 #### UI
 
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
index 5c67abb498..016b90b325 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/ModelInstaller.java
@@ -18,7 +18,9 @@
 
 package org.apache.skywalking.oap.server.core.storage.model;
 
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.RunningMode;
@@ -38,20 +40,29 @@ public abstract class ModelInstaller implements 
ModelCreator.CreatingListener {
     @Override
     public void whenCreating(Model model) throws StorageException {
         if (RunningMode.isNoInitMode()) {
-            while (!isExists(model)) {
-                try {
-                    log.info(
-                        "table: {} does not exist. OAP is running in 'no-init' 
mode, waiting... retry 3s later.",
-                        model.getName()
-                    );
-                    Thread.sleep(3000L);
-                } catch (InterruptedException e) {
-                    log.error(e.getMessage());
+            while (true) {
+                InstallInfo info = isExists(model);
+                if (!info.isAllExist()) {
+                    try {
+                        log.info(
+                            "install info: {}.table for model: [{}] not all 
required resources exist. OAP is running in 'no-init' mode, waiting create or 
update... retry 3s later.",
+                            info.buildInstallInfoMsg(), model.getName()
+                        );
+                        Thread.sleep(3000L);
+                    } catch (InterruptedException e) {
+                        log.error(e.getMessage());
+                    }
+                } else {
+                    break;
                 }
             }
         } else {
-            if (!isExists(model)) {
-                log.info("table: {} does not exist", model.getName());
+            InstallInfo info = isExists(model);
+            if (!info.isAllExist()) {
+                log.info(
+                    "install info: {}. table for model: [{}] not all required 
resources exist, creating or updating...",
+                    info.buildInstallInfoMsg(), model.getName()
+                );
                 createTable(model);
             }
         }
@@ -74,10 +85,35 @@ public abstract class ModelInstaller implements 
ModelCreator.CreatingListener {
     /**
      * Check whether the storage entity exists. Need to implement based on the 
real storage.
      */
-    public abstract boolean isExists(Model model) throws StorageException;
+    public abstract InstallInfo isExists(Model model) throws StorageException;
 
     /**
      * Create the storage entity. All creations should be after the {@link 
#isExists(Model)} check.
      */
     public abstract void createTable(Model model) throws StorageException;
+
+    @Getter
+    @Setter
+    public abstract static class InstallInfo {
+        private final String modelName;
+        private final boolean timeSeries;
+        private final boolean superDataset;
+        private final String modelType;
+        private boolean allExist;
+
+        protected InstallInfo(Model model) {
+            this.modelName = model.getName();
+            this.timeSeries = model.isTimeSeries();
+            this.superDataset = model.isSuperDataset();
+            if (model.isMetric()) {
+                this.modelType = "metric";
+            } else if (model.isRecord()) {
+                this.modelType = "record";
+            } else {
+                this.modelType = "unknown";
+            }
+        }
+
+        public abstract String buildInstallInfoMsg();
+    }
 }
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 12ad68f420..806903b99f 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
@@ -25,6 +25,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
+import lombok.Getter;
+import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.banyandb.common.v1.BanyandbCommon;
 import org.apache.skywalking.banyandb.common.v1.BanyandbCommon.Group;
@@ -41,6 +43,7 @@ import 
org.apache.skywalking.banyandb.v1.client.metadata.MetadataCache;
 import org.apache.skywalking.banyandb.v1.client.metadata.ResourceExist;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.RunningMode;
+import org.apache.skywalking.oap.server.core.analysis.DownSampling;
 import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.model.Model;
@@ -62,21 +65,31 @@ public class BanyanDBIndexInstaller extends ModelInstaller {
     }
 
     @Override
-    public boolean isExists(Model model) throws StorageException {
+    public InstallInfo isExists(Model model) throws StorageException {
+        InstallInfoBanyanDB installInfo = new InstallInfoBanyanDB(model);
+        installInfo.setDownSampling(model.getDownsampling());
         if (!model.isTimeSeries()) {
-            return true;
+            installInfo.setTableName(model.getName());
+            installInfo.setAllExist(true);
+            return installInfo;
         }
         final DownSamplingConfigService downSamplingConfigService = 
moduleManager.find(CoreModule.NAME)
                                                          .provider()
                                                          
.getService(DownSamplingConfigService.class);
         final MetadataRegistry.SchemaMetadata metadata = 
MetadataRegistry.INSTANCE.parseMetadata(
             model, config, downSamplingConfigService);
+        installInfo.setTableName(metadata.name());
+        installInfo.setKind(metadata.getKind());
+        installInfo.setGroup(metadata.getGroup());
         try {
             final BanyanDBClient c = ((BanyanDBStorageClient) 
this.client).client;
             // first check resource existence and create group if necessary
-            final boolean resourceExist = checkResourceExistence(metadata, c);
-            if (!resourceExist) {
-                return false;
+            final ResourceExist resourceExist = 
checkResourceExistence(metadata, c);
+            installInfo.setGroupExist(resourceExist.hasGroup());
+            installInfo.setTableExist(resourceExist.hasResource());
+            if (!resourceExist.hasResource()) {
+                installInfo.setAllExist(false);
+                return installInfo;
             } else {
                 // register models only locally(Schema cache) but not remotely
                 if (model.isRecord()) { // stream
@@ -108,7 +121,8 @@ public class BanyanDBIndexInstaller extends ModelInstaller {
                 if (remoteMeta == null) {
                     throw new IllegalStateException("inconsistent state: 
metadata:" + metadata + ", remoteMeta: null");
                 }
-                return true;
+                installInfo.setAllExist(true);
+                return installInfo;
             }
         } catch (BanyanDBException ex) {
             throw new StorageException("fail to check existence", ex);
@@ -206,7 +220,7 @@ public class BanyanDBIndexInstaller extends ModelInstaller {
             || g.getResourceOpts().getTtl().getNum() != metadata.getTtlDays();
     }
 
-    private boolean checkResourceExistence(MetadataRegistry.SchemaMetadata 
metadata,
+    private ResourceExist 
checkResourceExistence(MetadataRegistry.SchemaMetadata metadata,
                                            BanyanDBClient client) throws 
BanyanDBException {
         ResourceExist resourceExist;
         Group.Builder gBuilder
@@ -265,7 +279,7 @@ public class BanyanDBIndexInstaller extends ModelInstaller {
                 groupAligned.add(metadata.getGroup());
             }
         }
-        return resourceExist.hasResource();
+        return resourceExist;
     }
 
     /**
@@ -559,4 +573,36 @@ public class BanyanDBIndexInstaller extends ModelInstaller 
{
             }
         }
     }
+
+    @Getter
+    @Setter
+    private static class InstallInfoBanyanDB extends InstallInfo {
+        private DownSampling downSampling;
+        private String tableName;
+        private MetadataRegistry.Kind kind;
+        private String group;
+        private boolean tableExist;
+        private boolean groupExist;
+
+        protected InstallInfoBanyanDB(Model model) {
+            super(model);
+        }
+
+        @Override
+        public String buildInstallInfoMsg() {
+            return "InstallInfoBanyanDB{" +
+                "modelName=" + getModelName() +
+                ", modelType=" + getModelType() +
+                ", timeSeries=" + isTimeSeries() +
+                ", superDataset=" + isSuperDataset() +
+                ", downSampling=" + downSampling.name() +
+                ", tableName=" + tableName +
+                ", kind=" + kind.name() +
+                ", group=" + group +
+                ", allResourcesExist=" + isAllExist() +
+                " [groupExist=" + groupExist +
+                ", tableExist=" + tableExist +
+                "]}";
+        }
+    }
 }
diff --git 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
index 7024929332..7d0a577621 100644
--- 
a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
+++ 
b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/base/StorageEsInstaller.java
@@ -21,6 +21,7 @@ package 
org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.base.Strings;
 import com.google.gson.Gson;
+import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.library.elasticsearch.response.Index;
@@ -81,12 +82,15 @@ public class StorageEsInstaller extends ModelInstaller {
     }
 
     @Override
-    public boolean isExists(Model model) throws StorageException {
+    public InstallInfo isExists(Model model) throws StorageException {
+        InstallInfoES installInfo = new InstallInfoES(model, config);
         ElasticSearchClient esClient = (ElasticSearchClient) client;
         String tableName = IndexController.INSTANCE.getTableName(model);
         IndexController.LogicIndicesRegister.registerRelation(model, 
tableName);
+        installInfo.setTableName(esClient.formatIndexName(tableName));
         if (!model.isTimeSeries()) {
             boolean exist = esClient.isExistsIndex(tableName);
+            installInfo.setTableExist(exist);
             if (exist) {
                 Optional<Index> index = esClient.getIndex(tableName);
                 Mappings historyMapping = 
index.map(Index::getMappings).orElseGet(Mappings::new);
@@ -97,15 +101,21 @@ public class StorageEsInstaller extends ModelInstaller {
                     // or updating field types, it just cares about whether 
the data can be ingested without
                     // reporting errors.
                     exist = structures.containsFieldNames(tableName, 
createMapping(model));
+                    installInfo.setAllFieldsExist(exist);
                 } else {
                     boolean containsMapping = 
structures.containsMapping(tableName, createMapping(model));
-                    exist = containsMapping && 
structures.compareIndexSetting(tableName, createSetting(model));
+                    installInfo.setAllFieldsExist(containsMapping);
+                    boolean containsSetting = 
structures.compareIndexSetting(tableName, createSetting(model));
+                    installInfo.setAllIndexSettingsExist(containsSetting);
+                    exist = containsMapping && containsSetting;
                 }
             }
-            return exist;
+            installInfo.setAllExist(exist);
+            return installInfo;
         }
 
         boolean templateExists = esClient.isExistsTemplate(tableName);
+        installInfo.setTableExist(templateExists);
         final Optional<IndexTemplate> template = 
esClient.getTemplate(tableName);
 
         if ((templateExists && template.isEmpty()) || (!templateExists && 
template.isPresent())) {
@@ -123,12 +133,17 @@ public class StorageEsInstaller extends ModelInstaller {
             // because the no-init mode OAP server doesn't take responsibility 
for index settings.
             if (RunningMode.isNoInitMode()) {
                 exist = structures.containsFieldNames(tableName, 
createMapping(model));
+                installInfo.setAllFieldsExist(exist);
             } else {
                 boolean containsMapping = 
structures.containsMapping(tableName, createMapping(model));
-                exist = containsMapping && 
structures.compareIndexSetting(tableName, createSetting(model));
+                installInfo.setAllFieldsExist(containsMapping);
+                boolean containsSetting = 
structures.compareIndexSetting(tableName, createSetting(model));
+                installInfo.setAllIndexSettingsExist(containsSetting);
+                exist = containsMapping && containsSetting;
             }
         }
-        return exist;
+        installInfo.setAllExist(exist);
+        return installInfo;
     }
 
     @Override
@@ -373,4 +388,38 @@ public class StorageEsInstaller extends ModelInstaller {
 
         return mappings;
     }
+
+    @Getter
+    @Setter
+    public static class InstallInfoES extends InstallInfo {
+        private String tableName;
+        private boolean tableExist;
+        private boolean allFieldsExist;
+        private boolean allIndexSettingsExist;
+        private StorageModuleElasticsearchConfig config;
+
+        protected InstallInfoES(Model model, StorageModuleElasticsearchConfig 
config) {
+            super(model);
+            this.config = config;
+        }
+
+        @Override
+        public String buildInstallInfoMsg() {
+            String tableNameMsg = isTimeSeries() ? "indexTemplateName=" + 
tableName : "indexName=" + tableName;
+            String tableExistMsg = isTimeSeries() ? "indexTemplateExists=" + 
tableExist : "indexExists=" + tableExist;
+            return "InstallInfoES:{" +
+                "modelName=" + getModelName() +
+                ", modelType=" + getModelType() +
+                ", timeSeries=" + isTimeSeries() +
+                ", superDataset=" + isSuperDataset() +
+                ", logicSharding=" + config.isLogicSharding() +
+                ", indexNamespace=" + config.getNamespace() +
+                ", " + tableNameMsg +
+                ", allResourcesExist=" + isAllExist() +
+                " [" + tableExistMsg +
+                ", allFieldsExist=" + allFieldsExist +
+                ", allIndexSettingsExist=" + allIndexSettingsExist +
+                "]}";
+        }
+    }
 }
diff --git 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/JDBCTableInstaller.java
 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/JDBCTableInstaller.java
index c41eb58363..d6560cf6f5 100644
--- 
a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/JDBCTableInstaller.java
+++ 
b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/JDBCTableInstaller.java
@@ -19,6 +19,8 @@
 package org.apache.skywalking.oap.server.storage.plugin.jdbc.common;
 
 import com.google.gson.JsonObject;
+import lombok.Getter;
+import lombok.Setter;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.skywalking.oap.server.core.analysis.DownSampling;
@@ -64,14 +66,16 @@ public class JDBCTableInstaller extends ModelInstaller {
 
     @Override
     @SneakyThrows
-    public boolean isExists(Model model) {
+    public InstallInfo isExists(Model model) {
+        InstallInfoJDBC installInfo = new InstallInfoJDBC(model);
         TableMetaInfo.addModel(model);
 
         final var table = TableHelper.getLatestTableForWrite(model);
-
+        installInfo.setTableName(table);
         final var jdbcClient = (JDBCClient) client;
         if (!jdbcClient.tableExists(table)) {
-            return false;
+            installInfo.setAllExist(false);
+            return installInfo;
         }
 
         final var databaseColumns = getDatabaseColumns(table);
@@ -81,8 +85,9 @@ public class JDBCTableInstaller extends ModelInstaller {
                 .map(ModelColumn::getColumnName)
                 .map(ColumnName::getStorageName)
                 .anyMatch(not(databaseColumns::contains));
-
-        return !isAnyColumnNotCreated;
+        installInfo.setAllColumnsExist(isAnyColumnNotCreated);
+        installInfo.setAllExist(!isAnyColumnNotCreated);
+        return installInfo;
     }
 
     @Override
@@ -277,4 +282,30 @@ public class JDBCTableInstaller extends ModelInstaller {
 
         executeSQL(sql);
     }
+
+    @Getter
+    @Setter
+    private static class InstallInfoJDBC extends InstallInfo {
+        private String tableName;
+        private boolean tableExist;
+        private boolean allColumnsExist;
+
+        protected InstallInfoJDBC(Model model) {
+            super(model);
+        }
+
+        @Override
+        public String buildInstallInfoMsg() {
+            return "InstallInfoJDBC{" +
+                "modelName=" + getModelName() +
+                ", modelType=" + getModelType() +
+                ", timeSeries=" + isTimeSeries() +
+                ", superDataset=" + isSuperDataset() +
+                ", tableName=" + tableName +
+                ", allResourcesExist=" + isAllExist() +
+                " [tableExist=" + tableExist +
+                ", allColumnsExist=" + allColumnsExist +
+                "]}";
+        }
+    }
 }

Reply via email to