OpenStack计量模块Ceilometer之入门

本文主要对OpenStack计量模块的ceilometer学习记录,从功能、概念、架构、数据流几个方面初步研究。内容大多来自互联网,主要是总结性和功能性的知识。
<a name="6nsxxl"></a>

功能:

计量:metering

计费:rating

结算:billing
<a name="adtuoc"></a>

概念:

Meter 计量项
Sample 某Resource某时刻Meter的值
Statistics 某区间Samples聚合值
Alarm 某区间Statistics满足给定条件后发出告警

<a name="f76zcw"></a>

架构:

客户端部署的agent架构,收集数据,将数据库放在数据库,或者提供一个传入请求的API服务。

Ceilometer计量服务组件主要包括一下几个:

名称 中文名(自定义的) 部署节点 功能说明
ceilometer-agent-compute 计算代理 所有 循环查询资源使用率统计情况
ceilometer-agent-central 中枢代理 管理服务器 循环查询资源使用率统计情况
ceilometer-agent-notification 消息代理 管理服务器 使用消息队列中的信息记录时间和计量数据
ceilometer-collector 收集器 管理服务器 分发收集检测数据到数据存储上或展示给用户
ceilometer-alarm-evaluator 告警评估器 管理服务器 根据设置的阈值定义确定何时进行报警
ceilometer-alarm-notifier 告警通知 管理服务器 允许告警阈值在合适的范围内调整设置
ceilometer-api 数据访问接口 管理服务器 数据访问

<a name="n1oghd"></a>

数据流:

<a name="kbwsgc"></a>

内部处理流程

[图片上传失败...(image-50c873-1574327375303)]<a name="7p1vlr"></a>

数据流图

[图片上传失败...(image-2c023e-1574327375303)]
<a name="5s0lzi"></a>

Ceilometer中三种主要数据收集方式。

类型名称 收集方法 收集方式
Notification Ceilometer 接收 OpenStack 其它服务发出的 notification message 通知
Polling 直接从 Hypervisor 或者 使用 SNMP 从host machine,或者使用 OpenStack 其它服务的 API 来获取数据。 主动轮询
RestFul API 别的 application 使用 Ceilometer 的 REST API 创建 samples。 接口

<a name="lrrvlx"></a>

Notification方式

所有的 OpenStack 服务都会在执行了某种操作或者状态变化时发出 notification。一些 nofication message 会包含 metering 需要的数据,这部分消息会被ceilometer 处理并转化为samples。下表列出了目前 Ceilometer 所处理的各服务的notification:

OpenStack 服务 事件类型 备注
OpenStack Compute scheduler.run_instance.scheduled,scheduler.select_destinations<br />compute.instance.* 相关更详细的计算通知列表,请查阅 System Usage Data wiki page.
Bare metal module for OpenStack hardware.ipmi.*
OpenStack Image Service image.update,<br />image.upload,<br />image.delete,<br />image.send 映像服务所需的配置可以在openstack安装指南的Telemetry部分找到。 Configure the Image Service for Telemetry section
OpenStack Networking floatingip.create.end,<br />floatingip.update.,<br />floatingip.exists<br />network.create.end,<br />network.update.,<br />network.exists<br />port.create.end,<br />port.update.,<br />port.exists<br />router.create.end,<br />router.update.,<br />router.exists<br />subnet.create.end,<br />subnet.update.*,<br />subnet.exists<br />l3.meter
Orchestration module orchestration.stack.create.end,orchestration.stack.update.end<br />orchestration.stack.delete.end,orchestration.stack.resume.end<br />orchestration.stack.suspend.end
OpenStack Block Storage volume.exists,<br />volume.create.,<br />volume.delete.<br />volume.update.,<br />volume.resize.,<br />volume.attach.<br />volume.detach.<br /><br />snapshot.exists,<br />snapshot.create.<br />snapshot.delete.,<br />snapshot.update.* The required configuration for Block Storage service can be found in the Add the Block Storage service agent for Telemetry sectionsection in the OpenStack Installation Guide.

下面以cinder为例说明数据是如何发送到ceilometer的。

Cinder中的/cinder/volume/util.py中的notify_about_volume_usage函数负责调用oslo.message的方法负责发出volume usag相关的notification message。

[图片上传失败...(image-d38dfb-1574327375303)]<br />从Cinder节点开始:<br />(1) cinder-* 发出 event-type 为 "volume.." topic 为"<topic>.<priority>" 的消息 到 类型为 topic 名为 <service> 的exchange<br />(2)exchange <service> 和 queue "<topic>.<priority>" 使用 routing-key "<topic>.<priority>" 绑定<br />(3)notificaiton message 被 exchange 转发到 queue "<topic>.<priority>"<br />(4)ceilometer-agent-notification 从 queue "<topic>.<priority>" 中获取 message。Ceilometer 从 AMQP message queue "notifications.info" 中获取 notificaiton 消息。该 queue 的名字由 ceilometer.conf 中的配置项 notification_topics = notifications 指定。<br />(5)按照一定的方法将 notification 转化为 ceilometer event。<br />(6)ceilometer event转化为 samples,产生最终数据。

<a name="1hnmdw"></a>

Polling方式

Ceilometer的polling机制有三种类型:

类型 数据来源 具体数据 说明
central agent RESTApi获取openstack资源信息<br />SNMP获取hardware(硬件)资源信息 ● OpenStack Networking<br />● OpenStack Object Storage<br />● OpenStack Block Storage<br />● Hardware resources via SNMP<br />● Energy consumption metrics via Kwapi framework 该 agent 收集到的 samples 会通过 AMQP 发给 Ceilometer Collector 或者外部系统。
compute agent 计算节点上的虚拟机数据 虚拟机使用数据<br />物理机CPU数据 虚拟机数据通过调用Hypervisor SDK获取,目前支持的虚拟机如下:<br />● Kernel-based Virtual Machine (KVM)<br />● Quick Emulator (QEMU)<br />● Linux Containers (LXC)<br />● User-mode Linux (UML)<br />● Hyper-V<br />● XEN<br />● VMWare vSphere
IPMI agent IPMI 传感器(sensor)的数据<br />Intel Node Manager 的数据

<a name="7rtxxf"></a>

RESTFul API方式

先看一条具体的命令:

$ ceilometer sample-create -r 37128ad6-daaa-4d22-9509-b7e1c6b08697 -m memory.usage --meter-type gauge --meter-unit MB --sample-volume 48

该命令会创建一个Samples具体内容如下:

属性
message_id 6118820c-2137-11e4-a429-08002715c7fb
name memory.usage
project_id e34eaa91d52a4402b4cb8bc9bbd308c1
resource_id 37128ad6-daaa-4d22-9509-b7e1c6b08697
resource_metadata {}
timestamp 2014-08-11T09:10:46.358926
type gauge
unit MB
user_id 679b0499e7a34ccb9d90b64208401f8e
volume 48.0

----------------------------------以下是其他非主要方式,并不是不重要---------------------------------------

<a name="0qw2gm"></a>

Neutron 带宽 samples

Havana 版本中添加该功能。与 Ceilometer 其他采集方式不同的是,bandwidth 的采集是通过 neutron-meter-agent 收集,然后 push 到 oslo-messaging,ceilometer-agent-notification通过监听消息队列来收取bandwidth信息。

其实现是在 L3 router 层次来收集数据,因此需要操作员配置 IP 范围以及设置标签(label)。比如,我们加两个标签,一个表示内部网络流量,另一个表示外部网络流量。每个标签会计量一定IP范围内的流量。然后,每个标签的带宽的测量数据会被发到 MQ,然后被 Ceilometer 收集到。

<a name="y5qlyt"></a>

收集物理设备samples

物理能耗数据:<br />有时候我们需要收集 OpenStack 集群中服务器的能耗数据。kwapi 是采集物理机能耗信息的项目,agent-central 组件通过kwapi暴露的api来收集物理机的能耗信息。目前 kwapi 提供两个类型的计量数据:

  • Energy (cumulative type): 表示 kWh.

  • Power (gauge type): 表示 watts.

Ceilometer central agent 的 pollers 直接调用 kwapi 的 API 来获取 samples。

<a name="7064ag"></a>

数据处理

<a name="as1rgs"></a>

Pipeline管道

Meters 数据的处理使用 Pipeline 的方式,即Metes 数据依次经过(零个或者多个) Transformer 和 (一个或者多个)Publisher 处理,最后达到(一个或者多个)Receiver。其中Recivers 包括 Ceilometer Collector 和 外部系统。<br />[图片上传失败...(image-b7a3d4-1574327375303)]

Ceilometer 根据配置文件 /etc/ceilometer/pipeline.yaml 来配置 meters 所使用的 transformers 和 publishers。以 cpu meter 为例:

sources: A source is a producer of samples
......
  - name: cpu_source
    interval: 600
    meters:
        - "cpu"
    sinks:
        - cpu_sink

......
sinks: A sink on the other hand is a chain of handlers of samples
......
  - name: cpu_sink
    transformers:
      - name: "rate_of_change"
        parameters:
                target:
                    name: "cpu_util"
                    unit: "%"
                    type: "gauge"
                    scale: "100.0 / (10**9 * (resource_metadata.cpu_number or1))"
     publishers:
         - notifier://

这段代码定义了 cpu meter 的 :

  • interval: 600:Poller 获取 cpu samples 的间隔为 10 分钟

  • cpu meter 的 transformer 为 "rate_of_change"

  • cpu meter 的 publisher 为 notifier://,它使用默认的配置经过 AMQP 使用 oslo.messaging 发出数据

<a name="yug6nq"></a>

Transformer转换器

Transformer 即 Sample 的转换器。常见的 transformer 包括:

名称 中文名 说明
unit_conversion 单位转换器 比如温度从°F 转换成°C
rate_of_change 计算方式转换器 比如根据一定的计算规则来转换一个sample
accumulator 累计器 数据的累加
name: "rate_of_change"
           parameters:
               target:
                   name: "cpu_util"
                   unit: "%"
                   type: "gauge"
                   scale: "100.0 / (10**9 * (resource_metadata.cpu_number or 1))"

比如上面是一个计算转换。
<a name="h8f6ac"></a>

Publisher分发器

Ceilometer 支持如下几种 Publishers:

Publisher 格式 说明 配置项 示例
Notifier notifier://?option1=value1&option2=value2 samples 数据被发到 AMQP 系统,然后被 Ceilometer collecter 接收。默认的 AMQP Queue 是 metering_topic=metering。这默认的方式。 [publisher_notifier]<br />metering_driver = messagingv2<br />metering_topic = metering notifier://?policy=drop&max_queue_length=512
RPC rpc://?option1=value1&option2=value2 与 notifier类似,同样经过 AMQP, 不过是同步操作,因此可能有性能问题。 <br />[publisher_rpc]<br />metering_topic = metering rpc://?per_meter_topic=1
UDP udp://<host>:<port>/ 经过 UDP port 发出。默认的 UDP 端口是 4952 udp_port=4952 udp://10.0.0.2:1234
File file://path?option1=value1&option2=value2 发送到文件保存

可以在 /etc/ceilometer/pipeline.yaml 中为某个 meter 配置多个 publisher。比如增加一个file publisher:

sinks:
    - name: meter_sink
      transformers:
      publishers:
          - notifier://
          - file:///var/log/ceilometer/ceilometer-file-publisher #新增的file publisher

那么在该文件中你会看到如下的 sample:

| {
'user_id': None,
'name': 'image',
'resource_id': u 'bb8838d5-06b5-4f7e-b6ef-87c908f04cc7',
'timestamp': '2015-03-29T15:39:05Z',
'resource_metadata': {
'status': u 'active',
'name': u 'cinderimg',
'deleted': False,
'container_format': u 'bare',
'created_at': u '2015-01-21T17:15:56',
'disk_format': u 'qcow2',
'updated_at': u '2015-01-21T17:15:56',
'protected': True,
'min_ram': 0,
'checksum': u '64d7c1cd2b6f60c92c14662941cb7913',
'min_disk': 0,
'is_public': False,
'deleted_at': None,
'properties': {},
'size': 13167616
},
'volume': 1,
'source': 'openstack',
'project_id': u 'fa2046aaead44a698de8268f94759fc1',
'type': 'gauge',
'id': 'bb2b4142-d629-11e4-925a-080027ff4b45',
'unit': 'image'

}

<a name="hsetos"></a>

数据保存

Ceilometer Collector 从 AMQP 接收到数据后,会原封不动地通过一个或者多个分发器(dispatchers)将它保存到指定位置。目前它支持的分发器:

  • 文件分发器:保存到文件 - 添加配置项dispatcher = file 和 [dispatcher_file] 部分的配置项

  • HTTP 分发器:保存到外部的 HTTP target - 添加配置项 dispatcher = http

  • 数据库分发器:保存到数据库 - 添加配置项 dispatcher = database。参考文档

    • MongoDB:默认DB。

    • SQL DB:支持 mysql、postgreSQL 和 IBM DB2等。

    • HBase DB

[图片上传失败...(image-47c7fc-1574327375303)]

[图片上传失败...(image-7b26dd-1574327375303)]<br />Ceilometer 支持同时配置多个分发器,将数据保存到多个目的位置。比如在 ceilometer.conf 中做如下配置使得同时使用 file 和 database dispatcher:

[DEFAULT]
dispatcher = database
dispatcher = file

[dispatcher_file]
backup_count = 5
file_path = /var/log/ceilometer/ceilometer-samples
max_bytes = 100000

在 /var/log/ceilometer/ceilometer-samples 文件中将收到如下类似的 samples 数据:

[{
    u 'counter_name': u 'cpu_util',
    u 'user_id': u '8f4f734443674afcbbb57b9909d5a07f',
    u 'message_signature': u '21fdc2cbf50b4da39746eba47ac0a1b742c759a1bb42e17c00e293413c356a38',
    u 'timestamp': u '2015-03-29T14:47:10Z',
    u 'resource_id': u '49618cae-dd28-41a0-ae97-e98899d717eb',
    u 'message_id': u '7ad714f6-d622-11e4-8f83-080027df9b16',
    u 'source': u 'openstack',
    u 'counter_unit': u '%',
    u 'counter_volume': 0.0,
    u 'project_id': u 'd6feddb5279a42f4854b93a729470448',
    u 'resource_metadata': {
        u 'status': u 'shutoff',
        u 'cpu_number': 1,
        u 'ramdisk_id': None,
        u 'display_name': u 'vm-1-for-user-one',
        u 'name': u 'instance-0000000e',
        u 'disk_gb': 1,
        u 'kernel_id': None,
        u 'image': None,
        u 'ephemeral_gb': 0,
        u 'host': u '5d9f88849c5458f5b903fbc7a7d19bb90c3a4b0c492c5180434d216d',
        u 'memory_mb': 100,
        u 'instance_type': u '7124c366-3e56-4923-b32a-124ee31abaf7',
        u 'vcpus': 1,
        u 'root_gb': 1,
        u 'image_ref': None,
        u 'flavor': {
            u 'name': u 'tiny',
            u 'links': [{
                u 'href': u 'http://controller:8774/e5defbf994694519b1261fa855a058ae/flavors/7124c366-3e56-4923-b32a-124ee31abaf7',
                u 'rel': u 'bookmark'
            }],
            u 'ram': 100,
            u 'ephemeral': 0,
            u 'vcpus': 1,
            u 'disk': 1,
            u 'id': u '7124c366-3e56-4923-b32a-124ee31abaf7'
        },
        u 'OS-EXT-AZ:availability_zone': u 'nova',
        u 'image_ref_url': None
    },
    u 'counter_type': u 'gauge'
}]

<a name="zodzlx"></a>

数据访问

外部系统通过 ceilometer-api 模块提供的 Ceilometer REST API 来访问保存在数据库中的数据。API 有 V1 和 V2 两个版本,现在使用的是 V2.<br />[图片上传失败...(image-ba8dc7-1574327375303)]<br />API Service 默认在 8777 端口监听 (#port=8777)。
<a name="mbutuz"></a>

告警

(1)ceilometer-alarm-evaluator 使用 Ceilometer REST API 获取 statistics 数据

(2)ceilometer-alarm-evaluator 生成 alarm 数据, 并通过 AMQP 发给 ceilometer-alarm-notifer

(3)ceilometer-alarm-notifer 会通过指定方式把 alarm 发出去。<br />Heat 和 Ceilometer 通过 Ceilometer Alarm 进行交互来实现 Instance auto-scaling<br />[图片上传失败...(image-11d8f-1574327375303)]<br />具体步骤:<br />[图片上传失败...(image-f7ba78-1574327375303)]

<a name="30gdcx"></a>

组件Gnocchi数据存储

<a name="30gdcx"></a>

组件aoha告警服务

<a name="30gdcx"></a>

组件panko事件存储

<a name="qghcpo"></a>

<a name="qghcpo"></a>

参考文档

图片多来自网络。<br />OpenStack Ceilometer官方文档 https://docs.openstack.org/ceilometer/latest/<br />https://www.cnblogs.com/sammyliu/p/4383289.html

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

推荐阅读更多精彩内容