基于 Cron 的持续审计¶
https://blueprints.launchpad.net/watcher/+spec/cron-based-continuous-audits
问题描述¶
Watcher 当前实现用户指定的时间间隔来运行持续审计。这可能会导致在 Watcher 服务宕机时发生冲突,因为下一次审计时间未存储在数据库中。使用时间间隔不是一个灵活或用户友好的解决方案,相反,我们应该使用像 cron 语法这样的行业标准,它提供了一种弹性的方式来调度和执行审计。
用例¶
作为管理员,我希望使用 cron 语法来调度审计执行。
作为管理员,我希望确保 Watcher 正确设置下一次审计执行时间。
提议的变更¶
Watcher API 已经有了 Audit 对象中的 ‘interval’ 属性,因此我们可以使用它来存储类似 cron 的格式。API 需要检查传入 interval 的类型,如果它是字符串类型,则 Watcher 使用 croniter 模块来设置下一次运行时间。第二个建议是为当前的 ‘interval’ 列提供持久性。为此,我们需要正确更新 next_run_time,因为它的值可能小于当前时间。在这种情况下,我们可以使用以下算法
delta = timedelta(seconds=
(interval - (current_time-old_next_run_time).seconds % interval))
next_run_time = current_time + delta
例如,Watcher 应该在上午 7:30 运行审计,但服务宕机,直到上午 9:00 才恢复。使用 interval 值为 3600,Watcher 应该将下一次运行时间设置为上午 9:30。
为了实现此规范,我们需要确保 Watcher 可以存储持续作业,并且它的服务(可能以 HA 模式工作)仅获取带有标签分配的作业。Blueprint background-jobs-ha 负责实现作业存储机制。
备选方案¶
继续使用已经提供的 interval。
每次维护模式后删除持续审计并创建新的审计。
数据模型影响¶
Audit 表的 interval 列的类型应更改为字符串类型。
必须向 Audit 表添加新的列 next_run_time。
REST API 影响¶
无
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Alexander Chadin <alexchadin>
工作项¶
将 next_run_time 列添加到 Audit 表。
使用 croniter 模块来支持 Watcher 中的类似 cron 的语法。
更新 python-watcherclient 以支持类似 cron 的语法。
添加逻辑来计算 next_run_time 字段的值。
依赖项¶
https://blueprints.launchpad.net/watcher/+spec/continuously-optimization https://blueprints.launchpad.net/watcher/+spec/background-jobs-ha
测试¶
应更新单元测试。
文档影响¶
更新文档以提及 cron 和 interval。
参考资料¶
无
历史¶
无