异常检测 - Anomaly Detection

Amazon OpenSearch 服务还允许对数据执行异常检测。这使得 OpenSearch 能够随时间"学习"数据模式,在无需预先定义特定阈值的情况下提醒可能存在的异常情况。

我们将设置一个Detector来监控日志流中的错误。我们将使用 HTTP 状态代码,首先发送大部分为 200 状态代码的数据。然后,我们将更改模板,发送一半 200 和一半 5xx/4xx 代码。OpenSearch 将首先学习正常的、以 200 为主的状态代码。当我们添加错误代码时,我们将看到异常检测器触发。

设置Detector

首先,我们需要创建一个Detector。Detector是一个独立的异常检测任务。可以定义多个Detector,所有Detector可以同时运行,每个Detector都可以分析来自不同来源的数据。

打开 OpenSearch Dashboards 菜单,点击 Anomaly Detection 部分

点击 Create Detector:

image-20240616230836310

名称和描述:

  • 名称: non-200-frequency

image-20240616230929801

数据源:

索引: web-logs

  • 时间戳字段: @timestamp
  • 点击 Add filter 按钮
    • 字段: [status]
    • 运算符: [ is not]
    • : [200]

img

在这里,我们正在定义异常检测器将监控的数据集,但我们还没有定义监控异常的条件。

配置完成后的效果:

image-20240616231148252

检测器间隔: [1 分钟]

image-20240616231219588

点击 下一步 按钮来配置模型参数

模型设置

现在,我们需要配置模型中的特征。特征是我们想要检查异常的索引中的字段。Detector可以发现一个或多个特征的异常。我们必须为每个特征选择一种聚合方法: average()count()sum()min()max()。聚合方法决定了什么构成异常。

特征:

  • 特征名称: status-count
  • 聚合方法: count()
  • 字段: status

进入下一步Set up detector jobs, 这一步保持默认:

image-20240616231610666

单击 下一步 ,检查所有配置是否正确,单击 Create detector

此时,Detector将开始初始化。单击 Real-time results 选项卡查看任何检测到的异常的实时馈送(我们可能需要等待最多1分钟,直到Detector初始化完成)

Anomaly overview 部分,从查看过去7天切换到查看过去1小时,以便更好地查看结果

image-20240616231827324

结果检查

在设置好检测器和模型后,我们可以开始审查结果。

image-20240616232025438

现在,增加发送到 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/5200/404/503 状态消息分布改为 50/25/25 的分布,从而增加非 200 响应的频率,并创建一个明显的异常。

使用这些新的权重重新启动 KDG 后,我们可以通过转到 Discover 选项卡并发出以下查询来确认正在发送的非 200 消息的新速率: NOT status:200 在使用新的非 200 消息运行几分钟后,它应该看起来像这样:

几分钟后,我们应该会看到异常检测报告类似以下内容:

我们现在可以看到异常检测如何检测到值超出预期的"正常"范围。然后,我们可以设置这些异常的警报,以便在需要时采取行动。