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

  • 相关阅读:
    C++中使用多线程
    hdu 4223 dp 求连续子序列的和的绝对值最小值
    hdu 1372 bfs 计算起点到终点的距离
    hdu 4217 线段树 依次取第几个最小值,求其sum
    心得
    hdu 1175 bfs 按要求进行搜索,是否能到达,抵消两个(相同)棋子
    hdu 4221 greed 注意范围 工作延期,使整个工作时间罚时最少的单个罚时最长的值
    hdu 2844 多重背包 多种硬币,每一种硬币有一点数量,看他能组成多少种钱
    uva LCDDisplay
    hdu 4218 模拟 根据一个圆点和半径画一个圆 注意半径要求
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6911299.html
Copyright © 2020-2023  润新知