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

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


The following commit(s) were added to refs/heads/master by this push:
     new d32818e8ef [feat] Support Zookeeper Service Discovery  (#3377)
d32818e8ef is described below

commit d32818e8ef5e0e052691e82f9cf6188015e9a629
Author: Yang Chen <[email protected]>
AuthorDate: Tue May 20 21:30:48 2025 +0800

    [feat] Support Zookeeper Service Discovery  (#3377)
    
    Signed-off-by: tomsun28 <[email protected]>
    Co-authored-by: Calvin <[email protected]>
    Co-authored-by: tomsun28 <[email protected]>
---
 .../hertzbeat-collector-basic/pom.xml              |   6 ++
 .../collect/sd/ZookeeperSdCollectImpl.java         |  95 +++++++++++++++++
 .../collect/sd/ZookeeperSdCollectImplTest.java     | 113 +++++++++++++++++++++
 .../hertzbeat/common/entity/job/Metrics.java       |   7 +-
 .../entity/job/protocol/ZookeeperSdProtocol.java   |  37 +++++++
 .../hertzbeat/common/entity/manager/Monitor.java   |   2 +-
 .../src/main/resources/define/app-zookeeper_sd.yml |  70 +++++++++++++
 material/licenses/LICENSE                          |   1 +
 material/licenses/backend/LICENSE                  |   1 +
 material/licenses/collector/LICENSE                |   1 +
 pom.xml                                            |   2 +
 .../monitor-form/monitor-form.component.html       |   1 +
 web-app/src/assets/i18n/en-US.json                 |   1 +
 web-app/src/assets/i18n/ja-JP.json                 |   1 +
 web-app/src/assets/i18n/pt-BR.json                 |   1 +
 web-app/src/assets/i18n/zh-CN.json                 |   1 +
 web-app/src/assets/i18n/zh-TW.json                 |   1 +
 17 files changed, 339 insertions(+), 2 deletions(-)

diff --git a/hertzbeat-collector/hertzbeat-collector-basic/pom.xml 
b/hertzbeat-collector/hertzbeat-collector-basic/pom.xml
index 3c320227f8..df5ea8044a 100644
--- a/hertzbeat-collector/hertzbeat-collector-basic/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-basic/pom.xml
@@ -164,5 +164,11 @@
             <groupId>org.apache.sshd</groupId>
             <artifactId>sshd-sftp</artifactId>
         </dependency>
+        <!-- Zookeeper -->
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <version>${zookeeper.version}</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git 
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/sd/ZookeeperSdCollectImpl.java
 
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/sd/ZookeeperSdCollectImpl.java
new file mode 100644
index 0000000000..57a0068af2
--- /dev/null
+++ 
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/sd/ZookeeperSdCollectImpl.java
@@ -0,0 +1,95 @@
+/*
+ * 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.hertzbeat.collector.collect.sd;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.hertzbeat.collector.collect.AbstractCollect;
+import org.apache.hertzbeat.common.entity.job.Metrics;
+import org.apache.hertzbeat.common.entity.message.CollectRep;
+import org.apache.hertzbeat.common.entity.job.protocol.ZookeeperSdProtocol;
+import org.apache.hertzbeat.common.entity.sd.ConnectionConfig;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.hertzbeat.common.util.CommonUtil;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * zookeeper sd collector
+ */
+@Slf4j
+public class ZookeeperSdCollectImpl extends AbstractCollect {
+
+    private static int TIMEOUT = 30000;
+
+    @Override
+    public void collect(CollectRep.MetricsData.Builder builder, Metrics 
metrics) {
+        ZookeeperSdProtocol zookeeperSdProtocol = metrics.getZookeeper_sd();
+        String url = zookeeperSdProtocol.getUrl();
+        String pathPrefix = zookeeperSdProtocol.getPathPrefix();
+        try (ZooKeeper zk = new ZooKeeper(url, TIMEOUT, event -> {})){
+
+            List<String> children = zk.getChildren(pathPrefix, false);
+            List<ConnectionConfig> connectionConfigs = 
children.stream().map(node -> {
+                String[] split = node.split(":");
+                if (split.length != 2) log.warn("Node format is incorrect: {}, 
expected format is 'host:port'", node);
+                return new ConnectionConfig(split[0], split[1]);
+            }).toList();
+            connectionConfigs.forEach(config -> {
+                CollectRep.ValueRow valueRow = CollectRep.ValueRow.newBuilder()
+                        .addColumn(config.getHost())
+                        .addColumn(config.getPort())
+                        .build();
+                builder.addValueRow(valueRow);
+            });
+        } catch (IOException e){
+            String errorMsg = CommonUtil.getMessageFromThrowable(e);
+            log.error("Failed to connect to Zookeeper: {}", errorMsg);
+            builder.setCode(CollectRep.Code.FAIL);
+            builder.setMsg(errorMsg);
+        } catch (InterruptedException e) {
+            String errorMsg = CommonUtil.getMessageFromThrowable(e);
+            log.error("Zookeeper connection interrupted: {}", errorMsg);
+            builder.setCode(CollectRep.Code.FAIL);
+            builder.setMsg(errorMsg);
+        } catch (KeeperException e) {
+            String errorMsg = CommonUtil.getMessageFromThrowable(e);
+            log.error("Zookeeper operation failed: {}", errorMsg);
+            builder.setCode(CollectRep.Code.FAIL);
+            builder.setMsg(errorMsg);
+        }
+    }
+
+    @Override
+    public void preCheck(Metrics metrics) throws IllegalArgumentException {
+        if (metrics.getZookeeper_sd() == null) {
+            throw new IllegalArgumentException("Zookeeper SD configuration 
cannot be null");
+        }
+        if (metrics.getZookeeper_sd().getUrl() == null || 
metrics.getZookeeper_sd().getUrl().isEmpty()) {
+            throw new IllegalArgumentException("Zookeeper URL cannot be null 
or empty");
+        }
+        if (metrics.getZookeeper_sd().getPathPrefix() == null || 
metrics.getZookeeper_sd().getPathPrefix().isEmpty()) {
+            throw new IllegalArgumentException("Zookeeper path prefix cannot 
be null or empty");
+        }
+    }
+
+    @Override
+    public String supportProtocol() {
+        return "zookeeper_sd";
+    }
+}
diff --git 
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/sd/ZookeeperSdCollectImplTest.java
 
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/sd/ZookeeperSdCollectImplTest.java
new file mode 100644
index 0000000000..df18a6bbfc
--- /dev/null
+++ 
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/sd/ZookeeperSdCollectImplTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.hertzbeat.collector.collect.sd;
+
+import org.apache.hertzbeat.common.entity.job.Metrics;
+import org.apache.hertzbeat.common.entity.job.protocol.ZookeeperSdProtocol;
+import org.apache.hertzbeat.common.entity.message.CollectRep;
+import org.apache.zookeeper.ZooKeeper;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.MockedConstruction;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+
+@ExtendWith(MockitoExtension.class)
+class ZookeeperSdCollectImplTest {
+
+    private ZookeeperSdCollectImpl zookeeperSdCollect;
+
+    private Metrics metrics;
+    private ZookeeperSdProtocol protocol;
+    private CollectRep.MetricsData.Builder builder;
+
+    @BeforeEach
+    void setUp() {
+        zookeeperSdCollect = new ZookeeperSdCollectImpl();
+
+        protocol = ZookeeperSdProtocol.builder()
+                .url("localhost:2181")
+                .pathPrefix("/services")
+                .build();
+
+        metrics = Metrics.builder()
+                .zookeeper_sd(protocol)
+                .build();
+
+        builder = CollectRep.MetricsData.newBuilder();
+    }
+
+    @Test
+    void testPreCheckWithNullConfig() {
+        Metrics invalid = Metrics.builder().build();
+        IllegalArgumentException e = 
assertThrows(IllegalArgumentException.class,
+                () -> zookeeperSdCollect.preCheck(invalid));
+        assertEquals("Zookeeper SD configuration cannot be null", 
e.getMessage());
+    }
+
+    @Test
+    void testPreCheckWithEmptyUrl() {
+        ZookeeperSdProtocol badProtocol = 
ZookeeperSdProtocol.builder().url("").pathPrefix("/path").build();
+        Metrics m = Metrics.builder().zookeeper_sd(badProtocol).build();
+        IllegalArgumentException e = 
assertThrows(IllegalArgumentException.class,
+                () -> zookeeperSdCollect.preCheck(m));
+        assertEquals("Zookeeper URL cannot be null or empty", e.getMessage());
+    }
+
+    @Test
+    void testPreCheckWithEmptyPath() {
+        ZookeeperSdProtocol badProtocol = 
ZookeeperSdProtocol.builder().url("host").pathPrefix("").build();
+        Metrics m = Metrics.builder().zookeeper_sd(badProtocol).build();
+        IllegalArgumentException e = 
assertThrows(IllegalArgumentException.class,
+                () -> zookeeperSdCollect.preCheck(m));
+        assertEquals("Zookeeper path prefix cannot be null or empty", 
e.getMessage());
+    }
+
+    @Test
+    void testPreCheckValid() {
+        assertDoesNotThrow(() -> zookeeperSdCollect.preCheck(metrics));
+    }
+
+    @Test
+    void testSupportProtocol() {
+        assertEquals("zookeeper_sd", zookeeperSdCollect.supportProtocol());
+    }
+
+    @Test
+    void testCollectSuccess() throws Exception {
+        try (MockedConstruction<ZooKeeper> mocked = 
Mockito.mockConstruction(ZooKeeper.class,
+                (mock, context) -> Mockito.when(mock.getChildren("/services", 
false)).thenReturn(List.of("host1:8080", "host2:9090")))) {
+
+            zookeeperSdCollect.collect(builder, metrics);
+
+            assertEquals(2, builder.getValuesCount());
+            assertEquals("host1", builder.getValues(0).getColumns(0));
+            assertEquals("8080", builder.getValues(0).getColumns(1));
+            assertEquals("host2", builder.getValues(1).getColumns(0));
+            assertEquals("9090", builder.getValues(1).getColumns(1));
+        }
+    }
+}
diff --git 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/Metrics.java
 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/Metrics.java
index 6df41c4979..8317889d02 100644
--- 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/Metrics.java
+++ 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/Metrics.java
@@ -66,11 +66,12 @@ import 
org.apache.hertzbeat.common.entity.job.protocol.TelnetProtocol;
 import org.apache.hertzbeat.common.entity.job.protocol.UdpProtocol;
 import org.apache.hertzbeat.common.entity.job.protocol.WebsocketProtocol;
 import org.apache.hertzbeat.common.entity.message.CollectRep;
-
+import org.apache.hertzbeat.common.entity.job.protocol.ZookeeperSdProtocol;
 /**
  * Details of the monitoring metrics collected
  * eg: cpu | memory | health
  */
+
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
@@ -278,6 +279,10 @@ public class Metrics {
      * consul sd protocol
      */
     private ConsulSdProtocol consul_sd;
+    /**
+     * zookeeper sd protocol
+     */
+    private ZookeeperSdProtocol zookeeper_sd;
     /**
      * Monitoring configuration information using the public plc protocol
      */
diff --git 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ZookeeperSdProtocol.java
 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ZookeeperSdProtocol.java
new file mode 100644
index 0000000000..830398d517
--- /dev/null
+++ 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/job/protocol/ZookeeperSdProtocol.java
@@ -0,0 +1,37 @@
+/*
+ * 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.hertzbeat.common.entity.job.protocol;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+/**
+ * Zookeeper service discovery protocol
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ZookeeperSdProtocol implements Protocol{
+    
+    private String url;
+
+    private String pathPrefix;
+}
diff --git 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/manager/Monitor.java
 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/manager/Monitor.java
index 23e0ff338d..c2b5cca16f 100644
--- 
a/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/manager/Monitor.java
+++ 
b/hertzbeat-common/src/main/java/org/apache/hertzbeat/common/entity/manager/Monitor.java
@@ -77,7 +77,7 @@ public class Monitor {
     @Size(max = 100)
     private String app;
     
-    @Schema(title = "Scrape type: static | http_sd | dns_sd", example = 
"static", accessMode = READ_WRITE)
+    @Schema(title = "Scrape type: static | http_sd | dns_sd | zookeeper_sd", 
example = "static", accessMode = READ_WRITE)
     @Size(max = 100)
     private String scrape;
     
diff --git a/hertzbeat-manager/src/main/resources/define/app-zookeeper_sd.yml 
b/hertzbeat-manager/src/main/resources/define/app-zookeeper_sd.yml
new file mode 100644
index 0000000000..c0c17f19c4
--- /dev/null
+++ b/hertzbeat-manager/src/main/resources/define/app-zookeeper_sd.yml
@@ -0,0 +1,70 @@
+# 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.
+
+# The monitoring type category:service-application service monitoring 
db-database monitoring custom-custom monitoring os-operating system monitoring
+category: __system__
+# Monitoring application type name (consistent with file name) eg: linux 
windows tomcat mysql aws...
+app: zookeeper_sd
+# The app api i18n name
+name:
+  zh-CN: Zookeeper Service Discovery
+  en-US: Zookeeper Service Discovery
+# Input params define for app api(render web ui by the definition)
+params:
+  # field-param field key
+  - field: __sd_url__
+    # name-param field display i18n name
+    name:
+      zh-CN: 服务发现地址
+      en-US: Service Discovery Url
+    # type-param field type(most mapping the html input type)
+    type: text
+    # required-true or false
+    required: true
+
+  - field: __sd_path_prefix__
+    name:
+      zh-CN: 服务发现路径前缀
+      en-US: Service Discovery Path Prefix
+    type: text
+    required: true
+
+metrics:
+  - name: target
+    i18n:
+      zh-CN: 监控目标
+      en-US: Monitor Target
+    # metrics scheduling priority(0->127)->(high->low), metrics with the same 
priority will be scheduled in parallel
+    # priority 0's metrics is availability metrics, it will be scheduled 
first, only availability metrics collect success will the scheduling continue
+    priority: 0
+    # collect metrics content
+    fields:
+      # field-metric name, type-metric type(0-number,1-string), unit-metric 
unit('%','ms','MB'), label-whether it is a metrics label field
+      - field: host
+        type: 1
+        i18n:
+          zh-CN: Host
+          en-US: Host
+      - field: port
+        type: 1
+        i18n:
+          zh-CN: Port
+          en-US: Port
+    # the protocol used for monitoring, eg: sql, ssh, http, telnet, wmi, snmp, 
sdk
+    protocol: zookeeper_sd
+    # the config content when protocol is zookeeper_sd
+    zookeeper_sd:
+      url: ^_^__sd_url__^_^
+      pathPrefix: ^_^__sd_path_prefix__^_^
diff --git a/material/licenses/LICENSE b/material/licenses/LICENSE
index 3a1ed16fa6..216ef39fde 100644
--- a/material/licenses/LICENSE
+++ b/material/licenses/LICENSE
@@ -437,6 +437,7 @@ The text of each license is the standard Apache 2.0 license.
     https://mvnrepository.com/artifact/com.vesoft/client/3.6.0 Apache-2.0
     
https://mvnrepository.com/artifact/io.opentelemetry.instrumentation/opentelemetry-spring-boot-starter-2.15.0
 Apache-2.0
     
https://mvnrepository.com/artifact/io.opentelemetry.instrumentation/opentelemetry-logback-appender-1.0
 Apache-2.0
+    https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper/3.9.3 
Apache-2.0
 
 ========================================================================
 BSD-2-Clause licenses
diff --git a/material/licenses/backend/LICENSE 
b/material/licenses/backend/LICENSE
index 76850e1088..492f0f3f8a 100644
--- a/material/licenses/backend/LICENSE
+++ b/material/licenses/backend/LICENSE
@@ -435,6 +435,7 @@ The text of each license is the standard Apache 2.0 license.
     https://mvnrepository.com/artifact/org.webjars/swagger-ui/5.10.3
     
https://mvnrepository.com/artifact/com.google.flatbuffers/flatbuffers-java/1.12.0
     https://mvnrepository.com/artifact/com.vesoft/client/3.6.0
+    https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper/3.9.3 
Apache-2.0
 
 
 ========================================================================
diff --git a/material/licenses/collector/LICENSE 
b/material/licenses/collector/LICENSE
index 6db64cf092..b141b35c26 100644
--- a/material/licenses/collector/LICENSE
+++ b/material/licenses/collector/LICENSE
@@ -329,6 +329,7 @@ The text of each license is the standard Apache 2.0 license.
     
https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core/10.1.19
 Apache-2.0
     https://mvnrepository.com/artifact/com.vesoft/client/3.6.0 Apache-2.0
     https://mvnrepository.com/artifact/com.hivemq/hivemq-mqtt-client/1.3.3 
Apache-2.0
+    https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper/3.9.3 
Apache-2.0
 
 
 ========================================================================
diff --git a/pom.xml b/pom.xml
index 624d61e999..b9efd59f59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,6 +164,8 @@
         
<spring-boot-starter-sureness.version>1.1.0</spring-boot-starter-sureness.version>
         <huawei.sdk.version>3.1.37</huawei.sdk.version>
         <huawei.obs.version>3.23.5</huawei.obs.version>
+        <commons-net>3.8.0</commons-net>
+        <zookeeper.version>3.9.3</zookeeper.version>
         
         <iotdb-session.version>0.13.3</iotdb-session.version>
         <influxdb.version>2.23</influxdb.version>
diff --git 
a/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html 
b/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html
index 9f1ad2076c..15adc0fd41 100644
--- a/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html
+++ b/web-app/src/app/routes/monitor/monitor-form/monitor-form.component.html
@@ -34,6 +34,7 @@
             <nz-option nzValue="dns_sd" 
[nzLabel]="'monitor.scrape.type.dns_sd' | i18n"></nz-option>
             <nz-option nzValue="eureka_sd" 
[nzLabel]="'monitor.scrape.type.eureka_sd' | i18n"></nz-option>
             <nz-option nzValue="consul_sd" 
[nzLabel]="'monitor.scrape.type.consul_sd' | i18n"></nz-option>
+            <nz-option nzValue="zookeeper_sd" 
[nzLabel]="'monitor.scrape.type.zookeeper_sd' | i18n"></nz-option>
           </nz-select>
         </nz-form-control>
       </nz-form-item>
diff --git a/web-app/src/assets/i18n/en-US.json 
b/web-app/src/assets/i18n/en-US.json
index b570c57db0..cb9a8d0cab 100644
--- a/web-app/src/assets/i18n/en-US.json
+++ b/web-app/src/assets/i18n/en-US.json
@@ -765,6 +765,7 @@
   "monitor.scrape.type.dns_sd": "Dns Service Discovery",
   "monitor.scrape.type.eureka_sd": "Eureka Service Discovery",
   "monitor.scrape.type.consul_sd": "Consul Service Discovery",
+  "monitor.scrape.type.zookeeper_sd": "Zookeeper Service Discovery",
   "placeholder.key": "Key",
   "placeholder.value": "Value",
   "plugin.delete": "Delete Plugin",
diff --git a/web-app/src/assets/i18n/ja-JP.json 
b/web-app/src/assets/i18n/ja-JP.json
index fad463cd59..bb90d72227 100644
--- a/web-app/src/assets/i18n/ja-JP.json
+++ b/web-app/src/assets/i18n/ja-JP.json
@@ -765,6 +765,7 @@
   "monitor.scrape.type.http_sd": "Http サービスディスカバリー",
   "monitor.scrape.type.eureka_sd": "Eurekaサービスディスカバリー",
   "monitor.scrape.type.consul_sd": "Consulサービスディスカバリー",
+  "monitor.scrape.type.zookeeper_sd": "Zookeeperサービスディスカバリー",
   "placeholder.key": "キー",
   "placeholder.value": "値",
   "plugin.delete": "プラグインを削除",
diff --git a/web-app/src/assets/i18n/pt-BR.json 
b/web-app/src/assets/i18n/pt-BR.json
index d6aed35183..480a2420d0 100644
--- a/web-app/src/assets/i18n/pt-BR.json
+++ b/web-app/src/assets/i18n/pt-BR.json
@@ -576,6 +576,7 @@
     "monitor.scrape.type.dns_sd": "Dns Service Discovery",
     "monitor.scrape.type.eureka_sd": "Eureka Service Discovery",
     "monitor.scrape.type.consul_sd": "Consul Service Discovery",
+    "monitor.scrape.type.zookeeper_sd": "Zookeeper Service Discovery",
     "common.name": "Nome da Métrica",
     "common.value": "Valor da Métrica",
     "common.search": "Pesquisar",
diff --git a/web-app/src/assets/i18n/zh-CN.json 
b/web-app/src/assets/i18n/zh-CN.json
index f9a07af276..3eb40b23c5 100644
--- a/web-app/src/assets/i18n/zh-CN.json
+++ b/web-app/src/assets/i18n/zh-CN.json
@@ -765,6 +765,7 @@
   "monitor.scrape.type.dns_sd": "Dns 服务发现",
   "monitor.scrape.type.eureka_sd": "Eureka 服务发现",
   "monitor.scrape.type.consul_sd": "Consul 服务发现",
+  "monitor.scrape.type.zookeeper_sd": "Zookeeper 服务发现",
   "placeholder.key": "键",
   "placeholder.value": "值",
   "plugin.delete": "刪除插件",
diff --git a/web-app/src/assets/i18n/zh-TW.json 
b/web-app/src/assets/i18n/zh-TW.json
index e1ed05cd0d..3559146ea8 100644
--- a/web-app/src/assets/i18n/zh-TW.json
+++ b/web-app/src/assets/i18n/zh-TW.json
@@ -764,6 +764,7 @@
   "monitor.scrape.type.dns_sd": "Dns 服務發現",
   "monitor.scrape.type.eureka_sd": "Eureka 服務發現",
   "monitor.scrape.type.consul_sd": "Consul 服務發現",
+  "monitor.scrape.type.zookeeper_sd": "Zookeeper 服務發現",
   "placeholder.key": "鍵",
   "placeholder.value": "值",
   "plugin.delete": "刪除插件",


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to