一、简单介绍ceilometer
这里长话短说, ceilometer是用来采集openstack下面各种资源的在某一时刻的资源值,比如云硬盘的大小等。下面是官网现在的架构图
这里除了ceilometer的架构图,还有另外三个组件:
Panko 用来存储事件的, 后面用来实现cloudkitty事件秒级计费也是我的工作之一,目前实现来一部分,有时间单独在写一篇博文。
gnocchi是用来存储ceilometer的计量数据,之前的版本是存在mongo中, 不过随着计量数据的不断累计, 查询性能变得极低, 因此openstack后面推出来gnocchi项目,gnocchi的存储后端支持redis,file,ceph等等。这一块也是我负责,目前已经实现了, 有时间也可以写一篇文章。
Aodh 是用来告警的。
这里需要注意ceilometer 主要有两个agent:
一个是polling 主要是定时调用相应的openstack接口来获取计量数据,
一个是notification 主要是用来监听openstack的事件消息,然后转换成相应的计量数据,
两者的计量数据, 最后通过定义的pipeline,传递给gnocchi暴露出来的rest API ,后面由gnocchi来做聚合处理以及存储
下面来看一下,具体的官网的数据采集和处理转发的架构图
再来看一下数据的处理过程
这里,我觉得官方文档的架构图描述得非常好, 我就不在多说来。
二、源码分析说实话, 目测openstack估计是最大的python项目了,真的是一个庞然大物。第一次接触的时候,完全不知所措。不过看看就强一点了, 虽然有很多地方还是懵逼。看openstack下面的项目的话,其实有些文件很重要比如setup.py, 里面配置了项目的入口点。这篇文章,我主要分析polling这一块是如何实现的, 其他的地方类似。
ceilometer polling-agent启动的地方
# ceilometer/cmd/polling.py
1 def main():
2
conf = cfg.ConfigOpts()
3 conf.register_cli_opts(CLI_OPTS)
4
service.prepare_service(conf=conf)
5
sm = cotyledon.ServiceManager()
6
sm.add(create_polling_service, args=(conf,))
7 oslo_config_glue.setup(sm, conf)
8
sm.run()
# 前面几行是读取配置文件, 然后通过cotyledon这个库add一个polling的service,最后run 起来。 cotyledon这个库简单看了一下,可以用来启动进程任务
def create_polling_service(worker_id, conf):
return manager.AgentManager(worker_id,
conf,
conf.polling_namespaces,
conf.pollster_list)
# create_polling_service 返回了一个polling agent polling-namespaces的默认值为choices=['compute', 'central', 'ipmi'],