分享

ceilometer的数据采集机制入门

nettman 发表于 2015-1-4 19:27:43 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 5 76691
本帖最后由 nettman 于 2015-1-4 19:27 编辑

问题导读

1.ceilometer负责什么事情?
2.ceilometer 有哪些概念?
3.ceilometer 如何采集hardware?





ceilometer主要负责监控数据的采集,采集的项目包括虚拟机的性能数据,neutron-l3-router使用的网络带宽,glance&cinder&swift等租户使用信息,甚至是通过snmp采集物理机的信息,以及采集支持opendaylight的网络设备信息。
基本概念
ceilometer 主要有下面几个概念:
  • meter 是ceilometer定义的监控项,诸如内存占用,网络IO,磁盘IO等等
  • sample 是每个采集时间点上meter对应的值
  • statistics 一般是统计学上某个周期内,meter对应的值(平均值之类)
  • resource 是被监控的资源对象,这个可以是一台虚拟机,一台物理机或者一块云硬盘
  • alarm 是ceilometer的告警机制,你可以通过阈值或者组合条件告警,并设置告警时触发的action

采集机制

ceilometer的各个服务中,与采集相关的服务是ceilometer-collector、ceilometer-agent-central、ceilometer-agent-compute、ceilometer-agent-notification。我们可以通过下图了解一下他们之间的关系:


publisher1.png

agent-*服务负责采集信息,采集的信息可以通过三种方式publish出来,包括RPC、UDP、File。RPC是将采集的信息以payload方式发布到消息队列,collector服务通过监听对应的queue来收集这些信息,并保存到存储介质中;UDP通过socket创建一个UDP数据通道,然后collector通过bind这个socket来接收数据,并保存到存储介质中;File方式比较直接,就是将采集的数据以filelog的方式写入log文件中。


至于使用哪种方式publish,那么就要看你的pipline文件是如何配置的了,具体可以查看/etc/ceilometer/pipline.yaml中的publishers配置。

agent-*三个采集组件分别负责采集不同类型的信息,agent-notification负责收集各个组件推送到oslo-messaging的消息,oslo-messaging是openstack整体的消息队列框架,所有组件的消息队列都使用这个组件;agent-compute只负责收集虚拟机的CPU内存IO等信息,所以他需要安装在Hypervisor机器上;agent-central是通过各个组件API方式收集有用的信息;agent-notification只需监听AMQP中的queue即可收到信息,而agent-compute和agent-central都需要定期Poll轮询收集信息。看下图来了解一下:


agent2.png


信息通过agent-*采集并由collector汇总处理,最终需要持久化到存储介质中,ceilometer目前支持的存储包括mysql、DB2、HBase、mongoDB,从支持的数据库来看,监控数据持久化的压力还是相当大的。


storagemodel3.png


采集项

agent-*组件在启动时候,通过stevedore的插件机制来加载采集项,包括每个采集项对应的执行程序。stevedore的插件配置是利用了setuptools的entry_points,所以我们可以通过查看entry_points的配置信息,来确定有哪些采集项。如果你的程序打包完毕并发布到了python的搜索路径中,那么你需要查看ceilometer的egg文件来查看,或者你可以下载源码查看setup.cf文件,相关信息如下:
  1. [entry_points]
  2. ceilometer.notification =
  3.     instance = ceilometer.compute.notifications.instance:Instance
  4.     instance_flavor = ceilometer.compute.notifications.instance:InstanceFlavor
  5.     memory = ceilometer.compute.notifications.instance:Memory
  6.     ...
  7.     ...
  8. ceilometer.poll.compute =
  9.     disk.read.requests = ceilometer.compute.pollsters.disk:ReadRequestsPollster
  10.     cpu = ceilometer.compute.pollsters.cpu:CPUPollster
  11.     ...
  12.     ...
  13. ceilometer.poll.central =
  14.     image = ceilometer.image.glance:ImagePollster
  15.     storage.containers.objects = ceilometer.objectstore.swift:ContainersObjectsPollster
  16.     ...
  17.     ...
复制代码




ceilometer.notification 对应的是agent-notification组件,ceilometer.poll.compute对应的是agent-compute组件,ceilometer.poll.central对应的是agent-central组件。

采集neutron l3 router 的bandwidth

与ceilometer其他采集方式不同的是,bandwidth的采集是通过neutron-meter-agent收集,然后push到oslo-messaging,ceilometer-agent-notification通过监听消息队列来收取bandwidth信息,可以看一些官方的wiki(https://wiki.openstack.org/wiki/Neutron/Metering/Bandwidth)。

按照wiki上的描述,设置好rule,ceilometer就可以收集bandwidth信息了,router上的流量计算是利用了iptables的特性,iptables本身可以用于做流量统计,这里不清楚的去Google一下即可。

比如我们使用neutron-meter 设定了这样一组规则:
  1. $ neutron meter-label-rule-list
  2. +--------------------------------------+----------+-----------+------------------+
  3. | id                                   | excluded | direction | remote_ip_prefix |
  4. +--------------------------------------+----------+-----------+------------------+
  5. | d2f28556-7369-42a7-9a92-9f2a12e929ce | False    | egress    | 66.66.66.0/24    |
  6. | e6a3542d-596b-415a-ab96-90df211c027b | False    | ingress   | 66.66.66.0/24    |
  7. +--------------------------------------+----------+-----------+------------------+
复制代码




那么对应此规则建立的iptables规则如下:

  1. -A neutron-meter-r-d49bfb44-546 -d 66.66.66.0/24 -o qg-874a8e9b-4d -j neutron-meter-l-d49bfb44-546
  2. -A neutron-meter-r-d49bfb44-546 -d 66.66.66.0/24 -i qg-874a8e9b-4d -j neutron-meter-l-d49bfb44-546
复制代码



neutron-meter-agent 会在设定的间隔时间内去通过iptables统计流量,然后push到oslo-messaging:

  1. $ ip netns exec qrouter-94cca346-ea17-48fe-94fd-30004078e339 iptables -t filter -L neutron-meter-l-d49bfb44-546 -n -v -x -Z
  2. Chain neutron-meter-l-d49bfb44-546 (2 references)
  3.     pkts      bytes target     prot opt in     out     source               destination
  4.            0        0            all  --  *      *       0.0.0.0/0            0.0.0.0/0
复制代码



采集hardware

ceilometer除了可以收集openstack组件的相关信息,也可以收集诸如kwapi、hardware、opendaylight信息。kwapi是采集物理机能耗信息的项目,agent-central组件通过kwapi暴露的api来收集物理机的能耗信息;agent-central也可以通过snmp协议直接收集hardware的CPU、MEM、IO等信息;opendaylight是SDN解决方案的开源项目,opendaylight规范中包括暴露一个API接口来提供SDN内部的一些信息,agent-central正是通过这个API可以收集opendaylight组件的信息。

如果我们想扩展这些监控信息,需要对ceilometer增加一些额外的配置,但是这些配置原理都是一样的,我们这里以采集hardware信息为例。

首先需要在被监控的hardw上开启SNMP协议,比如我们要监控一台物理机host为icehouse-ncloud-compute-a1,系统为ubuntu,先安装snmp和snmpd包,然后修改配置文件:


  1. #开启监听端口和对应的ip
  2. agentAddress udp:161,udp6:[::1]:161
  3. #开启所有SNMP访问项
  4. view   systemonly  included   .1   80
复制代码



重启snmp服务,在ceilometer的pipline.yaml文件中加入如下(以采集hardware.memory为例),interval是poll的轮询间隔时间,可以按自家需求配置:

  1. - name: hardware_memory_source
  2.   interval: 1800
  3.   meters:
  4.     - "hardware.memory.*"
  5.   resources:
  6.     - snmp://icehouse-ncloud-compute-a1
  7.   sinks:
  8.     - meter_sink
复制代码


通过 ceilometer meter-list | grep hardware ,可以看到新增的监控项,如果要查看监控数据可以这样:

  1. $ ceilometer sample-list -m hardware.memory.total
  2. +----------------------------+-----------------------+-------+-------------+------+---------------------+
  3. | Resource ID                | Name                  | Type  | Volume      | Unit | Timestamp           |
  4. +----------------------------+-----------------------+-------+-------------+------+---------------------+
  5. | icehouse-ncloud-compute-a1 | hardware.memory.total | gauge | 131996840.0 | B    | 2014-05-21T03:07:40 |
  6. | icehouse-ncloud-compute-a1 | hardware.memory.total | gauge | 131996840.0 | B    | 2014-05-21T02:37:40 |
复制代码









加微信w3aboutyun,可拉入技术爱好者群

已有(5)人评论

跳转到指定楼层
cerberus 发表于 2015-1-7 09:00:36
本帖最后由 pig2 于 2015-1-7 11:33 编辑

版主,你好。请问下,我如果想要获取虚拟机内存使用率,需要额外配置吗。目前虚拟机我已经可以查询到cpu使用率,disk的I/O,network的I/O等,但是就是获取不到内存使用率。如下:图中的2个属性一直没有数据。目前可以在mangoDB中查询到的数据如下。

memory参数获取不到

memory参数获取不到



counter_name.png

回复

使用道具 举报

tntzbzc 发表于 2015-1-7 13:02:18
本帖最后由 tntzbzc 于 2015-1-7 13:07 编辑
cerberus 发表于 2015-1-7 09:00
版主,你好。请问下,我如果想要获取虚拟机内存使用率,需要额外配置吗。目前虚拟机我已经可以查询到cpu使 ...

现有虚拟机的监控项目,没有对内存的监控,有增加内存的方法。
下面内容可以参考:


这里介绍增加内存监控模块的方法,增加内存监控方法比较简单,主要在compute端增加获取数据的方式,然后修改配置文件,即可将数据持久化数据库中。详细步骤如下:

1、在 ceilometer/ceilometer/compute/pollsters目录下新建文件mem.py(名字自定义)。在该文件下定义MEMPollster类并实现get_samples方法:

class MEMPollster(plugin.ComputePollster):
    def get_samples(self, manager, cache, instance):
2、get_samples中获取内存数据的方式,可参考CPU获取数据的架构,在ceilometer/ceilometer/compute/virt/inspector.py 中定义返回数据的格式:

MEMStats = collections.namedtuple('MEMStats', ['total', 'free'])
获取内存方式多样,本文采用读取proc文件获取instance所在进程占用的内存大小,有时获取的数据比instance最大内存大,所以该方式对windows系统的虚机有一定的误差,仅作为示例参考。方法定义如下:

def inspect_mems(self, instance_name):
获取数据后,按sample数据结构返回即可。

3、设计完上述获取数据的方式后,并不能轮询到内存数据,还需要修改一些设置文件。

首先,修改ceilometer/setup.cfg文件,在该文件ceilometer.poll.compute下,增加

mem = ceilometer.compute.pollsters.mem:MEMPollster
其次,由于包冲突的问题,将ceilometer安装在隔离环境中,所以source隔离环境,重新安装ceilometer,以上配置才能生效。执行 python setup.py develop 命令即可。

4、重启ceilometer服务,进入mongodb的ceilometer数据库即可在meter表中查看mem的监控数据。

回复

使用道具 举报

cerberus 发表于 2015-1-8 13:36:20
tntzbzc 发表于 2015-1-7 13:02
本帖最后由 tntzbzc 于 2015-1-7 13:07 编辑

现有虚拟机的监控项目,没有对内存的监控,有增加内存的方 ...

thanks,我去试试看
回复

使用道具 举报

古月椒 发表于 2017-1-9 16:19:19
大神。。并不能找到setup.cfg文件。。。求大神告知一下详细路径。。我find都没有找到额。。是m版本的
回复

使用道具 举报

古月椒 发表于 2017-1-9 16:20:33
cerberus 发表于 2015-1-7 09:00
版主,你好。请问下,我如果想要获取虚拟机内存使用率,需要额外配置吗。目前虚拟机我已经可以查询到cpu使 ...

您的第一幅图是怎么出来的额?大神,你用的是什么命令额?。。。我找不到具体的数据,好奇怪
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条