Notification代理通过Notification Listener插件来实现监听OpenStack各个服务推送到通知总线上的通知消息,然后把其感兴趣的通知消息转换成测量取样值Sample,交给Pipeline做进一步处理。Notification Listener插件运行在Notification代理上,用户可以通过开发符合接口定义的新的Notification Listener插件,来实现对新的通知消息的监听。
所有Notification Listener插件都必须是ceilometer.agent.plugin_base.NotificationBase抽象类的子类,需要实现如下接口:
@six.add_metaclass(abc.ABCMeta)class NotificationBase(PluginBase):@abc.abstractpropertydef event_types(self): """返回该插件的事件类型"""def get_targets(self, conf): """返回一个包含oslo.messaging.Target对象实例的列表"""@abc.abstractmethoddef process_notification(self, message): """返回取样值"""
Notification Listener插件需要实现3个接口,event_types、get_targets和process_notification。各个接口的作用如下。
1)event_types:需要返回一个事件类型列表,用来表明此Notification Listener插件对哪些类型的通知消息感兴趣。
2)get_targets:返回一个包含oslo.messaging.Target对象实例的列表,这些Target对象实例指明了需要监听的Notification Bus信息。get_targets接口的输入参数conf指向oslo.config.CONF对象,该对象包含了Ceilometer的配置信息。例如,监听Neutron服务通知消息的Notification Listener插件的get_targets方法实现如下:
OPTS = [ cfg.StrOpt('neutron_control_exchange', default='neutron', help="Exchange name for Neutron notifications.", deprecated_name='quantum_control_exchange'),]cfg.CONF.register_opts(OPTS)class NetworkNotificationBase(plugin_base.NotificationBase):@staticmethoddef get_targets(conf):return [oslo.messaging.Target(topic=topic, exchange=conf.neutron_control_exchange) for topic in conf.notification_topics]
3)process_notification:用来把消息通知的内容转化为一系列的测量取样值(ceilometer.sample.Sample对象),并返回给Notification Agent。Notification Agent再将这些Sample交由Pipeline进一步处理,消息通知的内容作为入参传入。
Notification Listener插件需要被注册在ceilometer.notification的namespace下,一般来说,每一种Listener的实现只返回一种测量值的Sample实例,并且使用sample.name的值作为此Listener插件的注册名称,即使用测量值的名称作为setup.cfg文件中Listener插件的注册名称。例如:
ceilometer.notification =memory = ceilometer.compute.notifications.instance:Memory disk_root_size = ceilometer.compute.notifications.instance:RootDiskSize cpu_frequency = ceilometer.compute.notifications.cpu:CpuFrequency