Skip to content

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

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages