你将创建的内容
你将创建一个名为 CloudPeek-Alarms 的 CloudWatch 控制面板,其中包含一个列出生产环境警报的警报状态小组件。处于 ALARM 状态的警报始终排在最前,因此你看到的正是需要你处理的那个。它在 CloudPeek 中的样子如下:
如果你的警报已经存在,大约需要五分钟。
想显示所有警报,又不想创建控制面板?在 CloudPeek 中,轻点创建小组件,选择预设,然后选择“日志和监控”下的警报或警报摘要。警报会按相同的顺序列出账户默认区域中的所有警报,你可以通过编辑为它重新命名,例如改为“生产环境警报”;警报摘要则统计警报数量,例如“2 个异常、20 个正常”。如果只想显示名称以相同文本开头(例如 prod-)的警报,请在预览中的显示下选择名称开头为…(请参阅仅显示部分)。如果添加了多个账户,可以在预览中选择所有账户,以涵盖每个账户以及你勾选的区域,每个账户一行,例如“prod:2 个异常 · staging:全部正常”(请参阅所有账户中的警报)。如果要逐个挑选警报,或显示来自多个区域的警报,请按下文创建控制面板。
开始之前
- 要监控的 CloudWatch 警报:同一账户任何区域中的指标警报或复合警报。
- CloudPeek 的访问权限。入门中的
CloudPeek策略已包含警报小组件所需的cloudwatch:DescribeAlarms。如果你已完成该设置,就可以开始了。 - 可以创建 CloudWatch 控制面板的登录身份,例如管理员。
费用。CloudWatch 免费套餐包含三个控制面板;超出部分每个控制面板每月 3 美元。警报小组件使用 DescribeAlarms 而不是 GetMetricData 刷新,因此不会增加指标费用:它按请求计费,而 CloudWatch 免费套餐涵盖每个账户每月的前一百万个请求。请参阅 CloudWatch 定价。
1. 创建控制面板
控制面板通过 ARN 列出警报,例如 arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors,其中包含警报的区域、账户和名称。
- 打开 CloudWatch › 警报 › 所有警报。对于每个需要的警报,打开它并从其详细信息中复制 ARN。
- 选择控制面板 › 创建控制面板。将其命名为
CloudPeek-Alarms,然后选择创建控制面板。如果打开了添加小部件窗口,请将其关闭。 - 选择操作 › 查看/编辑源,将源替换为下面的控制面板 JSON(用你的 ARN 替换示例 ARN),然后选择更新。
- 选择保存。
你也可以选择添加小部件 › 警报状态并勾选警报,而不是编辑源。然后在源中添加 "sortBy": "stateUpdatedTimestamp",使最近发生变化的警报排在最前。
列出名称以 prod- 开头的所有警报的 ARN:
aws cloudwatch describe-alarms \
--region us-east-1 \
--alarm-name-prefix prod- \
--query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
--output json
将它们放入 production-alarms.json(见下文)以替换示例,然后运行:
aws cloudwatch put-dashboard \
--region us-east-1 \
--dashboard-name CloudPeek-Alarms \
--dashboard-body file://production-alarms.json
或者使用 jq,一步根据这些警报创建控制面板:
aws cloudwatch describe-alarms \
--region us-east-1 \
--alarm-name-prefix prod- \
--query '[MetricAlarms[].AlarmArn, CompositeAlarms[].AlarmArn][]' \
--output json |
jq '{widgets: [{type: "alarm", x: 0, y: 0, width: 12, height: 6,
properties: {title: "Production alarms", sortBy: "stateUpdatedTimestamp", alarms: .}}]}' \
> production-alarms.json
aws cloudwatch put-dashboard \
--region us-east-1 \
--dashboard-name CloudPeek-Alarms \
--dashboard-body file://production-alarms.json
每次添加警报后,请再次运行。
如果你的警报在同一个模板中,请在 !Sub 中用 ${Alarm.Arn} 列出它们,这样控制面板始终与你部署的警报一致:
AlarmsDashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: CloudPeek-Alarms
DashboardBody: !Sub |
{
"widgets": [
{
"type": "alarm", "x": 0, "y": 0, "width": 12, "height": 6,
"properties": {
"title": "Production alarms",
"sortBy": "stateUpdatedTimestamp",
"alarms": [
"${ApiErrorsAlarm.Arn}",
"${QueueDepthAlarm.Arn}"
]
}
}
]
}
这里的 ApiErrorsAlarm 和 QueueDepthAlarm 是同一模板中的 AWS::CloudWatch::Alarm 资源。对于在其他地方定义的警报,请使用它们的 ARN 部署 cloudpeek-alarms.yaml:
Resources:
# sortBy puts the most recent change first within each state; CloudPeek always lists alarms in
# ALARM first. The ARNs are joined into a JSON array of strings.
Dashboard:
Type: AWS::CloudWatch::Dashboard
Properties:
DashboardName: !Ref DashboardName
DashboardBody: !Sub
- |
{
"widgets": [
{
"type": "alarm",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"title": "${WidgetTitle}",
"sortBy": "stateUpdatedTimestamp",
"alarms": [ "${Alarms}" ]
}
}
]
}
- Alarms: !Join ['", "', !Ref AlarmArns]
aws cloudformation deploy \
--stack-name CloudPeek-Alarms \
--template-file cloudpeek-alarms.yaml \
--parameter-overrides 'AlarmArns=arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors,arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth'
如果你的警报在同一个配置中,请列出它们的 arn 属性,这样控制面板始终与你应用的警报一致:
resource "aws_cloudwatch_dashboard" "alarms" {
dashboard_name = "CloudPeek-Alarms"
dashboard_body = jsonencode({
widgets = [{
type = "alarm", x = 0, y = 0, width = 12, height = 6
properties = {
title = "Production alarms"
sortBy = "stateUpdatedTimestamp"
alarms = [
aws_cloudwatch_metric_alarm.api_5xx.arn,
aws_cloudwatch_metric_alarm.queue_depth.arn,
]
}
}]
})
}
这里的 api_5xx 和 queue_depth 是同一配置中的 aws_cloudwatch_metric_alarm 资源。如果你使用 for_each 创建警报,请用 [for alarm in aws_cloudwatch_metric_alarm.prod : alarm.arn] 列出全部警报。对于在其他地方定义的警报,请使用它们的 ARN 应用 cloudpeek-alarms.tf:
variable "alarm_arns" {
description = "The ARNs of the alarms to list. Each ARN names its own region, so one widget can list alarms from several regions."
type = list(string)
validation {
condition = length(var.alarm_arns) > 0
error_message = "List at least one alarm ARN."
}
}
# sortBy puts the most recent change first within each state; CloudPeek always lists alarms in
# ALARM first.
resource "aws_cloudwatch_dashboard" "alarms" {
dashboard_name = var.dashboard_name
dashboard_body = jsonencode({
widgets = [
{
type = "alarm"
x = 0
y = 0
width = 12
height = 6
properties = {
title = var.widget_title
sortBy = "stateUpdatedTimestamp"
alarms = var.alarm_arns
}
},
]
})
}
alarm_arns = [
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors",
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth",
]
terraform init
terraform apply
2. 添加账户并固定小组件
- 打开 CloudPeek,在账户标签页上使用访问密钥或 IAM Identity Center 添加包含你的警报的账户。请参阅入门的第 2 步。
- 在账户标签页上,打开该账户,再打开 CloudPeek-Alarms 控制面板,然后轻点 Production alarms 上的固定。
- 将 CloudPeek 添加到主屏幕(请参阅主屏幕和锁定屏幕)。它最初显示你最后固定的小组件 Production alarms。中号会显示每个警报上次变化的时间;小号适合快速查看数量。
- 轻点小组件,即可查看每个警报、CloudWatch 给出的状态原因以及该状态的开始时间,还可以在 AWS 控制台中打开其中任何一个。在中号或大号小组件上,轻点某个警报可直接跳转到该屏幕中的这个警报。
结果:小组件会列出你的警报,处于警报状态的排在最前。在 iPhone 和 iPad 的锁定屏幕上,它会显示摘要,例如“1 个警报中”或“全部正常”。
控制面板详解
无论使用哪种工具,最终的控制面板都如下所示,只是其中是你自己的警报 ARN:
{
"widgets": [
{
"type": "alarm",
"x": 0,
"y": 0,
"width": 12,
"height": 6,
"properties": {
"title": "Production alarms",
"sortBy": "stateUpdatedTimestamp",
"alarms": [
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-5xx-errors",
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-worker-queue-depth",
"arn:aws:cloudwatch:us-east-1:123456789012:alarm:prod-api-high-cpu"
]
}
}
]
}
alarm小组件通过 ARN 列出警报,数量不限。"sortBy": "stateUpdatedTimestamp"会在每种状态内将最近发生变化的警报排在最前,在 CloudPeek 和 CloudWatch 控制台中均是如此。- 每个 ARN 都包含其区域,CloudPeek 会在各自的区域中查找每个警报,因此一个小组件可以列出来自多个区域的警报。
警报的排列顺序
- 在 CloudPeek 中,处于
ALARM状态的警报始终排在最前,然后是数据不足的警报,接着是找不到的警报,最后是正常的警报。如果警报多到显示不下,显示的将是需要你处理的那些。 - 如果没有
sortBy,控制台会按名称排列警报,而 CloudPeek 会保持它们的列出顺序,但处于ALARM状态的警报仍排在最前。 - 小号小组件显示摘要和前三四个警报。中号及更大的小组件会尽量多地显示,大号小组件约可显示十几个,每个警报都会注明其状态在多久前发生变化。其余的会计为还有 N 项。
- 小号小组件和锁定屏幕上的摘要会以红色显示 N 个警报中;所有警报都正常时以绿色显示全部正常;所有警报都还没有足够数据时显示无数据;部分警报没有数据或找不到时显示 N 个未知。
- 每个警报的符号表示其状态:请参阅警报列表。
在警报触发时收到通知
当警报小组件中的某个警报进入 ALARM 状态时,CloudPeek 可以发送通知,注明警报名称并给出 CloudWatch 提供的原因,例如“Threshold Crossed: 1 datapoint [12.0] was greater than the threshold (10.0).”。这适用于任何警报小组件:从控制面板固定的警报小组件(如 Production alarms),或警报和警报摘要预设,包括涵盖所有账户的预设,其中任何账户的警报开始触发时都会通知(请参阅所有账户中的警报)。
- 在小组件标签页上,轻点 Production alarms 以打开它的专属屏幕。
- 开启警报列表下方的警报触发时通知。
- 首次开启时,手机会询问是否允许 CloudPeek 向你发送通知(在 Android 上,从 Android 13 开始):轻点允许。
结果:开关已开启。当某次刷新发现小组件的某个警报处于警报状态,而上次刷新时并非如此,你会收到一条通知,例如“prod-api-5xx-errors 处于警报状态”。轻点通知即可打开该小组件的屏幕,其中显示每个警报的原因,以及指向 AWS 控制台中每个警报的链接。
通知来自小组件的刷新:由显示它的主屏幕小组件(包括列出它的概览小组件;在 iPhone 和 iPad 上还包括锁定屏幕小组件)刷新,或在 App 中刷新。请按照第 2 步将小组件保留在主屏幕上,否则只有在你打开 CloudPeek 时它才会刷新。
不能替代值班呼叫。通知来自小组件的刷新,因此速度取决于小组件的刷新频率:在 iPhone 和 iPad 上,间隔通常为数十分钟,在低电量模式下或你很少查看小组件时间隔更长;在 Android 上最多每 15 分钟一次,手机省电时间隔更长(请参阅小组件何时刷新)。打开 App 也会刷新小组件。对于需要在几分钟内有人处理的警报,请继续通过 Amazon SNS 或你的值班工具进行呼叫。
- 每个警报每次进入警报状态时只通知一次,无论有多少次刷新或多少个小组件发现它。开启通知时已处于警报状态的警报,会在下次触发时通知。从正常变为数据不足的警报并未触发,因此不会通知。
- 同时开始触发的警报不超过三个时,每个警报各发一条通知。超过三个时,会合并为一条列出所有警报名称的通知,例如“4 个警报处于警报状态”。
- 如果某个警报与小组件列出的另一个警报同名,通知会注明其区域;跨账户时,如果需要靠 AWS 账户 ID 来区分,还会注明账户 ID,例如“api-5xx (us-east-1, 222222222222) 处于警报状态”。
- 通知是在你的手机或平板电脑上根据小组件获取的数据生成的。不会向 CloudPeek 或推送服务发送任何内容,也不需要小组件尚未拥有的任何 AWS 权限。
- 移除小组件会关闭其通知,撤销则会重新开启。
- 如果在手机的“设置”中关闭了 CloudPeek 的通知,小组件的屏幕会显示“CloudPeek 的通知已关闭。在‘设置’中允许通知后即可收到通知。”在 iPhone 和 iPad 上,轻点打开设置,开启允许通知,然后返回 CloudPeek。在 Android 上,点按打开设置,这会打开 CloudPeek 的通知设置,开启通知后返回即可。
故障排除
警报显示为虚线圆圈
CloudPeek 找不到该警报。请检查 ARN 中的名称、区域和账户是否与警报完全一致:警报名称区分大小写。CloudPeek 会在你固定该小组件时所在的账户中查找警报,因此无法找到其他 AWS 账户中的警报;请将该警报放到那个账户的控制面板上,并将那个账户添加到 CloudPeek。
警报显示为问号
它还没有足够的数据供 CloudWatch 评估,与控制台中的情况相同。它会排在处于 ALARM 状态的警报之后。
CloudPeek 提示访问被拒绝
该登录身份需要 cloudwatch:DescribeAlarms。CloudPeek 策略和 AWS 托管的 CloudWatchReadOnlyAccess 策略中都包含该权限。
收不到通知
请检查该小组件是否已开启警报触发时通知,它的屏幕上是否没有显示通知已关闭,以及该小组件是否在你的主屏幕上(在 iPhone 和 iPad 上也可以是锁定屏幕),通知正是由这些小组件的刷新发出的。通知的频率取决于小组件的刷新频率,已处于警报状态的警报会在下次触发时通知。请参阅在警报触发时收到通知。
控制台中的顺序不同
如果没有 "sortBy": "stateUpdatedTimestamp",CloudWatch 控制台会按名称排列警报。将它添加到小组件的属性中,即可与 CloudPeek 一致。
其他问题
请参阅故障排除,或发送电子邮件至 support@cloudpeek.app。切勿向我们发送你的秘密访问密钥。