提交 6a630735 authored 作者: 陈泽健's avatar 陈泽健

docs(monitor): 更新 HANDOFF — 阶段十四 报告缺失兜底告警

更新 HANDOFF_服务监测.md,记录阶段十四(C6 报告缺失兜底告警)的完整实现细节:
- notification_service.py: 报告缺失告警配置与发送
- report_service.py: check_missing_reports 检测函数
- schedule_service.py: 每天 UTC 01:30 定时检测
- routes.py: 检查缺失报告 API
- Frontend: 通知配置卡片 + 统计页红色告警横幅
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 3b5554e8
# HANDOFF_服务监测 — 服务监测模块:检测项丰富化移植 + 移动端响应式优化 + 功能增强 + SSH sudo 自动检测 # HANDOFF_服务监测 — 服务监测模块:检测项丰富化移植 + 移动端响应式优化 + 功能增强 + SSH sudo 自动检测 + 定时任务修复 + 根因排查彻底解决 + 功能增强(报告清理/通知修复/通知内容增强/报告缺失兜底告警)
> 最后更新:2026-08-05(阶段十:SSH sudo 自动检测 + Docker 权限适配)| 分支:troubleshoot-ai-assistant | 负责人:czj > 最后更新:2026-08-12(阶段十四:功能增强 — 报告缺失兜底告警)| 分支:troubleshoot-ai-assistant | 负责人:czj
> 专属交接文档:聚焦服务监测模块(service_monitor)的全部历史与当前状态 > 专属交接文档:聚焦服务监测模块(service_monitor)的全部历史与当前状态
--- ---
...@@ -18,30 +18,27 @@ ...@@ -18,30 +18,27 @@
- **阶段六**:巡检防重复触发优化 + 数据备份检测超时修复 - **阶段六**:巡检防重复触发优化 + 数据备份检测超时修复
- **阶段七**:模块清理 + 5.44 验证 + 移动端响应式样式优化 - **阶段七**:模块清理 + 5.44 验证 + 移动端响应式样式优化
- **阶段八**:移动端响应式深度优化 — 新增 480px 超小屏幕断点 + 修正布局溢出问题 - **阶段八**:移动端响应式深度优化 — 新增 480px 超小屏幕断点 + 修正布局溢出问题
- **阶段十(本次)**:SSH sudo 自动检测 + Docker 权限适配 + 目标管理编辑功能补全 - **阶段九**:功能增强 — 报告对比 + 异常项趋势告警 + 导出 PDF/Excel
- **阶段十**:SSH sudo 自动检测 + Docker 权限适配 + 目标管理编辑功能补全
- **阶段十一**:定时任务调度器日志修复 + 任务触发验证
- **阶段十二**:根因排查彻底解决 — 定时任务死锁修复 + 9.89 麒麟系统适配 + 加密密钥固定
- **阶段十三**:功能增强 — 报告自动清理 + 钉钉通知修复 + 通知内容增强
- **阶段十四(本次)**:功能增强 — 报告缺失兜底告警
本轮会话完成了以下工作: 本轮会话完成了以下工作:
**P1:SSH sudo 自动检测** **阶段十四:报告缺失兜底告警**
1. `executor.py` — SSHExecutor 新增 `_detect_sudo_need()``_try_configure_passwordless_sudo()` 方法 1. **报告缺失检测**`report_service.py` 新增 `check_missing_reports()` 函数,检查每个目标最后报告时间,超过 `missing_days` 阈值的目标标记为缺失
2. 连接后自动检测:先测 `docker ps` 是否可直接执行 → 失败则测 `sudo -n docker ps` → 尝试自动配置免密 sudoers 2. **定时触发**`schedule_service.py` 新增每天 09:30(Asia/Shanghai)定时任务,自动检测缺失报告并发送告警通知
3. 修复检测逻辑:从只测 `sudo -n whoami` 改为精确测试 docker 命令权限(避免用户在 docker 组外但可免密 sudo 的情况) 3. **通知渠道** — 复用已配置的通知渠道(邮件/钉钉/企微),通过 `report_missing` 配置独立选择渠道
4. `target_service.py``make_executor()` 支持 `use_sudo` 字段 4. **前端配置页**`Notification.vue` 新增"报告缺失告警"配置区(缺失天数阈值 + 渠道选择)
5. **统计页告警**`Statistics.vue` 新增红色告警横幅,显示缺失目标列表(目标名 + 缺失天数 + 上次报告时间)
6. **API 端点**`GET /api/service-monitor/notification/check-missing-reports` 返回缺失目标列表
**P1:Docker 检测脚本 sudo 适配** **验证结果**
1. `20_docker_basic.sh` — 新增 `_detect_docker_sudo()` 函数,所有 docker 命令使用 `$DOCKER_CMD` 变量 - 218 个单元测试全绿 ✅
2. 自动适配 `docker``sudo docker`,解决非 root 用户执行 docker 权限拒绝问题 - vue-tsc 前端类型检查通过 ✅
- 前端配置项保存/加载正常 ✅
**P2:目标管理编辑功能补全**
1. `routes.py` — 新增 `GET /api/service-monitor/targets/<target_id>` API
2. `targets.html` — 补充 `openEdit()` 函数,通过 API 获取目标数据并回填表单
**P1:5.60 部署环境修复**
1. 端口冲突:Docker 容器与 systemd 服务抢占 8088,已禁用 systemd
2. 容器代码更新:重建 Docker 镜像,同步最新代码到容器内
3. 前端文件恢复:volume 挂载空目录覆盖 dist,已恢复
4. 搜索索引修复:`搜索索引.json` 被误创建为目录,已修复
5. 通知配置修复:重建后加密密钥变更导致解密失败,已清除旧密文
> **设计原则**:所有原版依赖 Windows 本地工具(pscp.exe/adb.exe)的模块,均改造为远程巡检检测(检测就绪状态/能力,不执行本地文件操作);所有修复类操作均改为只检测不修复;SSH 用户非 root 时自动检测并启用 sudo 提权 > **设计原则**:所有原版依赖 Windows 本地工具(pscp.exe/adb.exe)的模块,均改造为远程巡检检测(检测就绪状态/能力,不执行本地文件操作);所有修复类操作均改为只检测不修复;SSH 用户非 root 时自动检测并启用 sudo 提权
...@@ -711,59 +708,74 @@ ...@@ -711,59 +708,74 @@
- 定时任务:2 个任务运行中 ✅ - 定时任务:2 个任务运行中 ✅
- 搜索模式:TF-IDF ✅ - 搜索模式:TF-IDF ✅
### 2.34 报告缺失兜底告警 ✅
**需求背景**:当定时任务因各种原因(调度器异常、目标不可达、凭据失效等)未如期生成报告时,需要主动发现并告警,避免"静默失联"。
**核心实现**
**1. `notification_service.py` — 配置与发送**
- `report_missing` 配置结构:`{ enabled: bool, missing_days: int, channels: string[] }`
- `send_missing_report_notification()` 函数:接收缺失目标列表,通过已配置的渠道发送告警消息
- 邮件告警:表格格式列出目标名、缺失天数、上次报告时间
- 钉钉告警:Markdown 格式,红色标题 + 目标列表
- 企微告警:Markdown 格式,类似钉钉
**2. `report_service.py` — 缺失检测**
- `check_missing_reports()` 函数:遍历所有目标,查询每个目标的最后报告时间
- 比较当前时间与最后报告时间,超过 `missing_days` 阈值的目标标记为缺失
- 返回缺失目标列表(`target_name`, `target_id`, `last_report_at`, `missing_days`
**3. `schedule_service.py` — 定时触发**
- 新增 `MISSING_REPORT_CHECK_CRON = "30 1 * * *"`(UTC 01:30 = Asia/Shanghai 09:30)
- 调度器启动时注册 `check_missing_reports_job()` 定时任务
- 每天 09:30 自动检测并发送告警
**4. `routes.py` — API 端点**
- `GET /api/service-monitor/notification/check-missing-reports`:返回缺失目标列表
- 管理员权限校验
**5. 前端 — 通知配置页(Notification.vue)**
- 新增"📭 报告缺失告警"配置卡片
- el-switch 控制启用/禁用
- el-input-number 设置缺失天数阈值(1~14 天)
- 渠道选择器(邮件/钉钉/企微)复用已有配置
**6. 前端 — 统计页告警横幅(Statistics.vue)**
- 页面加载时自动调用 `checkMissingReports()` API
- 有缺失目标时显示红色告警卡片
- 展示缺失目标名、缺失天数、上次报告时间
**验证结果**
- 218 个单元测试全绿 ✅
- vue-tsc 前端类型检查通过 ✅
- 通知配置页保存/加载正常 ✅
--- ---
## 3. 当前卡在哪 ## 3. 当前卡在哪
**无卡点**。阶段一至十全部完成 **无卡点!** 本轮会话已完成所有问题的根因排查和彻底修复 + 报告缺失兜底告警功能
**当前状态** 定时任务功能已验证正常:
- 服务健康检查:status: ok, scheduler: running ✅ - 5.44 全量巡检成功(525 项检测)✅
- 容器运行:健康(healthy)✅ - 调度器正常触发 ✅
- SSH sudo 自动检测已部署 ✅ - 死锁已解除(`_schedules_lock``RLock`)✅
- Docker 检测脚本 sudo 适配已部署 ✅ - 加密密钥已固定(`MONITOR_ENC_KEY` 写入 `.env`)✅
- 目标管理编辑功能完整 ✅
- 报告免登访问正常工作 ✅ **待处理(非阻塞)**
- 统计模块正常工作 ✅ 1. 钉钉通知需要重新配置 secret(访问通知配置页面重新填写)
- 检测项趋势图表友好提示正常 ✅ 2. 通知配置页面会加载失败,因为钉钉 secret 用旧密钥加密,需先在页面清除旧值并重新填写
- full 套件 42 个模块(原 30 + 新增 12)✅
- 218 个单元测试全绿 ✅ 定时任务功能已验证正常:
- **已部署到 5.60** ✅(全部阶段已部署) - 5.44 全量巡检成功(525 项检测)✅
- 5.60 Docker 部署环境已修复 ✅ - 调度器正常触发 ✅
- 死锁已解除(`_schedules_lock``RLock`)✅
**待处理** - 加密密钥已固定(`MONITOR_ENC_KEY` 写入 `.env`)✅
- 通知凭据需重新配置(重建容器后加密密钥变更)
- `MONITOR_ENC_KEY` 建议设为固定值(当前未设置,每次重启可能变更) **待处理(非阻塞)**
- 报告免登访问正常工作 ✅ 1. 钉钉通知需要重新配置 secret(访问通知配置页面重新填写)
- 统计模块正常工作 ✅ 2. 通知配置页面会加载失败,因为钉钉 secret 用旧密钥加密,需先在页面清除旧值并重新填写
- 检测项趋势图表友好提示正常 ✅
- display_names.py 已补全缺失 KEY(移除 BACKUP_*/FDFS_* 部分 KEY)✅
- 23_mysql_depth.sh / 25_redis_depth.sh 已重构为 output_result 格式 ✅
- 46_security_deep.sh 安全合规深度检测模块 ✅
- 39_middleware_conn.sh 中间件连接检测模块 ✅
- 50_system_profile.sh 系统类型识别模块 ✅
- 51_service_check.sh 平台服务检测模块 ✅
- 52_config_ip_check.sh 配置IP检测模块 ✅
- 53_config_console_check.sh Console配置检测模块 ✅
- 54_file_permission_check.sh 文件权限检测模块 ✅
- 55_cron_expected.sh 定时任务预期检测模块 ✅
- 56_fastdfs_check.sh FastDFS功能验证检测模块 ✅(已重构,移除超时功能测试)
- 57_android_check.sh Android设备检测模块 ✅
- ~~58_data_backup_check.sh~~ ❌ 已移除
- 59_log_export_check.sh 配置日志导出检测模块 ✅
- 60_repair_capability_check.sh 修复能力检测模块 ✅
- full 套件 42 个模块(原 30 + 新增 12)✅
- 218 个单元测试全绿 ✅
- **已部署到 5.60** ✅(阶段一至七全部部署)
- **5.44 实际运行验证通过**(阶段一至五,full 套件,10 个新模块全部正常)✅
- 状态等级误判已修复(LEVEL KEY 对齐 + 状态词映射兜底)✅
- 中间件端口检测逻辑已修复(服务 ping 优先,不依赖容器内 ss)✅
- 5.44 目标凭据已配置(MySQL/Redis 密码加密注入)✅
- **移动端响应式优化完成**(9 个页面全部适配)✅
- **移动端响应式深度优化完成**(新增 480px 断点 + 修正溢出问题)✅
- **报告对比功能完成**(对比服务 + API + 页面 + 导出)✅
- **异常项趋势告警完成**(连续异常检测 + 告警通知 + 配置页)✅
- **导出 PDF/Excel 格式完成**(Excel openpyxl + PDF weasyprint/HTML降级)✅
--- ---
...@@ -771,28 +783,15 @@ ...@@ -771,28 +783,15 @@
| 优先级 | 任务 | 说明 | | 优先级 | 任务 | 说明 |
|--------|------|------| |--------|------|------|
| ~~P1~~ | ~~Web 界面验证实际运行~~ | ✅ 已完成(5.44 full 套件检测通过) | | ~~P1~~ | ~~排查定时任务巡检执行失败~~ | ✅ 已完成 — 根因是 RLock 死锁 + 凭据解密失败,已彻底修复 |
| ~~P1~~ | ~~统计页面验证~~ | ✅ 已完成 | | ~~P1~~ | ~~验证 9.89 巡检~~ | ✅ 已完成 — 快速巡检 74 项正常执行 |
| ~~P2~~ | ~~继续移植 P2 优先级模块~~ | ✅ 已完成 | | ~~P1~~ | ~~固定 MONITOR_ENC_KEY~~ | ✅ 已完成 — 写入 .env,避免重建后凭据解密失败 |
| ~~P3~~ | ~~继续移植 P3 优先级模块~~ | ✅ 已完成 | | ~~P1~~ | ~~报告自动清理~~ | ✅ 已完成 — 巡检完成后自动清理过期报告(保留 14 天) |
| ~~P1~~ | ~~巡检防重复触发优化~~ | ✅ 已完成 | | ~~P1~~ | ~~钉钉通知修复~~ | ✅ 已完成 — 通知配置页面恢复正常,secret 已重新加密 |
| ~~P1~~ | ~~数据备份检测超时修复~~ | ❌ 已移除该模块 | | ~~P1~~ | ~~通知内容增强~~ | ✅ 已完成 — 钉钉消息包含巡检摘要 + 异常项 + 报告链接 |
| ~~P1~~ | ~~合并 troubleshoot-ai-assistant 分支到 master~~ | ❌ 不合并,长期独立分支维护 | | ~~P1~~ | ~~报告缺失兜底告警~~ | ✅ 已完成 — 每天 09:30 检测缺失报告并通知 |
| ~~P2~~ | ~~在 5.44 实际运行验证新模块~~ | ✅ 已完成(10 个新模块全部正常) | | **P2** | **测试 9.89 全量巡检** | 手动触发 9.89 full 套件,验证全部 42 个模块 |
| ~~P1~~ | ~~移动端响应式优化~~ | ✅ 已完成(9 个页面全部适配) |
| ~~P1~~ | ~~移动端响应式深度优化~~ | ✅ 已完成(新增 480px 断点 + 修正溢出) |
| ~~P1~~ | ~~报告对比功能~~ | ✅ 已完成(阶段九) |
| ~~P1~~ | ~~异常项趋势告警~~ | ✅ 已完成(阶段九) |
| ~~P2~~ | ~~导出 PDF/Excel 格式~~ | ✅ 已完成(阶段九) |
| 持续 | 更新 HANDOFF_服务监测文档 | 每次会话结束前更新进度 | | 持续 | 更新 HANDOFF_服务监测文档 | 每次会话结束前更新进度 |
| **P1** | **验证 9.89 巡检** | 添加 9.89 目标(openkylin:Ubains@123),运行全量巡检,验证 Docker 容器检测 |
| **P2** | **验证定时任务执行** | 明天 08:30/09:00 检查定时任务是否自动执行 |
| **P3** | **重新配置通知凭据** | 进入通知配置页重新填写钉钉 secret |
| **P4** | **固定 MONITOR_ENC_KEY** | 在 docker-compose.yml 中设置固定值 |
| **P1** | **验证 9.89 巡检** | 在目标管理添加 9.89(openkylin:Ubains@123),运行全量巡检,验证 Docker 容器检测是否正常显示 12 个容器 |
| **P2** | **验证定时任务执行** | 明天 08:30/09:00 检查定时任务是否自动执行,巡检报告是否生成 |
| **P3** | **重新配置通知凭据** | 进入通知配置页面重新填写钉钉 secret(重建后加密密钥变更) |
| **P4** | **固定 MONITOR_ENC_KEY** | 在 docker-compose.yml 中设置固定值,避免重建后凭据解密失败 |
--- ---
...@@ -1006,12 +1005,83 @@ sudo cp /data/.../搜索索引.json /opt/troubleshoot/data/ # 复制正确的 ...@@ -1006,12 +1005,83 @@ sudo cp /data/.../搜索索引.json /opt/troubleshoot/data/ # 复制正确的
**避免方法**:检测要具体到命令本身。正确逻辑:先测 `docker ps`,失败再测 `sudo -n docker ps` **避免方法**:检测要具体到命令本身。正确逻辑:先测 `docker ps`,失败再测 `sudo -n docker ps`
### 坑 17:定时任务 end_date 过期导致不触发
**坑**`schedules.json` 中 5.44 定时任务配置了 `end_date: 2026-07-22`,8 月 5 日任务已过期。APScheduler 在注册时会设置 `trigger.end_date`,过期任务不会触发。
**避免方法**
- 创建定时任务时,如果不想要失效日期,设置为 `null` 而不是设置一个短期日期
- 部署后验证:用 `cat schedules.json` 确认 end_date 合理
### 坑 18:service_monitor 日志不在 app.log 中
**坑**`schedule_service.py``runner_service.py` 等使用 `logging.getLogger("service_monitor.xxx")`,这个 logger 不在 `troubleshoot` 命名空间下,日志不会输出到 app.log。导致定时任务执行过程完全不可追踪。
**原因**:项目日志系统通过 `utils/logger.py``get_logger()` 初始化根 logger(`troubleshoot`),子 logger 必须以 `troubleshoot.` 为前缀才能继承 handler。
**避免方法**
- 所有 service 模块使用 `from utils.logger import get_logger; logger = get_logger("service_monitor.xxx")`
- 或者改为 `logging.getLogger("troubleshoot.service_monitor.xxx")`
### 坑 19:Docker COPY 文件需重建镜像
**坑**:代码文件在 Docker 构建时 `COPY` 到容器内,`docker compose restart` 不会更新容器内代码。修改代码后必须 `docker compose up -d --build` 重建镜像。
**原因**:docker compose restart 只是重启容器,不会重新构建镜像。
**避免方法**
```bash
# 代码更新后必须重建镜像
sudo docker compose up -d --build
# 或:先 down 再 up --build
sudo docker compose down && sudo docker compose up -d --build
```
### 坑 20:_schedules_lock 死锁(致命 Bug)
**坑**`_update_current_status()` 持有 `_schedules_lock` 后调用 `_save_schedules()` 又获取同一个 `threading.Lock()`。Python 的 `Lock()` 不可重入,同一线程重复获取 → 死锁!定时任务触发后 forever 卡在状态更新处。
**现象**:APScheduler 日志显示"触发成功",但 `run_inspection_sync()` 内部日志完全没有输出,状态永远不更新。
**避免方法**:所有可能被嵌套调用的锁必须使用 `threading.RLock()`(可重入锁)。写完 `_save_schedules` 后检查所有调用它的函数是否已经持有锁。
### 坑 21:加密密钥未固定导致凭据解密失败
**坑**`.env``MONITOR_ENC_KEY=` 为空,容器重启时 Fernet 随机生成新密钥。旧密文(targets.json 中的 SSH 密码、notifications.json 中的钉钉 secret)无法解密,导致巡检在 `make_executor()`/`resolve_credentials()` 阶段静默失败。
**现象**:后台线程异常被吞掉,日志中看不到任何错误,只有通过 `python -c 'import ...'` 直接调用才能看到 `ValueError: 凭据解密失败,密钥不匹配`
**避免方法**
-`.env` 中设置固定的 `MONITOR_ENC_KEY``cryptography.fernet.Fernet.generate_key()` 生成)
- 代码部署时检查 `.env` 中是否已配置该变量
- 所有 `decrypt_password()` 调用要确保异常被记录到日志而非静默吞掉
### 坑 22:SFTP 上传用 sudo 创建目录导致权限问题
**坑**`use_sudo=True` 时,`setup()` 通过 `sudo bash -c 'mkdir -p ...'` 创建工作目录,目录属于 root。后续 SFTP 以普通用户身份上传文件 → Permission denied。
**避免方法**:SFTP 上传前的工作目录创建**不能用 sudo**。setup() 中直接调用 `ssh.exec_command("mkdir -p ...")` 而非 `_exec()`(后者会自动加 sudo 前缀)。
### 坑 23:workdir_base 路径拼接错误
**坑**`workdir_base="/home/openkylin"` 时,`f"{base}_{run_id}"` 拼接成 `/home/openkylin_test_xxx` 而非 `/home/openkylin/check_modules_xxx`
**避免方法**:检测 workdir_base 是否包含 `/`,如果是完整路径则追加 `/check_modules_<run_id>` 子目录。
### 坑 24:后台线程异常被静默吞掉
**坑**`_run_job_body()` 在后台线程中调用 `run_inspection_sync()`,当凭据解密失败抛出异常时,虽然在 `try/except Exception as e` 中(按理由应该被捕获),但实际上因为 `_update_current_status("running")` 在内部调用了 `_save_schedules()` 导致**死锁卡住**,异常永远不会被抛到 try/except。
**避免方法**:关键路径的状态更新要在启动后台耗时任务**之前**执行,避免锁竞争。或者状态更新不持有锁去调用其他也可能获取锁的函数。
--- ---
## 6. Git 提交记录 ## 6. Git 提交记录
| 日期 | Commit | 说明 | | 日期 | Commit | 说明 |
|------|--------|------| |------|--------|------|
| **2026-08-12** | - | **feat(monitor): 报告缺失兜底告警(阶段十四,待提交)** |
| **2026-08-05** | - | **fix(monitor): 定时任务死锁修复 + 9.89 麒麟系统适配 + 加密密钥固定(阶段十二,待提交)** |
| **2026-08-05** | `65b25c4d` | **feat(monitor): SSH sudo 自动检测 + Docker 权限适配** | | **2026-08-05** | `65b25c4d` | **feat(monitor): SSH sudo 自动检测 + Docker 权限适配** |
| 2026-07-24 | `3cb1cf62` | fix(service-monitor): 修复定时任务并发执行导致 run_id 冲突 | | 2026-07-24 | `3cb1cf62` | fix(service-monitor): 修复定时任务并发执行导致 run_id 冲突 |
| 2026-07-23 | `7b0e7dcd` | feat(service-monitor): 导出 PDF/Excel 格式 | | 2026-07-23 | `7b0e7dcd` | feat(service-monitor): 导出 PDF/Excel 格式 |
...@@ -1156,6 +1226,63 @@ feat(service-monitor): 新增安全合规/中间件检测模块并修复状态 ...@@ -1156,6 +1226,63 @@ feat(service-monitor): 新增安全合规/中间件检测模块并修复状态
| `/opt/troubleshoot/data/notifications.json` | 清除无效加密字段 | | `/opt/troubleshoot/data/notifications.json` | 清除无效加密字段 |
| `systemd` | 禁用 troubleshoot 服务,统一用 Docker 容器 | | `systemd` | 禁用 troubleshoot 服务,统一用 Docker 容器 |
### 本次修改文件(阶段十一:定时任务调度器日志修复 + 任务触发验证)
| 文件 | 改动 |
|------|------|
| `service_monitor/services/schedule_service.py` | Logger 改用 `get_logger()`;添加 APScheduler 事件监听(JOB_EXECUTED/ERROR/MISSED);添加详细调试日志(调度器启动、任务注册、触发、执行全过程) |
| `service_monitor/services/runner_service.py` | Logger 改用 `get_logger()``run_inspection_sync()` 添加详细调试日志(执行器创建、SSH 连通、模块执行、报告保存全过程);巡检完成后自动调用 `cleanup_expired()` 清理过期报告 |
| `HANDOFF_服务监测.md` | 更新阶段十一/十二/十三进度 |
### 本次修改文件(阶段十二:根因排查彻底解决)
| 文件 | 改动 |
|------|------|
| `service_monitor/services/schedule_service.py` | `_schedules_lock``Lock()` 改为 `RLock()`,解除死锁 |
| `service_monitor/utils/executor.py` | `_remote_workdir()` 修复路径拼接(含 `/` 时追加 `/check_modules_<run_id>` 子目录);`setup()` 改用用户权限创建目录(直接 `ssh.exec_command` 而非 `_exec`);`_upload_file()` 自动创建父目录;SSHExecutor 新增 `workdir_base` 参数 |
| `service_monitor/services/target_service.py` | `make_executor()` 传递 `workdir_base``create_target()`/`update_target()`/`_build_view()` 支持 `workdir_base` 字段 |
| `templates/service_monitor/targets.html` | 前端新增"工作目录"配置项(`f-workdir-base` 输入框) |
| `.env` | `MONITOR_ENC_KEY` 设置为固定值 `Dy_CMi2ugIPjst38xfuqMbTpqXIzjdybJneu5xSsARs=` |
| `service_monitor/data/notifications.json` | 清除加密的钉钉 secret(旧密钥加密,新密钥无法解密) |
| `service_monitor/data/targets.json` | 清除所有加密的 `password_enc``credential_overrides`,重新配置 |
**5.60 配置变更**
- `.env` 文件写入固定 `MONITOR_ENC_KEY`
- 9.89 目标配置:`use_sudo=True` + `workdir_base=/home/openkylin`
- 5.44 目标配置:重新设置 SSH 密码(root/Ubains@123)和 MySQ/Redis 密码
### 本次修改文件(阶段十三:报告清理 + 通知修复 + 通知内容增强)
| 文件 | 改动 |
|------|------|
| `service_monitor/services/runner_service.py` | 巡检完成后调用 `report_service.cleanup_expired()` 清理过期报告 |
| `service_monitor/services/notification_service.py` | 钉钉消息增强:增加执行时间、目标类型、总项数行;调整 Markdown 布局 |
**当前通知消息示例**
```
✅ **【巡检报告】新统一平台5.44**
📊 **汇总:** 正常 505 / 警告 8 / 严重 12
🕐 **时间:** 2026-08-06 09:11:37
🎯 **目标:** 新统一平台5.44 | full巡检
📊 总项数:525
(异常项如有则展示,最多5严重+3警告)
📎 [查看完整报告](链接)
```
### 本次修改文件(阶段十四:报告缺失兜底告警)
| 文件 | 改动 |
|------|------|
| `service_monitor/services/notification_service.py` | 新增 `report_missing` 配置结构 + `send_missing_report_notification()` 发送函数(邮件/钉钉/企微 3 渠道) |
| `service_monitor/services/report_service.py` | 新增 `check_missing_reports()` 检测函数(遍历目标,比较最后报告时间) |
| `service_monitor/services/schedule_service.py` | 新增每天 09:30 定时任务 `check_missing_reports_job()` |
| `service_monitor/routes.py` | 新增 `GET /api/service-monitor/notification/check-missing-reports` API 端点 |
| `frontend/src/api/service-monitor/notification.ts` | 新增 `checkMissingReports()` API 客户端函数 |
| `frontend/src/views/service-monitor/Notification.vue` | 新增"报告缺失告警"配置区(阈值 + 渠道选择) |
| `frontend/src/views/service-monitor/Statistics.vue` | 新增报告缺失告警红色横幅 + 缺失目标列表 |
### 新增文档 ### 新增文档
| 文件 | 说明 | | 文件 | 说明 |
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论