

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 CloudWatch 复合警报进行故障检测
<a name="failure-detection-with-cloudwatch-composite-alarms"></a>

 在 CloudWatch 指标中，每个维度集都是一个唯一的指标，您可以为每个维度创建 CloudWatch 警报。然后，您可以创建 [Amazon CloudWatch 复合警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Create_Composite_Alarm.html)来汇总这些指标。

 为了准确检测撞击，本 paper 中的示例将为每个维度设置使用两种不同的 CloudWatch 警报结构。每个警报的**周期**都设置为一分钟，这意味着每分钟对该指标评估一次。第一种方法使用连续的三个超出阈值的数据点，具体来说是将**评估期**和**触发警报的数据点数**设置为三，即产生影响的时间总计三分钟。第二种方法是使用“M（最大为 N）”警报，如果将**评估期**设置为五，将**触发警报的数据点数**设置为三，表示在五分钟时段内任意 3 个数据点超出阈值。这样可以检测恒定信号以及短时间内波动信号。此处包含的持续时间和数据点数量仅供参考，请根据您的工作负载选择合适的值。

## 检测在单个可用区中的影响
<a name="detect-impact-in-a-single-availability-zone"></a>

 使用此构造时，可以考虑使用 `Controller`、`Action`、`InstanceId`、`AZ-ID` 和 `Region` 维度的工作负载。工作负载有两个控制器，即“产品”和“主页”，每个控制器各有一个操作，分别是“列表”和“索引”。它在 `us-east-1` 区域的三个可用区中运行。您将为每个可用区中的每个 `Controller` 和 `Action` 组合创建两个可用性警报，以及两个延迟警报。然后，您可以选择性地为每个 `Controller` 和 `Action` 组合创建可用性复合警报。最后，您创建一个复合警报，该警报汇总了可用区的所有可用性警报。请参见针对单个可用区 `use1-az1` 的以下图示，该可用区针对各个 `Controller` 和 `Action` 组合使用可选的复合警报（`use1-az2` 和 `use1-az3` 可用区也具有类似的警报，但为简单起见未显示）。

![\[该图显示了 use1-az1 中可用性复合警报的结构\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/composite-alarm-structure-availability.png)


 您还要根据后续图示为延迟构建类似的警报结构。

![\[该图显示了 use1-az1 中延迟复合警报的结构\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/composite-alarm-structure-latency.png)


在本部分的其余图示中，只有 `az1-availability` 和 `az1-latency` 复合警报将显示在顶层。这些复合警报（`az1-availability` 和 `az1-latency`）将告诉您工作负载的任何部分在特定可用区中是否存在可用性低于定义的阈值或延迟超过定义的阈值的情况。您可能还需要考虑测量吞吐量，以检测对您的工作负载在单个可用区中接收工作造成的影响。您也可以将金丝雀发出的指标生成的警报集成到这些复合警报中。这样，如果服务器端或客户端发现可用性或延迟受到影响，就会创建警报。

## 确保影响不是区域性的
<a name="ensure-the-impact-isnt-regional"></a>

另一组复合警报可用于确保只是隔离的可用区事件激活了警报。实现方法：确保某个可用区的复合警报处于 `ALARM` 状态时，其他可用区的复合警报仍处于 `OK` 状态。因此，您使用的每个可用区有一个复合警报。下图显示了一个示例（请注意，`use1-az2` 和 `use1-az3` 也有延迟警报和可用性警报：`az2-latency`、`az2-availability`、`az3-latency` 和 `az3-availability`，为简单起见，未为这些警报绘制图示）。

![\[该图显示了用于检测对单个隔离的 AZ 的影响的复合警报的结构\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/composite-alarm-structure-impact.png)


## 确保影响不是由单个实例造成的
<a name="ensure-the-impact-isnt-caused-by-a-single-instance"></a>

单个实例（或整个实例集的一小部分）会对可用性和延迟指标造成影响，严重程度各有差异，看上去对整个可用区都造成影响，而实际上并非如此。与撤离可用区相比，移除单个有问题的实例更快，且同样有效。

实例和容器通常被视为短暂资源，经常被诸如 [AWS Auto Scaling](https://aws.amazon.com/autoscaling/) 之类的服务所替代。每次创建新实例时都很难创建新的 CloudWatch 警报（但使用 [Amazon EventBridge 或 Amazon A EC2](https://docs.aws.amazon.com/autoscaling/ec2/userguide/cloud-watch-events.html) [uto Scaling 生命周期挂钩](https://docs.aws.amazon.com/autoscaling/ec2/userguide/lifecycle-hooks.html)肯定是可能的）。相反，您可以使用 “[CloudWatch 贡献者见解](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ContributorInsights.html)” 来确定可用性和延迟指标的贡献者数量。

例如，对于 HTTP Web 应用程序，您可以创建一条规则来识别每个可用区中 5xx HTTP 响应的最大贡献者。这将确定哪些实例导致了可用性下降（我们在上文中定义的可用性指标就是因为存在 5xx 错误的应对举措）。使用EMF日志示例，使用密钥创建规则`InstanceId`。然后，按 `HttpResponseCode` 字段筛选日志。此示例是 `use1-az1` 可用区的规则。

```
{
    "AggregateOn": "Count",
    "Contribution": {
        "Filters": [
            {
                "Match": "$.InstanceId",
                "IsPresent": true
            },
            {
                "Match": "$.HttpStatusCode",
                "IsPresent": true
            },
            {
                "Match": "$.HttpStatusCode",
                "GreaterThan": 499
            },
            {
                "Match": "$.HttpStatusCode",
                "LessThan": 600
            },
            {
                "Match": "$.AZ-ID",
                "In": ["use1-az1"]
            },
        ],
        "Keys": [
            "$.InstanceId"
        ]
    },
    "LogFormat": "JSON",
    "LogGroupNames": [
        "/loggroupname"
    ],
    "Schema": {
        "Name": "CloudWatchLogRule",
        "Version": 1
    }
}
```

CloudWatch 也可以根据这些规则创建警报。您可以使用[指标数学](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html)和带有 `UniqueContributors` 指标的 `INSIGHT_RULE_METRIC` 函数根据 Contributor Insights 规则创建警报。除了可用性之外，您还可以创建其他 Contributor Insights 规则，其中包含延迟或错误计数等指标的 CloudWatch 警报。这些警报可以与隔离的可用区影响复合警报一起使用，以确保单个实例不会激活警报。`use1-az1` 的 Contributor Insights 规则的指标可能会是下面这样：

```
 INSIGHT_RULE_METRIC("5xx-errors-use1-az1", "UniqueContributors") 
```

当该指标大于阈值（本示例中为 2）时，您可以定义警报。当 5xx 响应的独特贡献者超过该阈值时，表明影响来自两个以上的实例，警报就会被激活。此警报使用大于比较而不是小于比较的原因是为了确保独特贡献者数量为零时不会触发警报。这表示影响*不是*来自单个实例。您可以根据您的个人工作负载调整此阈值。一般要将该阈值设定为可用区中资源总数的 5% 或更高。如果样本量足够大，超过 5% 的资源受到影响可视为具有统计学显著性。

## 组合起来
<a name="putting-it-all-together"></a>

下图显示了单个可用区的完整复合警报结构：

![\[该图显示了用于确定单可用区影响的完整复合警报结构\]](http://docs.aws.amazon.com/zh_cn/whitepapers/latest/advanced-multi-az-resilience-patterns/images/composite-alarm-structure-complete.png)


 当指示隔离可用区延迟或可用性影响的复合警报 `use1-az1-aggregate-alarm` 处于 `ALARM` 状态且同一可用区中基于 Contributor Insights 规则的警报 `not-single-instance-use1-az1` 也处于 `ALARM` 状态（表示影响来自多个实例）时，会激活最终复合警报 `use1-az1-isolated-impact`。您将为您的工作负载使用的每个可用区创建此警报堆栈。

您可以在最后一个警报中附加[亚马逊简单通知服务](https://aws.amazon.com/sns/) (AmazonSNS) 警报。之前的所有警报都未配置操作。提醒可以通过电子邮件通知操作员，让其开始手动调查。它还可以启动自动撤离可用区。但是，请慎重设置对这些提醒的自动响应。撤离可用区后，应该达到以下效果：错误率增加的情况得到缓解，警报恢复到 `OK` 状态。如果影响发生在另一个可用区，自动化操作可能会撤出第二个或第三个可用区，进而可能移除工作负载的所有可用容量。执行自动化操作前，应检查是否已执行撤离操作。在成功撤离前，您可能还需要扩展其他可用区的资源。

当您向 MVC Web 应用程序或新的微服务添加新的控制器或操作，或者一般而言，添加要单独监控的任何其他功能时，您只需要在此设置中修改几个警报即可。您将为该新功能创建新的可用性和延迟警报，然后将其添加到相应的可用区对应的可用性和延迟复合警报（在此示例中分别为 `az1-availability` 和 `az1-latency`）。其余的复合警报在配置后保持静态。这样，引入新功能的过程变得更加简单。