添加管理服务状态变更通知

https://blueprints.launchpad.net/nova/+spec/service-status-notification

目前外部系统无法获取基于 Nova 服务状态的通知信息。Nova 服务状态可以通过 os-services/disable API 进行管理方式的变更。

提供此类通知有助于衡量维护窗口的长度,或间接通知用户维护操作可能对基础设施的运行产生影响。

问题描述

用例

部署者希望衡量某些 Nova 服务因故障排除或维护操作而被管理方式禁用所花费的时间,因为此信息可能是部署者和最终用户之间协议的一部分。

部署者希望衡量某些 Nova 服务因外部检测到的错误而被强制关闭所花费的时间,因为此信息可能是部署者和最终用户之间协议的一部分。

提议的变更

解决上述问题的简单方法是为以下操作添加 oslo.messaging 通知

  • /v2/{tenant_id}/os-services/disable

  • /v2/{tenant_id}/os-services/enable

  • /v2/{tenant_id}/os-services/disable-log-reason

  • /v2/{tenant_id}/os-service/force-down

然后 Ceilometer 可以接收这些通知,并通过 Ceilometer 查询计算维护窗口的长度。

或者,其他第三方工具(如 StackTach)可以通过 AMQP 接收新的通知。

备选方案

唯一的替代方案是定期轮询 /v2/{tenant_id}/os-services/ API,但这会导致信息流较慢,并给 Nova API 和 DB 服务带来负载。

数据模型影响

预计不会更改数据库模式。

以下新对象将被添加到 Nova

@base.NovaObjectRegistry.register
class ServiceStatusNotification(notification.NotificationBase):
    # Version 1.0: Initial version
    VERSION = '1.0'
    fields = {
        'payload': fields.ObjectField('ServiceStatusPayload')
    }

@base.NovaObjectRegistry.register
class ServiceStatusPayload(base.NovaObject):
    # Version 1.0: Initial version
    VERSION = '1.0'
    fields = {
        'service': fields.ObjectField('Service')
    }

NotificationBase 的定义可以在 Versioned notification spec [3] 中找到。

REST API 影响

安全影响

通知影响

将引入一个新的 service.status.update 通知,优先级为 INFO,通知的有效载荷将是现有 Service versioned 对象的序列化形式。这将是第一个使用 versioned 对象作为有效载荷的通知,但有一个倡议是将 versioned 对象作为每个 Nova 通知中的有效载荷 [3]。此新通知将不支持发出旧格式。

在实现此规范期间,我们将提供基于 [3] 发出 versioned 通知所需的最低基础设施,但所有高级功能(如示例和文档生成)将在实现期间完成 [3]。

例如,在以下 API 调用之后

PUT /v2/{tenant_id}/os-services/disable-log-reason
    {"host": "Devstack",
     "binary": "nova-compute",
     "disabled_reason": "my reason"}

通知将包含以下有效载荷

{
     "nova_object.version":"1.0",
     "nova_object.name":"ServiceStatusPayload",
     "nova_object.namespace":"nova",
     "nova_object.data":{
         "service":{
             "nova_object.version":"1.19",
             "nova_object.name":"Service",
             "nova_object.namespace":"nova",
             "nova_object.data":{
                 "id": 1,
                 "host": "Devstack"
                 "binary": "nova-compute",
                 "topic": "compute",
                 "report_count": 32011,
                 "disabled": true,
                 "disabled_reason": "my reason,
                 "availability_zone": "nova",
                 "last_seen_up": "2015-10-15 07:29:13",
                 "forced_down": false,
                 "version": 2,
                 }
             "nova_object.changes":[
                 "disabled",
                 "disabled_reason",
                 ]
         }
     }
}

请注意,compute_node 字段将不会序列化到通知有效载荷中,因为这会引入大量此处不需要的额外数据。

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

balazs-gibizer

工作项

  • 如果 Service 对象的 disabled disabled_reson 或 forced_down 字段更新,则发送新的通知

依赖项

这项工作是 Versioned notification API [3] 工作的一部分。但它不直接依赖于它。在峰会上,我们同意将此新通知作为 versioned notification api 工作的第一步,以激励操作员开始使用新的 versioned 通知。

测试

除了单元测试,还将添加新的功能测试用例来覆盖新的通知

文档影响

参考资料

[1] 此想法已经在 ML 上讨论过了

http://lists.openstack.org/pipermail/openstack-dev/2015-April/060645.html

[2] 此工作与 bp mark-host-down 相关,但不依赖于它

https://blueprints.launchpad.net/nova/+spec/mark-host-down

[3] Versioned notification spec https://review.openstack.org/#/c/224755/

历史

修订版

发布名称

描述

Mitaka

引入