Skip to content

hexxyan/FXMonitor

Repository files navigation

FX Monitor - 可配置监控平台

Go Version License Build Status

一个基于 Golang 和 Server-Sent Events (SSE) 的实时监控平台,支持动态配置、实时数据推送和可视化仪表盘。

🌟 核心特性

📊 实时监控

  • Server-Sent Events (SSE) 实时数据推送
  • 按需启动 监控项,节省系统资源
  • 独立频率控制 每个客户端可设置不同的更新频率
  • 自动重连 和手动重连机制

🚀 主动通知系统 (v1.0.3 新增)

  • Unix域套接字 高性能进程间通信
  • 命令行接口 快速发送通知:--send "消息" --level info --source 来源
  • 多级别通知 支持 info、warning、error 级别
  • 实时推送 通知即时显示在前端界面
  • 历史记录 通知历史管理和查看

📋 日志监听系统 (v1.0.3 新增)

  • 多种日志源 支持 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
Loading

🚀 快速开始

环境要求

  • 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

主动通知使用 (v1.0.3 新增)

# 发送基本通知(支持长短参数格式)
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 启用调试模式

📋 配置说明

新版配置结构 (v1.0.3)

# 新版配置格式,支持监控项和日志监听器
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 结果解析器类型

日志监听器配置字段说明 (v1.0.3 新增)

字段 类型 必填 说明
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: 停止执行器 (如无其他客户端)
Loading

🎛️ 功能模块

监控项管理

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
Loading

实时仪表盘

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
Loading

🔧 API 接口

监控项管理

方法 路径 说明
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 测试监控项

日志监听器管理 (v1.0.3 新增)

方法 路径 说明
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 导入配置文件

SSE 连接

方法 路径 说明
GET /sse/subscribe/{id} 订阅监控项数据
GET /sse/subscribe/monitor-status 订阅状态同步
GET /sse/active-notifications 订阅主动通知 (v1.0.3 新增)

🎯 使用场景

系统监控

mindmap
  root((系统监控))
    性能指标
      CPU 使用率
      内存使用率
      磁盘使用率
      网络流量
    系统状态
      进程监控
      服务状态
      端口监听
      日志监控
    自定义指标
      应用指标
      业务指标
      API 响应时间
      数据库连接数
Loading

应用监控

  • Web 服务监控: HTTP 响应时间、状态码统计
  • 数据库监控: 连接数、查询性能、锁等待
  • 消息队列监控: 队列长度、消费速率、错误率
  • 缓存监控: 命中率、内存使用、连接数

日志监控 (v1.0.3 新增)

  • 系统日志监控: dmesg、rsyslog、journalctl 日志监听
  • 应用日志监控: 自定义日志文件监听
  • 错误日志过滤: 基于级别、内容、正则表达式的智能过滤
  • 实时通知: 匹配的日志事件自动发送通知

🔍 高级特性

按需启动机制

stateDiagram-v2
    [*] --> 等待订阅: 监控项启用
    等待订阅 --> 运行中: 客户端订阅
    运行中 --> 等待订阅: 所有客户端断开
    等待订阅 --> [*]: 监控项禁用
    运行中 --> [*]: 监控项禁用
    
    note right of 运行中: 执行监控命令\n推送实时数据
    note right of 等待订阅: 不执行命令\n节省资源
Loading

独立频率控制

每个客户端可以设置不同的更新频率:

  • 客户端 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
Loading

🛠️ 开发指南

项目结构

fxmonitor/
├── main.go              # 主程序入口
├── config.yaml          # 配置文件
├── static/              # 静态文件
│   ├── index.html       # 主页面
│   ├── app.js          # 前端逻辑
│   └── style.css       # 样式文件
├── internal/            # 内部包
│   ├── monitor/         # 监控逻辑
│   ├── sse/            # SSE 实现
│   └── config/         # 配置管理
└── README.md           # 项目文档

添加新的监控类型

  1. 在配置中定义新的 type
  2. 实现对应的执行器
  3. 添加结果解析器
  4. 更新前端界面

自定义解析器

type Parser interface {
    Parse(output string) (interface{}, error)
}

🤝 贡献指南

  1. Fork 项目
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

🙏 致谢

🚨 故障排除

常见问题

1. SSE 连接失败

# 检查服务器状态
curl -I http://localhost:9999/sse/subscribe/test-monitor

# 预期响应
HTTP/1.1 200 OK
Content-Type: text/event-stream

2. 监控项无法启动

  • 检查命令是否可执行
  • 验证超时设置是否合理
  • 查看服务器日志输出

3. 配置文件格式错误

# 验证 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-1m

⚡ 性能优化

系统资源管理

graph 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
Loading

优化建议

  1. 合理设置频率: 避免过于频繁的监控
  2. 命令优化: 使用高效的 Shell 命令
  3. 客户端管理: 及时断开不需要的连接
  4. 资源监控: 定期检查系统资源使用情况

性能指标

指标 建议值 说明
并发监控项 < 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
Loading

安全建议

  1. 限制命令权限: 使用受限用户运行服务
  2. 输入验证: 验证监控项配置的合法性
  3. 网络安全: 在生产环境中使用 HTTPS
  4. 访问控制: 添加身份验证和授权机制

📊 监控示例

系统监控配置

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"]

日志监听配置示例 (v1.0.3 新增)

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"]

主动通知使用示例 (v1.0.3 新增)

# 部署脚本中发送通知(支持长短参数混用)
#!/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

C# 客户端集成示例 (v1.0.3 新增)

// 创建 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");

🔄 版本历史

v1.0.3 (当前版本)

  • 主动通知系统: Unix域套接字通信、命令行接口、多级别通知
  • 日志监听系统: 多种日志源、智能过滤、可视化配置
  • 前端增强: 主动通知面板、日志配置界面
  • C# 客户端演示: 完整的 .NET 对接示例项目
  • 架构优化: SSE Broker重构、错误处理改进
  • 配置升级: 支持新的YAML配置结构,向后兼容

v1.0.2

  • ✅ 所有v1.0.0和v1.0.1功能
  • ✅ 默认频率选项(使用YAML配置的默认频率)
  • ✅ 改进的频率设置界面
  • ✅ 优化的客户端连接管理
  • ✅ 修复的连接关闭和重连问题

v1.0.1

  • ✅ 修复优雅关闭Panic问题
  • ✅ 改进Channel操作安全性
  • ✅ 添加错误恢复机制
  • ✅ 增强调试日志

v1.0.0

  • ✅ 基础监控功能
  • ✅ SSE 实时数据推送
  • ✅ 按需启动机制
  • ✅ 独立频率控制
  • ✅ 手动重连功能
  • ✅ 状态同步机制
  • ✅ 配置热重载
  • ✅ 导入/导出功能

计划功能 (v1.1.0)

  • 🔄 用户认证系统
  • 🔄 监控数据持久化
  • 🔄 告警规则引擎
  • 🔄 监控模板系统
  • 🔄 性能统计面板
  • 🔄 通知渠道扩展 (邮件、钉钉、企业微信)

🌐 部署指南

Docker 部署

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.target

Nginx 反向代理

server {
    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、系统服务等部署方式

🔌 集成文档 (v1.0.3 新增)

  • 💻 C# 客户端演示 - 完整的 .NET 对接示例项目
    • REST API 调用示例
    • SSE 实时数据接收
    • 主动通知系统集成
    • 日志监听管理
    • 交互式操作界面
  • 📖 主动通知使用指南 - 详细的通知系统使用文档

📞 支持与反馈


FX Monitor - 让监控变得简单而强大 🚀

💡 提示: 如果你觉得这个项目有用,请给我们一个 ⭐ Star!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors