本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。
声明:
本博客欢迎转发,但请注明出处,保留原作者信息
博客地址:孟阿龙的博客
所有内容为本人学习、研究、总结。如有雷同,实属荣幸
注:
- 本文以Openstack Q版本为准分析
目录
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.1 调用agent的notifier的sample方法,将数据发送到消息队列
1. 概述
前边已经对ceilometer polling-agent 的整体框架进行了分析,本文将以memory.resident这个插件为例,分析单个插件采集数据的过程。
2. 相关定义
- memory.resident 插件定义如下:
memory.resident = ceilometer.compute.pollsters.instance_stats:MemoryResidentPollster
- 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)
- 在poll_and_notify函数的如上几行中,就是获取resources的过程
- 第4~6行,都是在cache中获取数据,假设没有cache,首次初始化的情况,就直接第8行
- 第8行,pollster.obj.default_discovery 是memory.resident这个插件对象中的default_discovery属性
ceilometer.compute.pollsters.GenericComputePollster#default_discovery
@property
def default_discovery(self):
return 'local_instances'
- 第8行这里调用self.manager.discover传入的参数为:
- ['local_instance']
- {}
- 进而去看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,