Ceilometer的各个服务中,负责计量数据采集的服务组件有4个,分别是agent-notification、agent-central、agent-compute、agent-ipmi。其采集数据的方式各有不同,主要分为Poll和Push两种方式,如图5-2所示。Poll即轮询方式,主动采集数据,Push即通知方式,被动获取数据。
agent-notification服务采用Push方式被动获取数据,即通过监听OpenStack通知总线(Notification Bus)上的通知消息来获取数据。OpenStack通知总线即oslo-messaging的消息队列,oslo-messaging是OpenStack整体的消息队列框架,OpenStack中各个模块在执行了某种操作或者状态变化时都会推送通知信息到oslo-messaging消息框架。agent-notification通过访问这个消息队列服务框架,获取相关通知信息,并进一步转化为采样数据的格式。
图5-2 Ceilometer的数据采集及处理逻辑
agent-notification通过notification listener插件来实现监听,可以开发符合接口定义的新的notification listener插件来实现对新的通知消息的监听,以及将此通知消息转化成Ceilometer采样值。agent-notification服务的运行流程如下:
1)解析Pipeline配置文件得到Pipeline定义。
2)调用stevedore库,载入所有的notification listener插件。
3)对每一个notification listener插件通过oslo.messaging库构造其对应的oslo.messaging库的notification listener对象,并且启动此对象监听通知消息。
4)当通知总线上有某个notification listener插件所感兴趣的通知到达时,所对应的notification listener插件就会被agent-notification调用,根据此通知消息构造出采样值Sample,然后根据Pipeline中的定义将此采样值转换和发布出去。
目前,K版本的Ceilometer所处理的OpenStack各服务的通知消息如表5-2所示。
表5-2 Kilo版本的处理的服务消息
agent-central服务可以部署在任何节点上,通常部署在控制节点上,它用来和远程的各种不同的实体和服务进行通信,获取不同的测量值。agent-central主要通过调用各OpenStack服务的REST API来获取OpenStack服务的各种信息,以及通过SNMP来获取Hardware资源的信息,通过kwapi来收集设备能耗数据。
agent-compute服务需要部署在运行nova-compute服务的计算节点上,主要用来收集计算节点上的虚拟机实例的计量数据,在每一个计算节点上都要运行这个服务组件。agent-compute主要是用来和Hypervisor进行通信,通过调用Hypervisor的API来获取相关测量值,需要定期Poll轮询收集信息。到目前为止,Ceilometer支持的Hypervisor如下:
·KVM(Kernel-based Virtual Machine)
·QEMU(Quick Emulator)
·LXC(Linux Container)
·UML(User-mode Linux)
·Hyper-V
·XEN
·VMware vSphere
agent-ipmi服务需要部署在支持IPMI的计算节点上,该计算节点需要安装ipmitool工具。agent-ipmi服务通过ipmitool收集本机IPMI传感器(Sensor)的数据,以及Intel Node Manager的数据。
agent-central、agent-compute、agent-ipmi都属于Polling代理,Polling代理的作用是根据Pipeline的定义,周期性地调用不同的Pollster插件去轮询获得Pipeline中定义的测量值,再根据Pipeline的定义,对这些采样值进行转换和发布。Pollster插件是指符合特定接口标准的Python类,代理会调用这些Pollster插件来获得不同的测量数据。可以开发自己的Pollster插件来获取新的测量值。各种不同的Polling代理的运行流程基本类似。
1)调用stevedore库,获取属于本Agent的所有Pollster插件。
2)创建PartitionCoordinator类实例对象,加入一个partition group,并创建一个定时器用来周期性地发送心跳消息。
3)解析Pipeline配置文件得到Pipeline的定义,并根据解析的结果创建一个或多个不同的PollingTask和所对应的定时器。由于所有采样频率相同的Pipeline都会在同一个PollingTask里处理,所以每个PollingTask都由某个特定频率的定时器驱动,在某一个线程中被执行。
4)由定时器驱动的PollingTask会周期性地调用其所包含的各种Pollster,由这些Pollster获取测量数据,然后根据Pipeline的定义,把获取的测量取样值交给Transformer转换后,再由Publisher发布。
agent-notification、agent-central、agent-compute、agent-ipmi服务组件在启动的时候,通过stevedore的插件机制来加载采集项,包括每个采集项对应的执行程序。stevedore的插件配置利用了setuptools的entry_points,所以可以通过查看entry_points的配置信息来确定有哪些采集项。如果用户的程序打包完毕并发布到了Python的搜索路径中,那么需要通过Ceilometer的egg文件来查看,或者下载源码查看setup.cfg文件。部分采集项配置信息如下:
[entry_points]ceilometer.notification = magnetodb_table = ceilometer.key_value_storage.notifications:Table magnetodb_index_count = ceilometer.key_value_storage.notifications:Index instance = ceilometer.compute.notifications.instance:Instance instance_flavor = ceilometer.compute.notifications.instance:InstanceFlavor ...ceilometer.poll.compute = disk.read.requests = ceilometer.compute.pollsters.disk:ReadRequestsPollster disk.write.requests = ceilometer.compute.pollsters.disk:WriteRequestsPollster disk.read.bytes = ceilometer.compute.pollsters.disk:ReadBytesPollster disk.write.bytes = ceilometer.compute.pollsters.disk:WriteBytesPollster ...ceilometer.poll.ipmi = hardware.ipmi.node.power = ceilometer.ipmi.pollsters.node:PowerPollster hardware.ipmi.node.temperature = ceilometer.ipmi.pollsters.node:TemperaturePollster hardware.ipmi.temperature = ceilometer.ipmi.pollsters.sensor:TemperatureSensorPollster hardware.ipmi.voltage = ceilometer.ipmi.pollsters.sensor:VoltageSensorPollster ...ceilometer.poll.central = ip.floating = ceilometer.network.floatingip:FloatingIPPollster image = ceilometer.image.glance:ImagePollster image.size = ceilometer.image.glance:ImageSizePollster storage.containers.objects = ceilometer.objectstore.swift:ContainersObjectsPollster ......
其中,ceilometer.notification对应的是agent-notification组件的采集项,ceilometer.poll.compute对应的是agent-compute组件的采集项,ceilometer.poll.ipmi对应的是agent-ipmi组件的采集项,ceilometer.poll.central对应的是agent-central组件的采集项。