从Kafka读取警报,然后使用其配置的通知方法通知客户。
monasca-notification的Python项目详细描述
通知引擎
此引擎从Kafka读取警报,然后使用 配置的通知方法。多次通知并重试 引擎可以并行运行,每个可用的kafka分区最多运行一个引擎。 zookeeper用于在 新进程加入或离开工作集。
架构
通知引擎使用以下命令生成通知 步骤:
- 从卡夫卡读取警报,没有自动提交。- monasca_common.kafka.kafkaconsumer类
- 确定报警的通知类型。通过从mysql读取完成。-报警处理器类
- 发送通知。-通知处理器类
- 将成功的通知添加到已发送通知主题。-通知引擎类
- 将失败的通知添加到重试主题。-通知引擎类
- 提交到kafka的偏移量-kafkaconsumer类
通知引擎使用三个kafka主题:
- 报警主题:进入通知引擎的报警。
- 通知主题:已成功发送通知。
- 通知重试主题:失败的通知。
重试引擎与通知引擎并行运行,并给出 任何失败的通知 成功。
重试引擎使用以下步骤生成通知:
- 从kafka读取通知json数据,不需要自动提交。-Kafkaconsumer类
- 重新生成失败的通知。-retryengine类
- 发送通知。-通知处理器类
- 将成功的通知添加到已发送通知主题。-retryengine类
- 将未达到重试限制的失败通知添加回重试主题。- retryengine类
- 放弃已达到重试限制的失败通知。-retryengine类
- 提交到卡夫卡的偏移量。-Kafkaconsumer类
重试引擎使用两个kafka主题:
- 通知重试主题:需要重试的通知。
- 通知主题:已成功发送通知。
容错性
从报警主题读取时,不执行提交。承诺 只有在处理后才能完成。这样可以继续处理 即使有些通知可能很慢。如果发生 灾难性故障可以发送一些通知,但警报 尚未得到承认。这是一种可接受的故障模式, 两次发送通知总比一次都不发送好。
遇到重大错误时的一般过程是退出 允许其他进程重新协商对 卡夫卡分区。还假设通知引擎 将由进程管理器运行,如果出现 失败。这样,任何不容易恢复的错误都是 由服务重新启动和活动守护进程自动处理 切换到另一个实例。
虽然这应该涵盖所有错误,但存在报警或 可以处理一组报警并发送多个通知 时代。为了将这种风险降到最低,我们使用了许多技术:
- 所有通知类型都实现超时。
- 使用报警TTL。任何早于TTL的警报 处理。
操作
oslo.config用于处理配置选项。样品 配置文件etc/monasca/notification.conf.sample可以是 运行生成:
tox -e genconfig
使用默认配置文件位置运行服务 of/etc/monasca/notification.conf:
monasca-notification
要运行服务并显式指定配置文件:
monasca-notification --config-file /etc/monasca/monasca-notification.conf
监测
statsd被合并到守护进程中,并将所有统计信息发送到 由Monasca代理启动的StatSD服务器。默认主机和端口指向 localhost:8125。
- 计数器
- 从卡夫卡消费
- AlarmsFailedParse
- 警报无通知
- 通知已创建
- 通知sentstp
- 通知sentwebhook
- 通知sentpagerduty
- 通知发送失败
- 通知有效类型
- 警报完成
- 发表于《东京邮报》
- 计时器
- 配置时间
- 发送通知时间
未来考虑因素
需要更广泛的负载测试:
- How fast is the mysql db? How much load do we put on it. Initially I think it makes most sense to read notification details for each alarm but eventually I may want to cache that info.
- How expensive are commits to Kafka for every message we read? Should we commit every N messages?
- How efficient is the default Kafka consumer batch size?
- Currently we can get ~200 notifications per second per NotificationEngine instance using webhooks to a local http server. Is that fast enough?
- Are we putting too much load on Kafka at ~200 commits per second?