本文主要對(duì)OpenStack計(jì)量模塊的ceilometer學(xué)習(xí)記錄,從功能纱耻、概念、架構(gòu)险耀、數(shù)據(jù)流幾個(gè)方面初步研究弄喘。內(nèi)容大多來自互聯(lián)網(wǎng),主要是總結(jié)性和功能性的知識(shí)甩牺。
<a name="6nsxxl"></a>
功能:
計(jì)量:metering
計(jì)費(fèi):rating
結(jié)算:billing
<a name="adtuoc"></a>
概念:
Meter | 計(jì)量項(xiàng) |
---|---|
Sample | 某Resource某時(shí)刻Meter的值 |
Statistics | 某區(qū)間Samples聚合值 |
Alarm | 某區(qū)間Statistics滿足給定條件后發(fā)出告警 |
<a name="f76zcw"></a>
架構(gòu):
客戶端部署的agent架構(gòu)蘑志,收集數(shù)據(jù),將數(shù)據(jù)庫放在數(shù)據(jù)庫贬派,或者提供一個(gè)傳入請(qǐng)求的API服務(wù)急但。
Ceilometer計(jì)量服務(wù)組件主要包括一下幾個(gè):
名稱 | 中文名(自定義的) | 部署節(jié)點(diǎn) | 功能說明 |
---|---|---|---|
ceilometer-agent-compute | 計(jì)算代理 | 所有 | 循環(huán)查詢資源使用率統(tǒng)計(jì)情況 |
ceilometer-agent-central | 中樞代理 | 管理服務(wù)器 | 循環(huán)查詢資源使用率統(tǒng)計(jì)情況 |
ceilometer-agent-notification | 消息代理 | 管理服務(wù)器 | 使用消息隊(duì)列中的信息記錄時(shí)間和計(jì)量數(shù)據(jù) |
ceilometer-collector | 收集器 | 管理服務(wù)器 | 分發(fā)收集檢測(cè)數(shù)據(jù)到數(shù)據(jù)存儲(chǔ)上或展示給用戶 |
ceilometer-alarm-evaluator | 告警評(píng)估器 | 管理服務(wù)器 | 根據(jù)設(shè)置的閾值定義確定何時(shí)進(jìn)行報(bào)警 |
ceilometer-alarm-notifier | 告警通知 | 管理服務(wù)器 | 允許告警閾值在合適的范圍內(nèi)調(diào)整設(shè)置 |
ceilometer-api | 數(shù)據(jù)訪問接口 | 管理服務(wù)器 | 數(shù)據(jù)訪問 |
<a name="n1oghd"></a>
數(shù)據(jù)流:
<a name="kbwsgc"></a>
內(nèi)部處理流程
[圖片上傳失敗...(image-50c873-1574327375303)]<a name="7p1vlr"></a>
數(shù)據(jù)流圖
[圖片上傳失敗...(image-2c023e-1574327375303)]
<a name="5s0lzi"></a>
Ceilometer中三種主要數(shù)據(jù)收集方式。
類型名稱 | 收集方法 | 收集方式 |
---|---|---|
Notification | Ceilometer 接收 OpenStack 其它服務(wù)發(fā)出的 notification message | 通知 |
Polling | 直接從 Hypervisor 或者 使用 SNMP 從host machine搞乏,或者使用 OpenStack 其它服務(wù)的 API 來獲取數(shù)據(jù)波桩。 | 主動(dòng)輪詢 |
RestFul API | 別的 application 使用 Ceilometer 的 REST API 創(chuàng)建 samples。 | 接口 |
<a name="lrrvlx"></a>
Notification方式
所有的 OpenStack 服務(wù)都會(huì)在執(zhí)行了某種操作或者狀態(tài)變化時(shí)發(fā)出 notification请敦。一些 nofication message 會(huì)包含 metering 需要的數(shù)據(jù)镐躲,這部分消息會(huì)被ceilometer 處理并轉(zhuǎn)化為samples。下表列出了目前 Ceilometer 所處理的各服務(wù)的notification:
OpenStack 服務(wù) | 事件類型 | 備注 |
---|---|---|
OpenStack Compute | scheduler.run_instance.scheduled侍筛,scheduler.select_destinations<br />compute.instance.* | 相關(guān)更詳細(xì)的計(jì)算通知列表萤皂,請(qǐng)查閱 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 | 映像服務(wù)所需的配置可以在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為例說明數(shù)據(jù)是如何發(fā)送到ceilometer的。
Cinder中的/cinder/volume/util.py中的notify_about_volume_usage函數(shù)負(fù)責(zé)調(diào)用oslo.message的方法負(fù)責(zé)發(fā)出volume usag相關(guān)的notification message酸茴。
[圖片上傳失敗...(image-d38dfb-1574327375303)]<br />從Cinder節(jié)點(diǎn)開始:<br />(1) cinder-* 發(fā)出 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 轉(zhuǎn)發(fā)到 queue "<topic>.<priority>"<br />(4)ceilometer-agent-notification 從 queue "<topic>.<priority>" 中獲取 message分预。Ceilometer 從 AMQP message queue "notifications.info" 中獲取 notificaiton 消息。該 queue 的名字由 ceilometer.conf 中的配置項(xiàng) notification_topics = notifications 指定薪捍。<br />(5)按照一定的方法將 notification 轉(zhuǎn)化為 ceilometer event笼痹。<br />(6)ceilometer event轉(zhuǎn)化為 samples,產(chǎn)生最終數(shù)據(jù)酪穿。
<a name="1hnmdw"></a>
Polling方式
Ceilometer的polling機(jī)制有三種類型:
類型 | 數(shù)據(jù)來源 | 具體數(shù)據(jù) | 說明 |
---|---|---|---|
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 會(huì)通過 AMQP 發(fā)給 Ceilometer Collector 或者外部系統(tǒng)凳干。 |
compute agent | 計(jì)算節(jié)點(diǎn)上的虛擬機(jī)數(shù)據(jù) | 虛擬機(jī)使用數(shù)據(jù)<br />物理機(jī)CPU數(shù)據(jù) | 虛擬機(jī)數(shù)據(jù)通過調(diào)用Hypervisor SDK獲取,目前支持的虛擬機(jī)如下:<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)的數(shù)據(jù)<br />Intel Node Manager 的數(shù)據(jù) |
<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 |
---|
該命令會(huì)創(chuàng)建一個(gè)Samples具體內(nèi)容如下:
屬性 | 值 |
---|---|
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通過監(jiān)聽消息隊(duì)列來收取bandwidth信息。
其實(shí)現(xiàn)是在 L3 router 層次來收集數(shù)據(jù)喳瓣,因此需要操作員配置 IP 范圍以及設(shè)置標(biāo)簽(label)馋贤。比如,我們加兩個(gè)標(biāo)簽畏陕,一個(gè)表示內(nèi)部網(wǎng)絡(luò)流量,另一個(gè)表示外部網(wǎng)絡(luò)流量仿滔。每個(gè)標(biāo)簽會(huì)計(jì)量一定IP范圍內(nèi)的流量惠毁。然后,每個(gè)標(biāo)簽的帶寬的測(cè)量數(shù)據(jù)會(huì)被發(fā)到 MQ崎页,然后被 Ceilometer 收集到鞠绰。
<a name="y5qlyt"></a>
收集物理設(shè)備samples
物理能耗數(shù)據(jù):<br />有時(shí)候我們需要收集 OpenStack 集群中服務(wù)器的能耗數(shù)據(jù)。kwapi 是采集物理機(jī)能耗信息的項(xiàng)目飒焦,agent-central 組件通過kwapi暴露的api來收集物理機(jī)的能耗信息蜈膨。目前 kwapi 提供兩個(gè)類型的計(jì)量數(shù)據(jù):
Energy (cumulative type): 表示 kWh.
Power (gauge type): 表示 watts.
Ceilometer central agent 的 pollers 直接調(diào)用 kwapi 的 API 來獲取 samples屿笼。
<a name="7064ag"></a>
數(shù)據(jù)處理
<a name="as1rgs"></a>
Pipeline管道
Meters 數(shù)據(jù)的處理使用 Pipeline 的方式,即Metes 數(shù)據(jù)依次經(jīng)過(零個(gè)或者多個(gè)) Transformer 和 (一個(gè)或者多個(gè))Publisher 處理翁巍,最后達(dá)到(一個(gè)或者多個(gè))Receiver驴一。其中Recivers 包括 Ceilometer Collector 和 外部系統(tǒng)。<br />[圖片上傳失敗...(image-b7a3d4-1574327375303)]
Ceilometer 根據(jù)配置文件 /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://肝断,它使用默認(rèn)的配置經(jīng)過 AMQP 使用 oslo.messaging 發(fā)出數(shù)據(jù)
<a name="yug6nq"></a>
Transformer轉(zhuǎn)換器
Transformer 即 Sample 的轉(zhuǎn)換器。常見的 transformer 包括:
名稱 | 中文名 | 說明 |
---|---|---|
unit_conversion | 單位轉(zhuǎn)換器 | 比如溫度從°F 轉(zhuǎn)換成°C |
rate_of_change | 計(jì)算方式轉(zhuǎn)換器 | 比如根據(jù)一定的計(jì)算規(guī)則來轉(zhuǎn)換一個(gè)sample |
accumulator | 累計(jì)器 | 數(shù)據(jù)的累加 |
name: "rate_of_change"
parameters:
target:
name: "cpu_util"
unit: "%"
type: "gauge"
scale: "100.0 / (10**9 * (resource_metadata.cpu_number or 1))"
比如上面是一個(gè)計(jì)算轉(zhuǎn)換驰凛。
<a name="h8f6ac"></a>
Publisher分發(fā)器
Ceilometer 支持如下幾種 Publishers:
Publisher | 格式 | 說明 | 配置項(xiàng) | 示例 |
---|---|---|---|---|
Notifier | notifier://?option1=value1&option2=value2 | samples 數(shù)據(jù)被發(fā)到 AMQP 系統(tǒng)胸懈,然后被 Ceilometer collecter 接收。默認(rèn)的 AMQP Queue 是 metering_topic=metering恰响。這默認(rèn)的方式趣钱。 | [publisher_notifier]<br />metering_driver = messagingv2<br />metering_topic = metering | notifier://?policy=drop&max_queue_length=512 |
RPC | rpc://?option1=value1&option2=value2 | 與 notifier類似,同樣經(jīng)過 AMQP胚宦, 不過是同步操作羔挡,因此可能有性能問題。 | <br />[publisher_rpc]<br />metering_topic = metering | rpc://?per_meter_topic=1 |
UDP | udp://<host>:<port>/ | 經(jīng)過 UDP port 發(fā)出间唉。默認(rèn)的 UDP 端口是 4952 | udp_port=4952 | udp://10.0.0.2:1234 |
File | file://path?option1=value1&option2=value2 | 發(fā)送到文件保存 |
可以在 /etc/ceilometer/pipeline.yaml 中為某個(gè) meter 配置多個(gè) publisher绞灼。比如增加一個(gè)file publisher:
sinks:
- name: meter_sink
transformers:
publishers:
- notifier://
- file:///var/log/ceilometer/ceilometer-file-publisher #新增的file publisher
那么在該文件中你會(huì)看到如下的 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>
數(shù)據(jù)保存
Ceilometer Collector 從 AMQP 接收到數(shù)據(jù)后,會(huì)原封不動(dòng)地通過一個(gè)或者多個(gè)分發(fā)器(dispatchers)將它保存到指定位置呈野。目前它支持的分發(fā)器:
文件分發(fā)器:保存到文件 - 添加配置項(xiàng)dispatcher = file 和 [dispatcher_file] 部分的配置項(xiàng)
HTTP 分發(fā)器:保存到外部的 HTTP target - 添加配置項(xiàng) dispatcher = http
數(shù)據(jù)庫分發(fā)器:保存到數(shù)據(jù)庫 - 添加配置項(xiàng) dispatcher = database低矮。參考文檔
MongoDB:默認(rèn)DB。
SQL DB:支持 mysql被冒、postgreSQL 和 IBM DB2等军掂。
HBase DB
[圖片上傳失敗...(image-47c7fc-1574327375303)]
[圖片上傳失敗...(image-7b26dd-1574327375303)]<br />Ceilometer 支持同時(shí)配置多個(gè)分發(fā)器,將數(shù)據(jù)保存到多個(gè)目的位置昨悼。比如在 ceilometer.conf 中做如下配置使得同時(shí)使用 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 數(shù)據(jù):
[{
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>
數(shù)據(jù)訪問
外部系統(tǒng)通過 ceilometer-api 模塊提供的 Ceilometer REST API 來訪問保存在數(shù)據(jù)庫中的數(shù)據(jù)蝗锥。API 有 V1 和 V2 兩個(gè)版本,現(xiàn)在使用的是 V2.<br />[圖片上傳失敗...(image-ba8dc7-1574327375303)]<br />API Service 默認(rèn)在 8777 端口監(jiān)聽 (#port=8777)率触。
<a name="mbutuz"></a>
告警
(1)ceilometer-alarm-evaluator 使用 Ceilometer REST API 獲取 statistics 數(shù)據(jù)
(2)ceilometer-alarm-evaluator 生成 alarm 數(shù)據(jù)终议, 并通過 AMQP 發(fā)給 ceilometer-alarm-notifer
(3)ceilometer-alarm-notifer 會(huì)通過指定方式把 alarm 發(fā)出去。<br />Heat 和 Ceilometer 通過 Ceilometer Alarm 進(jìn)行交互來實(shí)現(xiàn) Instance auto-scaling<br />[圖片上傳失敗...(image-11d8f-1574327375303)]<br />具體步驟:<br />[圖片上傳失敗...(image-f7ba78-1574327375303)]
<a name="30gdcx"></a>
組件Gnocchi數(shù)據(jù)存儲(chǔ)
<a name="30gdcx"></a>
組件aoha告警服務(wù)
<a name="30gdcx"></a>
組件panko事件存儲(chǔ)
<a name="qghcpo"></a>
<a name="qghcpo"></a>
參考文檔
圖片多來自網(wǎng)絡(luò)葱蝗。<br />OpenStack Ceilometer官方文檔 https://docs.openstack.org/ceilometer/latest/<br />https://www.cnblogs.com/sammyliu/p/4383289.html