diff --git a/.github/workflows/collector-native-build.yml b/.github/workflows/collector-native-build.yml
new file mode 100644
index 00000000000..d44877dba8f
--- /dev/null
+++ b/.github/workflows/collector-native-build.yml
@@ -0,0 +1,89 @@
+# 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.
+
+name: Collector Native Release
+
+run-name: Native collector release build (${{ github.ref_name }})
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build-native-collector:
+ name: Native collector (${{ matrix.platform }})
+ permissions:
+ contents: read
+ timeout-minutes: 120
+ runs-on: ${{ matrix.runner }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - platform: linux-amd64
+ runner: ubuntu-24.04
+ archive_ext: tar.gz
+ - platform: linux-arm64
+ runner: ubuntu-24.04-arm
+ archive_ext: tar.gz
+ - platform: macos-amd64
+ runner: macos-13
+ archive_ext: tar.gz
+ - platform: macos-arm64
+ runner: macos-14
+ archive_ext: tar.gz
+ - platform: windows-amd64
+ runner: windows-latest
+ archive_ext: zip
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up GraalVM JDK 25
+ uses: graalvm/setup-graalvm@v1
+ with:
+ distribution: graalvm-community
+ java-version: '25'
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ cache: maven
+ native-image-job-reports: 'true'
+
+ - name: Verify toolchain
+ shell: pwsh
+ run: |
+ java -version
+ native-image --version
+ mvn -version
+
+ - name: Build native collector package
+ run: mvn -B -pl hertzbeat-collector/hertzbeat-collector-collector -am -Pnative -DskipTests package
+
+ - name: Locate native collector package
+ id: package
+ shell: pwsh
+ run: |
+ $package = Get-ChildItem -Path "dist/apache-hertzbeat-collector-native-*-${{ matrix.platform }}-bin.${{ matrix.archive_ext }}" | Select-Object -First 1
+ if (-not $package) {
+ throw "Native collector package not found for ${{ matrix.platform }}"
+ }
+ "archive=$($package.FullName)" >> $env:GITHUB_OUTPUT
+
+ - name: Upload native collector package
+ uses: actions/upload-artifact@v4
+ with:
+ name: apache-hertzbeat-collector-native-${{ matrix.platform }}
+ path: ${{ steps.package.outputs.archive }}
+ retention-days: 14
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1a1738267c9..9f329883578 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,7 +32,7 @@ Even small corrections to typos are very welcome :)
#### Backend start
-1. Requires `maven3+`, `java21` and `lombok` environments
+1. Requires `maven3+`, `java25` and `lombok` environments
2. (Optional) Modify the configuration file: `hertzbeat-startup/src/main/resources/application.yml`
@@ -172,7 +172,7 @@ Add WeChat account `ahertzbeat` to pull you into the WeChat group.
#### 后端启动
-1. 需要 `maven3+`, `java21` 和 `lombok` 环境
+1. 需要 `maven3+`, `java25` 和 `lombok` 环境
2. (可选)修改配置文件配置信息-`hertzbeat-startup/src/main/resources/application.yml`
diff --git a/README.md b/README.md
index 0d8cff96a67..e6b5b7dbf7a 100644
--- a/README.md
+++ b/README.md
@@ -130,12 +130,12 @@ Detailed config refer to [Install HertzBeat via Docker](https://hertzbeat.apache
##### 2:Install via package
-1. Download the release package `hertzbeat-xx.tar.gz` [Download](https://hertzbeat.apache.org/docs/download)
+1. Download the release package `apache-hertzbeat-xx-bin.tar.gz` [Download](https://hertzbeat.apache.org/docs/download)
2. Configure the HertzBeat configuration yml file `hertzbeat/config/application.yml` (optional)
3. Run command `$ ./bin/startup.sh ` or `bin/startup.bat`
4. Access `http://localhost:1157` to start, default account: `admin/hertzbeat`
5. Deploy collector clusters (Optional)
- - Download the release package `hertzbeat-collector-xx.tar.gz` to new machine [Download](https://hertzbeat.apache.org/docs/download)
+ - Download the release package `apache-hertzbeat-collector-xx-bin.tar.gz` (JVM collector) or the native collector package for your platform, such as `apache-hertzbeat-collector-native-xx-linux-amd64-bin.tar.gz` or `apache-hertzbeat-collector-native-xx-windows-amd64-bin.zip`, to the new machine [Download](https://hertzbeat.apache.org/docs/download)
- Configure the collector configuration yml file `hertzbeat-collector/config/application.yml`: unique `identity` name, running `mode` (public or private), hertzbeat `manager-host`, hertzbeat `manager-port`
```yaml
collector:
@@ -148,7 +148,8 @@ Detailed config refer to [Install HertzBeat via Docker](https://hertzbeat.apache
manager-host: ${MANAGER_HOST:127.0.0.1}
manager-port: ${MANAGER_PORT:1158}
```
- - Run command `$ ./bin/startup.sh ` or `bin/startup.bat`
+ - If you need MySQL, OceanBase, Oracle, or DB2 monitoring with external JDBC drivers from `ext-lib`, use the JVM collector package.
+ - Run `$ ./bin/startup.sh ` or `bin/startup.bat` for the JVM collector package. Run `$ ./bin/startup.sh ` for Linux or macOS native collector packages, and `bin\\startup.bat` for the Windows native collector package.
- Access `http://localhost:1157` and you will see the registered new collector in dashboard
Detailed config refer to [Install HertzBeat via Package](https://hertzbeat.apache.org/docs/start/package-deploy)
@@ -156,7 +157,7 @@ Detailed config refer to [Install HertzBeat via Package](https://hertzbeat.apach
##### 3:Start via source code
1. Local source code debugging needs to start the back-end project `hertzbeat-startup` and the front-end project `web-app`.
-2. Backend:need `maven3+`, `java21`, `lombok`, add VM options in IDE: ` --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED `, then start the `hertzbeat-startup` service.
+2. Backend:need `maven3+`, `java25`, `lombok`, add VM options in IDE: ` --add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED `, then start the `hertzbeat-startup` service.
3. Web:need `nodejs npm angular-cli` environment, Run `ng serve --open` in `web-app` directory after backend startup.
4. Access `http://localhost:4200` to start, default account: `admin/hertzbeat`
diff --git a/README_CN.md b/README_CN.md
index 7393ace7010..fda8d7ca640 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -127,12 +127,12 @@
##### 方式二:通过安装包安装
-1. 下载您系统环境对应的安装包 `hertzbeat-xx.tar.gz` [Download](https://hertzbeat.apache.org/docs/download)
+1. 下载您系统环境对应的安装包 `apache-hertzbeat-xx-bin.tar.gz` [Download](https://hertzbeat.apache.org/docs/download)
2. 配置 HertzBeat 的配置文件 `hertzbeat/config/application.yml` (可选)
3. 部署启动 `$ ./bin/startup.sh ` 或 `bin/startup.bat`
4. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
5. 部署采集器集群(可选)
- - 下载采集器安装包 `hertzbeat-collector-xx.tar.gz` 到规划的另一台部署主机上 [Download](https://hertzbeat.apache.org/docs/download)
+ - 下载采集器安装包 `apache-hertzbeat-collector-xx-bin.tar.gz`(JVM 采集器)或与你目标平台匹配的 Native 采集器安装包,例如 `apache-hertzbeat-collector-native-xx-linux-amd64-bin.tar.gz`、`apache-hertzbeat-collector-native-xx-windows-amd64-bin.zip`,到规划的另一台部署主机上 [Download](https://hertzbeat.apache.org/docs/download)
- 配置采集器的配置文件 `hertzbeat-collector/config/application.yml` 里面的连接主 HertzBeat 服务的对外 IP,端口,当前采集器名称(需保证唯一性)等参数 `identity` `mode` (public or private) `manager-host` `manager-port`
```yaml
collector:
@@ -145,7 +145,8 @@
manager-host: ${MANAGER_HOST:127.0.0.1}
manager-port: ${MANAGER_PORT:1158}
```
- - 启动 `$ ./bin/startup.sh ` 或 `bin/startup.bat`
+ - 如果需要通过 `ext-lib` 加载 MySQL、OceanBase、Oracle、DB2 等外置 JDBC 驱动,请使用 JVM 采集器安装包。
+ - JVM 采集器安装包使用 `$ ./bin/startup.sh ` 或 `bin/startup.bat` 启动。Linux 或 macOS 的 Native 采集器安装包使用 `$ ./bin/startup.sh ` 启动,Windows 的 Native 采集器安装包使用 `bin\\startup.bat` 启动
- 浏览器访问主 HertzBeat 服务 `http://localhost:1157` 查看概览页面即可看到注册上来的新采集器
更多配置详细步骤参考 [通过安装包安装HertzBeat](https://hertzbeat.apache.org/docs/start/package-deploy)
@@ -153,7 +154,7 @@
##### 方式三:本地代码启动
1. 此为前后端分离项目,本地代码调试需要分别启动后端工程 `hertzbeat-startup` 和前端工程 `web-app`
-2. 后端:需要 `maven3+`, `java21` 和 `lombok` 环境,修改 `YML` 配置信息,添加JVM参数`--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`后启动 `hertzbeat-startup` 服务即可。
+2. 后端:需要 `maven3+`, `java25` 和 `lombok` 环境,修改 `YML` 配置信息,添加JVM参数`--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`后启动 `hertzbeat-startup` 服务即可。
3. 前端:需要 `nodejs npm angular-cli`环境,待本地后端启动后,在 `web-app` 目录下启动 `ng serve --open`
4. 浏览器访问 `http://localhost:4200` 即可开始,默认账号密码 `admin/hertzbeat`
diff --git a/README_JP.md b/README_JP.md
index 13c49de6a4f..f8993253319 100644
--- a/README_JP.md
+++ b/README_JP.md
@@ -108,7 +108,7 @@
docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat
```
-2. スタート:`http://localhost:4200`にアクセスします。デフォルトのアカウントとパスワード:`admin/hertzbeat`。
+2. スタート:`http://localhost:1157`にアクセスします。デフォルトのアカウントとパスワード:`admin/hertzbeat`。
3. コレクタークラスタのデプロイメント(オプション)
@@ -126,13 +126,13 @@
##### 方式2:インストールパッケージ
-1. リリースパッケージをダウンロード `hertzbeat-xx.tar.gz` [Download](https://hertzbeat.apache.org/docs/download)
-2. HertzBeatのymlファイルを設定 `hertzbeat/config/application.yml` (オプション)
-3. コマンド`$ ./bin/startup.sh`または`bin/startup.bat`を実行
-4. スタート:`http://localhost:4200`にアクセスします。デフォルトのアカウントとパスワード:`admin/hertzbeat`
+1. リリースパッケージ `apache-hertzbeat-xx-bin.tar.gz` をダウンロードします [Download](https://hertzbeat.apache.org/docs/download)
+2. HertzBeat の設定ファイル `hertzbeat/config/application.yml` を編集します(任意)
+3. コマンド `$ ./bin/startup.sh` または `bin/startup.bat` を実行します
+4. ブラウザで `http://localhost:1157` にアクセスします。デフォルトのアカウントとパスワードは `admin/hertzbeat` です
5. コレクタークラスタのデプロイメント(オプション)
- - コレクターパッケージを別のホストにダウンロード `hertzbeat-collector-xx.tar.gz` [Download](https://hertzbeat.apache.org/docs/download)
- - コレクターのymlファイルを設定 `hertzbeat-collector/config/application.yml`
+ - 別ホストにコレクターのインストールパッケージ `apache-hertzbeat-collector-xx-bin.tar.gz`(JVM コレクター)または対象プラットフォーム向けの Native コレクターパッケージ(例: `apache-hertzbeat-collector-native-xx-linux-amd64-bin.tar.gz`、`apache-hertzbeat-collector-native-xx-windows-amd64-bin.zip`)をダウンロードします [Download](https://hertzbeat.apache.org/docs/download)
+ - コレクターの設定ファイル `hertzbeat-collector/config/application.yml` を編集します
```yaml
collector:
dispatch:
@@ -148,15 +148,16 @@
- `mode: ${MODE:public}`:実行モード(パブリッククラスタまたはプライベートクラウドエッジ)。
- `manager-host: ${MANAGER_HOST:127.0.0.1}`:メインhertzbeatサーバーのIP。
- `manager-port: ${MANAGER_PORT:1158}`:メインhertzbeatサーバポート。
- - コマンド`$ ./bin/startup.sh`または`bin/startup.bat`を実行。
- - `http://localhost:1157`にアクセスし、登録された新しいコレクターを見ることがでます。
+ - `ext-lib` で MySQL、OceanBase、Oracle、DB2 などの外部 JDBC ドライバーを読み込む必要がある場合は、JVM コレクターのインストールパッケージを使用してください。
+ - JVM コレクターのインストールパッケージは `$ ./bin/startup.sh` または `bin/startup.bat`、Linux/macOS の Native コレクターパッケージは `$ ./bin/startup.sh`、Windows の Native コレクターパッケージは `bin\\startup.bat` で起動します。
+ - メインの HertzBeat サービス `http://localhost:1157` にアクセスすると、登録された新しいコレクターを確認できます。
詳細ステップ [通过安装包安装HertzBeat](https://hertzbeat.apache.org/docs/start/package-deploy)
##### 方式3:ローカルの実行
1. ローカルの実行には、バックエンドのプロジェクト`hertzbeat-startup`とフロントエンドのプロジェクト`web-app`を起動する必要があります。
-2. バックエンド:`maven3+`、`Java21`と`lombok`の環境は必要です。`YML` 設定を修正し、Java仮想マシンパラメータに`--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED` を追加し、`hertzbeat-startup` を起動します。
+2. バックエンド:`maven3+`、`Java25`、`lombok` の環境が必要です。`YML` 設定を修正し、Java 仮想マシンパラメータに `--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED` を追加して `hertzbeat-startup` を起動します。
3. フロントエンド:`nodejs npm angular-cli`の環境は必要です。ローカルのバックエンドが立ち上がったら、`web-app` ディレクトリで `ng serve --open` というコマンドを実行します。
4. スタート:`http://localhost:4200`にアクセスします。デフォルトのアカウントとパスワード:`admin/hertzbeat`。
diff --git a/hertzbeat-ai/pom.xml b/hertzbeat-ai/pom.xml
index 2b9298b6b5e..235b2481dce 100644
--- a/hertzbeat-ai/pom.xml
+++ b/hertzbeat-ai/pom.xml
@@ -27,7 +27,7 @@
${hertzbeat.version}
1.1.1
- 21
+ 25
diff --git a/hertzbeat-collector/hertzbeat-collector-basic/pom.xml b/hertzbeat-collector/hertzbeat-collector-basic/pom.xml
index c43972cda0a..de107950e41 100644
--- a/hertzbeat-collector/hertzbeat-collector-basic/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-basic/pom.xml
@@ -30,8 +30,8 @@
${project.artifactId}
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
1.2.5
@@ -189,4 +189,4 @@
${zookeeper.version}
-
\ No newline at end of file
+
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/pom.xml b/hertzbeat-collector/hertzbeat-collector-collector/pom.xml
index 8a108c99de0..e4f32ac721f 100644
--- a/hertzbeat-collector/hertzbeat-collector-collector/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-collector/pom.xml
@@ -29,12 +29,18 @@
${project.artifactId}
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
+
+ org.apache.hertzbeat
+ hertzbeat-common-spring
+ ${hertzbeat.version}
+
+
org.apache.hertzbeat
@@ -142,8 +148,8 @@
org.apache.maven.plugins
maven-compiler-plugin
- 17
- 17
+ ${java.version}
+ ${java.version}
@@ -216,8 +222,8 @@
org.apache.maven.plugins
maven-compiler-plugin
- 17
- 17
+ ${java.version}
+ ${java.version}
@@ -344,5 +350,201 @@
+
+ native
+
+ hertzbeat-collector-collector
+
+ ../../script/assembly/collector/bin-native
+ tar.gz
+ unsupported
+ ${native.target.platform}-bin
+ apache-hertzbeat-collector-native-${hzb.version}-${native.target.platform}-bin
+ target/${native.image.name}${native.binary.extension}
+ ${project.build.finalName}${native.binary.extension}
+
+
+ apache-hertzbeat-collector-native-${hzb.version}
+
+
+ src/main/resources
+
+ META-INF/services/org.apache.hertzbeat.collector.collect.AbstractCollect
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ full
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-enforcer-plugin
+ 3.5.0
+
+
+ require-supported-native-platform
+ validate
+
+ enforce
+
+
+
+
+ native.target.platform
+ ^(linux-amd64|linux-arm64|macos-amd64|macos-arm64|windows-amd64)$
+ Unsupported native collector platform. Build the native collector on a supported GitHub runner or matching local host: linux-amd64, linux-arm64, macos-amd64, macos-arm64, windows-amd64.
+
+
+
+
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ 0.11.4
+
+
+ build-native-image
+ package
+
+ compile-no-fork
+
+
+
+
+ ${native.image.name}
+
+ -H:+UnlockExperimentalVMOptions
+ -H:-AddAllFileSystemProviders
+ -H:ServiceLoaderFeatureExcludeServiceProviders=org.apache.sshd.common.file.root.RootedFileSystemProvider,org.apache.sshd.sftp.client.fs.SftpFileSystemProvider
+ --initialize-at-build-time=net.i2p.crypto.eddsa.EdDSASecurityProvider,org.apache.arrow.memory.util.MemoryUtil
+ -J--add-opens=java.base/java.nio=ALL-UNNAMED
+ -J-Dorg.apache.sshd.security.registrars=org.apache.sshd.common.util.security.eddsa.EdDSASecurityProviderRegistrar
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ ${maven-assembly-plugin.version}
+
+
+ native-bin
+ package
+
+ single
+
+
+
+ ../../script/assembly/collector/assembly-native.xml
+
+ ../../dist
+
+
+
+
+
+
+
+
+ native-platform-linux-amd64
+
+
+ Linux
+ amd64
+
+
+
+ linux-amd64
+
+
+
+ native-platform-linux-x86_64
+
+
+ Linux
+ x86_64
+
+
+
+ linux-amd64
+
+
+
+ native-platform-linux-arm64
+
+
+ Linux
+ aarch64
+
+
+
+ linux-arm64
+
+
+
+ native-platform-macos-amd64
+
+
+ mac
+ x86_64
+
+
+
+ macos-amd64
+
+
+
+ native-platform-macos-arm64
+
+
+ mac
+ aarch64
+
+
+
+ macos-arm64
+
+
+
+ native-platform-windows-amd64
+
+
+ windows
+ amd64
+
+
+
+ .exe
+ ../../script/assembly/collector/bin-native-win
+ zip
+ windows-amd64
+
+
+
+ native-platform-windows-x86_64
+
+
+ windows
+ x86_64
+
+
+
+ .exe
+ ../../script/assembly/collector/bin-native-win
+ zip
+ windows-amd64
+
+
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/Collector.java b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/Collector.java
index 3e41f228010..0eca3ce9e35 100644
--- a/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/Collector.java
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/Collector.java
@@ -18,10 +18,13 @@
package org.apache.hertzbeat.collector;
import jakarta.annotation.PostConstruct;
+import org.apache.hertzbeat.collector.nativex.CollectorRuntimeHintsRegistrar;
+import org.apache.hertzbeat.collector.nativex.NativeCollectorDefaults;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ImportRuntimeHints;
/**
* collector startup
@@ -29,13 +32,20 @@
@ComponentScan(basePackages = {"org.apache.hertzbeat"})
@ConfigurationPropertiesScan(basePackages = {"org.apache.hertzbeat"})
@SpringBootApplication
+@ImportRuntimeHints(CollectorRuntimeHintsRegistrar.class)
public class Collector {
public static void main(String[] args) {
- SpringApplication.run(Collector.class, args);
+ SpringApplication application = new SpringApplication(Collector.class);
+ NativeCollectorDefaults.applyTo(application);
+ application.run(args);
}
@PostConstruct
public void init() {
System.setProperty("jdk.jndi.object.factoriesFilter", "!com.zaxxer.hikari.HikariJNDIFactory");
+ if (System.getProperty("arrow.allocation.manager.type") == null
+ && System.getenv("ARROW_ALLOCATION_MANAGER_TYPE") == null) {
+ System.setProperty("arrow.allocation.manager.type", "Netty");
+ }
}
}
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/nativex/CollectorRuntimeHintsRegistrar.java b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/nativex/CollectorRuntimeHintsRegistrar.java
new file mode 100644
index 00000000000..3464caa1b1b
--- /dev/null
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/nativex/CollectorRuntimeHintsRegistrar.java
@@ -0,0 +1,111 @@
+/*
+ * 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.nativex;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.arrow.memory.netty.NettyAllocationManager;
+import org.apache.arrow.vector.types.DateUnit;
+import org.apache.arrow.vector.types.FloatingPointPrecision;
+import org.apache.arrow.vector.types.IntervalUnit;
+import org.apache.arrow.vector.types.MetadataVersion;
+import org.apache.arrow.vector.types.TimeUnit;
+import org.apache.arrow.vector.types.UnionMode;
+import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.DictionaryEncoding;
+import org.apache.arrow.vector.types.pojo.Field;
+import org.apache.arrow.vector.types.pojo.FieldType;
+import org.apache.arrow.vector.types.pojo.Schema;
+import org.apache.hertzbeat.common.entity.dto.ServerInfo;
+import org.springframework.aot.hint.BindingReflectionHintsRegistrar;
+import org.springframework.aot.hint.MemberCategory;
+import org.springframework.aot.hint.RuntimeHints;
+import org.springframework.aot.hint.RuntimeHintsRegistrar;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.TypeFilter;
+import org.springframework.lang.NonNull;
+import org.springframework.util.ClassUtils;
+
+/**
+ * Registers native binding hints for collector-side message payloads.
+ */
+@Slf4j
+public class CollectorRuntimeHintsRegistrar implements RuntimeHintsRegistrar {
+
+ private static final String JOB_PACKAGE = "org.apache.hertzbeat.common.entity.job";
+ private static final String JOB_PROTOCOL_PACKAGE = "org.apache.hertzbeat.common.entity.job.protocol";
+
+ @Override
+ public void registerHints(@NonNull RuntimeHints hints, ClassLoader classLoader) {
+ BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar();
+ registerType(bindingRegistrar, hints, ServerInfo.class);
+ scanBindingPackage(classLoader, bindingRegistrar, hints, JOB_PACKAGE);
+ scanBindingPackage(classLoader, bindingRegistrar, hints, JOB_PROTOCOL_PACKAGE);
+ hints.reflection().registerType(NettyAllocationManager.class, MemberCategory.DECLARED_FIELDS);
+ registerType(bindingRegistrar, hints, Schema.class);
+ registerType(bindingRegistrar, hints, Field.class);
+ registerType(bindingRegistrar, hints, FieldType.class);
+ registerType(bindingRegistrar, hints, DictionaryEncoding.class);
+ registerType(bindingRegistrar, hints, DateUnit.class);
+ registerType(bindingRegistrar, hints, FloatingPointPrecision.class);
+ registerType(bindingRegistrar, hints, IntervalUnit.class);
+ registerType(bindingRegistrar, hints, MetadataVersion.class);
+ registerType(bindingRegistrar, hints, TimeUnit.class);
+ registerType(bindingRegistrar, hints, UnionMode.class);
+ for (Class> nestedClass : ArrowType.class.getDeclaredClasses()) {
+ if (!nestedClass.isAnnotation() && !nestedClass.isInterface()) {
+ registerType(bindingRegistrar, hints, nestedClass);
+ }
+ }
+ }
+
+ private void scanBindingPackage(ClassLoader classLoader, BindingReflectionHintsRegistrar bindingRegistrar,
+ RuntimeHints hints, String basePackage) {
+ for (Class> clazz : findBindingTypes(basePackage, classLoader)) {
+ registerType(bindingRegistrar, hints, clazz);
+ }
+ }
+
+ private void registerType(BindingReflectionHintsRegistrar bindingRegistrar, RuntimeHints hints, Class> clazz) {
+ bindingRegistrar.registerReflectionHints(hints.reflection(), clazz);
+ }
+
+ private Set> findBindingTypes(String basePackage, ClassLoader classLoader) {
+ Set> bindingTypes = new LinkedHashSet<>();
+ ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
+ TypeFilter includeAll = (metadataReader, metadataReaderFactory) -> true;
+ scanner.addIncludeFilter(includeAll);
+ for (BeanDefinition candidate : scanner.findCandidateComponents(basePackage)) {
+ String className = candidate.getBeanClassName();
+ if (className == null) {
+ continue;
+ }
+ try {
+ Class> clazz = ClassUtils.forName(className, classLoader);
+ if (!clazz.isAnnotation() && !clazz.isInterface()) {
+ bindingTypes.add(clazz);
+ }
+ } catch (Throwable ex) {
+ log.debug("Skip native binding hint registration for {}", className, ex);
+ }
+ }
+ return bindingTypes;
+ }
+}
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/nativex/NativeCollectorDefaults.java b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/nativex/NativeCollectorDefaults.java
new file mode 100644
index 00000000000..5f97c36ecbf
--- /dev/null
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/main/java/org/apache/hertzbeat/collector/nativex/NativeCollectorDefaults.java
@@ -0,0 +1,58 @@
+/*
+ * 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.nativex;
+
+import java.util.Map;
+import org.springframework.boot.SpringApplication;
+import org.springframework.core.NativeDetector;
+
+/**
+ * Applies the native-only collector defaults without forking {@code application.yml}.
+ */
+public final class NativeCollectorDefaults {
+
+ static final String AUTOCONFIGURE_EXCLUDE_PROPERTY = "spring.autoconfigure.exclude";
+ static final String NATIVE_AUTOCONFIGURE_EXCLUDES = String.join(",",
+ "org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration",
+ "org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration",
+ "org.springframework.boot.jdbc.autoconfigure.DataSourceAutoConfiguration",
+ "org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration",
+ "org.springframework.boot.data.jpa.autoconfigure.DataJpaRepositoriesAutoConfiguration",
+ "org.springframework.boot.jdbc.autoconfigure.DataSourceInitializationAutoConfiguration",
+ "org.springframework.boot.jdbc.autoconfigure.DataSourceTransactionManagerAutoConfiguration",
+ "org.springframework.boot.jdbc.autoconfigure.health.DataSourceHealthContributorAutoConfiguration",
+ "org.springframework.boot.jdbc.autoconfigure.metrics.DataSourcePoolMetricsAutoConfiguration",
+ "org.springframework.boot.tomcat.autoconfigure.metrics.TomcatMetricsAutoConfiguration");
+
+ private NativeCollectorDefaults() {
+ }
+
+ public static void applyTo(SpringApplication application) {
+ Map defaultProperties = defaultProperties(NativeDetector.inNativeImage());
+ if (!defaultProperties.isEmpty()) {
+ application.setDefaultProperties(defaultProperties);
+ }
+ }
+
+ static Map defaultProperties(boolean nativeImage) {
+ if (!nativeImage) {
+ return Map.of();
+ }
+ return Map.of(AUTOCONFIGURE_EXCLUDE_PROPERTY, NATIVE_AUTOCONFIGURE_EXCLUDES);
+ }
+}
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/META-INF/spring.factories b/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000000..731da64e615
--- /dev/null
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,17 @@
+# 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.
+
+# Intentionally left blank.
+# Native collector defaults are applied from Collector.main.
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/native/resources/META-INF/native-image/org.apache.hertzbeat/hertzbeat-collector-collector/reflect-config.json b/hertzbeat-collector/hertzbeat-collector-collector/src/native/resources/META-INF/native-image/org.apache.hertzbeat/hertzbeat-collector-collector/reflect-config.json
new file mode 100644
index 00000000000..227a978fe57
--- /dev/null
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/native/resources/META-INF/native-image/org.apache.hertzbeat/hertzbeat-collector-collector/reflect-config.json
@@ -0,0 +1,54 @@
+[
+ {
+ "name": "org.apache.hertzbeat.collector.Collector__ApplicationContextInitializer",
+ "allDeclaredConstructors": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "name": "org.apache.hertzbeat.collector.Collector__BeanFactoryRegistrations",
+ "allDeclaredConstructors": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "name": "org.apache.hertzbeat.common.entity.dto.ServerInfo",
+ "allDeclaredConstructors": true,
+ "allDeclaredFields": true,
+ "allDeclaredMethods": true
+ },
+ {
+ "name": "io.netty.channel.kqueue.KQueueDatagramChannel",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.kqueue.KQueueSocketChannel",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.kqueue.KQueueEventLoopGroup",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.epoll.EpollDatagramChannel",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.epoll.EpollSocketChannel",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.epoll.EpollEventLoopGroup",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.socket.nio.NioDatagramChannel",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.socket.nio.NioSocketChannel",
+ "allPublicConstructors": true
+ },
+ {
+ "name": "io.netty.channel.nio.NioEventLoopGroup",
+ "allPublicConstructors": true
+ }
+]
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/native/resources/META-INF/services/org.apache.hertzbeat.collector.collect.AbstractCollect b/hertzbeat-collector/hertzbeat-collector-collector/src/native/resources/META-INF/services/org.apache.hertzbeat.collector.collect.AbstractCollect
new file mode 100644
index 00000000000..81ed2990010
--- /dev/null
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/native/resources/META-INF/services/org.apache.hertzbeat.collector.collect.AbstractCollect
@@ -0,0 +1,37 @@
+org.apache.hertzbeat.collector.collect.http.HttpCollectImpl
+org.apache.hertzbeat.collector.collect.http.SslCertificateCollectImpl
+org.apache.hertzbeat.collector.collect.database.JdbcCommonCollect
+org.apache.hertzbeat.collector.collect.icmp.IcmpCollectImpl
+org.apache.hertzbeat.collector.collect.jmx.JmxCollectImpl
+org.apache.hertzbeat.collector.collect.redis.RedisCommonCollectImpl
+org.apache.hertzbeat.collector.collect.mongodb.MongodbSingleCollectImpl
+org.apache.hertzbeat.collector.collect.rocketmq.RocketmqSingleCollectImpl
+org.apache.hertzbeat.collector.collect.snmp.SnmpCollectImpl
+org.apache.hertzbeat.collector.collect.ssh.SshCollectImpl
+org.apache.hertzbeat.collector.collect.telnet.TelnetCollectImpl
+org.apache.hertzbeat.collector.collect.smtp.SmtpCollectImpl
+org.apache.hertzbeat.collector.collect.ntp.NtpCollectImpl
+org.apache.hertzbeat.collector.collect.websocket.WebsocketCollectImpl
+org.apache.hertzbeat.collector.collect.ftp.FtpCollectImpl
+org.apache.hertzbeat.collector.collect.udp.UdpCollectImpl
+org.apache.hertzbeat.collector.collect.push.PushCollectImpl
+org.apache.hertzbeat.collector.collect.dns.DnsCollectImpl
+org.apache.hertzbeat.collector.collect.nginx.NginxCollectImpl
+org.apache.hertzbeat.collector.collect.memcached.MemcachedCollectImpl
+org.apache.hertzbeat.collector.collect.nebulagraph.NebulaGraphCollectImpl
+org.apache.hertzbeat.collector.collect.pop3.Pop3CollectImpl
+org.apache.hertzbeat.collector.collect.registry.RegistryImpl
+org.apache.hertzbeat.collector.collect.redfish.RedfishCollectImpl
+org.apache.hertzbeat.collector.collect.nebulagraph.NgqlCollectImpl
+org.apache.hertzbeat.collector.collect.imap.ImapCollectImpl
+org.apache.hertzbeat.collector.collect.script.ScriptCollectImpl
+org.apache.hertzbeat.collector.collect.mqtt.MqttCollectImpl
+org.apache.hertzbeat.collector.collect.ipmi2.IpmiCollectImpl
+org.apache.hertzbeat.collector.collect.kafka.KafkaCollectImpl
+org.apache.hertzbeat.collector.collect.sd.HttpSdCollectImpl
+org.apache.hertzbeat.collector.collect.sd.NacosSdCollectImpl
+org.apache.hertzbeat.collector.collect.sd.DnsSdCollectImpl
+org.apache.hertzbeat.collector.collect.sd.EurekaSdCollectImpl
+org.apache.hertzbeat.collector.collect.sd.ConsulSdCollectImpl
+org.apache.hertzbeat.collector.collect.modbus.ModbusCollectImpl
+org.apache.hertzbeat.collector.collect.s7.S7CollectImpl
diff --git a/hertzbeat-collector/hertzbeat-collector-collector/src/test/java/org/apache/hertzbeat/collector/nativex/NativeCollectorDefaultsTest.java b/hertzbeat-collector/hertzbeat-collector-collector/src/test/java/org/apache/hertzbeat/collector/nativex/NativeCollectorDefaultsTest.java
new file mode 100644
index 00000000000..2ffa4beeebc
--- /dev/null
+++ b/hertzbeat-collector/hertzbeat-collector-collector/src/test/java/org/apache/hertzbeat/collector/nativex/NativeCollectorDefaultsTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.nativex;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+
+class NativeCollectorDefaultsTest {
+
+ @Test
+ void shouldProvideNativeAutoconfigureExcludesWhenNativeImage() {
+ Map properties = NativeCollectorDefaults.defaultProperties(true);
+ assertEquals(NativeCollectorDefaults.NATIVE_AUTOCONFIGURE_EXCLUDES,
+ properties.get(NativeCollectorDefaults.AUTOCONFIGURE_EXCLUDE_PROPERTY));
+ }
+
+ @Test
+ void shouldNotProvideNativeSpecificPropertiesForJvmCollector() {
+ assertTrue(NativeCollectorDefaults.defaultProperties(false).isEmpty());
+ }
+}
diff --git a/hertzbeat-collector/hertzbeat-collector-common/pom.xml b/hertzbeat-collector/hertzbeat-collector-common/pom.xml
index d4cffe23fb7..7e0de3eda8a 100644
--- a/hertzbeat-collector/hertzbeat-collector-common/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-common/pom.xml
@@ -29,8 +29,8 @@
${project.artifactId}
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
diff --git a/hertzbeat-collector/hertzbeat-collector-common/src/main/java/org/apache/hertzbeat/collector/collect/common/ssh/SshTunnelHelper.java b/hertzbeat-collector/hertzbeat-collector-common/src/main/java/org/apache/hertzbeat/collector/collect/common/ssh/SshTunnelHelper.java
index 16b3087e895..de65033abef 100644
--- a/hertzbeat-collector/hertzbeat-collector-common/src/main/java/org/apache/hertzbeat/collector/collect/common/ssh/SshTunnelHelper.java
+++ b/hertzbeat-collector/hertzbeat-collector-common/src/main/java/org/apache/hertzbeat/collector/collect/common/ssh/SshTunnelHelper.java
@@ -17,10 +17,6 @@
package org.apache.hertzbeat.collector.collect.common.ssh;
-import com.github.benmanes.caffeine.cache.Cache;
-import com.github.benmanes.caffeine.cache.Caffeine;
-import com.github.benmanes.caffeine.cache.RemovalCause;
-import com.github.benmanes.caffeine.cache.Scheduler;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@@ -35,7 +31,6 @@
import java.io.IOException;
import java.net.ServerSocket;
import java.security.GeneralSecurityException;
-import java.time.Duration;
import java.util.Comparator;
import java.util.ArrayList;
import java.util.Iterator;
@@ -53,34 +48,7 @@ public class SshTunnelHelper {
private static final long DEFAULT_CACHE_TIMEOUT = 500 * 1000;
- private static final Cache TRACKER_CACHE =
- Caffeine.newBuilder()
- .initialCapacity(1)
- .maximumSize(1000)
- .expireAfterAccess(Duration.ofMillis(DEFAULT_CACHE_TIMEOUT))
- .scheduler(Scheduler.systemScheduler())
- .removalListener((key, value, cause) -> {
- if (cause == RemovalCause.REPLACED) {
- return;
- }
- if (key != null && value != null) {
- // 1. try close tunnel
- SshClientSessionWrapper clientSessionWrapper = (SshClientSessionWrapper) key;
- LocalPortForwardingWrapper wrapper = (LocalPortForwardingWrapper) value;
- wrapper.remove(clientSessionWrapper.getClientSession());
-
- // 2. try close session
- if (!clientSessionWrapper.isShareConnection()) {
- try {
- clientSessionWrapper.close();
- log.info("[SSH Tunnel] close unshared ssh connection, {}", clientSessionWrapper);
- } catch (IOException e) {
- log.error("[SSH Tunnel] close unshared ssh connection error", e);
- }
- }
- }
- })
- .build();
+ private static final Map TRACKER_CACHE = new ConcurrentHashMap<>();
/**
@@ -122,15 +90,13 @@ public static int localPortForward(SshTunnel sshTunnel, String remoteHost, Strin
// 2. get tunnel
LocalPortForwardingWrapper forwardingWrapper = selectWrapper(
- TRACKER_CACHE.getIfPresent(sessionWrapper), sessionWrapper, remoteHost, remotePort);
+ TRACKER_CACHE.get(sessionWrapper), sessionWrapper, remoteHost, remotePort);
int localPort;
if (forwardingWrapper == null) {
localPort = getRandomPort();
LocalPortForwardingWrapper newForwardingWrapper = sessionWrapper
.createLocalPortForwardingTracker(localPort, remoteHost, Integer.parseInt(remotePort));
- if (TRACKER_CACHE.getIfPresent(sessionWrapper) == null) {
- TRACKER_CACHE.put(sessionWrapper, newForwardingWrapper);
- }
+ TRACKER_CACHE.putIfAbsent(sessionWrapper, newForwardingWrapper);
log.info("[SSH Tunnel] created ssh forwarding tracker ssh:{}, remote:{}, localPort:{}",
sshTunnel.getHost() + ":" + sshTunnel.getPort(), remoteHost + ":" + remotePort, localPort);
} else {
@@ -184,6 +150,23 @@ private static int getRandomPort() throws IOException {
}
}
+ private static void removeSessionCacheEntry(ClientSession session) {
+ TRACKER_CACHE.entrySet().removeIf(entry -> {
+ if (!Objects.equals(entry.getKey().getClientSession(), session)) {
+ return false;
+ }
+ if (!entry.getKey().isShareConnection()) {
+ try {
+ entry.getKey().close();
+ log.info("[SSH Tunnel] close unshared ssh connection, {}", entry.getKey());
+ } catch (IOException e) {
+ log.error("[SSH Tunnel] close unshared ssh connection error", e);
+ }
+ }
+ return true;
+ });
+ }
+
@Getter
@Setter
@EqualsAndHashCode
@@ -267,6 +250,10 @@ public List select(ClientSession session, Predicate<
list.add(wrapper);
}
}
+ if (trackerList.isEmpty()) {
+ map.remove(session);
+ removeSessionCacheEntry(session);
+ }
return list;
}
@@ -290,6 +277,8 @@ public void remove(ClientSession session) {
log.error("[SSH Tunnel] Remove ssh session local port forwarding error", e);
}
}
+ map.remove(session);
+ removeSessionCacheEntry(session);
}
public void close() throws IOException {
diff --git a/hertzbeat-collector/hertzbeat-collector-kafka/pom.xml b/hertzbeat-collector/hertzbeat-collector-kafka/pom.xml
index 9acd5c98d94..7175050e818 100644
--- a/hertzbeat-collector/hertzbeat-collector-kafka/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-kafka/pom.xml
@@ -29,8 +29,8 @@
${project.artifactId}
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
@@ -47,4 +47,4 @@
kafka-clients
-
\ No newline at end of file
+
diff --git a/hertzbeat-collector/hertzbeat-collector-mongodb/pom.xml b/hertzbeat-collector/hertzbeat-collector-mongodb/pom.xml
index 1cdd2070f38..472dc55c3b9 100644
--- a/hertzbeat-collector/hertzbeat-collector-mongodb/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-mongodb/pom.xml
@@ -29,8 +29,8 @@
${project.artifactId}
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
@@ -46,4 +46,4 @@
mongodb-driver-sync
-
\ No newline at end of file
+
diff --git a/hertzbeat-collector/hertzbeat-collector-nebulagraph/pom.xml b/hertzbeat-collector/hertzbeat-collector-nebulagraph/pom.xml
index b21d4554633..9ea2e9d914e 100644
--- a/hertzbeat-collector/hertzbeat-collector-nebulagraph/pom.xml
+++ b/hertzbeat-collector/hertzbeat-collector-nebulagraph/pom.xml
@@ -29,8 +29,8 @@
${project.artifactId}
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
@@ -57,4 +57,4 @@
-
\ No newline at end of file
+
diff --git a/hertzbeat-collector/pom.xml b/hertzbeat-collector/pom.xml
index 48daddead48..bbb03e841d5 100644
--- a/hertzbeat-collector/pom.xml
+++ b/hertzbeat-collector/pom.xml
@@ -28,7 +28,7 @@
${project.artifactId}
pom
- 21
+ 25
${java.version}
${java.version}
diff --git a/hertzbeat-e2e/hertzbeat-collector-basic-e2e/pom.xml b/hertzbeat-e2e/hertzbeat-collector-basic-e2e/pom.xml
index af0d937df12..316661344be 100644
--- a/hertzbeat-e2e/hertzbeat-collector-basic-e2e/pom.xml
+++ b/hertzbeat-e2e/hertzbeat-collector-basic-e2e/pom.xml
@@ -28,8 +28,8 @@
hertzbeat-collector-basic-e2e
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
42.5.5
diff --git a/hertzbeat-e2e/hertzbeat-collector-common-e2e/pom.xml b/hertzbeat-e2e/hertzbeat-collector-common-e2e/pom.xml
index 323e3c57b7e..1e2952bdf28 100644
--- a/hertzbeat-e2e/hertzbeat-collector-common-e2e/pom.xml
+++ b/hertzbeat-e2e/hertzbeat-collector-common-e2e/pom.xml
@@ -28,8 +28,8 @@
hertzbeat-collector-common-e2e
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
@@ -67,4 +67,4 @@
-
\ No newline at end of file
+
diff --git a/hertzbeat-e2e/hertzbeat-collector-kafka-e2e/pom.xml b/hertzbeat-e2e/hertzbeat-collector-kafka-e2e/pom.xml
index d56825f6def..3c1824951d1 100644
--- a/hertzbeat-e2e/hertzbeat-collector-kafka-e2e/pom.xml
+++ b/hertzbeat-e2e/hertzbeat-collector-kafka-e2e/pom.xml
@@ -28,8 +28,8 @@
hertzbeat-collector-kafka-e2e
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
diff --git a/hertzbeat-e2e/hertzbeat-log-e2e/pom.xml b/hertzbeat-e2e/hertzbeat-log-e2e/pom.xml
index c725c7bd35f..a5638e23a20 100644
--- a/hertzbeat-e2e/hertzbeat-log-e2e/pom.xml
+++ b/hertzbeat-e2e/hertzbeat-log-e2e/pom.xml
@@ -28,8 +28,8 @@
hertzbeat-log-e2e
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
3.3.1
3.6.1
diff --git a/hertzbeat-e2e/pom.xml b/hertzbeat-e2e/pom.xml
index dbcbad9c5df..445a8a50776 100644
--- a/hertzbeat-e2e/pom.xml
+++ b/hertzbeat-e2e/pom.xml
@@ -36,8 +36,8 @@
true
- 17
- 17
+ ${java.version}
+ ${java.version}
UTF-8
2.0.3
4.13.2
diff --git a/home/docs/community/contribution.md b/home/docs/community/contribution.md
index 72b823e716d..e1651205688 100644
--- a/home/docs/community/contribution.md
+++ b/home/docs/community/contribution.md
@@ -52,7 +52,7 @@ Even small corrections to typos are very welcome :)
#### Backend start
-1. Requires `maven3+`, `java21` and `lombok` environments
+1. Requires `maven3+`, `java25` and `lombok` environments
2. (Optional) Modify the configuration file: `hertzbeat-startup/src/main/resources/application.yml`
3. Execute under the project root directory: `mvn clean install -DskipTests`
4. Add VM Options: `--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`
diff --git a/home/docs/community/development.md b/home/docs/community/development.md
index fd2c83327cf..c52e5c075e1 100644
--- a/home/docs/community/development.md
+++ b/home/docs/community/development.md
@@ -12,7 +12,7 @@ sidebar_label: Development
### Backend start
-1. Requires `maven3+`, `java21` and `lombok` environments
+1. Requires `maven3+`, `java25` and `lombok` environments
2. (Optional) Modify the configuration file: `hertzbeat-startup/src/main/resources/application.yml`
3. Execute under the project root directory: `mvn clean install -DskipTests`
4. Add VM Options: `--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED`
@@ -34,7 +34,7 @@ sidebar_label: Development
## Build HertzBeat binary package
-> Requires `maven3+`, `java21`, `node` and `pnpm` environments.
+> Requires `maven3+`, `java25`, `node` and `pnpm` environments.
### Frontend build
@@ -50,20 +50,23 @@ sidebar_label: Development
### Backend build
-1. Requires `maven3+`, `java21` environments
+1. Requires `maven3+`, `java25` environments
2. Execute under the project root directory: `mvn clean package -Prelease`
-The HertzBeat install package will at `dist/hertzbeat-{version}.tar.gz`
+The HertzBeat install package will be generated at `dist/apache-hertzbeat-{version}-bin.tar.gz`
### Collector build
-1. Requires `maven3+`, `java21` environments
+1. Requires `maven3+`, `java25` environments
2. Execute under the project root directory: `mvn clean install`
3. Cd to the `hertzbeat-collector` directory: `cd hertzbeat-collector`
-4. Execute under `hertzbeat-collector` directory: `mvn clean package -Pcluster`
+4. Build the JVM collector package under `hertzbeat-collector` directory: `mvn clean package -Pcluster`
+5. Build the native collector package under `hertzbeat-collector` directory: `mvn clean package -pl hertzbeat-collector-collector -am -Pnative`
-The HertzBeat collector package will at `dist/hertzbeat-collector-{version}.tar.gz`
+> Native collector packaging requires GraalVM for JDK 25 with the `native-image` tool available in `PATH`.
+
+The HertzBeat collector packages will be generated at `dist/apache-hertzbeat-collector-{version}-bin.tar.gz` and a platform-specific native package such as `dist/apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz`
diff --git a/home/docs/community/how-to-release.md b/home/docs/community/how-to-release.md
index 6deb97d01b2..9c92b940958 100644
--- a/home/docs/community/how-to-release.md
+++ b/home/docs/community/how-to-release.md
@@ -10,7 +10,7 @@ This tutorial describes in detail how to release Apache HertzBeat™, take the r
This release process is operated in the UbuntuOS(Windows,Mac), and the following tools are required:
-- JDK 21
+- JDK 25
- Node18 pnpm
- Apache Maven 3.x
- GnuPG 2.x
@@ -211,10 +211,25 @@ mvn clean install
mvn clean package -Pcluster
```
+> Build the native collector binary for the current host with GraalVM JDK 25 and `native-image`
+
+```shell
+mvn clean package -pl hertzbeat-collector-collector -am -Pnative
+```
+
+> The repository workflow `.github/workflows/collector-native-build.yml` is a release helper, not a regular PR or push CI workflow.
+>
+> It is intentionally manual-only because multi-platform native builds are relatively slow and consume scarce Linux ARM, macOS, and Windows runners. During release preparation, open the Actions page, select `Collector Native Release`, run it from the release branch or tag, and then download the uploaded artifacts for signing and publishing.
+
The release package are here:
- `dist/apache-hertzbeat-{version}-bin.tar.gz`
- `dist/apache-hertzbeat-collector-{version}-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-linux-arm64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-macos-amd64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-macos-arm64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`
- `dist/apache-hertzbeat-{version}-docker-compose.tar.gz`
#### 3.4 Package the source code
diff --git a/home/docs/download.md b/home/docs/download.md
index fde53959f4b..b6d62fa5f06 100644
--- a/home/docs/download.md
+++ b/home/docs/download.md
@@ -22,9 +22,15 @@ Download the latest Apache HertzBeat™ release (v1.8.0) as server binary, colle
|-------------|------|---------|----------|
| **Server Binary** | ~200MB | Main monitoring server | Linux, macOS, Windows |
| **Collector Binary** | ~50MB | Distributed collectors | Linux, macOS, Windows |
-| **Source Code** | ~30MB | Build from source | Any with Java 21+ |
+| **Source Code** | ~30MB | Build from source | Any with Java 25+ |
| **Docker Compose** | ~5MB | Full stack deployment | Docker environments |
+:::tip Native Collector Recommendation
+If you do not need MySQL, OceanBase, Oracle, DB2, or other monitoring types that rely on external JDBC drivers from `ext-lib`, you can choose the native collector package for faster startup and lower memory usage.
+
+Trade-offs: native packages are platform-specific and do not support runtime `ext-lib` JDBC loading. See [Native Collector Guide](start/native-collector).
+:::
+
:::tip Security Verification
Verify downloads using GPG signatures and SHA512 checksums. See [Apache Verification Guide](https://www.apache.org/dyn/closer.cgi#verify) and [HertzBeat KEYS](https://downloads.apache.org/hertzbeat/KEYS).
:::
@@ -57,6 +63,9 @@ For older releases, please check the [archive](https://archive.apache.org/dist/i
**Server Binary** - For most users. Includes the main HertzBeat monitoring server with web UI.
**Collector Binary** - For distributed deployments. Deploy collectors in remote networks to report to the main server.
+Native collector downloads are platform-specific, for example `apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz` or `apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`.
+
+If you are deciding between JVM and native collector packages, start with [Native Collector Guide](start/native-collector).
**Source Code** - For developers who want to build, modify, or contribute to HertzBeat.
@@ -73,17 +82,19 @@ Import Apache HertzBeat KEYS first: `wget https://downloads.apache.org/hertzbeat
### What are the system requirements?
**Server Binary Requirements:**
-- Java 21 or higher
+- Java 25 or higher
- 4GB RAM minimum (8GB recommended)
- 2 CPU cores minimum
- 20GB disk space
**Collector Binary Requirements:**
-- Java 21 or higher
+- Java 25 or higher
- 2GB RAM minimum
- 1 CPU core minimum
- 5GB disk space
+Native collector packages are published per target platform, while the JVM collector package remains cross-platform.
+
### Can I use Docker instead of binary packages?
Yes. Docker is the recommended installation method:
diff --git a/home/docs/help/db2.md b/home/docs/help/db2.md
index 5652094fa92..9258d261634 100644
--- a/home/docs/help/db2.md
+++ b/home/docs/help/db2.md
@@ -16,6 +16,13 @@ keywords: [ open source monitoring tool, open source database monitoring tool, m
- Copy the JAR package to the `hertzbeat/ext-lib` directory.
- Restart the HertzBeat service.
+:::important Collector package selection
+DB2 monitoring requires external JDBC driver loading from `ext-lib`.
+
+- Use HertzBeat server built-in collector or the JVM collector package for DB2 monitoring
+- Do not use the native collector package for DB2 monitoring
+:::
+
### Configuration Parameters
The following are the required configuration parameters for DB2 monitoring:
diff --git a/home/docs/help/mysql.md b/home/docs/help/mysql.md
index f21a1a1da87..7d62f7c0a46 100644
--- a/home/docs/help/mysql.md
+++ b/home/docs/help/mysql.md
@@ -14,6 +14,13 @@ keywords: [open source monitoring tool, open source database monitoring tool, mo
- Copy the jar package to the `hertzbeat/ext-lib` directory.
- Restart the HertzBeat service.
+:::important Collector package selection
+MySQL monitoring requires external JDBC driver loading from `ext-lib`.
+
+- Use HertzBeat server built-in collector or the JVM collector package for MySQL monitoring
+- Do not use the native collector package for MySQL monitoring
+:::
+
### Configuration parameter
| Parameter name | Parameter help description |
diff --git a/home/docs/help/oceanbase.md b/home/docs/help/oceanbase.md
index 510934771f5..d4fe52aeb18 100644
--- a/home/docs/help/oceanbase.md
+++ b/home/docs/help/oceanbase.md
@@ -13,6 +13,13 @@ keywords: [open source monitoring tool, open source database monitoring tool, mo
- Copy the jar package to the `hertzbeat/ext-lib` directory.
- Restart the HertzBeat service.
+:::important Collector package selection
+OceanBase monitoring depends on the external MySQL JDBC driver in `ext-lib`.
+
+- Use HertzBeat server built-in collector or the JVM collector package for OceanBase monitoring
+- Do not use the native collector package for OceanBase monitoring
+:::
+
### Configuration parameter
| Parameter name | Parameter help description |
diff --git a/home/docs/help/oracle.md b/home/docs/help/oracle.md
index 83d7854030e..562e68cfcfd 100644
--- a/home/docs/help/oracle.md
+++ b/home/docs/help/oracle.md
@@ -13,6 +13,13 @@ keywords: [open source monitoring tool, open source database monitoring tool, mo
- Copy the jar package to the `hertzbeat/ext-lib` directory.
- Restart the HertzBeat service.
+:::important Collector package selection
+Oracle monitoring requires external JDBC driver loading from `ext-lib`.
+
+- Use HertzBeat server built-in collector or the JVM collector package for Oracle monitoring
+- Do not use the native collector package for Oracle monitoring
+:::
+
### Configuration parameter
| Parameter name | Parameter help description |
diff --git a/home/docs/help/risc-v.md b/home/docs/help/risc-v.md
index 41d605afe84..a7d2ee5d467 100644
--- a/home/docs/help/risc-v.md
+++ b/home/docs/help/risc-v.md
@@ -48,7 +48,7 @@ Reference: [Ubuntu Official Documentation](https://canonical-ubuntu-boards.readt
## Install and Configure RISC-V-Compatible JDK
-> Configure a JDK that supports RISC-V architecture. Here we use Temurin JDK 21.
+> Configure a JDK that supports RISC-V architecture. Here we use Temurin JDK 25.
**1. Download Temurin JDK**
Download link: [https://adoptium.net/temurin/releases](https://adoptium.net/temurin/releases)
@@ -66,11 +66,11 @@ sudo apt install -y tar wget
sudo mkdir -p /usr/lib/jvm
# Extract to system directory
-sudo tar -xzf OpenJDK21U-jdk_riscv64_linux_hotspot_21.0.2_13.tar.gz -C /usr/lib/jvm
+sudo tar -xzf OpenJDK25U-jdk_riscv64_linux_hotspot_.tar.gz -C /usr/lib/jvm
# Edit environment variables
sudo nano /etc/profile.d/java.sh
-export JAVA_HOME=/usr/lib/jvm/jdk-21.0.2+13
+export JAVA_HOME=$(find /usr/lib/jvm -maxdepth 1 -type d -name 'jdk-25*' | head -n 1)
export PATH=$JAVA_HOME/bin:$PATH
# Apply configuration
@@ -91,6 +91,6 @@ cd apache-hertzbeat-1.7.2-incubating-bin/bin/
> Notes:
>
-> 1. Replace `OpenJDK21U-jdk_riscv64_linux_hotspot_21.0.2_13.tar.gz` with your actual JDK filename.
+> 1. Replace `OpenJDK25U-jdk_riscv64_linux_hotspot_.tar.gz` with your actual JDK filename.
> 2. Ensure the emulator has internet access to download HertzBeat.
> 3. If issues arise, verify disk permissions and Java environment paths.
diff --git a/home/docs/start/native-collector.md b/home/docs/start/native-collector.md
new file mode 100644
index 00000000000..e1affbbc040
--- /dev/null
+++ b/home/docs/start/native-collector.md
@@ -0,0 +1,80 @@
+---
+id: native-collector
+title: Native Collector Guide
+sidebar_label: Native Collector
+description: When to choose the HertzBeat native collector package, its benefits, limitations, and deployment guidance.
+---
+
+## When should I choose the native collector?
+
+Choose the native collector package when your monitoring workload does not depend on loading external JDBC drivers from `ext-lib`.
+
+Typical native-friendly workloads include:
+
+- HTTP, HTTPS, website availability, and API checks
+- Port, ping, SSL certificate, and other network probes
+- Redis, Zookeeper, Kafka, and other non-JDBC monitoring types
+
+## Why use it?
+
+Compared with the JVM collector package, the native collector package is usually a better fit when you want:
+
+- Faster startup
+- Lower baseline memory usage
+- A simpler runtime without a bundled or preinstalled JDK
+
+## What are the trade-offs?
+
+The native collector package is not a drop-in replacement for every JVM collector scenario.
+
+- Native packages are platform-specific. You must choose the package that matches your OS and CPU architecture.
+- The native collector does not support loading external JDBC driver JARs from `ext-lib` at runtime.
+- If your deployment depends on JVM-style runtime classpath extension, keep using the JVM collector package.
+
+## When should I stay on the JVM collector?
+
+Use the JVM collector package if your monitoring depends on external JDBC drivers, especially:
+
+- MySQL, which requires `mysql-connector-j`
+- OceanBase, which also depends on the MySQL JDBC driver
+- Oracle, which requires `ojdbc8` and sometimes `orai18n`
+- DB2, which requires `jcc`
+
+## Package naming
+
+The JVM collector package remains cross-platform:
+
+- `apache-hertzbeat-collector-{version}-bin.tar.gz`
+
+The native collector package is platform-specific:
+
+- Linux or macOS: `apache-hertzbeat-collector-native-{version}-{platform}-bin.tar.gz`
+- Windows: `apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`
+
+Examples:
+
+- `apache-hertzbeat-collector-native-1.8.0-linux-amd64-bin.tar.gz`
+- `apache-hertzbeat-collector-native-1.8.0-macos-arm64-bin.tar.gz`
+- `apache-hertzbeat-collector-native-1.8.0-windows-amd64-bin.zip`
+
+## Configuration consistency
+
+The native collector package uses the same `config/application.yml` layout as the JVM collector package.
+
+That means:
+
+- Collector connection settings are edited in the same place
+- Virtual-thread related configuration is edited in the same place
+- Native-only boot adjustments are applied by code at runtime instead of maintaining a second `application.yml`
+
+## Recommended decision
+
+- Choose the native collector package when you want lower memory usage and faster startup for non-JDBC monitoring.
+- Choose the JVM collector package when you need `ext-lib`, external JDBC drivers, or JVM-style runtime extensibility.
+
+## How are the official multi-platform packages built?
+
+- `mvn clean package -pl hertzbeat-collector-collector -am -Pnative` builds a native collector package for the current host only.
+- The official Linux, macOS, and Windows native release packages are produced by manually running the `Collector Native Release` GitHub Actions workflow during release preparation, not on every push or pull request.
+
+For package deployment steps, refer to [Install HertzBeat via Package](package-deploy).
diff --git a/home/docs/start/package-deploy.md b/home/docs/start/package-deploy.md
index 0747d7821d9..f2e8981f7cd 100644
--- a/home/docs/start/package-deploy.md
+++ b/home/docs/start/package-deploy.md
@@ -6,11 +6,11 @@ sidebar_label: Install via Package
:::tip
You can install and run Apache HertzBeat™ on Linux Windows Mac system, and CPU supports X86/ARM64.
-Since version 1.6.0 uses `Java 21` and the installation package no longer provides a built-in JDK version, use the new Hertzbeat according to the following situations:
+The current branch uses `Java 25`, and the standard installation package no longer provides a built-in JDK. Use HertzBeat according to the following situations:
-- When the default environment variable on your server is `Java 21`, you do not need to take any action for this step.
-- When the default environment variable on your server is not `Java 21`, such as `Java 8` or `Java 11`, and if there are no other applications on your server that require a lower version of Java, download the appropriate version from [https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html) according to your system, and search the engine for how to set a new environment variable pointing to the new `Java 21`.
-- When the default environment variable on your server is not `Java 21`, such as `Java 8` or `Java 11`,and you don't want to change the environment variable because if there are other applications on your server that require a lower version of Java, download the appropriate version from [https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html) according to your system, and rename the extracted folder to `java`, then copy it to the Hertzbeat extraction directory.
+- When the default environment variable on your server is `Java 25`, you do not need to take any action for this step.
+- When the default environment variable on your server is not `Java 25`, such as `Java 8`, `Java 11`, or `Java 21`, and if there are no other applications on your server that require a lower version of Java, download `Java 25` from [https://www.oracle.com/java/technologies/downloads/](https://www.oracle.com/java/technologies/downloads/) according to your system, and set a new environment variable pointing to `Java 25`.
+- When the default environment variable on your server is not `Java 25`, such as `Java 8`, `Java 11`, or `Java 21`, and you do not want to change the environment variable because there are other applications on your server that require a lower version of Java, download `Java 25` from [https://www.oracle.com/java/technologies/downloads/](https://www.oracle.com/java/technologies/downloads/) according to your system, rename the extracted folder to `java`, and then copy it to the HertzBeat extraction directory.
:::
@@ -64,11 +64,20 @@ HertzBeat Collector is a lightweight data collector used to collect and send dat
Deploying multiple HertzBeat Collectors can achieve high availability, load balancing, and cloud-edge collaboration of data.
:::
+:::tip Native Collector Recommendation
+If your monitoring workload does not depend on external JDBC drivers from `ext-lib`, prefer the native collector package for faster startup and lower memory usage.
+
+Before choosing it, review the trade-offs in [Native Collector Guide](native-collector).
+:::
+

1. Download installation package
- Download installation package `apache-hertzbeat-collector-xxx-bin.tar.gz` corresponding to your system environment
+ Download the collector package that matches your deployment mode:
+ - JVM collector package: `apache-hertzbeat-collector-xxx-bin.tar.gz`
+ - Native collector package for Linux or macOS: `apache-hertzbeat-collector-native-xxx-{platform}-bin.tar.gz`
+ - Native collector package for Windows: `apache-hertzbeat-collector-native-xxx-windows-amd64-bin.zip`
- [Download Page](/docs/download)
2. Configure the collector configuration file
@@ -77,6 +86,10 @@ Deploying multiple HertzBeat Collectors can achieve high availability, load bala
```shell
tar zxvf apache-hertzbeat-collector-xxx-bin.tar.gz
+ # or
+ tar zxvf apache-hertzbeat-collector-native-xxx-linux-amd64-bin.tar.gz
+ # or
+ unzip apache-hertzbeat-collector-native-xxx-windows-amd64-bin.zip
```
Configure the collector configuration yml file `config/application.yml`: unique `identity` name, running `mode` (public or private), hertzbeat `manager-host`, hertzbeat `manager-port`
@@ -102,11 +115,31 @@ Deploying multiple HertzBeat Collectors can achieve high availability, load bala
3. Start the service
- Run command `$ ./bin/startup.sh` or `bin/startup.bat`
+ Run `$ ./bin/startup.sh` or `bin/startup.bat` for the JVM collector package. Run `$ ./bin/startup.sh` for Linux or macOS native collector packages, and `bin\\startup.bat` for the Windows native collector package.
4. Begin to explore HertzBeat Collector
- Access `http://ip:1157` and you will see the registered new collector in dashboard
+ Open the HertzBeat server dashboard at `http://:1157` and confirm the new collector is registered.
+
+:::important Native Collector Limitations
+The native collector package is suitable for monitoring types that do not rely on external JVM classpath extension.
+
+See [Native Collector Guide](native-collector) for package selection, package naming, and platform-specific trade-offs.
+
+`ext-lib`-based JDBC driver loading is a JVM collector capability. The native collector package does not support loading external JDBC driver JARs from `ext-lib` at runtime.
+
+If your monitoring depends on external JDBC drivers, use the JVM collector package instead of the native collector package. This currently includes:
+
+- MySQL, which requires `mysql-connector-j`
+- OceanBase, which also relies on the MySQL JDBC driver
+- Oracle, which requires `ojdbc8` and often `orai18n`
+- DB2, which requires `jcc`
+
+Recommended deployment:
+
+- Use the native collector package for HTTP, website, port, ping, and similar non-JDBC monitoring types
+- Use the JVM collector package when you need `ext-lib` driver extension
+:::
**HAVE FUN**
@@ -117,15 +150,15 @@ Deploying multiple HertzBeat Collectors can achieve high availability, load bala
1. you need to prepare the JAVA environment in advance
Install JAVA runtime environment-refer to [official website](https://www.oracle.com/java/technologies/downloads/)
- requirement:JDK21 ENV
+ requirement:JDK25 ENV
download JAVA installation package: [mirror website](https://mirrors.huaweicloud.com/openjdk/)
After installation use command line to check whether you install it successfully.
```shell
$ java -version
- openjdk version "21.0.9" 2025-10-21 LTS
- OpenJDK Runtime Environment Corretto-21.0.9.10.1 (build 21.0.9+10-LTS)
- OpenJDK 64-Bit Server VM Corretto-21.0.9.10.1 (build 21.0.9+10-LTS, mixed mode, sharing)
+ openjdk version "25.0.2" 2026-01-20
+ OpenJDK Runtime Environment (build 25.0.2+8)
+ OpenJDK 64-Bit Server VM (build 25.0.2+8, mixed mode, sharing)
```
diff --git a/home/docs/start/quickstart.md b/home/docs/start/quickstart.md
index ddb24cab1e5..8e4830ec023 100644
--- a/home/docs/start/quickstart.md
+++ b/home/docs/start/quickstart.md
@@ -13,7 +13,7 @@ Install Apache HertzBeat™ in under 5 minutes using Docker with a single comman
## Installation Methods
-HertzBeat provides four installation options:
+HertzBeat provides multiple installation options:
1. **Docker** (Recommended) - Fastest setup, production-ready
2. **Binary Package** - Traditional deployment with manual configuration
@@ -54,12 +54,13 @@ Detailed config refer to [Install HertzBeat via Docker](https://hertzbeat.apache
##### 2:Install via package
-1. Download the release package `hertzbeat-xx.tar.gz` [Download Page](https://hertzbeat.apache.org/docs/download)
+1. Download the release package `apache-hertzbeat-xx-bin.tar.gz` [Download Page](https://hertzbeat.apache.org/docs/download)
2. Configure the HertzBeat configuration yml file `hertzbeat/config/application.yml` (optional)
3. Run command `$ ./bin/startup.sh` or `bin/startup.bat`
4. Access `http://localhost:1157` to start, default account: `admin/hertzbeat`
5. Deploy collector clusters(Optional)
- - Download the release package `hertzbeat-collector-xx.tar.gz` to new machine [Download Page](https://hertzbeat.apache.org/docs/download)
+ - If you do not need MySQL, OceanBase, Oracle, DB2, or other `ext-lib` JDBC drivers, prefer the native collector package for faster startup and lower memory usage. See [Native Collector Guide](native-collector).
+ - Download the release package `apache-hertzbeat-collector-xx-bin.tar.gz` (JVM collector) or the native collector package for your target platform, such as `apache-hertzbeat-collector-native-xx-linux-amd64-bin.tar.gz` or `apache-hertzbeat-collector-native-xx-windows-amd64-bin.zip`, to the new machine [Download Page](https://hertzbeat.apache.org/docs/download)
- Configure the collector configuration yml file `hertzbeat-collector/config/application.yml`: unique `identity` name, running `mode` (public or private), hertzbeat `manager-host`, hertzbeat `manager-port`
```yaml
@@ -74,15 +75,17 @@ Detailed config refer to [Install HertzBeat via Docker](https://hertzbeat.apache
manager-port: ${MANAGER_PORT:1158}
```
- - Run command `$ ./bin/startup.sh` or `bin/startup.bat`
- - Access `http://localhost:1157` and you will see the registered new collector in dashboard
+ - Native collector trade-offs: platform-specific packages, no runtime `ext-lib` JDBC loading, and less suitable for JVM-style runtime classpath extension. See [Native Collector Guide](native-collector).
+ - If you need MySQL, OceanBase, Oracle, or DB2 monitoring with external JDBC drivers from `ext-lib`, use the JVM collector package.
+ - Run command `$ ./bin/startup.sh` or `bin/startup.bat` for the JVM collector package. Run `$ ./bin/startup.sh` for Linux or macOS native collector packages, and `bin\\startup.bat` for the Windows native collector package.
+ - Access the HertzBeat server dashboard at `http://localhost:1157` and confirm the new collector is registered.
Detailed config refer to [Install HertzBeat via Package](package-deploy)
##### 3:Start via source code
1. Local source code debugging needs to start the back-end project `manager` and the front-end project `web-app`.
-2. Backend:need `maven3+`, `java21`, `lombok`, start the `hertzbeat-startup` service.
+2. Backend:need `maven3+`, `java25`, `lombok`, start the `hertzbeat-startup` service.
3. Web:need `nodejs npm angular-cli` environment, Run `ng serve --open` in `web-app` directory after backend startup.
4. Access `http://localhost:4200` to start, default account: `admin/hertzbeat`
@@ -108,7 +111,7 @@ Detailed steps refer to [Artifact Hub](https://artifacthub.io/packages/helm/hert
- 2 CPU cores
- 4GB RAM
- 10GB disk space
-- Docker 20.10+ or Java 21+
+- Docker 20.10+ or Java 25+
**Operating Systems:** Linux, macOS, Windows (via Docker or WSL)
diff --git a/home/docs/start/virtual-thread.md b/home/docs/start/virtual-thread.md
index f9d36190316..06ee9518a8e 100644
--- a/home/docs/start/virtual-thread.md
+++ b/home/docs/start/virtual-thread.md
@@ -5,7 +5,7 @@ sidebar_label: Virtual Threads
description: Configure HertzBeat virtual-thread executors, defaults, rollback switches, and tuning guidance.
---
-HertzBeat runs on JDK 21 and uses virtual threads for the blocking execution paths that benefit from them. All `hertzbeat.vthreads` keys are optional. If you upgrade HertzBeat but do not merge the new YAML block into your existing `application.yml`, HertzBeat still starts with built-in defaults.
+HertzBeat runs on JDK 25 and uses virtual threads for the blocking execution paths that benefit from them. All `hertzbeat.vthreads` keys are optional. If you upgrade HertzBeat but do not merge the new YAML block into your existing `application.yml`, HertzBeat still starts with built-in defaults.
## 1. Where to Configure It
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md
index fe530b8bc01..3748879cf55 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md
@@ -52,7 +52,7 @@ limitations under the License.
#### 后端启动
-1. 需要 `maven3+`, `java21` 和 `lombok` 环境
+1. 需要 `maven3+`, `java25` 和 `lombok` 环境
2. (可选)修改配置文件配置信息-`hertzbeat-startup/src/main/resources/application.yml`
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/development.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/development.md
index 76b20f0d2ac..3df906d2f8e 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/development.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/development.md
@@ -11,7 +11,7 @@ sidebar_label: 运行编译
### 后端启动
-1. 需要 `maven3+`, `java21` 和 `lombok` 环境
+1. 需要 `maven3+`, `java25` 和 `lombok` 环境
2. (可选)修改配置文件配置信息-`hertzbeat-startup/src/main/resources/application.yml`
@@ -37,7 +37,7 @@ sidebar_label: 运行编译
## 生成二进制包
-> 需要 `maven3+`, `java21`, `node` 和 `pnpm` 环境.
+> 需要 `maven3+`, `java25`, `node` 和 `pnpm` 环境.
### 前端打包
@@ -53,20 +53,23 @@ sidebar_label: 运行编译
### 后端打包
-1. 需要 `maven3+`, `java21` 环境
+1. 需要 `maven3+`, `java25` 环境
2. 在项目根目录运行: `mvn clean package -Prelease`
-HertzBeat 包将生成为 `dist/hertzbeat-{version}.tar.gz`
+HertzBeat 包将生成为 `dist/apache-hertzbeat-{version}-bin.tar.gz`
### 采样器打包
-1. 需要 `maven3+`, `java21` 环境
+1. 需要 `maven3+`, `java25` 环境
2. 在项目根目录运行: `mvn clean install`
3. 切换到 `hertzbeat-collector` 目录: `cd hertzbeat-collector`
-4. 在 `hertzbeat-collector` 目录下执行: `mvn clean package -Pcluster`
+4. 在 `hertzbeat-collector` 目录下打 JVM 采集器安装包: `mvn clean package -Pcluster`
+5. 在 `hertzbeat-collector` 目录下打 Native 采集器安装包: `mvn clean package -pl hertzbeat-collector-collector -am -Pnative`
-HertzBeat 采样器包将生成为 `dist/hertzbeat-collector-{version}.tar.gz`
+> Native 采集器打包需要带有 `native-image` 命令的 GraalVM JDK 25 环境。
+
+HertzBeat 采集器安装包将生成为 `dist/apache-hertzbeat-collector-{version}-bin.tar.gz`,以及类似 `dist/apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz` 这样的 Native 平台安装包
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/how-to-release.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/how-to-release.md
index b0d5ae4239e..7415ca15f9e 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/how-to-release.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/how-to-release.md
@@ -10,7 +10,7 @@ sidebar_position: 4
此发布过程在 UbuntuOS(可在 Windows Mac) 中进行操作,并需要以下环境:
-- JDK 21
+- JDK 25
- Node18 pnpm
- Apache Maven 3.x
- GnuPG 2.x
@@ -211,10 +211,25 @@ mvn clean install
mvn clean package -Pcluster
```
+> 使用带 `native-image` 的 GraalVM JDK 25,为当前宿主机构建 Native 采集器安装包
+
+```shell
+mvn clean package -pl hertzbeat-collector-collector -am -Pnative
+```
+
+> 仓库中的 `.github/workflows/collector-native-build.yml` 是 release 辅助工作流,不参与日常 PR 或 push 的常规 CI。
+>
+> 之所以只保留手动触发,是因为跨平台 Native 构建耗时更长,也会占用相对稀缺的 Linux ARM、macOS 和 Windows Runner。准备发版时,请在 GitHub Actions 页面选择 `Collector Native Release`,基于 release 分支或 tag 手动触发,然后下载上传的产物用于签名和发布。
+
生成的二进制包在:
- `dist/apache-hertzbeat-{version}-bin.tar.gz`
- `dist/apache-hertzbeat-collector-{version}-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-linux-arm64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-macos-amd64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-macos-arm64-bin.tar.gz`
+- `dist/apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`
- `dist/apache-hertzbeat-{version}-docker-compose.tar.gz`
#### 3.4 打包项目源代码
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/download.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/download.md
index 2325660f32d..1b467661198 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/download.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/download.md
@@ -22,9 +22,15 @@ description: Apache HertzBeat 监控系统下载 - 服务器、采集器、源
|--------|------|------|------|
| **服务器二进制** | ~200MB | 主监控服务器 | Linux、macOS、Windows |
| **采集器二进制** | ~50MB | 分布式采集器 | Linux、macOS、Windows |
-| **源码** | ~30MB | 从源码构建 | 任何支持 Java 21+ 的平台 |
+| **源码** | ~30MB | 从源码构建 | 任何支持 Java 25+ 的平台 |
| **Docker Compose** | ~5MB | 全栈部署 | Docker 环境 |
+:::tip Native 采集器推荐
+如果你不需要 MySQL、OceanBase、Oracle、DB2,或其他依赖 `ext-lib` 外部 JDBC 驱动的监控类型,可以优先选择 Native 采集器安装包,通常启动更快、内存更省。
+
+它的代价是安装包按平台区分,且不支持运行时 `ext-lib` JDBC 加载。详见 [Native 采集器指南](start/native-collector)。
+:::
+
:::tip 安全验证
使用 GPG 签名和 SHA512 校验和验证下载。参见 [Apache 验证指南](https://www.apache.org/dyn/closer.cgi#verify) 和 [HertzBeat KEYS](https://downloads.apache.org/hertzbeat/KEYS)。
:::
@@ -57,6 +63,9 @@ description: Apache HertzBeat 监控系统下载 - 服务器、采集器、源
**服务器二进制** - 大多数用户使用。包含主 HertzBeat 监控服务器和 Web UI。
**采集器二进制** - 分布式部署使用。在远程网络部署采集器向主服务器上报。
+Native 采集器下载包按目标平台区分,例如 `apache-hertzbeat-collector-native-{version}-linux-amd64-bin.tar.gz` 或 `apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`。
+
+如果你正在 JVM 采集器和 Native 采集器之间做选择,建议先阅读 [Native 采集器指南](start/native-collector)。
**源码** - 开发者想要构建、修改或贡献 HertzBeat 时使用。
@@ -73,17 +82,19 @@ description: Apache HertzBeat 监控系统下载 - 服务器、采集器、源
### 系统要求是什么?
**服务器二进制要求:**
-- Java 21 或更高版本
+- Java 25 或更高版本
- 4GB RAM 最低(推荐 8GB)
- 2 CPU 核心 最低
- 20GB 磁盘空间
**采集器二进制要求:**
-- Java 21 或更高版本
+- Java 25 或更高版本
- 2GB RAM 最低
- 1 CPU 核心 最低
- 5GB 磁盘空间
+Native 采集器安装包会按目标平台分别发布,JVM 采集器安装包仍然保持跨平台。
+
### 可以用 Docker 代替二进制包吗?
可以。Docker 是推荐的安装方法:
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/db2.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/db2.md
index 0c2f9bb7e32..0dcba300aee 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/db2.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/db2.md
@@ -15,6 +15,13 @@ keywords: [ 开源监控系统, 开源数据库监控, DB2数据库监控 ]
- 将 jar 包复制到 `hertzbeat/ext-lib` 目录下
- 重启 HertzBeat 服务
+:::important 采集器包选择
+DB2 监控依赖 `ext-lib` 目录下的外置 JDBC 驱动加载能力。
+
+- DB2 监控请使用 HertzBeat 主程序内置采集器,或 JVM 采集器安装包
+- 不要使用 Native 采集器安装包执行 DB2 监控
+:::
+
### 配置参数
以下是 DB2 监控所需的配置参数:
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/mysql.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/mysql.md
index 82b3f36b564..bc7e723a558 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/mysql.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/mysql.md
@@ -13,6 +13,13 @@ keywords: [开源监控系统, 开源数据库监控, Mysql数据库监控]
- 将此 jar 包拷贝放入 HertzBeat 的安装目录下的 `ext-lib` 目录下.
- 重启 HertzBeat 服务。
+:::important 采集器包选择
+MySQL 监控依赖 `ext-lib` 目录下的外置 JDBC 驱动加载能力。
+
+- MySQL 监控请使用 HertzBeat 主程序内置采集器,或 JVM 采集器安装包
+- 不要使用 Native 采集器安装包执行 MySQL 监控
+:::
+
### 配置参数
| 参数名称 | 参数帮助描述 |
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oceanbase.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oceanbase.md
index edeeaeaf611..5893d9c1957 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oceanbase.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oceanbase.md
@@ -13,6 +13,13 @@ keywords: [开源监控系统, 开源数据库监控, OceanBase 数据库监控]
- 将此 jar 包拷贝放入 HertzBeat 的安装目录下的 `ext-lib` 目录下.
- 重启 HertzBeat 服务。
+:::important 采集器包选择
+OceanBase 监控同样依赖 `ext-lib` 目录下的 MySQL JDBC 驱动。
+
+- OceanBase 监控请使用 HertzBeat 主程序内置采集器,或 JVM 采集器安装包
+- 不要使用 Native 采集器安装包执行 OceanBase 监控
+:::
+
### 配置参数
| 参数名称 | 参数帮助描述 |
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oracle.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oracle.md
index f15d3dc62b5..153ef72fcb4 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oracle.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/oracle.md
@@ -13,6 +13,13 @@ keywords: [开源监控系统, 开源数据库监控, Oracle数据库监控]
- 将 jar 包复制到 `hertzbeat/ext-lib` 目录下。
- 重启 HertzBeat 服务。
+:::important 采集器包选择
+Oracle 监控依赖 `ext-lib` 目录下的外置 JDBC 驱动加载能力。
+
+- Oracle 监控请使用 HertzBeat 主程序内置采集器,或 JVM 采集器安装包
+- 不要使用 Native 采集器安装包执行 Oracle 监控
+:::
+
### 配置参数
| 参数名称 | 参数帮助描述 |
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/risc-v.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/risc-v.md
index f931b561024..50b7da7a250 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/risc-v.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/risc-v.md
@@ -45,7 +45,7 @@ qemu-system-riscv64 \
## 安装并配置支持 RISC-V 架构的 JDK
-> 在启动的镜像中配置支持 RISC-V 架构的 JDK,这里选用 Temurin JDK 21。
+> 在启动的镜像中配置支持 RISC-V 架构的 JDK,这里选用 Temurin JDK 25。
**1. 下载 Temurin JDK**
@@ -63,11 +63,11 @@ sudo apt install -y tar wget
# 创建安装目录
sudo mkdir -p /usr/lib/jvm
# 解压到系统目录
-sudo tar -xzf OpenJDK21U-jdk_riscv64_linux_hotspot_21.0.2_13.tar.gz -C /usr/lib/jvm
+sudo tar -xzf OpenJDK25U-jdk_riscv64_linux_hotspot_.tar.gz -C /usr/lib/jvm
# 编辑环境变量,添加以下内容
sudo nano /etc/profile.d/java.sh
-export JAVA_HOME=/usr/lib/jvm/jdk-21.0.2+13
+export JAVA_HOME=$(find /usr/lib/jvm -maxdepth 1 -type d -name 'jdk-25*' | head -n 1)
export PATH=$JAVA_HOME/bin:$PATH
# 使配置生效
@@ -88,6 +88,6 @@ cd apache-hertzbeat-1.7.2-incubating-bin/bin/
> 注意事项:
>
-> 1. 请将 `OpenJDK21U-jdk_riscv64_linux_hotspot_21.0.2_13.tar.gz` 替换为您实际下载的 JDK 文件名。
+> 1. 请将 `OpenJDK25U-jdk_riscv64_linux_hotspot_.tar.gz` 替换为您实际下载的 JDK 文件名。
> 2. 确保模拟器具备网络访问能力,以下载 HertzBeat。
> 3. 若遇到问题,请检查磁盘权限和 Java 环境路径配置。
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/native-collector.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/native-collector.md
new file mode 100644
index 00000000000..6ef2037be31
--- /dev/null
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/native-collector.md
@@ -0,0 +1,80 @@
+---
+id: native-collector
+title: Native 采集器指南
+sidebar_label: Native 采集器
+description: 说明 HertzBeat Native 采集器安装包适合什么场景、优缺点、限制和部署建议。
+---
+
+## 什么场景适合使用 Native 采集器?
+
+当你的监控任务不依赖从 `ext-lib` 动态加载外部 JDBC 驱动时,优先考虑 Native 采集器安装包。
+
+比较适合 Native 采集器的场景包括:
+
+- HTTP、HTTPS、网站可用性、API 检查
+- 端口可用性、Ping、SSL 证书等网络探测
+- Redis、Zookeeper、Kafka 等非 JDBC 监控类型
+
+## 为什么选择它?
+
+相较 JVM 采集器安装包,Native 采集器安装包通常更适合以下诉求:
+
+- 启动更快
+- 常驻内存更低
+- 运行时更轻,不需要额外准备 bundled 或预装 JDK
+
+## 它的缺点和限制是什么?
+
+Native 采集器并不是所有 JVM 采集器场景的无损替代。
+
+- Native 安装包是平台相关的,必须选择与你操作系统和 CPU 架构匹配的包。
+- Native 采集器不支持在运行时从 `ext-lib` 目录动态加载外部 JDBC 驱动 JAR。
+- 如果你的部署依赖 JVM 风格的运行时 classpath 扩展能力,仍然应该使用 JVM 采集器安装包。
+
+## 哪些场景应该继续使用 JVM 采集器?
+
+如果你的监控依赖外部 JDBC 驱动,请继续使用 JVM 采集器安装包,尤其包括:
+
+- MySQL,需要 `mysql-connector-j`
+- OceanBase,同样依赖 MySQL JDBC 驱动
+- Oracle,需要 `ojdbc8`,部分场景还需要 `orai18n`
+- DB2,需要 `jcc`
+
+## 安装包命名规则
+
+JVM 采集器安装包仍然保持跨平台:
+
+- `apache-hertzbeat-collector-{version}-bin.tar.gz`
+
+Native 采集器安装包按平台区分:
+
+- Linux 或 macOS:`apache-hertzbeat-collector-native-{version}-{platform}-bin.tar.gz`
+- Windows:`apache-hertzbeat-collector-native-{version}-windows-amd64-bin.zip`
+
+例如:
+
+- `apache-hertzbeat-collector-native-1.8.0-linux-amd64-bin.tar.gz`
+- `apache-hertzbeat-collector-native-1.8.0-macos-arm64-bin.tar.gz`
+- `apache-hertzbeat-collector-native-1.8.0-windows-amd64-bin.zip`
+
+## 配置文件是否和 JVM 采集器一致?
+
+Native 采集器安装包和 JVM 采集器安装包使用同一套 `config/application.yml` 结构。
+
+这意味着:
+
+- 采集器连接参数仍然在同一个位置修改
+- 虚拟线程相关配置仍然在同一个位置修改
+- Native 专用的启动调整通过代码在运行时生效,而不是长期维护第二份 `application.yml`
+
+## 推荐选择
+
+- 想要更低内存、更快启动,并且监控类型不依赖 JDBC 驱动时,优先选择 Native 采集器安装包。
+- 需要 `ext-lib`、外置 JDBC 驱动,或者依赖 JVM 风格运行时扩展能力时,使用 JVM 采集器安装包。
+
+## 官方多平台安装包是怎么构建的?
+
+- `mvn clean package -pl hertzbeat-collector-collector -am -Pnative` 只会为当前宿主机构建一个 Native 采集器安装包。
+- 官方发布使用的 Linux、macOS、Windows Native 安装包,会在发布准备阶段手动触发 `Collector Native Release` GitHub Actions 工作流来生成,而不是在每次 push 或 pull request 时自动构建。
+
+具体安装步骤可参考 [通过安装包安装 HertzBeat](package-deploy)。
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/package-deploy.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/package-deploy.md
index b34768ac984..3091205add9 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/package-deploy.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/package-deploy.md
@@ -6,11 +6,11 @@ sidebar_label: 安装包方式安装
:::tip
Apache HertzBeat™ 支持在Linux Windows Mac系统安装运行,CPU支持X86/ARM64。
-由于1.6.0及以后版本使用 `Java 21` ,且安装包不再提供内置jdk的版本,参考以下情况使用新版Hertzbeat。
+当前分支默认使用 `Java 25`,且标准安装包不再提供内置 JDK。可参考以下情况使用 HertzBeat:
-- 当你的服务器中默认环境变量为 `Java 21` 时,这一步你无需任何操作。
-- 当你的服务器中默认环境变量不为 `Java 21`时,如 `Java 8` 、 `Java 11` ,若你服务器中**没有**其他应用需要低版本 `Java` ,根据你的系统,到 [https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html) 选择相应的发行版下载,并在搜索引擎搜索如何设置新的环境变量指向新的`Java 21`。
-- 当你的服务器中默认环境变量不为`Java 21`时,如 `Java 8` 、 `Java 11` ,若你服务器中**有**其他应用需要低版本 `Java` ,你不想更改环境变量,根据你的系统,到 [https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html](https://www.oracle.com/java/technologies/javase/jdk21-archive-downloads.html) 选择相应的发行版下载,并将解压后的文件夹重命名为`java`,复制到Hertzbeat的解压目录下。
+- 当你的服务器中默认环境变量为 `Java 25` 时,这一步无需任何操作。
+- 当你的服务器中默认环境变量不为 `Java 25` 时,如 `Java 8`、`Java 11`、`Java 21`,若你服务器中**没有**其他应用需要低版本 `Java`,根据你的系统到 [https://www.oracle.com/java/technologies/downloads/](https://www.oracle.com/java/technologies/downloads/) 下载 `Java 25`,并将环境变量指向新的 `Java 25`。
+- 当你的服务器中默认环境变量不为 `Java 25` 时,如 `Java 8`、`Java 11`、`Java 21`,若你服务器中**有**其他应用需要低版本 `Java`,不希望修改全局环境变量,可根据你的系统到 [https://www.oracle.com/java/technologies/downloads/](https://www.oracle.com/java/technologies/downloads/) 下载 `Java 25`,并将解压后的文件夹重命名为 `java`,复制到 HertzBeat 的解压目录下。
:::
@@ -63,11 +63,21 @@ HertzBeat Collector 是一个轻量级的数据采集器,用于采集并将数
通过部署多个 HertzBeat Collector 可以实现数据的高可用,负载均衡和云边协同。
:::
+:::tip Native 采集器推荐
+如果你的监控任务不依赖从 `ext-lib` 动态加载外部 JDBC 驱动,优先选择 Native 采集器安装包,通常启动更快、常驻内存更低。
+
+在选择前,建议先阅读 [Native 采集器指南](native-collector) 了解它的限制和取舍。
+:::
+

1. 下载安装包
- 从 [下载页面](/docs/download) 下载您系统环境对应的安装包版本 `apache-hertzbeat-collector-xxx-bin.tar.gz`
+ 按部署形态选择对应的采集器安装包:
+ - JVM 采集器安装包:`apache-hertzbeat-collector-xxx-bin.tar.gz`
+ - Linux 或 macOS 的 Native 采集器安装包:`apache-hertzbeat-collector-native-xxx-{platform}-bin.tar.gz`
+ - Windows 的 Native 采集器安装包:`apache-hertzbeat-collector-native-xxx-windows-amd64-bin.zip`
+ - 从 [下载页面](/docs/download) 下载
2. 设置配置文件
@@ -75,6 +85,10 @@ HertzBeat Collector 是一个轻量级的数据采集器,用于采集并将数
```shell
tar zxvf apache-hertzbeat-collector-xxx-bin.tar.gz
+ # 或
+ tar zxvf apache-hertzbeat-collector-native-xxx-linux-amd64-bin.tar.gz
+ # 或
+ unzip apache-hertzbeat-collector-native-xxx-windows-amd64-bin.zip
```
配置采集器的配置文件 `config/application.yml` 里面的 HertzBeat Server 连接 IP, 端口, 采集器名称(需保证唯一性)等参数。
@@ -100,14 +114,30 @@ HertzBeat Collector 是一个轻量级的数据采集器,用于采集并将数
3. 启动
- 执行位于安装目录 hertzbeat-collector/bin/ 下的启动脚本 startup.sh, windows 环境下为 startup.bat
-
- ```shell
- ./startup.sh
- ```
+ JVM 采集器安装包执行位于安装目录 `hertzbeat-collector/bin/` 下的启动脚本 `startup.sh`,Windows 环境下为 `startup.bat`;Linux 或 macOS 的 Native 采集器安装包执行 `./startup.sh`,Windows 的 Native 采集器安装包执行 `bin\\startup.bat`
4. 开始探索 HertzBeat Collector
- 浏览器访问 [http://ip:1157/](http://ip:1157/) 即可开始探索使用,默认账户密码 admin/hertzbeat。
+ 浏览器访问主 HertzBeat 服务 [http://manager-host:1157/](http://manager-host:1157/) 的概览页面,即可确认新采集器已注册。
+
+:::important Native 采集器限制说明
+Native 采集器适合不依赖外部 JVM classpath 扩展的监控类型。
+
+关于包选择、安装包命名和平台相关限制,详见 [Native 采集器指南](native-collector)。
+
+基于 `ext-lib` 的 JDBC 驱动加载能力是 JVM 采集器的能力。Native 采集器当前不支持在运行时从 `ext-lib` 目录动态加载外部 JDBC 驱动 JAR。
+
+因此,凡是依赖外置 JDBC 驱动的监控类型,请使用 JVM 采集器,不要使用 Native 采集器。当前至少包括:
+
+- MySQL,需要 `mysql-connector-j`
+- OceanBase,同样依赖 MySQL JDBC 驱动
+- Oracle,需要 `ojdbc8`,部分场景还需要 `orai18n`
+- DB2,需要 `jcc`
+
+建议部署方式:
+
+- `API`、`网站`、`端口可用性`、`Ping` 等非 JDBC 类型优先使用 Native 采集器
+- 需要 `ext-lib` 扩展驱动时使用 JVM 采集器
+:::
**HAVE FUN**
@@ -120,15 +150,15 @@ HertzBeat Collector 是一个轻量级的数据采集器,用于采集并将数
1. 启动失败,需您提前准备JAVA运行环境
安装JAVA运行环境-可参考[官方网站](https://www.oracle.com/java/technologies/downloads/)
- 要求:JAVA21环境
+ 要求:JAVA25环境
下载JAVA安装包: [镜像站](https://mirrors.huaweicloud.com/openjdk/)
安装后命令行检查是否成功安装
```shell
$ java -version
- openjdk version "21.0.9" 2025-10-21 LTS
- OpenJDK Runtime Environment Corretto-21.0.9.10.1 (build 21.0.9+10-LTS)
- OpenJDK 64-Bit Server VM Corretto-21.0.9.10.1 (build 21.0.9+10-LTS, mixed mode, sharing)
+ openjdk version "25.0.2" 2026-01-20
+ OpenJDK Runtime Environment (build 25.0.2+8)
+ OpenJDK 64-Bit Server VM (build 25.0.2+8, mixed mode, sharing)
```
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/quickstart.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/quickstart.md
index 9723ac7357a..0031ecebd45 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/quickstart.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/quickstart.md
@@ -13,7 +13,7 @@ description: Apache HertzBeat 监控系统快速安装指南 - Docker、安装
## 安装方式
-HertzBeat 提供四种安装选项:
+HertzBeat 提供多种安装选项:
1. **Docker**(推荐)- 最快设置,生产就绪
2. **二进制包** - 传统部署,手动配置
@@ -58,12 +58,13 @@ HertzBeat 提供四种安装选项:
#### 方式二:通过安装包安装
-1. 下载您系统环境对应的安装包`hertzbeat-xx.tar.gz` [Download Page](https://hertzbeat.apache.org/docs/download)
+1. 下载您系统环境对应的安装包 `apache-hertzbeat-xx-bin.tar.gz` [Download Page](https://hertzbeat.apache.org/docs/download)
2. 配置 HertzBeat 的配置文件 `hertzbeat/config/application.yml`(可选)
3. 部署启动 `$ ./bin/startup.sh` 或 `bin/startup.bat`
4. 浏览器访问 `http://localhost:1157` 即可开始,默认账号密码 `admin/hertzbeat`
5. 部署采集器集群(可选)
- - 下载您系统环境对应采集器安装包`hertzbeat-collector-xx.tar.gz`到规划的另一台部署主机上 [Download Page](https://hertzbeat.apache.org/docs/download)
+ - 如果你不需要 MySQL、OceanBase、Oracle、DB2 这类依赖 `ext-lib` JDBC 驱动的监控,优先选择 Native 采集器安装包,通常启动更快、内存更省。详见 [Native 采集器指南](native-collector)。
+ - 下载您系统环境对应采集器安装包 `apache-hertzbeat-collector-xx-bin.tar.gz`(JVM 采集器)或匹配目标平台的 Native 采集器安装包,例如 `apache-hertzbeat-collector-native-xx-linux-amd64-bin.tar.gz`、`apache-hertzbeat-collector-native-xx-windows-amd64-bin.zip`,到规划的另一台部署主机上 [Download Page](https://hertzbeat.apache.org/docs/download)
- 配置采集器的配置文件 `hertzbeat-collector/config/application.yml` 里面的连接主HertzBeat服务的对外IP,端口,当前采集器名称(需保证唯一性)等参数 `identity` `mode` (public or private) `manager-host` `manager-port`
```yaml
@@ -78,15 +79,17 @@ HertzBeat 提供四种安装选项:
manager-port: ${MANAGER_PORT:1158}
```
- - 启动 `$ ./bin/startup.sh` 或 `bin/startup.bat`
- - 浏览器访问主HertzBeat服务 `http://localhost:1157` 查看概览页面即可看到注册上来的新采集器
+ - Native 采集器的代价是安装包按平台区分、不支持运行时 `ext-lib` JDBC 加载,也不适合依赖 JVM 风格运行时 classpath 扩展的场景。详见 [Native 采集器指南](native-collector)。
+ - 如果需要通过 `ext-lib` 加载 MySQL、OceanBase、Oracle、DB2 等外置 JDBC 驱动,请使用 JVM 采集器安装包
+ - JVM 采集器安装包使用 `$ ./bin/startup.sh` 或 `bin/startup.bat` 启动。Linux 或 macOS 的 Native 采集器安装包使用 `$ ./bin/startup.sh` 启动,Windows 的 Native 采集器安装包使用 `bin\\startup.bat` 启动
+ - 浏览器访问主 HertzBeat 服务 `http://localhost:1157` 查看概览页面即可看到注册上来的新采集器
更多配置详细步骤参考 [通过安装包安装HertzBeat](package-deploy)
#### 方式三:本地代码启动
1. 此为前后端分离项目,本地代码调试需要分别启动后端工程`hertzbeat-startup`和前端工程`web-app`
-2. 后端:需要`maven3+`, `java21`和`lombok`环境,修改`YML`配置信息并启动`hertzbeat-startup`服务
+2. 后端:需要`maven3+`, `java25`和`lombok`环境,修改`YML`配置信息并启动`hertzbeat-startup`服务
3. 前端:需要`nodejs npm angular-cli`环境,待本地后端启动后,在`web-app`目录下启动 `ng serve --open`
4. 浏览器访问 `http://localhost:4200` 即可开始,默认账号密码 `admin/hertzbeat`
@@ -112,7 +115,7 @@ HertzBeat 提供四种安装选项:
- 2 CPU 核心
- 4GB RAM
- 10GB 磁盘空间
-- Docker 20.10+ 或 Java 21+
+- Docker 20.10+ 或 Java 25+
**支持系统:** Linux、macOS、Windows(通过 Docker 或 WSL)
diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/virtual-thread.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/virtual-thread.md
index ae69b63e0a9..020f5376b5f 100644
--- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/virtual-thread.md
+++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/start/virtual-thread.md
@@ -5,7 +5,7 @@ sidebar_label: 虚拟线程
description: 说明 HertzBeat 虚拟线程执行器的默认值、回滚开关和调优方式。
---
-HertzBeat 基于 JDK 21 运行,并把适合虚拟线程的阻塞型执行路径切到了虚拟线程模型。所有 `hertzbeat.vthreads` 配置项都是可选的。也就是说,即使升级 HertzBeat 后你没有把新的 YAML 配置块合并到原有 `application.yml`,系统也会使用内置默认值正常启动。
+HertzBeat 基于 JDK 25 运行,并把适合虚拟线程的阻塞型执行路径切到了虚拟线程模型。所有 `hertzbeat.vthreads` 配置项都是可选的。也就是说,即使升级 HertzBeat 后你没有把新的 YAML 配置块合并到原有 `application.yml`,系统也会使用内置默认值正常启动。
## 1. 到哪里配置
diff --git a/home/sidebars.json b/home/sidebars.json
index 24c235bc785..292e3ddff27 100755
--- a/home/sidebars.json
+++ b/home/sidebars.json
@@ -15,6 +15,7 @@
"start/docker-deploy",
"start/docker-compose-deploy",
"start/package-deploy",
+ "start/native-collector",
{
"type": "link",
"label": "Install via Helm",
diff --git a/home/src/components/StructuredData.js b/home/src/components/StructuredData.js
index 97472f05e6a..cbeeb493187 100644
--- a/home/src/components/StructuredData.js
+++ b/home/src/components/StructuredData.js
@@ -55,7 +55,7 @@ export default function StructuredData() {
"Cloud-edge collaboration for isolated networks",
"Status page builder for service communication"
],
- "softwareRequirements": "Docker 20.10+ or Java 21+",
+ "softwareRequirements": "Docker 20.10+ or Java 25+",
"memoryRequirements": "4GB minimum, 8GB recommended",
"processorRequirements": "2 CPU cores minimum",
"storageRequirements": "10GB minimum"
diff --git a/home/src/pages/faq.js b/home/src/pages/faq.js
index cc6d74af086..cc45b8c4d58 100644
--- a/home/src/pages/faq.js
+++ b/home/src/pages/faq.js
@@ -46,7 +46,7 @@ const faqs = [
},
{
question: "What are HertzBeat's system requirements?",
- answer: "Minimum: 2 CPU cores, 4GB RAM (8GB recommended), 10GB disk space, Docker 20.10+ or Java 21+. Supported on Linux, macOS, Windows."
+ answer: "Minimum: 2 CPU cores, 4GB RAM (8GB recommended), 10GB disk space, Docker 20.10+ or Java 25+. Supported on Linux, macOS, Windows."
},
{
question: "How do I upgrade HertzBeat?",
diff --git a/home/src/pages/zh-cn/faq.js b/home/src/pages/zh-cn/faq.js
index ae16a05b411..f422546dfca 100644
--- a/home/src/pages/zh-cn/faq.js
+++ b/home/src/pages/zh-cn/faq.js
@@ -46,7 +46,7 @@ const faqs = [
},
{
question: "HertzBeat 的系统要求是什么?",
- answer: "最低:2 CPU 核心、4GB RAM(推荐 8GB)、10GB 磁盘空间、Docker 20.10+ 或 Java 21+。支持系统:Linux、macOS、Windows。"
+ answer: "最低:2 CPU 核心、4GB RAM(推荐 8GB)、10GB 磁盘空间、Docker 20.10+ 或 Java 25+。支持系统:Linux、macOS、Windows。"
},
{
question: "如何升级 HertzBeat?",
diff --git a/home/static/llms-zh.txt b/home/static/llms-zh.txt
index 0ae302d4691..8971f7a70f7 100644
--- a/home/static/llms-zh.txt
+++ b/home/static/llms-zh.txt
@@ -57,7 +57,7 @@ cd apache-hertzbeat-1.8.0
- 2 CPU 核心 最低
- 4GB RAM 最低(推荐 8GB)
- 10GB 磁盘空间
-- Docker 20.10+ 或 Java 21+
+- Docker 20.10+ 或 Java 25+
- 平台:Linux、macOS、Windows
## 支持的监控类型
diff --git a/home/static/llms.txt b/home/static/llms.txt
index 18ab6d7bbf9..65ef12af761 100644
--- a/home/static/llms.txt
+++ b/home/static/llms.txt
@@ -57,7 +57,7 @@ cd apache-hertzbeat-1.8.0
- 2 CPU cores minimum
- 4GB RAM minimum (8GB recommended)
- 10GB disk space
-- Docker 20.10+ or Java 21+
+- Docker 20.10+ or Java 25+
- Platforms: Linux, macOS, Windows
## Supported Monitoring Types
diff --git a/pom.xml b/pom.xml
index fdbdcd0960a..341a12c9066 100644
--- a/pom.xml
+++ b/pom.xml
@@ -99,7 +99,7 @@
1.8.0
- 21
+ 25
${java.version}
${java.version}
3.2.0
@@ -610,6 +610,10 @@
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
+
+
+ full
+
org.apache.maven.plugins
diff --git a/script/assembly/collector/assembly-native.xml b/script/assembly/collector/assembly-native.xml
new file mode 100644
index 00000000000..c341eaffd05
--- /dev/null
+++ b/script/assembly/collector/assembly-native.xml
@@ -0,0 +1,82 @@
+
+
+
+ ${native.package.id}
+ true
+ ${native.package.baseDirectory}
+
+ ${native.package.format}
+
+
+
+
+ ${native.launcher.dir}
+ true
+ bin
+ 0755
+
+
+
+ src/main/resources
+
+ application.yml
+ logback-spring.xml
+ banner.txt
+
+ true
+ ${file.separator}config
+
+
+
+ ../../
+ ${file.separator}
+
+ README.md
+
+
+
+ ../../material/licenses/collector
+ ${file.separator}
+
+ LICENSE
+ NOTICE
+
+
+
+ ../../material/licenses/collector
+ licenses
+
+ LICENSE-*
+
+
+
+
+
+
+ ${native.binary.source}
+ ${file.separator}
+ ${native.executable.packageName}
+ 0755
+
+
+
diff --git a/script/assembly/collector/assembly.xml b/script/assembly/collector/assembly.xml
index f4af4618f28..d02ee97e0cc 100644
--- a/script/assembly/collector/assembly.xml
+++ b/script/assembly/collector/assembly.xml
@@ -58,6 +58,9 @@ http://maven.apache.org/ASSEMBLY/2.0.0 ">
banner.txt
META-INF/**
+
+ META-INF/spring.factories
+
true
${file.separator}config
@@ -68,7 +71,7 @@ http://maven.apache.org/ASSEMBLY/2.0.0 ">
target
/
- *.jar
+ ${project.build.finalName}.jar
diff --git a/script/assembly/collector/bin-native-win/restart.bat b/script/assembly/collector/bin-native-win/restart.bat
new file mode 100644
index 00000000000..50521a8d85b
--- /dev/null
+++ b/script/assembly/collector/bin-native-win/restart.bat
@@ -0,0 +1,25 @@
+@rem
+@rem Licensed to the Apache Software Foundation (ASF) under one or more
+@rem contributor license agreements. See the NOTICE file distributed with
+@rem this work for additional information regarding copyright ownership.
+@rem The ASF licenses this file to You under the Apache License, Version 2.0
+@rem (the "License"); you may not use this file except in compliance with
+@rem the License. You may obtain a copy of the License at
+@rem
+@rem http://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@echo off
+setlocal
+
+echo Restarting Apache HertzBeat ${project.artifactId} ...
+call "%~dp0shutdown.bat"
+timeout /t 2 /nobreak >nul
+call "%~dp0startup.bat"
+exit /b %ERRORLEVEL%
diff --git a/script/assembly/collector/bin-native-win/shutdown.bat b/script/assembly/collector/bin-native-win/shutdown.bat
new file mode 100644
index 00000000000..eb1dc08e316
--- /dev/null
+++ b/script/assembly/collector/bin-native-win/shutdown.bat
@@ -0,0 +1,49 @@
+@rem
+@rem Licensed to the Apache Software Foundation (ASF) under one or more
+@rem contributor license agreements. See the NOTICE file distributed with
+@rem this work for additional information regarding copyright ownership.
+@rem The ASF licenses this file to You under the Apache License, Version 2.0
+@rem (the "License"); you may not use this file except in compliance with
+@rem the License. You may obtain a copy of the License at
+@rem
+@rem http://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@echo off
+setlocal
+
+set SERVER_NAME=${project.artifactId}
+
+cd /d %~dp0
+cd ..
+set DEPLOY_DIR=%CD%
+set LOGS_DIR=%DEPLOY_DIR%\logs
+set PID_FILE=%LOGS_DIR%\%SERVER_NAME%.pid
+set SERVER_PORT=1159
+
+set PID=
+if exist "%PID_FILE%" (
+ set /p PID=<"%PID_FILE%"
+)
+
+if not defined PID (
+ for /f %%i in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "$conn = Get-NetTCPConnection -LocalPort %SERVER_PORT% -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1; if ($conn) { $conn.OwningProcess }"') do set PID=%%i
+)
+
+if not defined PID (
+ echo Apache HertzBeat %SERVER_NAME% is already stopped
+ del /q "%PID_FILE%" >nul 2>&1
+ exit /b 0
+)
+
+powershell -NoProfile -ExecutionPolicy Bypass -Command "if (Get-Process -Id %PID% -ErrorAction SilentlyContinue) { Stop-Process -Id %PID% -Force; exit 0 } exit 1"
+del /q "%PID_FILE%" >nul 2>&1
+
+echo Shutdown Apache HertzBeat %SERVER_NAME% Success!
+exit /b 0
diff --git a/script/assembly/collector/bin-native-win/startup.bat b/script/assembly/collector/bin-native-win/startup.bat
new file mode 100644
index 00000000000..33bfec4f48c
--- /dev/null
+++ b/script/assembly/collector/bin-native-win/startup.bat
@@ -0,0 +1,102 @@
+@rem
+@rem Licensed to the Apache Software Foundation (ASF) under one or more
+@rem contributor license agreements. See the NOTICE file distributed with
+@rem this work for additional information regarding copyright ownership.
+@rem The ASF licenses this file to You under the Apache License, Version 2.0
+@rem (the "License"); you may not use this file except in compliance with
+@rem the License. You may obtain a copy of the License at
+@rem
+@rem http://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@echo off
+setlocal
+
+set SERVER_NAME=${project.artifactId}
+set BINARY_NAME=${native.executable.packageName}
+
+cd /d %~dp0
+cd ..
+set DEPLOY_DIR=%CD%
+set CONF_DIR=%DEPLOY_DIR%\config
+set LOGS_DIR=%DEPLOY_DIR%\logs
+set PID_FILE=%LOGS_DIR%\%SERVER_NAME%.pid
+set APP_PATH=%DEPLOY_DIR%\%BINARY_NAME%
+set SERVER_PORT=1159
+set STDOUT_LOG=%LOGS_DIR%\startup.out.log
+set STDERR_LOG=%LOGS_DIR%\startup.err.log
+
+if "%1"=="status" goto status
+
+if not exist "%APP_PATH%" (
+ echo ERROR: native executable not found: %APP_PATH%
+ exit /b 1
+)
+
+if not exist "%LOGS_DIR%" (
+ mkdir "%LOGS_DIR%"
+)
+
+if exist "%PID_FILE%" (
+ set /p RUNNING_PID=<"%PID_FILE%"
+ powershell -NoProfile -ExecutionPolicy Bypass -Command "if (Get-Process -Id %RUNNING_PID% -ErrorAction SilentlyContinue) { exit 0 } exit 1"
+ if not errorlevel 1 (
+ echo ERROR: The HertzBeat %SERVER_NAME% already started!
+ echo PID: %RUNNING_PID%
+ exit /b 1
+ )
+ del /q "%PID_FILE%" >nul 2>&1
+)
+
+powershell -NoProfile -ExecutionPolicy Bypass -Command "$portInUse = Get-NetTCPConnection -State Listen -LocalPort %SERVER_PORT% -ErrorAction SilentlyContinue; if ($portInUse) { exit 0 } exit 1"
+if not errorlevel 1 (
+ echo ERROR: The HertzBeat %SERVER_NAME% port %SERVER_PORT% is already used!
+ exit /b 1
+)
+
+echo You can review logs at hertzbeat\logs
+echo Starting the HertzBeat %SERVER_NAME% ...
+
+for /f %%i in ('powershell -NoProfile -ExecutionPolicy Bypass -Command "$p = Start-Process -FilePath ''%APP_PATH%'' -ArgumentList ''--spring.config.location=%CONF_DIR%\'' -RedirectStandardOutput ''%STDOUT_LOG%'' -RedirectStandardError ''%STDERR_LOG%'' -PassThru; $p.Id"') do set APP_PID=%%i
+
+if not defined APP_PID (
+ echo ERROR: Service start failed, check %STDOUT_LOG% and %STDERR_LOG%
+ exit /b 1
+)
+
+>"%PID_FILE%" echo %APP_PID%
+
+powershell -NoProfile -ExecutionPolicy Bypass -Command "$deadline = (Get-Date).AddSeconds(30); do { Start-Sleep -Seconds 1; if (-not (Get-Process -Id %APP_PID% -ErrorAction SilentlyContinue)) { exit 1 } $listening = Get-NetTCPConnection -LocalPort %SERVER_PORT% -State Listen -ErrorAction SilentlyContinue | Where-Object { $_.OwningProcess -eq %APP_PID% }; if ($listening) { exit 0 } } while ((Get-Date) -lt $deadline); exit 0"
+if errorlevel 1 (
+ echo ERROR: Service start failed, check %STDOUT_LOG% and %STDERR_LOG%
+ del /q "%PID_FILE%" >nul 2>&1
+ exit /b 1
+)
+
+echo Service Start Success!
+echo Service PID: %APP_PID%
+exit /b 0
+
+:status
+if not exist "%PID_FILE%" (
+ echo The HertzBeat %SERVER_NAME% is stopped
+ exit /b 0
+)
+
+set /p RUNNING_PID=<"%PID_FILE%"
+powershell -NoProfile -ExecutionPolicy Bypass -Command "if (Get-Process -Id %RUNNING_PID% -ErrorAction SilentlyContinue) { exit 0 } exit 1"
+if errorlevel 1 (
+ echo The HertzBeat %SERVER_NAME% is stopped
+ del /q "%PID_FILE%" >nul 2>&1
+ exit /b 0
+)
+
+echo The HertzBeat %SERVER_NAME% is running...!
+echo PID: %RUNNING_PID%
+exit /b 0
diff --git a/script/assembly/collector/bin-native/restart.sh b/script/assembly/collector/bin-native/restart.sh
new file mode 100644
index 00000000000..af640ba89f1
--- /dev/null
+++ b/script/assembly/collector/bin-native/restart.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+# 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.
+
+startTime=$(date +%s)
+echo -e "\033[0;31mCurrent Time is:$(date "+%Y-%m-%d %H:%M:%S") Restart Now!\033[0m"
+./shutdown.sh
+echo
+sleep 2
+echo
+./startup.sh
+endTime=$(date +%s)
+echo -e "\033[0;31mCurrent Time is:$(date "+%Y-%m-%d %H:%M:%S") Restart Success!Spend $((endTime - startTime)) seconds \033[0m"
diff --git a/script/assembly/collector/bin-native/shutdown.sh b/script/assembly/collector/bin-native/shutdown.sh
new file mode 100644
index 00000000000..1c0478edbac
--- /dev/null
+++ b/script/assembly/collector/bin-native/shutdown.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+# 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.
+
+SERVER_NAME="${project.artifactId}"
+BINARY_NAME="${project.build.finalName}"
+
+cd "$(dirname "$0")"
+cd ..
+DEPLOY_DIR="$(pwd)"
+
+CONF_DIR="$DEPLOY_DIR/config"
+LOGS_DIR="$DEPLOY_DIR/logs"
+PID_FILE="$LOGS_DIR/${project.artifactId}.pid"
+APP_PATH="$DEPLOY_DIR/$BINARY_NAME"
+
+find_running_pid() {
+ if [ -f "$PID_FILE" ]; then
+ PID="$(cat "$PID_FILE" 2>/dev/null)"
+ if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
+ echo "$PID"
+ return 0
+ fi
+ fi
+
+ ps -ef | grep "$APP_PATH" | grep "$CONF_DIR" | grep -v grep | awk '{print $2}' | head -n 1
+}
+
+PID="$(find_running_pid)"
+if [ -z "$PID" ]; then
+ echo "Apache HertzBeat ${SERVER_NAME} is already stopped"
+ rm -f "$PID_FILE"
+ exit 0
+fi
+
+kill "$PID"
+for _ in $(seq 1 30); do
+ if ! kill -0 "$PID" 2>/dev/null; then
+ rm -f "$PID_FILE"
+ echo "Shutdown Apache HertzBeat ${SERVER_NAME} Success!"
+ exit 0
+ fi
+ sleep 1
+done
+
+kill -9 "$PID" 2>/dev/null
+rm -f "$PID_FILE"
+echo "Shutdown Apache HertzBeat ${SERVER_NAME} Success!"
diff --git a/script/assembly/collector/bin-native/startup.sh b/script/assembly/collector/bin-native/startup.sh
new file mode 100644
index 00000000000..bd57563fad8
--- /dev/null
+++ b/script/assembly/collector/bin-native/startup.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+# 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.
+
+SERVER_NAME="${project.artifactId}"
+BINARY_NAME="${project.build.finalName}"
+
+cd "$(dirname "$0")"
+BIN_DIR="$(pwd)"
+cd ..
+DEPLOY_DIR="$(pwd)"
+
+CONF_DIR="$DEPLOY_DIR/config"
+LOGS_DIR="$DEPLOY_DIR/logs"
+PID_FILE="$LOGS_DIR/${project.artifactId}.pid"
+APP_PATH="$DEPLOY_DIR/$BINARY_NAME"
+SERVER_PORT=1159
+
+find_running_pid() {
+ if [ -f "$PID_FILE" ]; then
+ PID="$(cat "$PID_FILE" 2>/dev/null)"
+ if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
+ echo "$PID"
+ return 0
+ fi
+ fi
+
+ ps -ef | grep "$APP_PATH" | grep "$CONF_DIR" | grep -v grep | awk '{print $2}' | head -n 1
+}
+
+RUNNING_PID="$(find_running_pid)"
+if [ "$1" = "status" ]; then
+ if [ -n "$RUNNING_PID" ]; then
+ echo "The HertzBeat $SERVER_NAME is running...!"
+ echo "PID: $RUNNING_PID"
+ else
+ echo "The HertzBeat $SERVER_NAME is stopped"
+ fi
+ exit 0
+fi
+
+if [ ! -x "$APP_PATH" ]; then
+ echo "ERROR: native executable not found: $APP_PATH"
+ exit 1
+fi
+
+if [ -n "$RUNNING_PID" ]; then
+ echo "ERROR: The HertzBeat $SERVER_NAME already started!"
+ echo "PID: $RUNNING_PID"
+ exit 1
+fi
+
+mkdir -p "$LOGS_DIR"
+
+if command -v lsof >/dev/null 2>&1; then
+ SERVER_PORT_COUNT="$(lsof -nP -iTCP:$SERVER_PORT -sTCP:LISTEN | wc -l)"
+ if [ "$SERVER_PORT_COUNT" -gt 0 ]; then
+ echo "ERROR: The HertzBeat $SERVER_NAME port $SERVER_PORT is already used!"
+ exit 1
+ fi
+fi
+
+echo "You can review logs at hertzbeat/logs"
+echo "Starting the HertzBeat $SERVER_NAME ..."
+nohup "$APP_PATH" --spring.config.location="$CONF_DIR/" >"$LOGS_DIR/startup.log" 2>&1 &
+APP_PID=$!
+echo "$APP_PID" >"$PID_FILE"
+
+COUNT=0
+while [ $COUNT -lt 30 ]; do
+ sleep 1
+ if ! kill -0 "$APP_PID" 2>/dev/null; then
+ echo "ERROR: Service start failed, check $LOGS_DIR/startup.log"
+ rm -f "$PID_FILE"
+ exit 1
+ fi
+ if command -v lsof >/dev/null 2>&1 && lsof -nP -iTCP:$SERVER_PORT -sTCP:LISTEN | grep -q "$APP_PID"; then
+ break
+ fi
+ COUNT=$((COUNT + 1))
+done
+
+echo "Service Start Success!"
+echo "Service PID: $APP_PID"
diff --git a/script/assembly/collector/bin/startup.sh b/script/assembly/collector/bin/startup.sh
index 1d2db5f9c27..dbdab8c581b 100644
--- a/script/assembly/collector/bin/startup.sh
+++ b/script/assembly/collector/bin/startup.sh
@@ -103,7 +103,7 @@ if [ -f "./java/bin/java" ]; then
else
JAVA_EXIST=`which java | grep bin | wc -l`
if [ $JAVA_EXIST -le 0 ]; then
- echo -e "ERROR: there is no java21+ environment, please config java environment."
+ echo -e "ERROR: there is no java${java.version}+ environment, please config java environment."
exit 1
fi
echo -e "Use the system environment jdk to start"
diff --git a/script/assembly/server/bin/startup.sh b/script/assembly/server/bin/startup.sh
index ebf25d7ae30..45bff0dc90f 100644
--- a/script/assembly/server/bin/startup.sh
+++ b/script/assembly/server/bin/startup.sh
@@ -107,7 +107,7 @@ if [ -f "./java/bin/java" ]; then
else
JAVA_EXIST=`which java | grep bin | wc -l`
if [ $JAVA_EXIST -le 0 ]; then
- echo -e "ERROR: there is no java21+ environment, please config java environment."
+ echo -e "ERROR: there is no java${java.version}+ environment, please config java environment."
exit 1
fi
echo -e "Use the system environment jdk to start"
diff --git a/script/ci/github-actions/setup-deps/action.yml b/script/ci/github-actions/setup-deps/action.yml
index 0e1698fe720..3ad4560a589 100644
--- a/script/ci/github-actions/setup-deps/action.yml
+++ b/script/ci/github-actions/setup-deps/action.yml
@@ -21,11 +21,11 @@ description: Install host system dependencies (with mvnd)
runs:
using: composite
steps:
- - name: Set up JDK 21
+ - name: Set up JDK 25
uses: actions/setup-java@v4
with:
distribution: "zulu"
- java-version: 21
+ java-version: 25
- name: Install mvnd
shell: bash
@@ -40,4 +40,4 @@ runs:
- name: Verify mvnd installation
shell: bash
- run: mvnd --version
\ No newline at end of file
+ run: mvnd --version
diff --git a/script/docker/collector/Dockerfile b/script/docker/collector/Dockerfile
index a6f89d8c89d..5a33eb5b392 100644
--- a/script/docker/collector/Dockerfile
+++ b/script/docker/collector/Dockerfile
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-FROM eclipse-temurin:21-jdk
+FROM eclipse-temurin:25-jdk
MAINTAINER Apache HertzBeat "dev@hertzbeat.apache.org"
@@ -26,7 +26,7 @@ RUN sed -i 's#http://#https://#g' /etc/apt/sources.list.d/ubuntu.sources && \
apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
-ADD apache-hertzbeat-collector-*-bin.tar.gz /opt/
+ADD apache-hertzbeat-collector-${VERSION}-bin.tar.gz /opt/
ENV JAVA_OPTS ""
ENV TZ=Asia/Shanghai
diff --git a/script/docker/collector/build.sh b/script/docker/collector/build.sh
index 278df32c783..03f93312b0d 100644
--- a/script/docker/collector/build.sh
+++ b/script/docker/collector/build.sh
@@ -21,13 +21,20 @@ cd `dirname $0`
CURRENT_DIR=`pwd`
# cd dist dir
cd ../../../dist
-# auto detect hertzbeat version
-VERSION=`ls apache-hertzbeat-collector-*-bin.tar.gz| awk -F"-" '{print $4}'`
+# auto detect the JVM collector package version
+PACKAGE_FILE=$(find . -maxdepth 1 -name 'apache-hertzbeat-collector-*-bin.tar.gz' \
+ ! -name 'apache-hertzbeat-collector-native-*-bin.tar.gz' | head -n 1)
+VERSION=$(basename "$PACKAGE_FILE" | sed -e 's/^apache-hertzbeat-collector-//' -e 's/-bin\.tar\.gz$//')
# use the version param
if [ -n "$1" ]; then
VERSION="$1";
fi
+if [ -z "$VERSION" ]; then
+ echo "Can not find the JVM collector package under dist/. Build apache-hertzbeat-collector-{version}-bin.tar.gz first."
+ exit 1
+fi
+
# docker compile context
CONTEXT_DIR=`pwd`
diff --git a/script/docker/server/Dockerfile b/script/docker/server/Dockerfile
index 773c21c0d15..6427e6300b9 100644
--- a/script/docker/server/Dockerfile
+++ b/script/docker/server/Dockerfile
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-FROM eclipse-temurin:21-jdk
+FROM eclipse-temurin:25-jdk
MAINTAINER Apache HertzBeat "dev@hertzbeat.apache.org"
diff --git a/script/ext-lib/README b/script/ext-lib/README
index 5898fde6b91..0afb3b3bbec 100644
--- a/script/ext-lib/README
+++ b/script/ext-lib/README
@@ -13,9 +13,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-Please move external libs to this folder like:
+Please move external libs to this folder for JVM-based server / collector packages, for example:
ojdbc8-21.5.0.0.jar
orai18n-21.5.0.0.jar
mysql-connector-java-8.0.30.jar
+jcc-11.5.9.0.jar
+Note:
+
+- `ext-lib` is loaded by the JVM server package and the JVM collector package.
+- The native collector package does not support loading external JDBC driver jars from `ext-lib` at runtime.
+- If you need MySQL, OceanBase, Oracle, or DB2 monitoring with external JDBC drivers, use the JVM collector package.