oslo 中间件健康检查

https://blueprints.launchpad.net/oslo.middleware/+spec/oslo-middleware-healthcheck

一个通用且可扩展的健康检查中间件

问题描述

目前没有简单且通用的方法来确保 Openstack API 端点能够处理请求。但使用负载均衡器的部署者希望有一种简单的方法来知道 API 端点是否能够处理请求。

对于依赖后端(如数据库)的 API 端点,仅检查 API 端点在端点根 URL 上不返回 50x 错误是不够的。像 nova 这样的应用程序即使数据库不可用,也可能在‘/’上返回 200。

提议的变更

这个想法是创建一个所有 Openstack 组件都可以使用的 wsgi 中间件

[filter:healthcheck]
paste.filter_factory = oslo.middleware.healthcheck:Healthcheck
path = /healthcheck (default)
backends = database,disable_by_file (optional, default: empty)
# used by the 'disable_by_file' backend
disable_by_file_path = /var/run/nova/healthcheck_disable (optional, default: empty)

如果一切正常,中间件将返回“200 OK”,否则将返回“503 <原因>”,并说明为什么不应该使用此 API。

“backends” 将是 “oslo.middleware.healthcheck” 命名空间中的 stevedore 扩展的名称。

oslo.middleware 还会为这些扩展提供一个基类

HealthcheckResult = namedtuple('HealthcheckResult', ['available', 'reason'], verbose=True)

class HealthcheckBaseExtension(object):
    def __init__(self, conf):
        self.conf = conf

    @abc.abstractmethod
    def healthcheck():
        """method called by the healthcheck middleware

        return: HealthcheckResult object
        """

class MyDBHealthcheck(HealthcheckBaseExtension):
    def healthcheck():
        ...
        return HealthcheckResult(available=False,
                                 reason="Fail to connect to the database")

因此 setup.cfg 将具有如下 entry_point

[entry_points]
healthcheck =
    database = oslo.db:DBHealthcheck
    disable_by_file = oslo.middleware.healthcheck:DisableByFileHealthcheck

‘DisableByFileHealthcheck’ 扩展将在 ‘disable_by_file_path’ 文件缺失时返回

return HealthcheckResult(available=False, reason="DISABLED BY FILE")

否则

return HealthcheckResult(available=True, reason="")

此外,虽然不属于此蓝图,但 oslo.db 可以为数据库检查提供通用的实现。

备选方案

一些项目已经提出了相关工作,但从未合并

部署者可以在他们的云中准备资源,并构建 HTTP 请求来查询这些资源以检查一切是否正常工作,但这种方法效率不高,需要准备一些资源,HTTP 请求将包含需要存储在负载均衡器上的凭据。因此,当我们可以简单地在数据库中执行 ‘select now();’ 来知道后端是否正常工作时,这种方法有点繁重。

Impact on Existing APIs

Swift 已经有了这种中间件,我们必须确保保持相同的行为

https://github.com/openstack/swift/blob/master/swift/common/middleware/healthcheck.py

安全影响

建议阻止此 URL 或随机化用于健康检查的 URL,因为此功能明确专用于负载均衡器等部署者使用的工具。

性能影响

无。

Configuration Impact

中间件将是可配置的

  • path: 此中间件的 URL 路径(默认:/healthcheck)

  • backends: 要使用的 stevedore 扩展列表

以及 DisablebyfileHealthcheck,配置如下

  • disable_by_file_path 用于以管理方式返回 503 的文件的位置(可选)

开发人员影响

N/A

Testing Impact

中间件将由单元测试覆盖,并且每个集成了它的服务都将具有 tempest 测试。

实现

负责人

主要负责人

Mehdi Abaakouk (sileht)

其他贡献者

Julien Danjou (jdanjou)

里程碑

完成目标里程碑

  • Kilo-1

工作项

  • 编写中间件

  • 更新应用程序以使用它

孵化

N/A

文档影响

N/A

依赖项

参考资料

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode