一个基于 Rust 的轻量级网络监控工具,支持 TCP、ICMP (Ping)、DNS 以及 HTTP/HTTPS 协议监控,提供现代化 Web 界面和灵活的 Webhook 告警功能。
本项目采用异步并发模型(Tokio),主要由以下几个核心模块组成:
- Probe Loop: 主循环定期遍历所有监控目标 (Target)。
- 并发探测: 针对每个目标启动异步任务进行探测 (TCP connect, ICMP ping, DNS query, HTTP/HTTPS request)。
- 状态管理: 使用
DashMap(线程安全的 HashMap) 存储所有目标的实时状态 (MonitorStatus)。 - 状态确认机制:
- 首次启动时立即确认状态。
- 状态变更(UP <-> DOWN)需要经过多次探测确认(防抖动)。
- 配置热重载: 监听配置文件变化,通过 Hash 比对智能更新监控列表,避免不必要的重启。
- Axum Server: 提供 HTTP API 和静态文件服务(嵌入式静态资源)。
- API:
GET /api/events: SSE 实时事件流(初始状态 + 实时更新)。GET /api/config: 获取当前配置。POST /api/config: 更新配置(支持前端直接修改)。
- Frontend: 单页应用 (SPA),通过 SSE 实时获取状态更新,支持深色模式 (Dark Mode),提供可视化配置管理界面。
- Config Persistence: 配置文件 (
config.json) 是单一数据源 (Source of Truth)。修改配置会自动保存到磁盘。 - Cache System:
- Graceful Shutdown: 程序接收到终止信号 (SIGINT/SIGTERM) 时,会将当前的监控状态(如历史延迟数据、当前状态)序列化保存到
cache.json。 - Restore: 下次启动时优先加载缓存,恢复之前的监控上下文,避免数据断层。
- Graceful Shutdown: 程序接收到终止信号 (SIGINT/SIGTERM) 时,会将当前的监控状态(如历史延迟数据、当前状态)序列化保存到
- Webhook: 支持配置多个 Webhook 端点,当目标状态发生确认变更时,异步发送 HTTP POST 请求。
- Template: 支持自定义 JSON 告警模版,支持变量替换(如
{{TARGET}},{{STATUS}}等)。 - Retry: 内置简单的错误重试和详细的日志记录。
本项目提供了 Makefile 以简化多架构编译。
- Rust (Cargo)
- 交叉编译工具链:
- x86_64 musl: 需要
x86_64-linux-gcc - AArch64 musl: 需要
aarch64-linux-gcc
- x86_64 musl: 需要
# 编译 x86_64 Musl (静态链接,单文件,使用 x86_64-linux-gcc)
make x86_64
# 编译 AArch64 Musl (静态链接,单文件,使用 aarch64-linux-gcc)
make aarch64{
"targets": [
{
"id": "uuid-1",
"name": "Local SSH",
"host": "127.0.0.1",
"protocol": "TCP",
"port": 22
},
{
"id": "uuid-2",
"name": "Google",
"host": "www.google.com",
"protocol": "HTTPS",
"port": 443
}
],
"alert": {
"enabled": true,
"webhooks": [
{
"id": "w_1",
"name": "Telegram",
"url": "https://api.telegram.org/bot<TOKEN>/sendMessage",
"template": "{ \"chat_id\": \"<CHAT_ID>\", \"text\": \"{{STATUS}} {{TARGET}} {{HOST}} {{TIME}} {{MESSAGE}}\" }",
"enabled": true
}
]
},
"data_retention_days": 3
}直接运行:
./netwatch命令行参数:
-d <directory>: 指定运行工作目录(配置文件和缓存文件将在此目录下查找/创建)。-c <config_path>: 指定配置文件路径(覆盖默认的config.json)。
示例:
# 指定工作目录
./netwatch -d /opt/netwatch
# 指定配置文件
./netwatch -c /etc/netwatch/my_config.json日志级别可通过 RUST_LOG 环境变量控制,默认为 info。