通知调度器过滤器

https://blueprints.launchpad.net/oslo?searchtext=notification-dispatcher-filter

Oslo.messaging 缺乏过滤它发送到端点的通知的能力。本规范建议在将消息分发到端点之前启用过滤过程。

问题描述

目前,oslo.messaging 会盲目地将通知分发到所有已注册的端点。只有在端点接收到消息后,我们才能进行过滤并决定端点是否应该处理这些通知。可以在将消息分发到端点之前提前做出此决定,以避免将消息发送到将忽略它们的端点所带来的开销。

例如,在 Ceilometer 中,多个端点连接到通知监听器。每个端点可能只处理拾取到的通知的一个子集。我们目前在端点级别过滤是否继续处理通知,但这种过滤很容易在甚至将其分发到端点之前完成。

提议的变更

建议的解决方案是在调度器中添加一个 NotificationFilter。当 oslo.messaging 将消息分发到端点时,它将首先通过过滤器,并检查消息是否符合过滤器中定义的标准。可以使用正则表达式针对消息的所有一级属性进行过滤:context、publisher_id、event_type、metadata 和 payload。由于 context、metadata 和 payload 是字典值,因此可以为它们定义多个约束。

一个示例过滤器如下

filter =  NotificationFilter(
    publisher_id='^compute.*',
    context={'tenant_id': '^5f643cfc-664b-4c69-8000-ce2ed7b08216$',
             'roles': 'private'},
    event_type='^compute\.instance\..*',
    metadata={'timestamp': 'Aug'}.
    payload={'state': '^active$'})

备选方案

我们继续在端点级别进行过滤。

Impact on Existing APIs

无。

安全影响

无。

性能影响

没有,但它可以减少分发的负载。

Configuration Impact

无。

开发人员影响

开发者现在可以在定义端点时添加过滤器。

class NotificationEndpoint(object):
    filter = NotificationFilter(publisher_id='^compute.*')

Testing Impact

单元测试就足够了,因为该功能仅限于调度器。间接地说,在 Ceilometer 中实现时,将通过 tempest 进行测试。

实现

负责人

主要负责人

sileht

其他贡献者

gordc

里程碑

完成目标里程碑:kilo-1

工作项

  • 添加带有单元测试的调度器过滤器

  • 更改 Ceilometer 中的过滤器以使用新的过滤器。

孵化

无。

采用

Ceilometer,但似乎是其他监听器也会使用的通用功能。

oslo.messaging。

预计 API 稳定

无。

文档影响

无。

依赖项

无。

参考资料

代码审查:http://review.openstack.org/#/c/77886/

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode