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

Duansg 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 42307a9928 [feat] Support etcd monitoring (#4306)
42307a9928 is described below

commit 42307a9928ebe967c31ad7840d57d55a398bd73e
Author: NekoPunch <[email protected]>
AuthorDate: Sun Aug 9 09:10:00 2026 -0700

    [feat] Support etcd monitoring (#4306)
    
    Co-authored-by: Duansg <[email protected]>
---
 .../collect/basic/http/EtcdMonitorE2eTest.java     | 158 ++++++++++
 .../src/test/resources/http/etcd/metrics.txt       |  17 ++
 .../src/main/resources/define/app-etcd.yml         | 328 +++++++++++++++++++++
 home/docs/help/etcd.md                             |  65 ++++
 .../current/help/etcd.md                           |  65 ++++
 home/sidebars.json                                 |   1 +
 6 files changed, 634 insertions(+)

diff --git 
a/hertzbeat-e2e/hertzbeat-collector-basic-e2e/src/test/java/org/apache/hertzbeat/collector/collect/basic/http/EtcdMonitorE2eTest.java
 
b/hertzbeat-e2e/hertzbeat-collector-basic-e2e/src/test/java/org/apache/hertzbeat/collector/collect/basic/http/EtcdMonitorE2eTest.java
new file mode 100644
index 0000000000..3233adf8f7
--- /dev/null
+++ 
b/hertzbeat-e2e/hertzbeat-collector-basic-e2e/src/test/java/org/apache/hertzbeat/collector/collect/basic/http/EtcdMonitorE2eTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.basic.http;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpServer;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.hertzbeat.collector.collect.AbstractCollectE2eTest;
+import org.apache.hertzbeat.collector.collect.http.HttpCollectImpl;
+import org.apache.hertzbeat.collector.dispatch.CollectDataDispatch;
+import org.apache.hertzbeat.collector.dispatch.MetricsCollect;
+import org.apache.hertzbeat.collector.dispatch.unit.impl.DataSizeConvert;
+import org.apache.hertzbeat.collector.timer.WheelTimerTask;
+import org.apache.hertzbeat.collector.util.CollectUtil;
+import org.apache.hertzbeat.common.entity.job.Configmap;
+import org.apache.hertzbeat.common.entity.job.Job;
+import org.apache.hertzbeat.common.entity.job.Metrics;
+import org.apache.hertzbeat.common.entity.job.protocol.HttpProtocol;
+import org.apache.hertzbeat.common.entity.job.protocol.Protocol;
+import org.apache.hertzbeat.common.entity.message.CollectRep;
+import org.apache.hertzbeat.common.timer.Timeout;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.util.ResourceUtils;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Integration test for etcd monitoring functionality.
+ * Fixture at src/test/resources/http/etcd/metrics.txt is a real capture from 
a live
+ * etcd v3.5.17 /metrics endpoint (see app-etcd.yml for the corresponding 
template).
+ */
+@Slf4j
+@ExtendWith(MockitoExtension.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class EtcdMonitorE2eTest extends AbstractCollectE2eTest {
+
+    private static final int MOCK_SERVER_PORT = 52379;
+    private static final String LOCALHOST = "127.0.0.1";
+    private static HttpServer mockServer;
+
+    @AfterAll
+    public static void tearDown() {
+        if (mockServer != null) {
+            mockServer.stop(0);
+        }
+    }
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        super.setUp();
+        collect = new HttpCollectImpl();
+
+        // the shared harness wires MetricsCollect with an empty unit-convert 
list,
+        // but this template relies on B->MB conversion
+        Timeout convertTimeout = mock(Timeout.class);
+        WheelTimerTask convertTimerJob = mock(WheelTimerTask.class);
+        when(convertTimeout.task()).thenReturn(convertTimerJob);
+        when(convertTimerJob.getJob()).thenReturn(mock(Job.class));
+        metricsCollect = new MetricsCollect(mock(Metrics.class), 
convertTimeout,
+                mock(CollectDataDispatch.class), null, List.of(new 
DataSizeConvert()));
+
+        String metricsResponse = 
loadResponseFromFile("classpath:http/etcd/metrics.txt");
+
+        mockServer = HttpServer.create(new 
InetSocketAddress(MOCK_SERVER_PORT), 0);
+        mockServer.setExecutor(null);
+        mockServer.start();
+        mockServer.createContext("/metrics", exchange -> 
sendTextResponse(exchange, metricsResponse));
+    }
+
+    private String loadResponseFromFile(String resourcePath) throws Exception {
+        return new 
String(Files.readAllBytes(ResourceUtils.getFile(resourcePath).toPath()));
+    }
+
+    private void sendTextResponse(HttpExchange exchange, String response) 
throws IOException {
+        exchange.getResponseHeaders().set("Content-Type", "text/plain");
+        final byte[] array = response.getBytes(StandardCharsets.UTF_8);
+        exchange.sendResponseHeaders(200, array.length);
+        try (OutputStream os = exchange.getResponseBody()) {
+            os.write(array);
+        }
+    }
+
+    private static final Map<String, String> EXPECTED_VALUES = Map.of(
+            "etcd_server_has_leader", "1",
+            "etcd_mvcc_db_total_size_in_bytes", "0.0195",
+            "etcd_server_leader_changes_seen_total", "1",
+            "process_cpu_seconds_total", "42.41",
+            "process_resident_memory_bytes", "29.9844");
+
+    @Test
+    public void testEtcdMonitor() {
+        Job etcdJob = appService.getAppDefine("etcd");
+        List<Map<String, Configmap>> configmapFromPreCollectData = new 
LinkedList<>();
+        for (Metrics metricsDef : etcdJob.getMetrics()) {
+            metricsDef = CollectUtil.replaceCryPlaceholderToMetrics(metricsDef,
+                    !configmapFromPreCollectData.isEmpty() ? 
configmapFromPreCollectData.get(0) : new HashMap<>());
+            CollectRep.MetricsData metricsData = 
validateMetricsCollection(metricsDef, metricsDef.getName());
+            Assertions.assertEquals(EXPECTED_VALUES.get(metricsDef.getName()),
+                    metricsData.getValues().get(0).getColumns(0),
+                    metricsDef.getName() + " collected value mismatch");
+            configmapFromPreCollectData = 
CollectUtil.getConfigmapFromPreCollectData(metricsData);
+        }
+    }
+
+    @Override
+    protected Protocol buildProtocol(Metrics metricsDef) {
+        HttpProtocol protocol = new HttpProtocol();
+        protocol.setHost(LOCALHOST);
+        protocol.setPort(String.valueOf(MOCK_SERVER_PORT));
+        protocol.setMethod(metricsDef.getHttp().getMethod());
+        protocol.setParseType(metricsDef.getHttp().getParseType());
+        protocol.setParseScript(metricsDef.getHttp().getParseScript());
+        protocol.setUrl(metricsDef.getHttp().getUrl());
+        return protocol;
+    }
+
+    @Override
+    protected CollectRep.MetricsData.Builder collectMetrics(Metrics 
metricsDef) {
+        HttpProtocol protocol = (HttpProtocol) buildProtocol(metricsDef);
+        metrics.setHttp(protocol);
+        // prometheus parseType filters by builder.getMetrics(); production 
sets it in
+        // MetricsCollect.run() but this test harness does not, so set it here
+        CollectRep.MetricsData.Builder metricsData = 
CollectRep.MetricsData.newBuilder()
+                .setMetrics(metricsDef.getName());
+        return collectMetricsData(metrics, metricsDef, metricsData);
+    }
+}
diff --git 
a/hertzbeat-e2e/hertzbeat-collector-basic-e2e/src/test/resources/http/etcd/metrics.txt
 
b/hertzbeat-e2e/hertzbeat-collector-basic-e2e/src/test/resources/http/etcd/metrics.txt
new file mode 100644
index 0000000000..45969a7b6b
--- /dev/null
+++ 
b/hertzbeat-e2e/hertzbeat-collector-basic-e2e/src/test/resources/http/etcd/metrics.txt
@@ -0,0 +1,17 @@
+# Captured from a live etcd v3.5.17 /metrics endpoint, trimmed to the metric
+# families used by app-etcd.yml.
+# HELP etcd_mvcc_db_total_size_in_bytes Total size of the underlying database 
physically allocated in bytes.
+# TYPE etcd_mvcc_db_total_size_in_bytes gauge
+etcd_mvcc_db_total_size_in_bytes 20480
+# HELP etcd_server_has_leader Whether or not a leader exists. 1 is existence, 
0 is not.
+# TYPE etcd_server_has_leader gauge
+etcd_server_has_leader 1
+# HELP etcd_server_leader_changes_seen_total The number of leader changes seen.
+# TYPE etcd_server_leader_changes_seen_total counter
+etcd_server_leader_changes_seen_total 1
+# HELP process_cpu_seconds_total Total user and system CPU time spent in 
seconds.
+# TYPE process_cpu_seconds_total counter
+process_cpu_seconds_total 42.41
+# HELP process_resident_memory_bytes Resident memory size in bytes.
+# TYPE process_resident_memory_bytes gauge
+process_resident_memory_bytes 3.1440896e+07
diff --git a/hertzbeat-manager/src/main/resources/define/app-etcd.yml 
b/hertzbeat-manager/src/main/resources/define/app-etcd.yml
new file mode 100644
index 0000000000..d177dd9dc8
--- /dev/null
+++ b/hertzbeat-manager/src/main/resources/define/app-etcd.yml
@@ -0,0 +1,328 @@
+# 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 
mid-middleware
+category: mid
+# The monitoring type eg: linux windows tomcat mysql aws...
+app: etcd
+# The monitoring i18n name
+name:
+  zh-CN: etcd
+  en-US: etcd
+  ja-JP: etcd
+# The description and help of this monitoring type
+help:
+  zh-CN: HertzBeat 通过调用 <a href='https://etcd.io/docs/latest/metrics/' 
class='help_module_content'>etcd Prometheus Metrics 接口</a>(默认在客户端端口 <i>2379</i> 
的 <i>/metrics</i> 路径)对 etcd 
键值存储(3.4+)的领导者状态、数据库大小、进程资源等指标进行采集监控。<br>您可以点击“<i>新建 etcd</i>”并配置 HOST 
端口等相关参数进行添加。<br><span class='help_module_span'>⚠️注意:请确保 HertzBeat 能访问 etcd 的 
/metrics 接口。该接口默认由 client listener 提供;若 etcd 仅监听 localhost 或客户端启用了双向 TLS,请通过 
--listen-metrics-urls 配置独立的 metrics 地址。</span>
+  en-US: HertzBeat monitors the etcd key-value store's (3.4+) leader status, 
database size and process resource usage by calling the <a 
href='https://etcd.io/docs/latest/metrics/' class='help_module_content'>etcd 
Prometheus Metrics endpoint</a> (default at the <i>/metrics</i> path on the 
client port <i>2379</i>).<br>You can click "<i>New etcd</i>" and configure the 
host, port and other related params to add it.<br><span 
class='help_module_span'>Note - make sure HertzBeat can reach etcd's [...]
+  zh-TW: HertzBeat 透過調用 <a href='https://etcd.io/docs/latest/metrics/' 
class='help_module_content'>etcd Prometheus Metrics 介面</a>(預設在客戶端連接埠 
<i>2379</i> 的 <i>/metrics</i> 路徑)對 etcd 
鍵值儲存(3.4+)的領導者狀態、資料庫大小、程序資源等指標進行採集監控。<br>您可以點擊“<i>新建 etcd</i>”並配置 HOST 
連接埠等相關參數進行添加。<br><span class='help_module_span'>⚠️注意:請確保 HertzBeat 能訪問 etcd 的 
/metrics 介面。該介面預設由 client listener 提供;若 etcd 僅監聽 localhost 或客戶端啟用了雙向 TLS,請透過 
--listen-metrics-urls 配置獨立的 metrics 地址。</span>
+  ja-JP: HertzBeat は etcd(3.4+)が公開する <a 
href='https://etcd.io/docs/latest/metrics/' 
class='help_module_content'>Prometheus metrics エンドポイント</a>(デフォルトではクライアントポート 
<i>2379</i> の <i>/metrics</i> パス)から、リーダー状態・データベースサイズ・プロセスリソース等の指標を収集し、etcd 
キーバリューストアを監視します。<br>「<i>新規 etcd</i>」をクリックしてホストやポートなどのパラメータを設定して追加できます。<br><span 
class='help_module_span'>⚠️注意:HertzBeat が etcd の /metrics 
エンドポイントへ到達できることを確認してください。デフォルトでは client listener が提供しますが、etcd が localhost 
のみを監視している場合やクライアント相互 TLS が有効な場合は、--listen-met [...]
+helpLink:
+  zh-CN: https://hertzbeat.apache.org/zh-cn/docs/help/etcd/
+  en-US: https://hertzbeat.apache.org/docs/help/etcd/
+# Input params define for monitoring(render web ui by the definition)
+params:
+  # field-param field key
+  - field: host
+    # name-param field display i18n name
+    name:
+      zh-CN: 目标Host
+      en-US: Target Host
+      ja-JP: 目標ホスト
+    # type-param field type(most mapping the html input type)
+    type: host
+    # required-true or false
+    required: true
+  - field: port
+    name:
+      zh-CN: 端口
+      en-US: Port
+      ja-JP: ポート
+    # type-param field type(most mapping the html input type)
+    type: number
+    # when type is number, range is required
+    range: '[0,65535]'
+    # default value: etcd client port that serves /metrics
+    defaultValue: 2379
+    required: true
+  - field: timeout
+    name:
+      zh-CN: 查询超时时间
+      en-US: Query Timeout
+      ja-JP: クエリタイムアウト
+    type: number
+    required: false
+    # hide param-true or false
+    hide: true
+    defaultValue: 6000
+  # field-param field key
+  - field: ssl
+    # name-param field display i18n name
+    name:
+      zh-CN: 启用HTTPS
+      en-US: HTTPS
+      ja-JP: HTTPS
+    # type-param field type(most mapping the html input type)
+    type: boolean
+    hide: true
+    # field-param field key
+  - field: headers
+    # name-param field display i18n name
+    name:
+      zh-CN: 请求Headers
+      en-US: Headers
+      ja-JP: ヘッダ
+    # type-param field type(most mapping the html input type)
+    type: key-value
+    # required-true or false
+    required: false
+    hide: true
+    # when type is key-value, use keyAlias to config key alias name
+    keyAlias: Header Name
+    # when type is key-value, use valueAlias to config value alias name
+    valueAlias: Header Value
+    # field-param field key
+  - field: authType
+    # name-param field display i18n name
+    name:
+      zh-CN: 认证方式
+      en-US: Auth Type
+      ja-JP: 認証方法
+    # type-param field type(most mapping the html input type)
+    type: radio
+    # required-true or false
+    required: false
+    # hide param-true or false
+    hide: true
+    # when type is radio checkbox, use option to show optional values 
{name1:value1,name2:value2}
+    options:
+      - label: Basic Auth
+        value: Basic Auth
+      - label: Digest Auth
+        value: Digest Auth
+    # field-param field key
+  - field: username
+    # name-param field display i18n name
+    name:
+      zh-CN: 用户名
+      en-US: Username
+      ja-JP: ユーザー名
+    # type-param field type(most mapping the html input type)
+    type: text
+    # when type is text, use limit to limit string length
+    limit: 50
+    # required-true or false
+    required: false
+    # hide param-true or false
+    hide: true
+    # field-param field key
+  - field: password
+    # name-param field display i18n name
+    name:
+      zh-CN: 密码
+      en-US: Password
+      ja-JP: パスワード
+    # type-param field type(most mapping the html input type)
+    type: password
+    # required-true or false
+    required: false
+    # hide param-true or false
+    hide: true
+# collect metrics config list
+# each metrics group name must exactly match a Prometheus metric family name 
exposed by etcd /metrics
+metrics:
+  # metrics - etcd_server_has_leader (availability: whether this etcd member 
has a raft leader)
+  - name: etcd_server_has_leader
+    i18n:
+      zh-CN: 领导者状态
+      en-US: Leader Status
+      ja-JP: リーダー状態
+    # 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
+    fields:
+      - field: hasLeader
+        type: 0
+        i18n:
+          zh-CN: 是否存在领导者(1有0无)
+          en-US: Has Leader(1=yes 0=no)
+          ja-JP: リーダー有無(1=有 0=無)
+    aliasFields:
+      - value
+    calculates:
+      - hasLeader=value
+    protocol: http
+    http:
+      host: ^_^host^_^
+      port: ^_^port^_^
+      url: /metrics
+      timeout: ^_^timeout^_^
+      ssl: ^_^ssl^_^
+      method: GET
+      headers:
+        ^_^headers^_^: ^_^headers^_^
+      authorization:
+        type: ^_^authType^_^
+        basicAuthUsername: ^_^username^_^
+        basicAuthPassword: ^_^password^_^
+        digestAuthUsername: ^_^username^_^
+        digestAuthPassword: ^_^password^_^
+      parseType: prometheus
+  # metrics - etcd_mvcc_db_total_size_in_bytes
+  - name: etcd_mvcc_db_total_size_in_bytes
+    i18n:
+      zh-CN: 数据库大小
+      en-US: Database Size
+      ja-JP: データベースサイズ
+    priority: 1
+    fields:
+      - field: dbSize
+        type: 0
+        unit: MB
+        i18n:
+          zh-CN: 物理分配的数据库大小
+          en-US: Physically Allocated DB Size
+          ja-JP: 物理割当済みDBサイズ
+    aliasFields:
+      - value
+    calculates:
+      - dbSize=value
+    units:
+      - dbSize=B->MB
+    protocol: http
+    http:
+      host: ^_^host^_^
+      port: ^_^port^_^
+      url: /metrics
+      timeout: ^_^timeout^_^
+      ssl: ^_^ssl^_^
+      method: GET
+      headers:
+        ^_^headers^_^: ^_^headers^_^
+      authorization:
+        type: ^_^authType^_^
+        basicAuthUsername: ^_^username^_^
+        basicAuthPassword: ^_^password^_^
+        digestAuthUsername: ^_^username^_^
+        digestAuthPassword: ^_^password^_^
+      parseType: prometheus
+  # metrics - etcd_server_leader_changes_seen_total
+  - name: etcd_server_leader_changes_seen_total
+    i18n:
+      zh-CN: 领导者变更次数
+      en-US: Leader Changes
+      ja-JP: リーダー変更回数
+    priority: 1
+    fields:
+      - field: leaderChanges
+        type: 0
+        i18n:
+          zh-CN: 已观测到的领导者变更总次数
+          en-US: Total Leader Changes Seen
+          ja-JP: 観測されたリーダー変更総数
+    aliasFields:
+      - value
+    calculates:
+      - leaderChanges=value
+    protocol: http
+    http:
+      host: ^_^host^_^
+      port: ^_^port^_^
+      url: /metrics
+      timeout: ^_^timeout^_^
+      ssl: ^_^ssl^_^
+      method: GET
+      headers:
+        ^_^headers^_^: ^_^headers^_^
+      authorization:
+        type: ^_^authType^_^
+        basicAuthUsername: ^_^username^_^
+        basicAuthPassword: ^_^password^_^
+        digestAuthUsername: ^_^username^_^
+        digestAuthPassword: ^_^password^_^
+      parseType: prometheus
+  # metrics - process_cpu_seconds_total (standard Go/Prometheus client process 
collector, always present)
+  - name: process_cpu_seconds_total
+    i18n:
+      zh-CN: 进程CPU时间
+      en-US: Process CPU Time
+      ja-JP: プロセスCPU時間
+    priority: 1
+    fields:
+      - field: cpuSeconds
+        type: 0
+        unit: s
+        i18n:
+          zh-CN: 累计用户与系统CPU时间
+          en-US: Total User+System CPU Time
+          ja-JP: 累計ユーザー+システムCPU時間
+    aliasFields:
+      - value
+    calculates:
+      - cpuSeconds=value
+    protocol: http
+    http:
+      host: ^_^host^_^
+      port: ^_^port^_^
+      url: /metrics
+      timeout: ^_^timeout^_^
+      ssl: ^_^ssl^_^
+      method: GET
+      headers:
+        ^_^headers^_^: ^_^headers^_^
+      authorization:
+        type: ^_^authType^_^
+        basicAuthUsername: ^_^username^_^
+        basicAuthPassword: ^_^password^_^
+        digestAuthUsername: ^_^username^_^
+        digestAuthPassword: ^_^password^_^
+      parseType: prometheus
+  # metrics - process_resident_memory_bytes
+  - name: process_resident_memory_bytes
+    i18n:
+      zh-CN: 进程内存占用
+      en-US: Process Resident Memory
+      ja-JP: プロセス常駐メモリ
+    priority: 1
+    fields:
+      - field: memory
+        type: 0
+        unit: MB
+        i18n:
+          zh-CN: 常驻内存大小
+          en-US: Resident Memory Size
+          ja-JP: 常駐メモリサイズ
+    aliasFields:
+      - value
+    calculates:
+      - memory=value
+    units:
+      - memory=B->MB
+    protocol: http
+    http:
+      host: ^_^host^_^
+      port: ^_^port^_^
+      url: /metrics
+      timeout: ^_^timeout^_^
+      ssl: ^_^ssl^_^
+      method: GET
+      headers:
+        ^_^headers^_^: ^_^headers^_^
+      authorization:
+        type: ^_^authType^_^
+        basicAuthUsername: ^_^username^_^
+        basicAuthPassword: ^_^password^_^
+        digestAuthUsername: ^_^username^_^
+        digestAuthPassword: ^_^password^_^
+      parseType: prometheus
diff --git a/home/docs/help/etcd.md b/home/docs/help/etcd.md
new file mode 100644
index 0000000000..e9395a85eb
--- /dev/null
+++ b/home/docs/help/etcd.md
@@ -0,0 +1,65 @@
+---
+id: etcd
+title: Monitoring:etcd monitoring
+sidebar_label: etcd
+keywords: [open source monitoring tool, open source middleware monitoring 
tool, monitoring etcd metrics]
+---
+
+> HertzBeat monitors the etcd key-value store by collecting metrics from the 
Prometheus metrics endpoint that etcd exposes.
+>
+> etcd 3.4+ is supported (the database size metric 
`etcd_mvcc_db_total_size_in_bytes` replaced the old `etcd_debugging_*` name in 
3.4).
+
+## PreRequisites
+
+### Make sure HertzBeat can reach etcd's metrics endpoint
+
+etcd exposes Prometheus-format metrics on its client port (default `2379`) at 
the `/metrics` path. Make sure this address is reachable from HertzBeat:
+
+1. If etcd only listens on localhost, or client mutual TLS is enabled on the 
client port, configure a dedicated metrics listener via 
[`--listen-metrics-urls`](https://etcd.io/docs/latest/op-guide/configuration/). 
It serves the metrics and health-check endpoints; if exposed without TLS, 
restrict it to a trusted network.
+2. Access `{metrics-host}:{metrics-port}/metrics` (the client port `2379` by 
default) from the HertzBeat host to confirm metrics data can be fetched.
+
+More information see [etcd monitoring 
documentation](https://etcd.io/docs/latest/op-guide/monitoring/).
+
+### Configuration parameter
+
+| Parameter name      | Parameter help description                             
                                   |
+|----------------------|---------------------------------------------------------------------------------------------|
+| Target Host          | Monitored IPV4, IPV6 or domain name. Note⚠️Without 
protocol header (eg: https://, http://) |
+| Port                 | Port of the etcd metrics endpoint, default 2379 when 
using the client listener             |
+| Query Timeout        | HTTP request timeout in milliseconds, default 6000    
                                      |
+| HTTPS                | Whether to use HTTPS to request the metrics endpoint  
                                      |
+| Headers              | Optional extra HTTP request headers                   
                                      |
+| Auth Type            | Optional Basic/Digest auth if the metrics endpoint 
sits behind an auth proxy                |
+| Username / Password  | Credentials used when Auth Type is set                
                                      |
+
+### Collection Metric
+
+#### Metric set:etcd_server_has_leader
+
+| Metric name | Metric unit | Metric help description                          
           |
+|-------------|-------------|---------------------------------------------------------------|
+| hasLeader   | none        | Whether this etcd member has a raft leader 
(1=yes, 0=no)       |
+
+#### Metric set:etcd_mvcc_db_total_size_in_bytes
+
+| Metric name | Metric unit | Metric help description                          
    |
+|-------------|-------------|--------------------------------------------------------|
+| dbSize      | MB          | Total size of the underlying database physically 
allocated |
+
+#### Metric set:etcd_server_leader_changes_seen_total
+
+| Metric name    | Metric unit | Metric help description                |
+|-----------------|-------------|-------------------------------------------|
+| leaderChanges   | none        | Total number of leader changes observed  |
+
+#### Metric set:process_cpu_seconds_total
+
+| Metric name | Metric unit | Metric help description                        |
+|-------------|-------------|---------------------------------------------------|
+| cpuSeconds  | second      | Cumulative user and system CPU time consumed     
 |
+
+#### Metric set:process_resident_memory_bytes
+
+| Metric name | Metric unit | Metric help description        |
+|-------------|-------------|-----------------------------------|
+| memory      | MB          | Resident memory size of the process |
diff --git 
a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/etcd.md 
b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/etcd.md
new file mode 100644
index 0000000000..5a672fc08c
--- /dev/null
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/etcd.md
@@ -0,0 +1,65 @@
+---
+id: etcd
+title: 监控:etcd 监控
+sidebar_label: etcd
+keywords: [开源监控系统, 中间件监控, etcd监控]
+---
+
+> HertzBeat 通过采集 etcd 暴露的 Prometheus metrics 接口数据,对 etcd 键值存储进行监控。
+>
+> 支持 etcd 3.4 及以上版本(数据库大小指标 `etcd_mvcc_db_total_size_in_bytes` 自 3.4 起替代旧的 
`etcd_debugging_*` 命名)。
+
+## 监控前操作
+
+### 确认 HertzBeat 能访问 etcd 的 metrics 接口
+
+etcd 会在客户端端口(默认 `2379`)的 `/metrics` 路径暴露 Prometheus 格式的指标。请确保 HertzBeat 能访问该地址:
+
+1. 若 etcd 仅监听 localhost,或客户端端口启用了双向 TLS,请通过 
[`--listen-metrics-urls`](https://etcd.io/docs/latest/op-guide/configuration/) 
配置独立的 metrics 监听地址。该地址提供 metrics 与健康检查端点;若不加 TLS 暴露,请仅限受信任网络访问。
+2. 从 HertzBeat 所在机器访问 `{metrics-host}:{metrics-port}/metrics`(默认为客户端端口 
`2379`),确认能获取到 metrics 数据。
+
+更多信息请参考 [etcd 监控文档](https://etcd.io/docs/latest/op-guide/monitoring/)。
+
+### 配置参数
+
+| 参数名称   | 参数帮助描述                                       |
+|--------|-----------------------------------------------|
+| 目标Host | 被监控的对端IPV4,IPV6或域名。注意⚠️不带协议头(eg: https://, http://)。 |
+| 端口     | metrics 接口端口,使用客户端 listener 时默认为 2379        |
+| 查询超时时间 | HTTP请求超时时间,单位毫秒,默认6000                        |
+| 启用HTTPS | 是否使用 HTTPS 请求 metrics 接口                      |
+| 请求Headers | 可选的额外 HTTP 请求头                                |
+| 认证方式   | 若 metrics 接口在认证代理后面,可选 Basic/Digest 认证        |
+| 用户名/密码 | 配置认证方式后使用的凭据                                  |
+
+### 采集指标
+
+#### 指标集合:etcd_server_has_leader
+
+| 指标名称      | 指标单位 | 指标帮助描述                       |
+|-----------|------|------------------------------|
+| hasLeader | 无    | 该 etcd 成员是否存在 raft 领导者(1有0无) |
+
+#### 指标集合:etcd_mvcc_db_total_size_in_bytes
+
+| 指标名称   | 指标单位 | 指标帮助描述          |
+|--------|------|-----------------|
+| dbSize | MB   | 物理分配的数据库总大小     |
+
+#### 指标集合:etcd_server_leader_changes_seen_total
+
+| 指标名称           | 指标单位 | 指标帮助描述       |
+|----------------|------|--------------|
+| leaderChanges  | 无    | 已观测到的领导者变更总次数 |
+
+#### 指标集合:process_cpu_seconds_total
+
+| 指标名称       | 指标单位 | 指标帮助描述           |
+|------------|------|------------------|
+| cpuSeconds | 秒    | 累计用户与系统CPU使用时间   |
+
+#### 指标集合:process_resident_memory_bytes
+
+| 指标名称   | 指标单位 | 指标帮助描述  |
+|--------|------|---------|
+| memory | MB   | 进程常驻内存大小 |
diff --git a/home/sidebars.json b/home/sidebars.json
index fd24405bbe..b42a8db679 100755
--- a/home/sidebars.json
+++ b/home/sidebars.json
@@ -245,6 +245,7 @@
             "help/kafka_client",
             "help/pulsar",
             "help/nacos",
+            "help/etcd",
             "help/rabbitmq",
             "help/rocketmq",
             "help/shenyu",


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

Reply via email to