Amazon OpenSearch 服务还允许对数据执行异常检测。这使得 OpenSearch 能够随时间"学习"数据模式,在无需预先定义特定阈值的情况下提醒可能存在的异常情况。
我们将设置一个Detector来监控日志流中的错误。我们将使用 HTTP 状态代码,首先发送大部分为 200 状态代码的数据。然后,我们将更改模板,发送一半 200 和一半 5xx/4xx 代码。OpenSearch 将首先学习正常的、以 200 为主的状态代码。当我们添加错误代码时,我们将看到异常检测器触发。
首先,我们需要创建一个Detector。Detector是一个独立的异常检测任务。可以定义多个Detector,所有Detector可以同时运行,每个Detector都可以分析来自不同来源的数据。
打开 OpenSearch Dashboards 菜单,点击 Anomaly Detection 部分
点击 Create Detector:
名称和描述:
non-200-frequency
数据源:
索引: web-logs
@timestamp
在这里,我们正在定义异常检测器将监控的数据集,但我们还没有定义监控异常的条件。
配置完成后的效果:
检测器间隔: [1 分钟]
点击 下一步 按钮来配置模型参数
现在,我们需要配置模型中的特征。特征是我们想要检查异常的索引中的字段。Detector可以发现一个或多个特征的异常。我们必须为每个特征选择一种聚合方法: average()
、count()
、sum()
、min()
或max()
。聚合方法决定了什么构成异常。
特征:
status-count
count()
status
进入下一步Set up detector jobs
, 这一步保持默认:
单击 下一步 ,检查所有配置是否正确,单击 Create detector
此时,Detector将开始初始化。单击 Real-time results 选项卡查看任何检测到的异常的实时馈送(我们可能需要等待最多1分钟,直到Detector初始化完成)
在 Anomaly overview 部分,从查看过去7天切换到查看过去1小时,以便更好地查看结果
在设置好检测器和模型后,我们可以开始审查结果。
现在,增加发送到 OpenSearch 的非 200 事件的频率。快速停止 Kinesis Data Generator,粘贴以下模板,然后重新启动它:
{
"host": "{{internet.domainName}}",
"ident": "-",
"auth": "-",
"@timestamp": "{{date.utc("YYYY-MM-DDTHH:mm:ss")}}",
"bytes": {{random.number(1000000)}},
"verb": "{{random.weightedArrayElement(
{
"weights": [0.8,0.1,0.1],
"data": ["GET","PUT","POST"]
}
)}}",
"url": "{{internet.url}}",
"http": "HTTP/1.1",
"status": {{random.weightedArrayElement(
{
"weights": [0.5,0.25,0.25],
"data": ["200","404","503"]
}
)}},
"agent": "{{internet.userAgent}}",
"clientip": "{{internet.ip}}",
"geo": {
"src": "{{address.countryCode}}",
"dest": "{{address.countryCode}}",
"coordinates": {
"lat": "{{address.latitude}}",
"lon": "{{address.longitude}}"
}
}
}
这将把我们的状态消息从 90/5/5
的 200/404/503
状态消息分布改为 50/25/25
的分布,从而增加非 200 响应的频率,并创建一个明显的异常。
使用这些新的权重重新启动 KDG 后,我们可以通过转到 Discover 选项卡并发出以下查询来确认正在发送的非 200 消息的新速率: NOT status:200
在使用新的非 200 消息运行几分钟后,它应该看起来像这样:
几分钟后,我们应该会看到异常检测报告类似以下内容:
我们现在可以看到异常检测如何检测到值超出预期的"正常"范围。然后,我们可以设置这些异常的警报,以便在需要时采取行动。