支持复合阈值规则告警

https://blueprints.launchpad.net/ceilometer/+spec/composite-threshold-rule-alarm

该提案旨在支持创建可以指定复合阈值规则的告警,并尝试取代组合告警。

问题描述

组合告警的设计目的是处理针对多个条件的触发告警。组合告警需要依赖其他告警,这些依赖的告警可以是阈值告警或组合告警。如果情况复杂,这将形成依赖链。ZhiQiang Fan 在蓝图[1]中描述了组合告警评估的一些潜在问题

  • 依赖链过长,导致组合告警的状态无法及时评估,在最坏的情况下,会导致组合告警永远无法更新。

  • 更新告警时会引入死循环,导致组合告警的状态无法正确设置。

  • 删除依赖告警时,依赖链会被破坏。

更多信息,请参阅:蓝图[1]和规范[2]

ZhiQiang Fan 通过 resolve-alarm-dependency-chain 提案[2] 为这些问题做了一些努力。该提案试图在 API 和告警评估器层检查和解决依赖链。为了解决上述问题,该提案的实现将非常复杂,并且考虑到告警评估器与分区协调器一起工作,情况会更糟,并且难以通过该提案解决。

提议的变更

该提案允许在创建阈值告警时指定多个阈值规则,并且阈值规则通过逻辑运算符组合:与、或。以下是新告警体的示例

{
    ......
    "threshold_rules": {
        "or": [{
            "type": "threshold" (or "gnocchi_threshold")
            "meter_name": "cpu_util",
            "evaluation_periods": 1,
            "period": 60,
            "statistic": "avg",
            "threshold": 0.8,
            "query": [{
                "field": "metadata.metering.stack_id",
                "value": "36b20eb3-d749-4964-a7d2-a71147cd8147",
                "op": "ge"
            }],
            "comparison_operator": "ge",
            "exclude_outliers": false
        },
        {
            "and": [{
                "type": "threshold" (or "gnocchi_threshold")
                "meter_name": "mem_util",
                "evaluation_periods": 1,
                "period": 60,
                "statistic": "avg",
                "threshold": 0.8,
                "query": [{
                    "field": "metadata.metering.stack_id",
                    "value": "36b20eb3-d749-4964-a7d2-a71147cd8147",
                    "op": "ge"
                }],
                "comparison_operator": "ge",
                "exclude_outliers": false
            },
            {
                "type": "threshold" (or "gnocchi_threshold")
                "meter_name": "disk.usage",
                "evaluation_periods": 1,
                "period": 60,
                "statistic": "avg",
                "threshold": 0.8,
                "query": [{
                    "field": "metadata.metering.stack_id",
                    "value": "36b20eb3-d749-4964-a7d2-a71147cd8147",
                    "op": "ge"
                }],
                "comparison_operator": "ge",
                "exclude_outliers": false
            }]
        }]
    }
}

该提案的变更项

  • 允许指定阈值规则列表,并使用两个逻辑运算符“与”、“或”组合阈值规则,请参见上面的示例。阈值规则的组合可以是多层级的,以支持复杂的场景。

  • 告警评估器将解析与运算符组合的告警阈值规则,并按照适当的顺序使用从 Ceilometer 查询的统计列表评估阈值条件。在此过程中,应考虑短路逻辑,以避免不必要的统计查询和比较。

  • 该提案不能应用于 EventAlarm,主要是因为事件告警评估不是周期性的,事件告警评估器监听消息总线,并且评估操作是由外部通知被动触发的。如果存在需要组合事件告警和阈值告警的告警用法,这将是不利的,但我更倾向于在用户端处理这种情况。这意味着如果用户希望在达到阈值并同时指定事件发生时触发告警,他们可以在上游应用程序中组合阈值告警和事件告警。

  • 同时考虑到上述缺点,旧的组合告警功能也将作为复合规则告警的补充保留,但需要添加文档来描述潜在问题。

这些更改将轻松解决上述问题,并希望取代组合告警。此外,此更改将减少我们云中告警定义的数量,因为当前,如果我们需要组合告警,我们可能需要首先创建依赖告警。对于最终用户来说,显示触发多个条件的告警比组合告警(需要连续查询依赖告警)也更方便。

替代方案

采用提案[2]并努力使其与分区协调器一起工作。

数据模型影响

  • “threshold_rules” 将是一个字典,可以包含多个阈值规则,并且字典的键将是“and”或“or”。但这不会影响数据模型,因为规则以 json 格式存储在数据库中。

REST API 影响

安全影响

Pipeline 影响

其他最终用户影响

性能/可扩展性影响

其他部署影响

开发者影响

实现

负责人

主要负责人

liusheng

其他贡献者

持续维护者

liusheng

工作项

  • 支持 Aodh API 以允许使用新的阈值规则定义创建告警,并希望 API 能够与以前的用法保持兼容。

  • 实现存储层中的相关更改

  • 更改阈值评估器以支持与告警关联的多个阈值规则和逻辑运算符。

未来生命周期

依赖项

测试

  • 现有的声明性测试和使用 gabbi 的新测试应该被更改/添加,以测试告警的 CRUD 操作。

  • 应该为新的阈值评估器过程添加单元测试。

文档影响

  • 应该更新 API 文档以添加关于此功能描述。

  • 应该更新用户指南以添加此用法描述。

参考资料

[1] https://blueprints.launchpad.net/ceilometer/+spec/resolve-combination-alarm-dependency-chain

[2] https://review.openstack.org/#/c/98047/