• <转>Openstack ceilometer 宿主机监控模块扩展


    《Openstack ceilometer监控项扩展》( http://eccp.csdb.cn/blog/?p=352 )主要介绍了对虚拟机监控项扩展, 比較简单。怎样在ceilometer框架基础上,添加对宿主机、服务等的监控?本文以宿主机监控为例,具体介绍扩展方法。

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

    监控模块添加流程

    其次,在该框架下怎样扩展新的监控模块,顺其自然的想法即依次改动以上模块,其重点是配置文件的设置。须要定义发送端和接收端的topic、secrete和method才干将数据顺利发送到collector端进行存储。下面具体介绍各模块的改动方法。

    一、compute数据採集pollster模块

    该模块主要负责数据的採集,採集宿主机CPU、内存、网络等信息,封装成自己定义数据格式后通过publisher发送到消息队列,该部分与ceilometer监控项扩展相似。


    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方法,将获取的数据封装成定义的数据格式返回就可以。可參考虚拟机採集数据架构。
    3、同监控项的扩展,在ceilometer/setup.cfg中添加监控项pollster的配置。最后全部改动完毕后。又一次安装ceilometer。

    二、发送数据publisher模块

    1、改动ceilometer/pipeline.yaml配置文件,配置发送和接收数据的方式。

    -
      name: server_pipeline
      interval: 60
      counters:
        - "server.cpu"
        - "server.mem"
      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。其数据封装格式同样。但因为新增不同监控模块的数据封装格式不同。所以须要分开处理,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')

    当中。最后一个參数指定本次发送过来的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的数据。

  • 相关阅读:
    原创:微信小程序页面跳转展示缓冲提示
    转发:微信小程序-template模板使用
    JS正则判断输入框是否仅仅含有汉字、字母和数字
    jQuery使用正则判断是否含有非法字符
    允许远程用户登录访问mysql的方法
    如何使php页面中不再出现NOTICE和DEPRECATED的错误提示
    原生php如何获取当前页面的url
    jQuery写缓存之:sessionStorage的运用,配合PHP将不同tab页的数据写入后台
    TP2.0或3.1 或者 3.2 下使用ajax+php做无刷新分页(转+自创)
    jquery中的replaceWith()和html()的区别
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6911299.html
Copyright © 2020-2023  润新知