Ceilometer/blueprints/remove-ceilometer-nova-notifier
上下文
Ceilometer 从每个 OpenStack 组件检索不同的计量数据。
对于 nova 实例的计量数据,其中一部分是通过轮询 nova-compute 驱动程序(例如:目前是 libvirt 或 hyperv)检索的,另一部分是通过读取 nova 的 RPC 通知来检索的。
通过轮询系统检索的计量数据包括:
- cpu
- disk.read.requests
- disk.read.bytes
- disk.write.requests
- disk.write.bytes
- instance
- instance:<flavor_name>
- network.incoming.bytes
- network.incoming.packets
- network.outgoing.bytes
- network.outgoing.packets
对于 instance 和 instance:<flavor_name> 也是通过 RPC 检索的,因此在 BP 的其余部分我们无需关心它们。
问题
pollster 在每个 nova-compute 节点上运行,以连接到 libvirt 或 hyperv。
当我们删除一个实例时,我们需要最后一次检索 pollster 的计量数据,以便为计费获取最新的计量数据样本。
但是 pollster 无法知道实例何时被删除,这是一个周期性任务的转储。
Ceilometer 中编写了一个 nova notifier,它仅捕获 'compute.instance.delete.start' 通知,以构建另一个通知 'compute.instance.delete.samples',其中包含每个 pollster 计量数据的最后一个样本。
Ceilometer 中的这段代码依赖于 nova 的内部代码/数据格式/…,在 Ceilometer 中维护起来非常困难,并且经常出现故障。
解决方案
nova.virt.driver 部分
有趣的 nova.virt.driver API 方法(由以下驱动程序实现):
- interface_stats() (libvirt),可用于 network.* 计量数据
- block_stats() (libvirt),可用于 disk.* 计量数据
- get_all_volume_usage() (libvirt),可用于 disk.* 计量数据
- get_all_bw_counters() (xenapi),可用于 network.* 计量数据
- get_info() cpu_time 字段 (libvirt, hyperv, powervm),可用于 cpu 计量数据
Ceilometer 目前仅在 libvirt 和 hyperv 中支持这些有问题的计量数据。因此,为了保持相同的功能,这两个驱动程序都必须实现上述方法。
当前 Ceilometer 代码可以重用于实现这些 API 方法。
nova.manager 部分
如果配置了 (CONF.bandwidth_poll_interval 和 CONF.volume_usage_poll_interval),则已经存在轮询任务来缓存驱动程序的 get_all_volume_usage/get_all_bw_counters 的结果
因此,我们需要编写一个轮询任务来获取 cpu 使用量。
当前的 'instance.exists' 通知可以将卷和 cpu 使用量添加到通知中(就像它对 bw 所做的那样)
当删除实例时,我们需要更新所有使用量缓存(卷/bw/cpu),然后
- 发送一个 'instance.delete.start' 通知,其中包含额外的信息,就像 'instance.exists' 所做的那样。
- 或者,在发送 'instance.delete.start' 之前,只需再通知一次 'instance.exists'。
ceilometer 部分
我们只需要编写消费者部分,将这些新信息写入通知消息中,就像来自通知的其他计量数据一样。