首先,总体介绍Ceilometer采集监控数据到持久化存储的流程,在compute节点上通过pollster的轮询机制获取宿主机的各监控数据,通过publisher调用rpc将监控数据发送到消息队列,collector端根据约定的topic接收相应管道发送的数据,并调用storage接口 进行持久化存储,具体流程如下图所示。
其次,在该框架下如何扩展新的监控模块,顺其自然的想法即依次修改以上模块,其重点是配置文件的设置,需要定义发送端和接收端的topic、secrete和method才能将数据顺利发送到collector端进行存储。以下详细介绍各模块的修改方法。
一、compute数据采集pollster模块
class ServerPollster(plugin.PollsterBase): @abc.abstractmethod def get_samples(self, manager, cache, instances):
讯享网
二、发送数据publisher模块
1、修改ceilometer/pipeline.yaml配置文件,配置发送和接收数据的方式。

2、由于增加了新的topic发送通道,所以需要对ceilometer/ceilometer/publisher/rpc.py做相应的修改。首先,需要修改初始化函数,读取pipeline和ceilometer配置文件信息。其次,修改publish_counters函数,由于pipeline文件会对所有的counters每隔10分钟轮询一次,ceilometer默认采用topic为metering,其数据封装格式相同。但由于新增不同监控模块的数据封装格式不同,所以需要分开处理,10分钟轮询时只对counter类型为sample的数据进行publish。具体如下:
讯享网if self.meter_type == 'metering': meters = [ meter_message_from_counter_beta( counter, self.topic_secret[self.meter_type], source) for counter in counters if type(counter) == sample.Sample ] else: meters = [ meter_message_from_counter_beta( counter, self.topic_secret[self.meter_type], source) for counter in counters ] topic = self.meter_type
三、接收数据collector模块
1、ceilometer/ceilometer/collector/service.py文件initialize_service_hook中定义worker用于接收rpc发送过来的数据,具体配置如下:
for k, v in cfg.CONF.publisher_rpc.iteritems(): if k.endswith('topic'): self.conn.create_worker( v, rpc_dispatcher.RpcDispatcher([self]), 'ceilometer.collector.' + v, )
2、定义相应的target用于接收采集的数据,如下所示:
讯享网def record_server_data(self, context, data): for dispatcher in self.dispatchers: dispatcher.record_data(context, data, 'server')
def record_data(self, context, data, meter_type): if not isinstance(data, list): data = [data] for meter in data: if self.secret_method[meter_type] and publisher_rpc.verify_signature(meter, self.secret_method[meter_type][0]): try: if meter.get('timestamp'): meter['timestamp'] = self.time_to_date(meter['timestamp']) method = getattr(self.storage_conn.__class__, self.secret_method[meter_type][1]) method(self.storage_conn, meter) except Exception as err: LOG.error('Failed to record metering data: %s', err) LOG.exception(err) else: LOG.warning( 'message signature invalid, discarding message: %r', meter)
四、持久化存储模块
1、由于新增宿主机数据模块的监测,需增一张数据库表,所以storage模块也需做相应的修改。首先,需要修改ceilometer/ceilometer/storage/base.py文件,增加接口:
讯享网@abc.abstractmethod def record_server_data(self, data):
2、在ceilometer/ceilometer/storage/impl_mongodb.py的Connection类中实现在接口。
3、设计对应的数据库表结构,在ceilometer/ceilometer/storage/sqlalchemy/models.py中设置model对应的Server类。
4、在ceilometer/ceilometer/storage/sqlalchemy/migrate_repo/versions/001_add_meter_table.py中定义对应的表。
以上配置完成后,source隔离环境重新安装ceilometer,重启服务,即可在mongodb数据库中查看到新增server表,表中存储对应counter的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/74480.html