本文主要对OpenStack计量模块的ceilometer学习记录,从功能、概念、架构、数据流几个方面初步研究。内容大多来自互联网,主要是总结性和功能性的知识。
功能:
计量:metering
计费:rating
概念:
Meter | 计量项 |
---|---|
Sample | 某Resource某时刻Meter的值 |
Statistics | 某区间Samples聚合值 |
Alarm | 某区间Statistics满足给定条件后发出告警 |
架构:
客户端部署的agent架构,收集数据,将数据库放在数据库,或者提供一个传入请求的API服务。
Ceilometer计量服务组件主要包括一下几个:
名称 | 中文名(自定义的) | 部署节点 | 功能说明 |
---|---|---|---|
ceilometer-agent-compute | 计算代理 | 所有 | 循环查询资源使用率统计情况 |
ceilometer-agent-central | 中枢代理 | 管理服务器 | 循环查询资源使用率统计情况 |
ceilometer-agent-notification | 消息代理 | 管理服务器 | 使用消息队列中的信息记录时间和计量数据 |
ceilometer-collector | 收集器 | 管理服务器 | 分发收集检测数据到数据存储上或展示给用户 |
ceilometer-alarm-evaluator | 告警评估器 | 管理服务器 | 根据设置的阈值定义确定何时进行报警 |
ceilometer-alarm-notifier | 告警通知 | 管理服务器 | 允许告警阈值在合适的范围内调整设置 |
ceilometer-api | 数据访问接口 | 管理服务器 | 数据访问 |
数据流:
内部处理流程
[图片上传失败...(image-50c873-1574327375303)]
数据流图
[图片上传失败...(image-2c023e-1574327375303)]
Ceilometer中三种主要数据收集方式。
类型名称 | 收集方法 | 收集方式 |
---|---|---|
Notification | Ceilometer 接收 OpenStack 其它服务发出的 notification message | 通知 |
Polling | 直接从 Hypervisor 或者 使用 SNMP 从host machine,或者使用 OpenStack 其它服务的 API 来获取数据。 | 主动轮询 |
RestFul API | 别的 application 使用 Ceilometer 的 REST API 创建 samples。 | 接口 |
Notification方式
所有的 OpenStack 服务都会在执行了某种操作或者状态变化时发出 notification。一些 nofication message 会包含 metering 需要的数据,这部分消息会被ceilometer 处理并转化为samples。下表列出了目前 Ceilometer 所处理的各服务的notification:
OpenStack 服务 | 事件类型 | 备注 |
---|---|---|
OpenStack Compute | scheduler.run_instance.scheduled,scheduler.select_destinations compute.instance.* |
相关更详细的计算通知列表,请查阅 System Usage Data wiki page. |
Bare metal module for OpenStack | hardware.ipmi.* | |
OpenStack Image Service | image.update, image.upload, image.delete, image.send |
映像服务所需的配置可以在openstack安装指南的Telemetry部分找到。 Configure the Image Service for Telemetry section |
OpenStack Networking | floatingip.create.end, floatingip.update., floatingip.exists network.create.end, network.update., network.exists port.create.end, port.update., port.exists router.create.end, router.update., router.exists subnet.create.end, subnet.update.*, subnet.exists l3.meter |
|
Orchestration module | orchestration.stack.create.end,orchestration.stack.update.end orchestration.stack.delete.end,orchestration.stack.resume.end orchestration.stack.suspend.end |
|
OpenStack Block Storage | volume.exists, volume.create., volume.delete. volume.update., volume.resize., volume.attach. volume.detach. snapshot.exists, snapshot.create. snapshot.delete., 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)]
从Cinder节点开始:
(1) cinder-* 发出 event-type 为 "volume.." topic 为"
(2)exchange
(3)notificaiton message 被 exchange 转发到 queue "
(4)ceilometer-agent-notification 从 queue "
(5)按照一定的方法将 notification 转化为 ceilometer event。
(6)ceilometer event转化为 samples,产生最终数据。
Polling方式
Ceilometer的polling机制有三种类型:
类型 | 数据来源 | 具体数据 | 说明 |
---|---|---|---|
central agent | RESTApi获取openstack资源信息 SNMP获取hardware(硬件)资源信息 |
● OpenStack Networking ● OpenStack Object Storage ● OpenStack Block Storage ● Hardware resources via SNMP ● Energy consumption metrics via Kwapi framework |
该 agent 收集到的 samples 会通过 AMQP 发给 Ceilometer Collector 或者外部系统。 |
compute agent | 计算节点上的虚拟机数据 | 虚拟机使用数据 物理机CPU数据 |
虚拟机数据通过调用Hypervisor SDK获取,目前支持的虚拟机如下: ● Kernel-based Virtual Machine (KVM) ● Quick Emulator (QEMU) ● Linux Containers (LXC) ● User-mode Linux (UML) ● Hyper-V ● XEN ● VMWare vSphere |
IPMI agent | IPMI 传感器(sensor)的数据 Intel Node Manager 的数据 |
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 |
----------------------------------以下是其他非主要方式,并不是不重要---------------------------------------
Neutron 带宽 samples
Havana 版本中添加该功能。与 Ceilometer 其他采集方式不同的是,bandwidth 的采集是通过 neutron-meter-agent 收集,然后 push 到 oslo-messaging,ceilometer-agent-notification通过监听消息队列来收取bandwidth信息。
其实现是在 L3 router 层次来收集数据,因此需要操作员配置 IP 范围以及设置标签(label)。比如,我们加两个标签,一个表示内部网络流量,另一个表示外部网络流量。每个标签会计量一定IP范围内的流量。然后,每个标签的带宽的测量数据会被发到 MQ,然后被 Ceilometer 收集到。
收集物理设备samples
物理能耗数据:
有时候我们需要收集 OpenStack 集群中服务器的能耗数据。kwapi 是采集物理机能耗信息的项目,agent-central 组件通过kwapi暴露的api来收集物理机的能耗信息。目前 kwapi 提供两个类型的计量数据:
Energy (cumulative type): 表示 kWh.
Power (gauge type): 表示 watts.
Ceilometer central agent 的 pollers 直接调用 kwapi 的 API 来获取 samples。
数据处理
Pipeline管道
Meters 数据的处理使用 Pipeline 的方式,即Metes 数据依次经过(零个或者多个) Transformer 和 (一个或者多个)Publisher 处理,最后达到(一个或者多个)Receiver。其中Recivers 包括 Ceilometer Collector 和 外部系统。
[图片上传失败...(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 发出数据
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))"
Publisher分发器
Ceilometer 支持如下几种 Publishers:
Publisher | 格式 | 说明 | 配置项 | 示例 |
---|---|---|---|---|
Notifier | notifier://?option1=value1&option2=value2 | samples 数据被发到 AMQP 系统,然后被 Ceilometer collecter 接收。默认的 AMQP Queue 是 metering_topic=metering。这默认的方式。 | [publisher_notifier] metering_driver = messagingv2 metering_topic = metering |
notifier://?policy=drop&max_queue_length=512 |
RPC | rpc://?option1=value1&option2=value2 | 与 notifier类似,同样经过 AMQP, 不过是同步操作,因此可能有性能问题。 | [publisher_rpc] metering_topic = metering |
rpc://?per_meter_topic=1 |
UDP | udp:// |
经过 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'
} |
---|
数据保存
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)]
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'
}]
数据访问
外部系统通过 ceilometer-api 模块提供的 Ceilometer REST API 来访问保存在数据库中的数据。API 有 V1 和 V2 两个版本,现在使用的是 V2.
[图片上传失败...(image-ba8dc7-1574327375303)]
API Service 默认在 8777 端口监听 (#port=8777)。
告警
(1)ceilometer-alarm-evaluator 使用 Ceilometer REST API 获取 statistics 数据
(2)ceilometer-alarm-evaluator 生成 alarm 数据, 并通过 AMQP 发给 ceilometer-alarm-notifer
(3)ceilometer-alarm-notifer 会通过指定方式把 alarm 发出去。
Heat 和 Ceilometer 通过 Ceilometer Alarm 进行交互来实现 Instance auto-scaling
[图片上传失败...(image-11d8f-1574327375303)]
具体步骤:
[图片上传失败...(image-f7ba78-1574327375303)]
组件Gnocchi数据存储
组件aoha告警服务
组件panko事件存储
参考文档
图片多来自网络。
OpenStack Ceilometer官方文档 https://docs.openstack.org/ceilometer/latest/
https://www.cnblogs.com/sammyliu/p/4383289.html