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]