messaging: notification dispatcher filter
Change-Id: I841d141cd20edc0db3b12215133b7fb520f1a4c2
This commit is contained in:
parent
c31a00a76b
commit
e817b89f20
186
specs/kilo/notification-dispatcher-filter.rst
Normal file
186
specs/kilo/notification-dispatcher-filter.rst
Normal file
@ -0,0 +1,186 @@
|
||||
..
|
||||
This template should be in ReSTructured text. For help with syntax,
|
||||
see http://sphinx-doc.org/rest.html
|
||||
|
||||
To test out your formatting, build the docs using tox, or see:
|
||||
http://rst.ninjs.org
|
||||
|
||||
The filename in the git repository should match the launchpad URL,
|
||||
for example a URL of
|
||||
https://blueprints.launchpad.net/oslo?searchtext=awesome-thing should be
|
||||
named awesome-thing.rst.
|
||||
|
||||
For specs targeted at a single project, please prefix the first line
|
||||
of your commit message with the name of the project. For example,
|
||||
if you're submitting a new feature for oslo.config, your git commit
|
||||
message should start something like: "config: My new feature".
|
||||
|
||||
Wrap text at 79 columns.
|
||||
|
||||
Do not delete any of the sections in this template. If you have
|
||||
nothing to say for a whole section, just write: None
|
||||
|
||||
If you would like to provide a diagram with your spec, ascii diagrams are
|
||||
required. http://asciiflow.com/ is a very nice tool to assist with making
|
||||
ascii diagrams. The reason for this is that the tool used to review specs is
|
||||
based purely on plain text. Plain text will allow review to proceed without
|
||||
having to look at additional files which can not be viewed in gerrit. It
|
||||
will also allow inline feedback on the diagram itself.
|
||||
|
||||
==============================
|
||||
Notification Dispatcher Filter
|
||||
==============================
|
||||
|
||||
https://blueprints.launchpad.net/oslo?searchtext=notification-dispatcher-filter
|
||||
|
||||
Oslo.messaging lacks the ability to filter out notifications it sends to
|
||||
endpoints. This spec proposes to enable filtering process before messages are
|
||||
dispatched to endpoints.
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Currently, oslo.messaging blindly dispatches notifications to all registered
|
||||
endpoints. It is after the endpoints receive the messages are we able to filter
|
||||
and decide whether the endpoint should process the notifications. This decision
|
||||
can be made earlier before it dispatches messages to the endpoints to avoid
|
||||
the overhead of sending messages to endpoints which will ignore them.
|
||||
|
||||
For example, in Ceilometer, multiple endpoints are connected to the
|
||||
notification listener. Each endpoint may only process a subset of the
|
||||
notifications that are picked up. It is at the endpoint level where we
|
||||
currently filter whether to continue processing the notification but this
|
||||
filtering can easily be done before it's even dispatched to the endpoint.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
The proposed solution is to add a NotificationFilter to the dispatcher. When
|
||||
oslo.messaging dispatches messages to the endpoints, it will first pass through
|
||||
the filter and check if the messages fits the criteria defined in filter.
|
||||
Messages can be filtered using regex against all first level attributes of a
|
||||
message: context, publisher_id, event_type, metadata, and payload. As context,
|
||||
metadata, and payload are dictionary values, multiple contraints can be
|
||||
defined for them.
|
||||
|
||||
An example filter is as follows:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
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$'})
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
We continue to filter at the endpoint level.
|
||||
|
||||
Impact on Existing APIs
|
||||
-----------------------
|
||||
|
||||
None.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None, but it does offer potential to reduce load dispatched.
|
||||
|
||||
Configuration Impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
Developer Impact
|
||||
----------------
|
||||
|
||||
Developers nowi have ability to add a filter when they defined Endpoints.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
class NotificationEndpoint(object):
|
||||
filter = NotificationFilter(publisher_id='^compute.*')
|
||||
|
||||
|
||||
Testing Impact
|
||||
--------------
|
||||
|
||||
Unit tests are sufficient as the functionality is limited to dispatcher.
|
||||
Indirectly, when implemented in Ceilometer, this will be tested via tempest.
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
sileht
|
||||
|
||||
Other contributors:
|
||||
gordc
|
||||
|
||||
Milestones
|
||||
----------
|
||||
|
||||
Target Milestone for completion: kilo-1
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
- Add filter to dispatcher with unit tests
|
||||
- change filters in Ceilometer to use new filters.
|
||||
|
||||
Incubation
|
||||
==========
|
||||
|
||||
None.
|
||||
|
||||
Adoption
|
||||
--------
|
||||
|
||||
Ceilometer but it seems like common functionality that other listeners
|
||||
would use.
|
||||
|
||||
Library
|
||||
-------
|
||||
|
||||
oslo.messaging.
|
||||
|
||||
Anticipated API Stabilization
|
||||
-----------------------------
|
||||
|
||||
None.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
None.
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
code review: http://review.openstack.org/#/c/77886/
|
||||
|
||||
|
||||
.. note::
|
||||
|
||||
This work is licensed under a Creative Commons Attribution 3.0
|
||||
Unported License.
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
Loading…
Reference in New Issue
Block a user