# 运维告警监控平台项目完整部署文档
## 文档说明
本文档完整记录告警监控平台**目录结构、数据库表、前后端脚本、接口逻辑、部署配置、导出功能**全栈信息，用于运维存档、交接、故障排查。

# 一、项目整体架构
## 1. 架构分层
1. **数据采集层**：Alertmanager Webhook（909端口Python入库脚本）
2. **数据存储层**：MariaDB/MySQL `alert_mail_stat` 库
3. **服务接口层**：Nginx容器 + PHP（api接口，统计/图表/明细/CSV导出）
4. **可视化展示层**：HTML前端监控看板（实时刷新、图表、导出）

## 2. 端口与服务说明
| 服务 | 端口 | 部署位置 | 作用 |
|------|------|----------|------|
| Alertmanager | 9093 | 宿主机 | 接收Prometheus告警，转发给webhook |
| Prometheus | 9090 | 宿主机 | 生成告警规则 |
| Python Webhook | 909 | 宿主机 | 接收AM告警，入库MySQL |
| Nginx+PHP | 8080 | Docker容器 | 提供api接口、静态页面访问 |
| MySQL/MariaDB | 3306 | 宿主机 | 告警数据持久存储 |

# 二、项目目录层级结构
## 宿主机目录（宿主机实体文件）
```
/root
├─ webhook.py                # Alertmanager告警入库脚本（909端口服务）
├─ alert_report.py           # 旧CSV导出Python脚本（已废弃，改用纯PHP导出）
├─ alert.rules.yml           # Prometheus告警规则
├─ am.yml                    # Alertmanager配置文件
/var/www/html                 # Nginx容器挂载目录（前端+PHP接口）
├─ index.html                 # 企业级告警监控看板前端页面
├─ api.php                    # PHP后端接口文件（统计/top10/明细/导出）
/tmp                          # 临时文件目录（CSV临时文件，现已不用）
```

## Docker容器目录（Nginx+PHP容器内）
```
/usr/share/nginx/html
├─ index.html
├─ api.php
```

# 三、数据库设计
## 1. 数据库库名
`alert_mail_stat`

## 2. 数据表：`alert_log` 告警明细表
### 建表语句
```sql
CREATE TABLE `alert_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `mail_uid` varchar(255) NOT NULL COMMENT '告警唯一指纹fingerprint',
  `alert_type` tinyint(1) NOT NULL COMMENT '1=触发故障 2=恢复告警',
  `alert_name` varchar(200) NOT NULL COMMENT '告警规则名称',
  `instance` varchar(200) NOT NULL COMMENT '告警实例IP/主机名',
  `severity` varchar(50) NOT NULL DEFAULT 'warning' COMMENT '告警级别 critical/warning/info',
  `starts_at` datetime DEFAULT NULL COMMENT '原始UTC告警触发时间',
  `ends_at` datetime DEFAULT NULL COMMENT '原始UTC恢复时间',
  `content` text COMMENT '告警完整原始JSON内容',
  `receive_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库东八区服务器时间',
  PRIMARY KEY (`id`),
  KEY idx_receive_time (`receive_time`),
  KEY idx_instance (`instance`),
  KEY idx_alert_type (`alert_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='告警全量明细记录表';
```

### 字段详细说明
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int | 自增主键 |
| mail_uid | varchar | Alertmanager告警唯一指纹，区分同一条告警 |
| alert_type | tinyint | 1=故障触发 2=告警恢复 |
| alert_name | varchar | Prometheus告警名称 |
| instance | varchar | 告警目标实例地址 |
| severity | varchar | 告警等级：critical严重 / warning警告 / info信息 |
| starts_at | datetime | UTC零时区告警开始时间，前端/CSV导出自动转东八区 |
| ends_at | datetime | UTC零时区告警恢复时间，现前端不再展示该字段 |
| content | text | 完整原始告警JSON报文 |
| receive_time | datetime | 脚本入库时服务器本地东八区时间，前端统一展示此字段为「故障发生时间」 |

### 索引说明
1. `idx_receive_time`：按日期查询今日告警核心索引
2. `idx_instance`：实例过滤、TOP统计加速
3. `idx_alert_type`：区分故障/恢复统计

# 四、核心脚本完整说明
## 脚本1：/root/webhook.py 告警入库服务（909端口）
### 功能
1. 开启HTTP 909端口接收Alertmanager POST告警推送
2. 区分告警状态firing/resolved，赋值alert_type=1/2
3. 解析fingerprint作为唯一标识存入mail_uid
4. 自动写入starts_at/ends_at UTC时间
5. 使用数据库NOW()写入本地东八区receive_time
6. 支持同实例多次故障重复入库（已删除唯一索引uk_mail_uid）

### 关键逻辑
- firing告警：直接INSERT新增一条故障记录
- resolved恢复告警：INSERT新增一条恢复记录，故障记录保留不覆盖
- 无重复限制，全天多次启停告警全部留存明细

### 启动方式
```bash
# 后台常驻运行
nohup python3 /root/webhook.py &
# 查看日志
tail -f nohup.out
```

## 脚本2：/var/www/html/api.php PHP后端接口（核心业务接口）
### 四大接口（通过GET参数act区分）
地址前缀：`http://10.150.117.190:8080/api.php`
1. `?act=day_total` 今日统计卡片数据
   - 输出：今日故障总数、恢复总数、独立实例数、恢复率
2. `?act=top_alert` 今日告警TOP10图表数据
   - 输出：按告警名称分组计数，降序取前10
3. `?act=log_list` 告警明细表格数据
   - 输出今日所有告警明细，提供前端表格渲染
4. `?act=export_csv` 纯PHP生成CSV导出（无python依赖，解决容器找不到python问题）
   - 自动转换UTC starts_at为东八区北京时间
   - 告警数字1/2自动转为中文「触发/恢复」
   - UTF8-BOM，Windows Excel不乱码
   - 不生成临时文件，流式直接下载

### 数据库连接配置
```php
$host = "10.150.117.190";
$user = "root";
$pass = "hp93000";
$dbname = "alert_mail_stat";
```

## 脚本3：/var/www/html/index.html 前端监控看板页面
### 页面模块划分
1. 顶部导航栏
   - 平台标题、实时系统时钟（每秒刷新）
   - 手动刷新按钮、CSV导出按钮、导出加载遮罩
2. 四大统计卡片
   - 今日触发告警、今日恢复告警、故障实例总数、恢复率
3. ECharts柱状图：今日告警频次TOP10
4. 告警明细表格
   - 字段：告警状态、告警名称、实例地址、告警级别、故障发生时间（receive_time）
   - 已移除原UTC starts_at列，消除时区混淆
   - 状态标签、级别标签带颜色区分，配套FontAwesome图标

### 前端核心能力
1. 每60秒自动全量刷新统计、图表、表格
2. 右上角实时时钟每秒更新
3. 导出按钮触发CSV下载，5秒遮罩等待
4. 自适应PC/平板/手机响应式布局
5. 企业深蓝高级UI，全页面运维图标

### 接口请求地址统一常量
```js
const api = "http://10.150.117.190:8080/api.php";
```

## 废弃脚本说明
`/root/alert_report.py`：早期CSV导出脚本
- 问题：Nginx容器内无Python环境，exec调用失败，返回码127
- 解决方案：完全移除Python调用逻辑，改用纯PHP流式导出CSV

# 五、配置文件说明
## 1. Prometheus告警规则 /root/alert.rules.yml
作用：定义各类业务告警，设置`severity`标签（critical/warning/info），标签会透传给webhook入库。

## 2. Alertmanager配置 /root/am.yml
核心路由配置：所有告警转发至宿主机909端口webhook地址
```yaml
receivers:
- name: webhook-receiver
  webhook_configs:
  - url: http://127.0.0.1:909
```

## 3. Nginx容器挂载配置
容器启动挂载参数：将宿主机静态页面与PHP接口挂载至容器web根目录
```
-v /var/www/html:/usr/share/nginx/html
```

# 六、数据流转完整流程
1. Prometheus触发告警 → 推送至Alertmanager
2. Alertmanager根据路由配置POST JSON告警报文到 `127.0.0.1:909`
3. webhook.py接收报文，解析字段，写入MySQL `alert_log`
4. 前端页面定时请求api.php三大数据接口拉取入库后的告警数据
5. 用户点击导出，api.php直接查询数据库生成CSV文件浏览器下载

# 七、运维常用操作命令
## 1. 重启告警入库服务
```bash
pkill -f webhook.py
nohup python3 /root/webhook.py &
```

## 2. 测试接口是否正常
```bash
# 统计接口
curl http://10.150.117.190:8080/api.php?act=day_total
# 明细接口
curl http://10.150.117.190:8080/api.php?act=log_list
# CSV导出（浏览器访问）
http://10.150.117.190:8080/api.php?act=export_csv
```

## 3. 数据库查询今日告警
```sql
SELECT * FROM alert_log WHERE DATE(receive_time) = CURDATE() ORDER BY receive_time DESC;
```

# 八、已知优化点与历史问题记录
1. 历史问题：CSV导出调用宿主机Python，容器内无环境，报错127
   优化：重写export_csv为纯PHP实现，移除外部脚本依赖
2. 历史问题：故障恢复UPDATE覆盖原始故障记录，无法同时查看触发+恢复
   优化：删除mail_uid唯一索引，触发、恢复分别INSERT两条独立记录
3. 历史问题：表格同时存在UTC starts_at和东八区receive_time，时区混淆
   优化：前端删除starts_at列，仅展示入库东八区时间，表头命名「故障发生时间」
4. UI迭代：原始简易配色改为企业深蓝运维后台风格，全量增加FontAwesome图标
5. 时钟优化：静态页面刷新时间改为每秒更新的系统实时时钟，区分数据刷新与系统时间