OpenStack计量模块Ceilometer之入门

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

功能:

计量:metering

计费:rating

结算:billing

概念:

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 为"." 的消息 到 类型为 topic 名为 的exchange
(2)exchange 和 queue "." 使用 routing-key "." 绑定
(3)notificaiton message 被 exchange 转发到 queue "."
(4)ceilometer-agent-notification 从 queue "." 中获取 message。Ceilometer 从 AMQP message queue "notifications.info" 中获取 notificaiton 消息。该 queue 的名字由 ceilometer.conf 中的配置项 notification_topics = notifications 指定。
(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

你可能感兴趣的:(OpenStack计量模块Ceilometer之入门)