Ceilometer插件采集数据原理及过程

本文详细探讨了OpenStack Ceilometer插件memory.resident的数据采集流程,从获取资源列表、调用AgentManager的discover方法、到内存占用数据的get_sample方法实现,再到数据如何入库和发送到消息队列,最后描述了数据如何最终存储的过程。
摘要由CSDN通过智能技术生成

本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。

声明:
本博客欢迎转发,但请注明出处,保留原作者信息
博客地址:孟阿龙的博客
所有内容为本人学习、研究、总结。如有雷同,实属荣幸


注:

  1. 本文以Openstack Q版本为准分析

目录

 

1. 概述

2. 相关定义

3. 代码逻辑

3.1 获取resources列表

3.2 AgentManager中discover方法的实现:

3.3 调用memory.resident插件的get_sample方法

3.4 插件memory.resident的get_sample方法的实现:

3.5 插件memory.resident的inspect方法

3.6 通过本插件的insperctor的inspect_method对应的方法获取指定虚拟机的监控数据

3.7 数据入库

3.7.1 调用agent的notifier的sample方法,将数据发送到消息队列

3.7.2 notifier的sample方法:

3.8 数据最终入库:


1. 概述

前边已经对ceilometer polling-agent 的整体框架进行了分析,本文将以memory.resident这个插件为例,分析单个插件采集数据的过程。

2. 相关定义

  1. memory.resident 插件定义如下:
memory.resident = ceilometer.compute.pollsters.instance_stats:MemoryResidentPollster
  1. polling.yaml 中定义如下,代表该插件为300s执行一次
---
sources:
    - name: some_pollsters
      interval: 300
      meters:
        - memory.resident

3. 代码逻辑

3.1 获取resources列表

代码入口:ceilometer.polling.manager.PollingTask#poll_and_notify

  1 for source_name, pollsters in iter_random(
  2         self.pollster_matches.items()):
  3     for pollster in iter_random(pollsters):
  4         key = Resources.key(source_name, pollster)
  5         candidate_res = list(
  6             self.resources[key].get(discovery_cache))
  7         if not candidate_res and pollster.obj.default_discovery:
  8             candidate_res = self.manager.discover(
  9                 [pollster.obj.default_discovery], discovery_cache)
  1. 在poll_and_notify函数的如上几行中,就是获取resources的过程
  2. 第4~6行,都是在cache中获取数据,假设没有cache,首次初始化的情况,就直接第8行
  3. 第8行,pollster.obj.default_discovery 是memory.resident这个插件对象中的default_discovery属性
    ceilometer.compute.pollsters.GenericComputePollster#default_discovery
    @property
    def default_discovery(self):
        return 'local_instances'
  1. 第8行这里调用self.manager.discover传入的参数为:
    • ['local_instance']
    • {}
  2. 进而去看self.manager.discover方法

3.2 AgentManager中discover方法的实现:

入口:ceilometer.polling.manager.AgentManager#discover

  1 discover(self, discovery=None, discovery_cache=None):
  2 resources = []
  3 discovery = discovery or []
  4 for url in discovery:
  5     if discovery_cache is not None and url in discovery_cache:
  6         resources.extend(discovery_cache[url])
  7         continue
  8     name, param = self._parse_discoverer(url)
  9     discoverer = self._discoverer(name)
 10     if discoverer:
 11         try:
 12             if discoverer.KEYSTONE_REQUIRED_FOR_SERVICE:
 13                 service_type = getattr(
 14                     self.conf.service_types,
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值