Watcher 中的通知

https://blueprints.launchpad.net/watcher/+spec/watcher-notifications-ovo

为 Watcher 提供支持版本化的通知机制。

每当创建一个、更新或删除 Watcher 对象(即 目标策略审计模板审计行动计划行动效能指标评分引擎),都应该自动发送一个版本化的通知(如果相关),以通知其他服务,从而允许在 Watcher 内部采用事件驱动的架构。此外,它还将赋予其他服务和/或第三方软件(例如监控解决方案或规则引擎)响应此类事件的能力。

此蓝图深受其他项目类似蓝图的启发

问题描述

目前,Watcher 在执行某些操作(例如对象更新)时不会发出任何通知。这些信息应该被通知,以便 Watcher 服务能够基于事件进行互操作,而不是依赖于数据轮询。此外,这些通知对于其他 OpenStack 服务也可能有用,特别是 CongressVitrageMonascaAodh

因此,此蓝图的目的是赋予 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 字符串参数,以指示发送通知的最低优先级级别。可用选项将是 DEBUGINFOWARNERRORNone 以禁用通知。INFO 将是默认值。

请注意,来自 oslo.messaging 的一些现有配置选项,这些选项自动生成到 watcher.conf.sample 配置样本中,现在将被考虑在内。有关更多信息,请参阅 oslo.messaging 配置选项 文档。

开发人员影响

开发人员应遵守适当的版本控制指南,并在创建新通知时使用通知基类。

实现

负责人

主要负责人

vincent-francoise

工作项

  • 实现 数据模型影响 中呈现的所有基本对象

  • 添加新的 sphinx 指令,该指令将通过提供通知示例来帮助记录 Watcher 通知。

依赖项

watcher-versioned-objects

测试

应添加单元测试以确定新实现的通知的良好行为。

文档影响

在 Watcher 中创建一个新的文档部分,该部分将自动公开所有已实现的通知,并提供完整的通知示例,供尝试使用它们的开发人员作为参考。

参考资料

无。