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

wenjun pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 3526b42df6 Add Server HealthIndicator (#15274)
3526b42df6 is described below

commit 3526b42df64428e5c2f3a15f12d63998fa49fd35
Author: Wenjun Ruan <[email protected]>
AuthorDate: Wed Feb 7 14:07:30 2024 +0800

    Add Server HealthIndicator (#15274)
---
 .../alert/metrics/AlertHealthIndicator.java        | 44 +++++++++++++++++++++
 .../alert/registry/AlertRegistryClient.java        |  4 ++
 .../api/metrics/ApiHealthIndicator.java            | 45 ++++++++++++++++++++++
 .../master/metrics/MasterHealthIndicator.java      | 44 +++++++++++++++++++++
 .../master/registry/MasterRegistryClient.java      |  3 ++
 .../dolphinscheduler/registry/api/Registry.java    |  2 +
 .../registry/api/RegistryClient.java               | 17 +++-----
 .../plugin/registry/etcd/EtcdRegistry.java         | 13 +++----
 .../plugin/registry/jdbc/JdbcOperator.java         |  1 -
 .../plugin/registry/jdbc/JdbcRegistry.java         |  6 +++
 .../registry/zookeeper/ZookeeperRegistry.java      |  5 +++
 .../worker/metrics/WorkerHealthIndicator.java      | 44 +++++++++++++++++++++
 .../worker/registry/WorkerRegistryClient.java      |  3 ++
 13 files changed, 212 insertions(+), 19 deletions(-)

diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/metrics/AlertHealthIndicator.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/metrics/AlertHealthIndicator.java
new file mode 100644
index 0000000000..f5dc95bcf6
--- /dev/null
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/metrics/AlertHealthIndicator.java
@@ -0,0 +1,44 @@
+/*
+ * 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.dolphinscheduler.alert.metrics;
+
+import org.apache.dolphinscheduler.alert.registry.AlertRegistryClient;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.HealthIndicator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AlertHealthIndicator implements HealthIndicator {
+
+    @Autowired
+    private AlertRegistryClient alertRegistryClient;
+
+    @Override
+    public Health health() {
+        try {
+            if (alertRegistryClient.isAvailable()) {
+                return Health.up().build();
+            }
+            return Health.down().build();
+        } catch (Exception ex) {
+            return Health.down().withException(ex).build();
+        }
+    }
+}
diff --git 
a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/registry/AlertRegistryClient.java
 
b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/registry/AlertRegistryClient.java
index cdb5e5eca8..616220bd1b 100644
--- 
a/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/registry/AlertRegistryClient.java
+++ 
b/dolphinscheduler-alert/dolphinscheduler-alert-server/src/main/java/org/apache/dolphinscheduler/alert/registry/AlertRegistryClient.java
@@ -58,4 +58,8 @@ public class AlertRegistryClient implements AutoCloseable {
         
registryClient.releaseLock(RegistryNodeType.ALERT_LOCK.getRegistryPath());
         log.info("AlertRegistryClient closed...");
     }
+
+    public boolean isAvailable() {
+        return registryClient.isConnected();
+    }
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/metrics/ApiHealthIndicator.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/metrics/ApiHealthIndicator.java
new file mode 100644
index 0000000000..87354d8339
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/metrics/ApiHealthIndicator.java
@@ -0,0 +1,45 @@
+/*
+ * 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.dolphinscheduler.api.metrics;
+
+import org.apache.dolphinscheduler.registry.api.RegistryClient;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.HealthIndicator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ApiHealthIndicator implements HealthIndicator {
+
+    @Autowired
+    private RegistryClient registryClient;
+
+    @Override
+    public Health health() {
+        try {
+            if (registryClient.isConnected()) {
+                return Health.up().build();
+            }
+            return Health.down().build();
+        } catch (Exception ex) {
+            return Health.down().withException(ex).build();
+        }
+    }
+
+}
diff --git 
a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/metrics/MasterHealthIndicator.java
 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/metrics/MasterHealthIndicator.java
new file mode 100644
index 0000000000..bdf80bd953
--- /dev/null
+++ 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/metrics/MasterHealthIndicator.java
@@ -0,0 +1,44 @@
+/*
+ * 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.dolphinscheduler.server.master.metrics;
+
+import org.apache.dolphinscheduler.server.master.registry.MasterRegistryClient;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.HealthIndicator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MasterHealthIndicator implements HealthIndicator {
+
+    @Autowired
+    private MasterRegistryClient masterRegistryClient;
+
+    @Override
+    public Health health() {
+        try {
+            if (masterRegistryClient.isAvailable()) {
+                return Health.up().build();
+            }
+            return Health.down().build();
+        } catch (Exception ex) {
+            return Health.down().withException(ex).build();
+        }
+    }
+}
diff --git 
a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistryClient.java
 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistryClient.java
index 054eb4770c..99731bbf0e 100644
--- 
a/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistryClient.java
+++ 
b/dolphinscheduler-master/src/main/java/org/apache/dolphinscheduler/server/master/registry/MasterRegistryClient.java
@@ -195,4 +195,7 @@ public class MasterRegistryClient implements AutoCloseable {
         }
     }
 
+    public boolean isAvailable() {
+        return registryClient.isConnected();
+    }
 }
diff --git 
a/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/Registry.java
 
b/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/Registry.java
index 76e387ce8f..8bdb8b9021 100644
--- 
a/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/Registry.java
+++ 
b/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/Registry.java
@@ -30,6 +30,8 @@ import lombok.NonNull;
  */
 public interface Registry extends Closeable {
 
+    boolean isConnected();
+
     /**
      * Connect to the registry, will wait in the given timeout
      *
diff --git 
a/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/RegistryClient.java
 
b/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/RegistryClient.java
index 3193614d0d..2cfae44a47 100644
--- 
a/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/RegistryClient.java
+++ 
b/dolphinscheduler-registry/dolphinscheduler-registry-api/src/main/java/org/apache/dolphinscheduler/registry/api/RegistryClient.java
@@ -41,8 +41,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import javax.annotation.PostConstruct;
-
 import lombok.NonNull;
 import lombok.extern.slf4j.Slf4j;
 
@@ -61,11 +59,14 @@ public class RegistryClient {
 
     public RegistryClient(Registry registry) {
         this.registry = registry;
+        registry.put(RegistryNodeType.MASTER.getRegistryPath(), EMPTY, false);
+        registry.put(RegistryNodeType.WORKER.getRegistryPath(), EMPTY, false);
+        registry.put(RegistryNodeType.ALERT_SERVER.getRegistryPath(), EMPTY, 
false);
     }
 
-    @PostConstruct
-    public void afterConstruct() {
-        initNodes();
+    public boolean isConnected() {
+        return registry.isConnected();
+
     }
 
     public void connectUntilTimeout(@NonNull Duration duration) throws 
RegistryException {
@@ -229,12 +230,6 @@ public class RegistryClient {
         }
     }
 
-    private void initNodes() {
-        registry.put(RegistryNodeType.MASTER.getRegistryPath(), EMPTY, false);
-        registry.put(RegistryNodeType.WORKER.getRegistryPath(), EMPTY, false);
-        registry.put(RegistryNodeType.ALERT_SERVER.getRegistryPath(), EMPTY, 
false);
-    }
-
     private Collection<String> getServerNodes(RegistryNodeType nodeType) {
         return getChildrenKeys(nodeType.getRegistryPath());
     }
diff --git 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-etcd/src/main/java/org/apache/dolphinscheduler/plugin/registry/etcd/EtcdRegistry.java
 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-etcd/src/main/java/org/apache/dolphinscheduler/plugin/registry/etcd/EtcdRegistry.java
index 57a17c6519..1d1397db54 100644
--- 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-etcd/src/main/java/org/apache/dolphinscheduler/plugin/registry/etcd/EtcdRegistry.java
+++ 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-etcd/src/main/java/org/apache/dolphinscheduler/plugin/registry/etcd/EtcdRegistry.java
@@ -36,7 +36,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 
-import javax.annotation.PostConstruct;
 import javax.net.ssl.SSLException;
 
 import lombok.NonNull;
@@ -124,16 +123,16 @@ public class EtcdRegistry implements Registry {
         log.info("Started Etcd Registry...");
         etcdConnectionStateListener = new EtcdConnectionStateListener(client);
         etcdKeepAliveLeaseManager = new EtcdKeepAliveLeaseManager(client);
-    }
 
-    /**
-     * Start the etcd Connection stateListeer
-     */
-    @PostConstruct
-    public void start() {
         log.info("Starting Etcd ConnectionListener...");
         etcdConnectionStateListener.start();
         log.info("Started Etcd ConnectionListener...");
+
+    }
+
+    @Override
+    public boolean isConnected() {
+        return client.getKVClient().get(byteSequence("/")).join() != null;
     }
 
     @Override
diff --git 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcOperator.java
 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcOperator.java
index 5129a89232..a56d609da7 100644
--- 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcOperator.java
+++ 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcOperator.java
@@ -44,7 +44,6 @@ public class JdbcOperator {
     private JdbcRegistryDataMapper jdbcRegistryDataMapper;
     @Autowired
     private JdbcRegistryLockMapper jdbcRegistryLockMapper;
-
     private final long expireTimeWindow;
 
     public JdbcOperator(JdbcRegistryProperties registryProperties) {
diff --git 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcRegistry.java
 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcRegistry.java
index 8ad409c424..f3cbcfbc3b 100644
--- 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcRegistry.java
+++ 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-jdbc/src/main/java/org/apache/dolphinscheduler/plugin/registry/jdbc/JdbcRegistry.java
@@ -75,6 +75,12 @@ public class JdbcRegistry implements Registry {
         log.info("Started Jdbc Registry...");
     }
 
+    @Override
+    public boolean isConnected() {
+        jdbcOperator.healthCheck();
+        return true;
+    }
+
     @Override
     public void connectUntilTimeout(@NonNull Duration timeout) throws 
RegistryException {
         long beginTimeMillis = System.currentTimeMillis();
diff --git 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-zookeeper/src/main/java/org/apache/dolphinscheduler/plugin/registry/zookeeper/ZookeeperRegistry.java
 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-zookeeper/src/main/java/org/apache/dolphinscheduler/plugin/registry/zookeeper/ZookeeperRegistry.java
index 20f53225ae..7333c10f05 100644
--- 
a/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-zookeeper/src/main/java/org/apache/dolphinscheduler/plugin/registry/zookeeper/ZookeeperRegistry.java
+++ 
b/dolphinscheduler-registry/dolphinscheduler-registry-plugins/dolphinscheduler-registry-zookeeper/src/main/java/org/apache/dolphinscheduler/plugin/registry/zookeeper/ZookeeperRegistry.java
@@ -253,6 +253,11 @@ public final class ZookeeperRegistry implements Registry {
         return true;
     }
 
+    @Override
+    public boolean isConnected() {
+        return client.getZookeeperClient().isConnected();
+    }
+
     @Override
     public void close() {
         treeCacheMap.values().forEach(CloseableUtils::closeQuietly);
diff --git 
a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/metrics/WorkerHealthIndicator.java
 
b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/metrics/WorkerHealthIndicator.java
new file mode 100644
index 0000000000..f4ee4dbc1a
--- /dev/null
+++ 
b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/metrics/WorkerHealthIndicator.java
@@ -0,0 +1,44 @@
+/*
+ * 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.dolphinscheduler.server.worker.metrics;
+
+import org.apache.dolphinscheduler.server.worker.registry.WorkerRegistryClient;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.HealthIndicator;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WorkerHealthIndicator implements HealthIndicator {
+
+    @Autowired
+    private WorkerRegistryClient workerRegistryClient;
+
+    @Override
+    public Health health() {
+        try {
+            if (workerRegistryClient.isAvailable()) {
+                return Health.up().build();
+            }
+            return Health.down().build();
+        } catch (Exception ex) {
+            return Health.down().withException(ex).build();
+        }
+    }
+}
diff --git 
a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistryClient.java
 
b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistryClient.java
index 8c04aa752c..eb7b8d32d2 100644
--- 
a/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistryClient.java
+++ 
b/dolphinscheduler-worker/src/main/java/org/apache/dolphinscheduler/server/worker/registry/WorkerRegistryClient.java
@@ -136,4 +136,7 @@ public class WorkerRegistryClient implements AutoCloseable {
         log.info("Worker registry client closed");
     }
 
+    public boolean isAvailable() {
+        return registryClient.isConnected();
+    }
 }

Reply via email to