Watcher 中的通知¶
https://blueprints.launchpad.net/watcher/+spec/watcher-notifications-ovo
为 Watcher 提供支持版本化的通知机制。
每当创建一个、更新或删除 Watcher 对象(即 目标、策略、审计模板、审计、行动计划、行动、效能指标 或 评分引擎),都应该自动发送一个版本化的通知(如果相关),以通知其他服务,从而允许在 Watcher 内部采用事件驱动的架构。此外,它还将赋予其他服务和/或第三方软件(例如监控解决方案或规则引擎)响应此类事件的能力。
此蓝图深受其他项目类似蓝图的启发
Ironic: notifications 蓝图
问题描述¶
目前,Watcher 在执行某些操作(例如对象更新)时不会发出任何通知。这些信息应该被通知,以便 Watcher 服务能够基于事件进行互操作,而不是依赖于数据轮询。此外,这些通知对于其他 OpenStack 服务也可能有用,特别是 Congress、Vitrage、Monasca 或 Aodh。
因此,此蓝图的目的是赋予 Watcher 发送版本化通知的能力。
用例¶
作为 OpenStack 开发者,我希望能够监听来自 Watcher 的通知。我还想知道通知的格式是什么。
作为 OpenStack 开发者,我希望能够检测并跟踪通知格式的更改。
作为 OpenStack 操作员,我希望能够禁用 Watcher 中的通知。
作为 OpenStack 操作员,我希望能够定义 Watcher 发送通知的主题。
项目优先级¶
N/A
提议的变更¶
基于 oslo.versionedobjects 库,目标是创建版本化对象,稍后将这些对象序列化并作为通知的有效负载发送,每个对象都能够保存一个版本号,以便在添加新字段时实现向后兼容性。
所有通知的基本结构将与 Nova 中 versioned-notification-api 蓝图 中使用的结构相同,即:
{
"priority": "INFO",
"event_type": "audit.update",
"timestamp": "2016-10-07 09:31:10.895274",
"publisher_id": "infra-optim:localhost",
"message_id": "a13cb7a6-8fae-4e20-8fc8-1c4e851fa6f5",
"payload": {
// [...]
}
}
为了发送版本化通知,我们将使用 oslo.messaging 库,这是一个标准的 OpenStack 库。Watcher 已经使用它来监听其他项目(例如 Nova)发出的通知,oslo.messaging 将帮助我们声明一个 notifier,允许我们 配置所有通知将发送到的主题。
备选方案¶
与使用 oslo.versionedobjects 相比,我们可以定义通知的有效负载,而无需任何版本化支持。
数据模型影响¶
将定义以下基本对象
class NotificationPriorityType(Enum):
AUDIT = 'audit'
CRITICAL = 'critical'
DEBUG = 'debug'
INFO = 'info'
ERROR = 'error'
SAMPLE = 'sample'
WARN = 'warn'
ALL = (AUDIT, CRITICAL, DEBUG, INFO, ERROR, SAMPLE, WARN)
class NotificationPhase(BaseWatcherEnum):
START = 'start'
END = 'end'
ERROR = 'error'
ALL = (START, END, ERROR)
class NotificationAction(BaseWatcherEnum):
CREATE = 'create'
UPDATE = 'update'
EXCEPTION = 'exception'
DELETE = 'delete'
ALL = (CREATE, UPDATE, EXCEPTION, DELETE)
class NotificationPriorityField(BaseEnumField):
AUTO_TYPE = NotificationPriority()
class NotificationPhaseField(BaseEnumField):
AUTO_TYPE = NotificationPhase()
class NotificationActionField(BaseEnumField):
AUTO_TYPE = NotificationAction()
@base.WatcherObjectRegistry.register_notification
class EventType(NotificationObject):
VERSION = '1.0'
fields = {
'object': fields.StringField(nullable=False),
'action': fields.NotificationActionField(nullable=False),
'phase': fields.NotificationPhaseField(nullable=True),
}
@base.WatcherObjectRegistry.register_if(False)
class NotificationBase(NotificationObject):
VERSION = '1.0'
fields = {
'priority': fields.NotificationPriorityField(),
'event_type': fields.ObjectField('EventType'),
'publisher': fields.ObjectField('NotificationPublisher'),
}
def emit(self, context):
"""Send the notification."""
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
无,尽管此蓝图引入了实现任何通知所需的构建块。
其他最终用户影响¶
无。
性能影响¶
启用后,每次发生触发通知的事件时,都会调用发送通知的代码。这对于 Watcher 本身来说问题不大,但应考虑所使用的消息总线上的负载。
其他部署者影响¶
将添加以下配置选项
将添加一个
notification_level字符串参数,以指示发送通知的最低优先级级别。可用选项将是DEBUG、INFO、WARN、ERROR或None以禁用通知。INFO将是默认值。
请注意,来自 oslo.messaging 的一些现有配置选项,这些选项自动生成到 watcher.conf.sample 配置样本中,现在将被考虑在内。有关更多信息,请参阅 oslo.messaging 配置选项 文档。
开发人员影响¶
开发人员应遵守适当的版本控制指南,并在创建新通知时使用通知基类。
实现¶
负责人¶
- 主要负责人
vincent-francoise
工作项¶
实现 数据模型影响 中呈现的所有基本对象
添加新的 sphinx 指令,该指令将通过提供通知示例来帮助记录 Watcher 通知。
依赖项¶
测试¶
应添加单元测试以确定新实现的通知的良好行为。
文档影响¶
在 Watcher 中创建一个新的文档部分,该部分将自动公开所有已实现的通知,并提供完整的通知示例,供尝试使用它们的开发人员作为参考。
参考资料¶
无。