亚马逊AWS官方博客

在 Amazon Elasticsearch Service 中设置警报

Original URL:https://aws.amazon.com/blogs/big-data/setting-alerts-in-amazon-elasticsearch-service/

客户经常使用 Amazon Elasticsearch Service 进行日志分析。Amazon ES 允许您从基础设施收集日志,将每个日志行转换为 JSON 文档,并将这些文档发送到批量处理 BULK API。转换后的日志行包含许多 字段,每个字段都包含多个 。例如,Apache Web 日志每行包含一个源 IP 地址字段、一个请求 URL 字段和一个状态代码字段(还有其他各种字段)。许多用户使用 Kibana 构建控制面板,直观监控其基础设施,显示应用程序使用情况、错误数或安全问题,这些问题从这些字段中的数据显而易见。例如,您可以将 HTTP 5xx 状态代码的计数绘制成图形,观察变化并对其做出反应。如果您看到 5xx 代码数量出现突增,则可能是您的某个服务器出现了问题。但是使用此系统,您必须手动监控 Kibana。4 月 8 日,Amazon ES 推出了事件监控和警报支持。要使用此功能,您可以使用带有 触发器(即您设置的特定触发条件,指示监视器何时发送警报)的 监控 Monitor(即事先安排的作业)。 警报是发生触发条件的通知。触发器触发时,监控 Monitor 将执行特定 操作(向 目标发送消息)。本文使用模拟的物联网 Device Farm 生成数据并将数据发送到 Amazon ES。

模拟器概览

该模拟包括几个重要部分:传感器和设备。

传感器

模拟器的核心类是 Sensor 类。设备上配有传感器,可以模拟不同的浮点值模式。调用每个传感器的 report 方法时,它会更新并返回其传感器的对应值。Sensor 有多个子类:

  • SineSensor:根据当前时间戳生成正弦波。
  • ConstSensor:生成常量值。该类包括一个随机的“模糊”因子,可以在特定值附近偏移。
  • DriftingSensor:允许在起始值的基础上连续、随机地偏移。
  • MonotonicSensor:通过随机模糊以恒定增量增加其值。

在本文中,我使用了 MonotonicSensor,它的值会不断增加,以强行突破我设置的警报阈值。

您可以通过通用唯一标识符 (UUID) 和它跟踪的指标的标签来确认传感器。Sensor 类的 report 函数会返回时间戳、传感器的 UUID、指标标签以及该时刻的指标值。

设备

设备是一组传感器的集合。在本文中,我创建了一组设备,用以模拟现场的 IoT 设备,测量温度和湿度,并发送设备的 CPU 信息。每个设备具有一个 report 方法,可递归调用所有传感器的 report 方法,并返回传感器报告的集合。我在 GitHub 上的 Open Distro for Elasticsearch 示例代码存储库中提供了代码。

我将某个设备的 CPU 传感器设置为不断向上偏移,来模拟设备中的问题。您可以在以下折线图中看到预期的“不良行为”:

在接下来的部分中,我设置了一个 CPU 使用率达到 90% 时触发的警报,以便我可以捕获并纠正这种情况。

先决条件

要继续使用此解决方案,您需要一个 AWS 账户。设置您自己的 Amazon ES 域,以构成配置监控和警报的基础。

第 1 步:设置目标

在 Amazon ES 中创建警报时,您可以分配一个或多个目标。目标是分发频道,您的域会在警报触发时发送通知。您可以使用 Amazon SNS、Slack 频道或 Amazon Chime 作为目标。也可以设置一个自定义 webhook (URL) 来接收消息。您可以设置标题和邮件正文,Amazon ES Alerts 会将邮件发布到目标 URL。

在此示例中,我使用 SNS 接收来自 Amazon ES 域的警报,但 Amazon ES 提供了许多用于设置主题和订阅的选项。我创建了主题以接收通知并订阅电子邮件分发主题。您的 SNS 主题可以有许多订阅,支持通过 HTTP/S 终端节点、电子邮件、Amazon SQS、AWS Lambda 和 SMS 分发。

要设置目标,请导航至 AWS 管理控制台。登录并打开 SNS 控制台。

选择主题创建主题

创建主题页面中,填写名称显示名称的值。我将两者都设置为 sensor-alerting。选择创建主题

现在订阅您的主题。您可以从主题页面执行此操作,因为在您创建完主题后,控制台会自动将您返回此页面。您也可以通过左侧导航窗格中的订阅选项卡来订阅。从主题页面中,选择创建订阅

创建订阅页面上,为协议部分选择电子邮件。在终端节点框中填写您的电子邮件地址,然后选择创建订阅。请记下此处的主题 ARN,您稍后会再次引用它。

最后,通过单击 SNS 发送给您的电子邮件中的确认链接来确认您的订阅。

第 2 步:设置角色

要让 Amazon ES 向您的主题发布警报,请创建具有相应权限的 IAM 角色。在开始之前,请从第 1 步中的 SNS 主题页面复制主题 ARN。

您的角色包含两部分:可信实体和承担该角色的实体的权限。控制台不支持使用 Amazon ES 作为可信实体创建角色。使用 EC2 作为可信实体创建角色,然后编辑 JSON 信任文档以更改实体。

在 AWS 管理控制台中,打开 IAM 控制台并依次选择角色创建角色

创建角色页面上,选择 AWS 服务EC2。选择下一步: 权限

在权限页面上,选择创建策略。此操作会将您带到创建策略的新窗口。不要关闭原来的选项卡,因为您稍后会返回该窗口。

您在此步骤创建的策略会定义承担该角色的实体的权限。添加策略文档,允许各种实体(在本例中为 Amazon ES)发布到您的 SNS 主题。

创建策略页面上,选择 JSON 选项卡,并复制粘贴以下代码来替换 JSON 文本。将代码中的 sns-topic-arn 替换为您之前创建的主题的 ARN。完成此操作后,选择查看策略

{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "sns-topic-arn"
}]
}

查看策略页面上,为您的策略命名。在此示例中,我设置为 SensorAlertingPolicy。选择创建策略

返回创建角色窗口或选项卡。使用刷新按钮重新加载策略,并在搜索框中键入策略的名称。选中策略旁边的复选框。依次选择下一步: 标签下一步: 查看。您还可以添加标签,以便更轻松地搜索您的角色。

在“查看”页面上,为您的角色命名。在此示例中,我使用了 SensorAlertingRole。选择创建角色

要将角色的可信实体更改为 Amazon ES,请在 IAM 控制台中选择角色。在搜索框中键入 SensorAlertingRole,然后选择链接(而不是复选框)以查看该角色。依次选择信任关系编辑信任关系

编辑策略文档代码,使用 es.amazonaws.com 替换 ec2.amazonaws.com。完成后的策略文档应类似于以下代码示例:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

选择更新信任策略。记下您的角色 ARN,因为您会再次引用它。

第 3 步:设置 Amazon ES 警报

我将我的 IoT 传感器模拟器指向我的 Amazon ES 域。这会创建作为监视器和警报基础的数据。要亲自执行此操作,请在浏览器中导航到 Kibana 终端节点,然后在左侧导航窗格中选择警报。在窗口顶部,依次选择目标添加目标

添加目标对话框中,为目标命名。在类型部分,选择 SNS,并将 SNS 主题 ARN 设置为您在第 1 步中创建的主题 ARN。将 IAM 角色 ARN 设置为您在第 2 步中创建的角色 ARN。选择创建。您可以根据需要设置多个目标,以便在出现问题时提醒多个人。

第 4 步:设置监控

Open Distro for Amazon ES 中的监控支持指定要监控的值。您可以通过图形方式或通过指定 Amazon ES 查询来选择值。首先定义监视器,然后为监视的值定义触发器。

在 Kibana 中,依次选择监控创建监控

为您的监控命名。我将监控命名为 Device CPUs。您可以将频率设置为某个预定义的时间间隔,或使用 cron 表达式进行更精细的控制。我选择的是每隔 1 分钟

滚动到页面的定义监控部分。使用此组控件指定要监控的值。您可以为一个索引多个索引时间字段输入值并输入目标值。从您想如何定义监控?列表中,选择使用可视图表定义。您还可以输入使用提取查询定义的信息,这允许您提供生成要监控的值的查询。对于简单的阈值,可视界面快速简便。

从列表中选择要监控的索引值。该列表包含单个索引。要使用通配符,您还可以在文本框中键入。对于要注册的值,必须在键入索引名称后按 Enter 键(例如,“logs-*” <enter>)。

从列表中选择时间字段的值。这会在图表顶部显示几个选择器。选择 Count() 并打开菜单以查看计算值的汇总。选择 max(),然后在选择字段部分选择 CPU。最后,将 FOR THE LAST 设置为 5 分钟。选择创建

您可以直观地创建监视器或提供查询以生成要监控的值。

我选择了 logs-* 索引来监控 CPU 字段的最大值,但此操作尚未创建一个触发器。选择创建。这将打开定义触发器页面。

第 5 步:创建触发器

创建触发器时,可以为要监控的字段指定阈值。当该字段的值超过阈值时,监视器会进入活动状态。我创建了一个名为 CPU Too High 的触发器,阈值为 90,严重性级别为 1。

设置触发条件后,可以设置 Amazon ES 要执行的操作。

要添加操作,请滚动页面。我添加了一项操作,用于向我的 SNS 主题发送消息,包括监控名称、触发器、严重性以及警报激活的时间段。您可以使用 Mustache 脚本为您收到的消息创建模板。

添加完操作后,请选择页面底部的创建

总结

当您返回警报控制面板后,您将看到警报处于已完成状态。警报可以处于各种不同的状态已完成表示监视器成功查询目标,并且未触发该触发器。

为使警报达到活动状态,我发送了某台 CPU 使用率从 50% 上升到 100% 的故障设备的模拟传感器数据。在这个数值达到 90% 时,我收到了以下电子邮件:

小结

在本文中,我演示了如何使用 Amazon ES 警报功能帮助您监控日志文件中的关键数据,以便在问题初现端倪时快速做出反应。通过识别 KPI、设置阈值并向第一应急响应者发出警报,您可以缩短关键问题的响应时间。

如果您有任何问题或反馈,请在下面留言,或在 Twitter 上联系我们!


关于作者

Jon Handler (@_searchgeek) 是总部位于加利福尼亚州帕罗奥图市的 Amazon Web Services 的首席解决方案架构师。Jon 与 CloudSearch 和 Elasticsearch 团队密切合作,为想要将搜索工作负载迁移到 AWS 云的广大客户提供帮助和指导。在加入 AWS 之前,Jon 作为一名软件开发人员,曾为某个大型电子商务搜索引擎编写代码长达四年。