一个基于 Golang 和 Server-Sent Events (SSE) 的实时监控平台,支持动态配置、实时数据推送和可视化仪表盘。
- Server-Sent Events (SSE) 实时数据推送
- 按需启动 监控项,节省系统资源
- 独立频率控制 每个客户端可设置不同的更新频率
- 自动重连 和手动重连机制
- Unix域套接字 高性能进程间通信
- 命令行接口 快速发送通知:
--send "消息" --level info --source 来源 - 多级别通知 支持 info、warning、error 级别
- 实时推送 通知即时显示在前端界面
- 历史记录 通知历史管理和查看
- 多种日志源 支持 dmesg、rsyslog、journalctl、自定义文件
- 智能过滤 级别过滤、内容匹配、正则表达式
- 可视化配置 前端界面管理日志监听器
- 自动通知 匹配的日志自动发送到通知系统
- 实时控制 支持启用/禁用和实时配置
- REST API 完整的日志监听器管理API (
/api/log-watchers)
- YAML 配置文件 支持热重载,新增日志监听配置
- 动态添加/编辑/删除 监控项和日志监听器
- 标签系统 便于分类管理
- 变量替换 支持模板化命令
- 向后兼容 支持新旧配置格式
- 实时仪表盘 数据可视化
- 主动通知面板 实时通知显示,支持不同级别的视觉区分
- 日志配置界面 可视化日志监听管理,支持复杂过滤规则配置
- 状态同步 前后端状态实时同步
- 导入/导出 配置文件
- 测试功能 验证监控项配置
- C# 客户端演示 完整的 .NET 对接示例项目
graph TB
subgraph "前端 Frontend"
A[监控项列表] --> B[实时仪表盘]
A --> C[配置管理]
A --> N[主动通知面板]
A --> O[日志配置界面]
B --> D[SSE 客户端]
N --> D
end
subgraph "后端 Backend"
E[HTTP API] --> F[配置管理器]
E --> G[SSE Broker V2]
E --> P[日志监听API]
F --> H[YAML 配置文件]
G --> I[动态调度器]
I --> J[监控执行器]
P --> Q[日志监听服务]
end
subgraph "通知系统"
R[Unix域套接字] --> S[通知服务器]
S --> G
Q --> S
end
subgraph "监控执行"
J --> K[Shell 命令]
J --> L[结果解析器]
L --> M[数据广播]
end
D -.->|SSE 连接| G
M -.->|实时数据| D
C -->|API 调用| E
style A fill:#e1f5fe
style B fill:#f3e5f5
style G fill:#fff3e0
style I fill:#e8f5e8
- Go 1.21 或更高版本
- 支持 Shell 命令执行的操作系统 (Linux/macOS/Windows)
# 克隆仓库
git clone https://github.com/your-username/fxmonitor.git
cd fxmonitor
# 运行服务器
go run main.go
# 调试模式运行
go run main.go --debug
# 指定端口运行(支持长短参数)
go run main.go --port=8083
go run main.go -p 8083打开浏览器访问:http://localhost:9999
# 发送基本通知(支持长短参数格式)
go run main.go --send "这是一个测试通知"
go run main.go -s "这是一个测试通知"
# 发送不同级别的通知
go run main.go --send "部署完成" --level info --source deployment
go run main.go -s "部署完成" -l info -o deployment
# 混合使用长短参数
go run main.go -s "系统负载过高" --level warning -o monitoring
go run main.go --send "数据库连接失败" -l error --source database| 长参数 | 短参数 | 默认值 | 说明 |
|---|---|---|---|
--send |
-s |
- | 发送通知消息 |
--level |
-l |
info |
通知级别 (info, warning, error) |
--source |
-o |
cli |
通知来源标识 |
--port |
-p |
9999 |
服务器端口 |
--debug |
-d |
false |
启用调试模式 |
# 新版配置格式,支持监控项和日志监听器
monitors:
- id: "system-load-1m"
name: "系统1分钟平均负载"
description: "监控系统1分钟平均负载"
type: "command"
command: "uptime | awk '{print $(NF-2)}' | sed 's/,//'"
frequency: "5s"
timeout: "3s"
enabled: true
tags: ["system", "performance"]
parser: "text"
parser_options: {}
log_watchers:
- id: "system-errors"
name: "系统错误监听"
description: "监听系统错误日志"
enabled: true
source:
type: "rsyslog"
follow: true
filters:
- type: "level"
level: "error"
output:
notification_level: "error"
source: "system-log"
include_timestamp: true
tags: ["system", "error"]| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | ✅ | 监控项唯一标识符 |
name |
string | ✅ | 监控项显示名称 |
description |
string | ❌ | 监控项描述 |
type |
string | ✅ | 监控类型 (目前支持 "command") |
command |
string | ✅ | 要执行的 Shell 命令 |
frequency |
string | ✅ | 执行频率 (如: "5s", "1m", "1h") |
timeout |
string | ✅ | 命令超时时间 |
enabled |
boolean | ✅ | 是否启用 |
tags |
[]string | ❌ | 标签列表 |
parser |
string | ✅ | 结果解析器类型 |
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id |
string | ✅ | 日志监听器唯一标识符 |
name |
string | ✅ | 日志监听器显示名称 |
description |
string | ❌ | 日志监听器描述 |
enabled |
boolean | ✅ | 是否启用 |
source.type |
string | ✅ | 日志源类型 (dmesg, rsyslog, journalctl, file) |
source.path |
string | ❌ | 日志文件路径 (file类型必填) |
source.follow |
boolean | ✅ | 是否跟踪新日志 |
filters |
[]object | ❌ | 过滤规则列表 |
output.notification_level |
string | ✅ | 通知级别 (info, warning, error) |
output.source |
string | ✅ | 通知来源标识 |
tags |
[]string | ❌ | 标签列表 |
sequenceDiagram
participant C as 客户端
participant API as HTTP API
participant SSE as SSE Broker
participant S as 调度器
participant E as 执行器
Note over C,E: 1. 客户端订阅监控项
C->>+SSE: 建立 SSE 连接
SSE->>+S: 按需启动监控项
S->>+E: 创建执行器实例
Note over C,E: 2. 数据收集和推送
loop 按频率执行
E->>E: 执行监控命令
E->>SSE: 发送执行结果
SSE->>C: 推送实时数据
end
Note over C,E: 3. 客户端断开
C->>SSE: 断开连接
SSE->>S: 检查客户端数量
S->>E: 停止执行器 (如无其他客户端)
graph LR
A[添加监控项] --> B[配置验证]
B --> C[保存到 YAML]
C --> D[状态同步]
E[编辑监控项] --> F[更新配置]
F --> G[热重载]
G --> D
H[删除监控项] --> I[停止执行]
I --> J[清理资源]
J --> D
style A fill:#e8f5e8
style E fill:#fff3e0
style H fill:#ffebee
graph TB
A[客户端订阅] --> B[SSE 连接建立]
B --> C[监控项按需启动]
C --> D[数据收集]
D --> E[实时推送]
E --> F[仪表盘更新]
G[连接断开] --> H[显示断开状态]
H --> I[手动重连按钮]
I --> J[重新建立连接]
J --> B
style A fill:#e1f5fe
style F fill:#f3e5f5
style I fill:#fff3e0
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/monitors |
获取启用的监控项列表 |
GET |
/api/monitors/all |
获取所有监控项列表 |
GET |
/api/monitors/{id} |
获取指定监控项详情 |
POST |
/api/monitors |
创建新监控项 |
PUT |
/api/monitors/{id} |
更新监控项 |
DELETE |
/api/monitors/{id} |
删除监控项 |
POST |
/api/monitors/{id}/toggle |
切换监控项启用状态 |
POST |
/api/monitors/{id}/test |
测试监控项 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/log-watchers |
获取所有日志监听器列表 |
GET |
/api/log-watchers/{id} |
获取指定日志监听器详情 |
POST |
/api/log-watchers |
创建新日志监听器 |
PUT |
/api/log-watchers/{id} |
更新日志监听器 |
DELETE |
/api/log-watchers/{id} |
删除日志监听器 |
POST |
/api/log-watchers/{id}/toggle |
切换日志监听器启用状态 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/api/monitors/export |
导出配置文件 |
POST |
/api/monitors/import |
导入配置文件 |
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/sse/subscribe/{id} |
订阅监控项数据 |
GET |
/sse/subscribe/monitor-status |
订阅状态同步 |
GET |
/sse/active-notifications |
订阅主动通知 (v1.0.3 新增) |
mindmap
root((系统监控))
性能指标
CPU 使用率
内存使用率
磁盘使用率
网络流量
系统状态
进程监控
服务状态
端口监听
日志监控
自定义指标
应用指标
业务指标
API 响应时间
数据库连接数
- Web 服务监控: HTTP 响应时间、状态码统计
- 数据库监控: 连接数、查询性能、锁等待
- 消息队列监控: 队列长度、消费速率、错误率
- 缓存监控: 命中率、内存使用、连接数
- 系统日志监控: dmesg、rsyslog、journalctl 日志监听
- 应用日志监控: 自定义日志文件监听
- 错误日志过滤: 基于级别、内容、正则表达式的智能过滤
- 实时通知: 匹配的日志事件自动发送通知
stateDiagram-v2
[*] --> 等待订阅: 监控项启用
等待订阅 --> 运行中: 客户端订阅
运行中 --> 等待订阅: 所有客户端断开
等待订阅 --> [*]: 监控项禁用
运行中 --> [*]: 监控项禁用
note right of 运行中: 执行监控命令\n推送实时数据
note right of 等待订阅: 不执行命令\n节省资源
每个客户端可以设置不同的更新频率:
- 客户端 A: 5秒更新一次
- 客户端 B: 10秒更新一次
- 客户端 C: 30秒更新一次
- 客户端 D: 使用YAML配置的默认频率
系统为每个客户端创建独立的执行器实例,实现真正的个性化监控。
用户可以在频率设置中选择"默认"选项,使用YAML配置文件中定义的频率,便于保持与后端配置的一致性。
graph LR
A[配置变更] --> B[YAML 文件更新]
B --> C[状态同步广播]
C --> D[所有客户端更新]
E[监控项启用/禁用] --> F[状态变更事件]
F --> C
style C fill:#fff3e0
style D fill:#e8f5e8
fxmonitor/
├── main.go # 主程序入口
├── config.yaml # 配置文件
├── static/ # 静态文件
│ ├── index.html # 主页面
│ ├── app.js # 前端逻辑
│ └── style.css # 样式文件
├── internal/ # 内部包
│ ├── monitor/ # 监控逻辑
│ ├── sse/ # SSE 实现
│ └── config/ # 配置管理
└── README.md # 项目文档
- 在配置中定义新的
type - 实现对应的执行器
- 添加结果解析器
- 更新前端界面
type Parser interface {
Parse(output string) (interface{}, error)
}- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- Gin - HTTP Web 框架
- YAML - YAML 解析库
- Server-Sent Events - 实时数据推送技术
# 检查服务器状态
curl -I http://localhost:9999/sse/subscribe/test-monitor
# 预期响应
HTTP/1.1 200 OK
Content-Type: text/event-stream- 检查命令是否可执行
- 验证超时设置是否合理
- 查看服务器日志输出
# 验证 YAML 格式
go run main.go --debug
# 查看启动日志中的配置解析错误# 启用详细日志(支持长短参数)
go run main.go --debug
go run main.go -d
# 日志输出示例
2024/01/01 12:00:00 【调度器调试】监控项 system-load-1m 执行完成
2024/01/01 12:00:00 【SSE Broker V2调试】广播消息到主题 system-load-1mgraph TB
A[客户端连接] --> B{检查监控项状态}
B -->|未运行| C[启动监控项]
B -->|已运行| D[复用现有实例]
E[客户端断开] --> F{检查剩余客户端}
F -->|无客户端| G[停止监控项]
F -->|有客户端| H[保持运行]
style C fill:#e8f5e8
style G fill:#ffebee
style D fill:#e1f5fe
style H fill:#e1f5fe
- 合理设置频率: 避免过于频繁的监控
- 命令优化: 使用高效的 Shell 命令
- 客户端管理: 及时断开不需要的连接
- 资源监控: 定期检查系统资源使用情况
| 指标 | 建议值 | 说明 |
|---|---|---|
| 并发监控项 | < 50 | 单实例建议监控项数量 |
| 客户端连接 | < 100 | 同时连接的客户端数量 |
| 更新频率 | ≥ 1s | 最小更新间隔 |
| 命令超时 | 3-10s | 根据命令复杂度调整 |
graph LR
A[用户输入] --> B[输入验证]
B --> C[命令白名单]
C --> D[沙箱执行]
D --> E[结果过滤]
style B fill:#fff3e0
style C fill:#ffebee
style D fill:#e8f5e8
- 限制命令权限: 使用受限用户运行服务
- 输入验证: 验证监控项配置的合法性
- 网络安全: 在生产环境中使用 HTTPS
- 访问控制: 添加身份验证和授权机制
monitors:
# CPU 使用率
- id: "cpu-usage"
name: "CPU 使用率"
command: "top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | sed 's/%us,//'"
frequency: "5s"
timeout: "3s"
tags: ["system", "cpu"]
# 内存使用率
- id: "memory-usage"
name: "内存使用率"
command: "free | grep Mem | awk '{printf \"%.1f\", $3/$2 * 100.0}'"
frequency: "10s"
timeout: "3s"
tags: ["system", "memory"]
# 磁盘使用率
- id: "disk-usage"
name: "磁盘使用率"
command: "df -h / | awk 'NR==2{print $5}' | sed 's/%//'"
frequency: "30s"
timeout: "5s"
tags: ["system", "disk"]monitors:
# HTTP 服务状态
- id: "web-service-status"
name: "Web 服务状态"
command: "curl -s -o /dev/null -w '%{http_code}' http://localhost:3000/health"
frequency: "15s"
timeout: "10s"
tags: ["application", "web"]
# 数据库连接数
- id: "db-connections"
name: "数据库连接数"
command: "mysql -e 'SHOW STATUS LIKE \"Threads_connected\"' | awk 'NR==2{print $2}'"
frequency: "20s"
timeout: "5s"
tags: ["database", "mysql"]log_watchers:
# 系统错误日志监听
- id: "system-errors"
name: "系统错误监听"
description: "监听系统错误日志"
enabled: true
source:
type: "rsyslog"
follow: true
filters:
- type: "level"
level: "error"
output:
notification_level: "error"
source: "system-log"
include_timestamp: true
include_hostname: true
tags: ["system", "error"]
# 应用日志监听
- id: "app-errors"
name: "应用错误监听"
description: "监听应用错误日志"
enabled: true
source:
type: "file"
path: "/var/log/myapp/error.log"
follow: true
filters:
- type: "regex"
pattern: "ERROR|FATAL"
case_sensitive: false
output:
notification_level: "warning"
source: "myapp"
template: "应用错误: {message}"
tags: ["application", "error"]
# 内核消息监听
- id: "kernel-messages"
name: "内核消息监听"
description: "监听内核重要消息"
enabled: true
source:
type: "dmesg"
follow: true
filters:
- type: "content"
pattern: "Out of memory"
- type: "content"
pattern: "segfault"
output:
notification_level: "error"
source: "kernel"
tags: ["kernel", "critical"]# 部署脚本中发送通知(支持长短参数混用)
#!/bin/bash
echo "开始部署应用..."
go run main.go -s "开始部署应用 v2.1.0" -l info -o deployment
# 执行部署操作
if deploy_app; then
go run main.go --send "应用部署成功" --level info --source deployment
else
go run main.go -s "应用部署失败,请检查日志" -l error -o deployment
exit 1
fi
# 监控脚本中发送告警
#!/bin/bash
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
go run main.go -s "CPU使用率过高: ${CPU_USAGE}%" -l warning -o monitoring
fi
# 备份脚本中发送状态
#!/bin/bash
if backup_database; then
go run main.go --send "数据库备份完成" --level info --source backup
else
go run main.go -s "数据库备份失败" -l error -o backup
fi// 创建 FX Monitor 客户端
var client = new FxMonitorHttpClient("http://localhost:9999");
var sseClient = new FxMonitorSseClient("http://localhost:9999");
// 获取监控项列表
var monitors = await client.GetMonitorsAsync();
Console.WriteLine($"发现 {monitors.Count} 个监控项");
// 订阅主动通知
sseClient.OnNotification += (notification) => {
Console.WriteLine($"🔔 [{notification.Level.ToUpper()}] {notification.Source}: {notification.Message}");
};
// 订阅监控数据
sseClient.OnMonitorData += (data) => {
Console.WriteLine($"📊 {data.MonitorId}: {data.Data}");
};
// 启动连接
await sseClient.ConnectToNotificationsAsync();
await sseClient.ConnectToMonitorAsync("system-load-1m");- ✅ 主动通知系统: Unix域套接字通信、命令行接口、多级别通知
- ✅ 日志监听系统: 多种日志源、智能过滤、可视化配置
- ✅ 前端增强: 主动通知面板、日志配置界面
- ✅ C# 客户端演示: 完整的 .NET 对接示例项目
- ✅ 架构优化: SSE Broker重构、错误处理改进
- ✅ 配置升级: 支持新的YAML配置结构,向后兼容
- ✅ 所有v1.0.0和v1.0.1功能
- ✅ 默认频率选项(使用YAML配置的默认频率)
- ✅ 改进的频率设置界面
- ✅ 优化的客户端连接管理
- ✅ 修复的连接关闭和重连问题
- ✅ 修复优雅关闭Panic问题
- ✅ 改进Channel操作安全性
- ✅ 添加错误恢复机制
- ✅ 增强调试日志
- ✅ 基础监控功能
- ✅ SSE 实时数据推送
- ✅ 按需启动机制
- ✅ 独立频率控制
- ✅ 手动重连功能
- ✅ 状态同步机制
- ✅ 配置热重载
- ✅ 导入/导出功能
- 🔄 用户认证系统
- 🔄 监控数据持久化
- 🔄 告警规则引擎
- 🔄 监控模板系统
- 🔄 性能统计面板
- 🔄 通知渠道扩展 (邮件、钉钉、企业微信)
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o fxmonitor main.go
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/fxmonitor .
COPY --from=builder /app/static ./static
COPY --from=builder /app/config.yaml .
EXPOSE 9999
CMD ["./fxmonitor"]# /etc/systemd/system/fxmonitor.service
[Unit]
Description=FX Monitor Service
After=network.target
[Service]
Type=simple
User=fxmonitor
WorkingDirectory=/opt/fxmonitor
ExecStart=/opt/fxmonitor/fxmonitor
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetserver {
listen 80;
server_name monitor.example.com;
location / {
proxy_pass http://localhost:9999;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# SSE 支持
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
}
}详细的技术文档、修复报告和开发指南请访问:
📖 文档中心 - 包含完整的项目文档
- 🐛 优雅关闭Panic修复报告 - CTRL+C退出panic问题修复
- 🏗️ 系统架构 - 详细的架构设计和组件说明
- 🔧 开发指南 - 代码规范、调试技巧、测试指南
- 🚀 部署文档 - Docker、系统服务等部署方式
- 💻 C# 客户端演示 - 完整的 .NET 对接示例项目
- REST API 调用示例
- SSE 实时数据接收
- 主动通知系统集成
- 日志监听管理
- 交互式操作界面
- 📖 主动通知使用指南 - 详细的通知系统使用文档
- 🐛 Bug 报告: GitHub Issues
- 💡 功能建议: GitHub Discussions
- 📧 联系方式: your-email@example.com
- 📖 完整文档: 文档中心
FX Monitor - 让监控变得简单而强大 🚀
💡 提示: 如果你觉得这个项目有用,请给我们一个 ⭐ Star!