ceilometery源码分析之:ceilometer-agent-computer

ceilometer-agent-computer

Ceilometer Compute Agent服务组件主要用来收集计算节点上的虚拟机实例的监控数据,在每一个计算节点上都要运行这个服务组件。该agent通过Stevedore(Python深入:stevedore简介)管理了一组pollster插件,分别用来获取计算节点上虚拟机的CPU、Memory、Disk IO、Network IO、Instance这些信息,这些信息大部分是通过调用Hypervisor的API来获取的,需要定期Poll轮询收集信息。

[toc]

注册插件

Pollster插件就是指各项采集指标的具体python实现文件,开发者每完成一个采集指标的插件实现,都需要在入口文件entry_points.txt找到命名空间” ceilometer.poll.compute”并注册,Agent借助Stevedore会将所有插件在启动时加载。
/usr/lib/python2.7/site-packages/ceilometer-2015.1.0-py2.7.egg-info/entry_points.txt

[ceilometer.poll.compute]
compute.node.disk.read.bytes = ceilometer.compute.pollsters.disk:NodeReadBytesPollster
disk.read.bytes = ceilometer.compute.pollsters.disk:ReadBytesPollster
network.outgoing.bytes.rate = ceilometer.compute.pollsters.net:OutgoingBytesRatePollster
compute.node.network.outgoing.bytes = ceilometer.compute.pollsters.net:NodeOutgoingBytesPollster
disk.write.bytes = ceilometer.compute.pollsters.disk:WriteBytesPollster
disk.capacity = ceilometer.compute.pollsters.disk:CapacityPollster
disk.total.size = ceilometer.compute.pollsters.disk:DiskTotalSizePollster
disk.usage = ceilometer.compute.pollsters.disk:PhysicalPollster
disk.read.bytes.rate = ceilometer.compute.pollsters.disk:ReadBytesRatePollster
cpu_util = ceilometer.compute.pollsters.cpu:CPUUtilPollster
network.incoming.bytes.rate = ceilometer.compute.pollsters.net:IncomingBytesRatePollster
memory = ceilometer.compute.pollsters.memory:MemoryPollster
disk.write.bytes.rate = ceilometer.compute.pollsters.disk:WriteBytesRatePollster
memory.usage = ceilometer.compute.pollsters.memory:MemoryUsagePollster
compute.node.network.incoming.bytes = ceilometer.compute.pollsters.net:NodeIncomingBytesPollster
network.outgoing.bytes = ceilometer.compute.pollsters.net:OutgoingBytesPollster
network.incoming.bytes = ceilometer.compute.pollsters.net:IncomingBytesPollster
compute.node.disk.write.bytes = ceilometer.compute.pollsters.disk:NodeWriteBytesPollster
disk.allocation = ceilometer.compute.pollsters.disk:AllocationPollster
compute.node.network.bandwidth = ceilometer.compute.pollsters.net:NodeBandwidthPollster
vcpus = ceilometer.compute.pollsters.cpu:VCPUSPollster
cpu = ceilometer.compute.pollsters.cpu:CPUPollster

初始化操作

服务的初始化操作主要实现了以下内容的操作:

  • 先根据指定参数获取agent的命名空间ceilometer.poll.compute,然后获取与ceilometer.poll.compute相匹配的所有插件,并加载;ceilometer.poll.compute所指定的插件描述了如何获取收集所监控的虚拟机实例相关的监控采样数据;
  • 根据指定参数获取命名空间ceilometer.discover,获取与ceilometer.discover相匹配的所有插件,并加载;ceilometer.discover所指定的插件描述了如何发现主机上的监控的虚拟机:
ceilometer.discover = 
    local_instances = ceilometer.compute.discovery:InstanceDiscovery
  • 获取管理员操作的上下文环境类的初始化对象;
  • 建立线程池,用于后续服务中若干操作的运行;
  • 加载命名空间ceilometer.compute.virt,描述了获取虚拟机实例的信息(实例数据,CPU数据,网卡数据和磁盘数据等)的方式;

/usr/lib/python2.7/site-packages/ceilometer/agent/base.py:

class AgentManager(os_service.Service):

    def __init__(self, namespaces, pollster_list, group_prefix=None):
        super(AgentManager, self).__init__()

         """
        加载命名空间ceilometer.poll.compute的所有插件:
         """
        extensions = (self._extensions('poll', namespace).extensions
                      for namespace in namespaces)

        """
        加载命名空间所有插件ceilometer.discover:
        """
        self.discovery_manager = self._extensions('discover')

        """
        获取管理员操作的上下文环境类的初始化对象:
        """
        self.context = context.RequestContext('admin', 'admin', is_admin=True)

    def _extensions(category, agent_ns=None):
        """
        根据指定参数拼接出命名空间namespace,
        """
        namespace = ('ceilometer.%s.%s' % (category, agent_ns) if agent_ns else 'ceilometer.%s' % category)
        """
        获取与该namespace相匹配的所有插件,并加载;
        这时候的namespace就等于 ceilometer.poll.compute
        """
        return extension.ExtensionManager(
            namespace=namespace,
            invoke_on_load=True,
        )

启动操作

ceilometer-agent-central的启动操作实现以下任务:

  • 遍历配置文件pipeline.yaml,获取每个监控项的采样配置、数据的加工方式以及数据的发布方式;
  • 以采集周期为key创建定时任务列表,并将待采集任务添加到对应采集周期的定时任务列表中。例如创建600s的定时任务,并将“采集CPU指标并上报原始数据”和“采集CPU指标并上报加工后数据”都加入了600s的任务列表里。
    注意:因pipeline.yaml里的meter_source项的默认配置是"*",故entry_points.txt里定义的所有采集指标都会有对应一个采集并上报原始数据任务并加入600s的任务列表里。如果不想上报原始数据,则配置项应改为:"!*"
    /etc/ceilometer/pipeline.yaml:
sources:
     - name: meter_source
        interval: 600
        meters:
            - "*"
        sinks:
            - meter_sink

再来看启动流程:

class AgentManager(os_service.Service):
    def start(self):
        """
        读取pipeline.yaml
        """
        self.pipeline_manager = publish_pipeline.setup_pipeline()
         ……
        for interval, task in six.iteritems(self.setup_polling_tasks()):
            delay_time = (interval + delay_polling_time if delay_start
                          else delay_polling_time)
            self.tg.add_timer(interval,
                              self.interval_task,
                              initial_delay=delay_time,
                              task=task)

    def setup_polling_tasks(self):
        polling_tasks = {}
        """
        Self.extensions就是保存的从entry_points.txt里读取的采集指标插件
         任意一个pipeline和extensions组成一对,定义了采集项的周期,数据源,上报格
         式等,将此采集项加入到某个定时任务列表中,该定时任务的周期就是采集项的周期
        """
        for pipeline in self.pipeline_manager.pipelines:
            for pollster in self.extensions:
                if pipeline.support_meter(pollster.name):
                    polling_task = polling_tasks.get(pipeline.get_interval())
                    if not polling_task:
                        polling_task = self.create_polling_task()
                        polling_tasks[pipeline.get_interval()] = polling_task
                    polling_task.add(pollster, pipeline)

        return polling_tasks

定时任务创建后,之后的事情就是周期执行定时任务,获取数据并上报。
具体的单个polling_task的运行:

class AgentManager(os_service.Service):
    def poll_and_publish(self):
        """
        创建轮徇的任务;
        任务以一定时间间隔周期性地进行;

        遍历任务(通道),获取每个任务指定获取的监控项的采样数据;
        针对每个监控项的采样数据,实现发布监控项采样数据样本到消息队列;
        """
        """
        通过nova客户端访问nova数据库,获取本地主机上所有的虚拟机实例;
        ""
         cache = {}
         discovery_cache = {}

        """
        遍历pipeline里定义的所有sources
        ""
         for source_name in self.pollster_matches:
            with self.publishers[source_name] as publisher:
               """
               遍历每个source的meter项
               ""
                for pollster in self.pollster_matches[source_name]:
                    key = Resources.key(source_name, pollster)
                    """
                    get_samples:获取nova管理下虚拟机实例的某一监控项的采样数据
                    注:这些信息大部分是通过调用Hypervisor的API来获取的,Ceilometer提供了Libvirt的API和Hyper-V的API:
                    CPUPollster.get_samples
                    CPUUtilPollster.get_samples
                    _DiskRatesPollsterBase.get_samples
                    InstancePollster.get_samples
                    InstanceFlavorPollster.get_samples
                    MemoryUsagePollster.get_samples
                    """
                    try:
                        samples = list(pollster.obj.get_samples(
                            manager=self.manager,
                            cache=cache,
                            resources=polling_resources
                        )) 
                      """
                    实现发布监控项采样数据样本;
                    """
                    publisher(samples)

如何扩展采集项

参考:
openstack监控扩展

参考资料:

Ceilometer 中 meter 的流程(一)

Ceilometer 源码学习 - Polling Agent

openstack监控扩展

一個meter的旅行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。 声明:本博客欢迎...
    mengalong阅读 1,160评论 0 0
  • ceilometer的几个概念 ceilometer 主要有下面几个概念: meter 是ceilometer定义...
    爱吃土豆的程序猿阅读 3,390评论 0 5
  • 本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。 声明:本博客欢迎...
    mengalong阅读 5,293评论 0 3
  • Objectives 2012年Ceilometer创建的时候,目的只是为了提供基础设施为OpenStack项目收...
    黑加仑妞阅读 950评论 0 0
  • OSSIM架构与组成综述 一、背景 如果运维工程师手里没有高效的管理工具支持,就很难快速处理故障。市面上有很多运维...
    OSSIMCN阅读 1,410评论 0 1