跳转到: 导航, 搜索

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 部分

我们只需要编写消费者部分,将这些新信息写入通知消息中,就像来自通知的其他计量数据一样。


注意

https://etherpad.openstack.org/p/CeilometerNovaNotifier