设为首页 收藏本站
查看: 903|回复: 0

[经验分享] <转>Openstack ceilometer 宿主机监控模块扩展

[复制链接]

尚未签到

发表于 2017-6-27 11:25:02 | 显示全部楼层 |阅读模式
  《Openstack ceilometer监控项扩展》(
http://eccp.csdb.cn/blog/?p=352 )主要介绍了对虚拟机监控项扩展, 比較简单。怎样在ceilometer框架基础上,添加对宿主机、服务等的监控?本文以宿主机监控为例,具体介绍扩展方法。

  首先,整体介绍Ceilometer採集监控数据到持久化存储的流程,在compute节点上通过pollster的轮询机制获取宿主机的各监控数据,通过publisher调用rpc将监控数据发送到消息队列。collector端依据约定的topic接收对应管道发送的数据。并调用storage接口 进行持久化存储,详细流程例如以下图所看到的。
DSC0000.jpg

  其次,在该框架下怎样扩展新的监控模块,顺其自然的想法即依次改动以上模块,其重点是配置文件的设置。须要定义发送端和接收端的topic、secrete和method才干将数据顺利发送到collector端进行存储。下面具体介绍各模块的改动方法。
  一、compute数据採集pollster模块
  该模块主要负责数据的採集,採集宿主机CPU、内存、网络等信息,封装成自己定义数据&#26684;式后通过publisher发送到消息队列,该部分与ceilometer监控项扩展相&#20284;。
  


1、在ceilometer/ceilometer/compute/plugin.py中定义宿主机获取数据的基类。

class ServerPollster(plugin.PollsterBase):
@abc.abstractmethod
def get_samples(self, manager, cache, instances):
  2、在ceilometer/ceilometer/compute下新建server_pollsters包。在该包下新建server_cpu.py、server_mem.py等。继承ServerPollster类实现get_samples方法,将获取的数据封装成定义的数据&#26684;式返回就可以。可參考虚拟机採集数据架构。


3、同监控项的扩展,在ceilometer/setup.cfg中添加监控项pollster的配置。最后全部改动完毕后。又一次安装ceilometer。
  二、发送数据publisher模块
  1、改动ceilometer/pipeline.yaml配置文件,配置发送和接收数据的方式。

-
  name: server_pipeline
  interval: 60
  counters:
    - &quot;server.cpu&quot;
    - &quot;server.mem&quot;
  transformers:
  publishers:
    - rpc://?
  target=record_server_data&meter_type=server
  当中,name为pipeline的名字;interval为轮询的时间间隔;counters为该pipeline的pollster名字;transformers若发送的数据在进行publisher之前须要进一步处理,可设置transformers进行转换。publishers指定发送数据到collector的方式,target指定collector端的接收方。依据meter_type获取rpc的topic、secret和method。


同一时候,须要设置ceilometer/ceilometer.conf文件,设置server的topic、secret、method信息。详细配置例如以下:

[publisher_rpc]
server_topic=server
server_secret=True
server_method=record_server_data
  2、因为添加了新的topic发送通道。所以须要对ceilometer/ceilometer/publisher/rpc.py做对应的改动。
  首先,须要改动初始化函数,读取pipeline和ceilometer配置文件信息。
  其次,改动publish_counters函数,因为pipeline文件会对全部的counters每隔10分钟轮询一次。ceilometer默认採用topic为metering。其数据封装&#26684;式同样。但因为新增不同监控模块的数据封装&#26684;式不同。所以须要分开处理,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.' &#43; v,
    )
  2、定义对应的target用于接收採集的数据,例如以下所看到的:

def record_server_data(self, context, data):
for dispatcher in self.dispatchers:
dispatcher.record_data(context, data, 'server')
  当中。最后一个參数指定本次发送过来的topic类型。在调用dispatch.record_data方法时。用于调用对应的存储数据的方法,进而使得数据持久化到不同的数据库表中。


3、dispatch也是在原基础上做了对应的调整。该调整依据当前数据接收的topic,调用不同的方法。进行数据库的存储,详细例如以下:

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的数据。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388574-1-1.html 上篇帖子: 使用openstack的虚拟机模版注意事项 下篇帖子: Openstack的mysql数据多主galera的错误
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表