教程:开始使用异常检测
Elastic Stack Serverless
准备好试用异常检测了吗?请遵循本教程,以
- 试用 数据可视化工具
- 为 Kibana 示例数据创建异常检测作业
- 使用结果来识别数据中的潜在异常
在本教程结束时,您应该对机器学习有一个很好的了解,并希望从中获得启发,以便将其用于检测自己数据中的异常。
需要更多背景信息?查看 Elasticsearch 简介,了解术语并掌握 Elasticsearch 的基本工作原理。
在使用机器学习功能之前,您必须安装 Elasticsearch 和 Kibana。Elasticsearch 存储数据和分析结果。Kibana 提供了一个有用的用户界面,用于创建和查看作业。
提示您可以在自己的硬件上或 Elastic Cloud 上运行 Elasticsearch 和 Kibana。 免费试用 Elastic Cloud。
验证您的环境是否已正确设置为使用机器学习功能。如果启用了 Elasticsearch 安全功能,则要完成本教程,您需要一个有权管理异常检测作业的用户。请参阅 设置和安全。
-
- 在 Kibana 主页上,点击 试用示例数据,然后打开 其他示例数据集 部分。
- 选择一个数据集。在本教程中,您将使用 示例 Web 日志。在此期间,请随时点击所有可用示例数据集上的 添加数据。
这些数据集现在已准备好在 Kibana 的机器学习作业中进行分析。
为了从机器学习分析中获得最佳结果,您必须了解您的数据。您必须知道其数据类型以及值的范围和分布。数据可视化工具使您能够探索数据中的字段
在 Web 浏览器中打开 Kibana。如果您在本地运行 Kibana,请访问
https://:5601/。提示Kibana 机器学习功能使用弹出窗口。您必须配置 Web 浏览器,使其不阻止弹出窗口,或者为您的 Kibana URL 创建一个例外。
从主菜单打开 机器学习,或使用 全局搜索字段。
选择 数据可视化工具 选项卡。
点击 选择数据视图 并选择
kibana_sample_data_logs数据视图。使用时间过滤器选择您感兴趣的时间段。或者,点击 使用全部数据 查看完整的时间范围数据。
可选:您可以更改随机采样行为,该行为会影响数据可视化工具中使用的每个分片的文档数量。您可以使用自动随机采样来平衡准确性和速度,手动采样(您可以选择采样百分比的值),或者关闭该功能以使用完整数据集。Kibana 示例数据中的文档数量相对较少,因此您可以关闭随机采样。对于较大的数据集,请记住使用较大的样本量会增加查询运行时间并增加集群的负载。
探索数据可视化工具中的字段。
您可以按字段名称或 字段类型 筛选列表。数据可视化工具显示选定时间段内样本中的文档包含每个字段的数量。
特别是,请查看
clientip、response.keyword和url.keyword字段,因为我们将在异常检测作业中使用它们。对于这些字段,数据可视化工具提供了不同值的数量、最常见值的列表以及包含该字段的文档数量和百分比。例如
对于数值字段,数据可视化工具提供有关最小值、中值、最大值和最常见值、不同值的数量以及它们分布的信息。您可以使用分布图更好地了解值在数据中的聚集方式。例如
记下 @timestamp 字段中的日期范围。它们相对于您添加示例数据的时间,您将在本教程稍后需要这些信息。
现在您已经熟悉了 kibana_sample_data_logs 索引中的数据,您可以创建一些异常检测作业来分析它。
您可以在异常检测向导中查看可选择字段的统计信息。显示在弹出窗口中的字段统计信息提供了更有意义的上下文,以帮助您选择相关字段。
此页面上的结果可能与您使用示例数据集时获得的实际值有所不同。这是预期行为,因为数据集中的数据点可能会随时间而变化。
Kibana 示例数据集包含一些预配置的异常检测作业供您使用。您可以使用以下任一方法添加作业
- 在 Kibana 主页上加载示例 Web 日志数据集后,点击 查看数据 > ML 作业。
- 在机器学习应用程序中,当您在 数据可视化工具 或 异常检测 作业向导中选择
kibana_sample_data_logs数据视图时,它会建议您使用其已知配置创建作业。选择 Kibana 示例 Web 日志 配置。 - 接受默认值,然后点击 创建作业。
该向导会创建三个作业和三个数据馈送。
如果您想查看作业和数据馈送的所有配置详细信息,可以在 机器学习 > 异常检测 > 作业 页面上进行。或者,您可以在 GitHub 中查看配置文件。但是,为了本教程的目的,这里对每个作业的目标进行了简要概述
low_request_rate使用low_count函数来查找异常低的请求率response_code_rates使用count函数并通过response.keyword值对分析进行分区,以查找 HTTP 响应代码异常的事件率url_scanning使用high_distinct_count函数并对clientip字段执行总体分析,以查找访问异常高 URL 数量的客户端 IP
下一步是查看结果并了解这些作业生成了哪些类型的见解!
在数据馈送启动并异常检测作业处理了一些数据后,您可以在 Kibana 中查看结果。
根据您的机器容量,您可能需要等待几秒钟,机器学习分析才能生成初始结果。
机器学习功能分析输入的数据流,对其行为进行建模,并根据每个作业中的检测器执行分析。当事件发生在模型之外时,该事件被识别为异常。您会立即看到所有三个作业都找到了异常,它们在每个作业的泳道中用红色块表示。
Kibana 中有两种用于检查异常检测作业结果的工具:异常探测器 和 单指标查看器。您可以通过点击左上角的图标在这些工具之间切换。您还可以编辑作业选择以检查不同的异常检测作业子集。
其中一个示例作业(low_request_rate)是一个单指标异常检测作业。它有一个使用 low_count 函数的检测器,并且作业属性有限。如果您想确定您的网站请求率何时显着下降,可以使用类似这样的作业。
让我们开始在 单指标查看器 中查看这个简单的作业
- 在 机器学习 中选择 作业 选项卡,查看异常检测作业列表。
- 点击
low_request_rate作业的 操作 列中的图表图标,在 单指标查看器 中查看其结果。 - 使用日期选择器的相对模式,选择一周前作为开始日期,一个月后作为结束日期,以覆盖大部分已分析数据点。
此视图包含一个图表,该图表随时间表示实际值和预期值。仅当作业启用了 model_plot_config 时才可用。它只能显示一个时间序列。
图表中的蓝色线表示实际数据值。蓝色的阴影区域表示预期值的边界。上限和下限之间的区域是模型最可能的值,使用 95% 的置信度。也就是说,实际值有 95% 的几率落在这些边界内。如果值超出此区域,通常会被识别为异常。
如果您从头到尾滑动时间选择器,您可以看到模型如何随着处理更多数据而改进。一开始,预期的值范围相当宽,模型没有捕捉到数据的周期性。但它很快就学会了,并开始反映您数据中的模式。
超出模型预测范围的任何数据点都被标记为异常。为了提供有意义的结果视图,会为每个分桶时间间隔计算一个异常分数。异常分数是一个 0 到 100 的值,表示异常与先前看到的异常相比的重要性。高度异常的值以红色显示,低分值以蓝色指示。高异常分数的时间间隔很重要,需要进行调查。
将时间选择器滑动到包含红色异常数据点的时间序列部分。如果您将鼠标悬停在该点上,您可以看到更多信息。
您可能会注意到时间序列中的高尖峰。然而,它并没有被标记为异常,因为这个作业只查找低计数。
对于每个异常,您可以在查看器的 异常 部分看到关键详细信息,例如时间、实际值和预期值(“典型”值)以及它们的概率。例如
在 操作 列中,有其他选项,例如 原始数据,它会为 发现 中相关的文档生成查询。您还可以使用 自定义 URL 在操作菜单中添加更多链接。
默认情况下,该表包含所选时间轴段中严重性为“警告”或更高的所有异常。例如,如果您只对严重异常感兴趣,您可以更改此表的严重性阈值。
异常解释 部分提供了关于每个异常的更多见解,例如其类型和影响,以便更容易解释作业结果。
您可以通过在 单指标查看器 中通过拖动选择一个时间段并添加描述来选择性地注释您的作业结果。注释是引用特定时间段内事件的说明。它们可以由用户创建,也可以由异常检测作业自动生成,以反映模型更改和值得注意的事件。
在识别出异常之后,通常下一步是尝试确定这些情况的上下文。例如,是否有其他因素导致了问题?异常是否仅限于特定的应用程序或服务器?您可以通过叠加其他作业或创建多指标作业来开始解决这些情况。
从概念上讲,您可以将多指标异常检测作业视为运行多个独立的单指标作业。但是,通过将它们捆绑在多指标作业中,您可以看到作业中所有指标和所有实体的总体分数和共享影响因素。因此,多指标作业比许多独立的单指标作业具有更好的可伸缩性。当存在跨检测器共享的影响因素时,它们也能提供更好的结果。
在创建异常检测作业时,您可以将字段标识为影响因素。这些字段是您认为包含有关某人或某事影响或导致异常的信息的字段。response_code_rates 和 url_scanning 作业中都存在影响因素。
作为最佳实践,不要选择太多的影响因素。例如,您通常不需要超过三个。如果您选择了许多影响因素,结果可能会令人不知所措,并且分析会产生少量开销。有关更多详细信息,请参阅 影响因素。
您还可以配置您的异常检测作业,根据分类字段将单个时间序列分割成多个时间序列。例如,response_code_rates 作业有一个检测器,该检测器根据 response.keyword 分割数据,然后使用 count 函数来确定事件数量何时异常。如果您想按响应代码查看高低请求率,可以使用类似这样的作业。
让我们开始在 异常探测器 中查看 response_code_rates 作业
- 在 机器学习 中选择 作业 选项卡,查看异常检测作业列表。
- 在异常探测器中打开
response_code_rates作业,以通过点击作业行中对应的图标来查看其结果。
对于这个特定的作业,您可以选择为每个客户端 IP 或响应代码显示单独的泳道。例如
由于该作业使用 response.keyword 作为其分区字段,因此分析被分割,以便您为该字段的每个不同值都有完全不同的基线。通过查看每个实体的时间模式,您可能会发现一些在汇总视图中被隐藏的内容。
在异常时间轴下方,有一个包含注释的部分。您可以使用 注释 部分右侧的选择器来按事件类型筛选。
在 异常探测器 的左侧,列出了同一时间段内所有检测到的异常的顶级影响因素。列表包括最大异常分数,在本例中,这些分数按每个影响因素、每个分桶、跨所有检测器进行聚合。还有每个影响因素的异常分数的总和。您可以使用此列表来帮助您缩小导致因素并专注于最异常的实体。
点击泳道中的一个区域,以获取有关该时间段内异常的更多信息。例如,点击 404 的 response.keyword 值的泳道中的红色区域
您可以看到异常发生的精确时间。如果作业有多个检测器或指标,您可以查看是哪个检测器捕捉到了异常。您还可以通过点击 操作 菜单中的 查看系列 按钮,切换到在 单指标查看器 中查看此时间序列。
图表下方有一个表格,提供了更多信息,例如典型值和实际值,以及导致异常的影响因素。例如
如果您的作业有多个检测器,该表将聚合异常,显示每个检测器和实体(在 发现于 列中显示的字段值)的最高严重性异常。要查看所有异常而不进行任何聚合,请将 间隔 设置为 显示全部。
在此示例数据中,404 响应代码的尖峰受到特定客户端的影响。这种情况可能表明该客户端正在访问异常页面或扫描您的站点以查看其是否可以访问异常 URL。这种异常行为值得进一步调查。
您在 异常探测器 的每个部分看到的异常分数可能略有不同。这种差异发生是因为每个作业都有分桶结果、影响因素结果和记录结果。为每种结果类型生成异常分数。异常时间轴使用分桶级别的异常分数。顶级影响因素列表使用影响因素级别的异常分数。异常列表使用记录级别的异常分数。
最后一个示例作业(url_scanning)是一个总体异常检测作业。正如我们在 response_code_rates 作业结果中看到的,有些客户端似乎在访问异常多的 URL。url_scanning 示例作业提供了另一种调查该类型问题的方法。它有一个检测器,该检测器对 url.keyword 使用 high_distinct_count 函数来检测该字段中异常高的不同值数量。然后,它分析该行为在客户端总体(由 clientip 字段定义)中是否有所不同。
如果您在 异常探测器 中检查 url_scanning 异常检测作业的结果,您会注意到其图表格式有所不同。例如
在这种情况下,每个客户端 IP 的指标相对于每个分桶中的其他客户端 IP 进行分析,我们再次可以看到 30.156.16.164 客户端 IP 的行为异常。
如果您想尝试另一个总体异常检测作业的示例,请添加示例电子商务订单数据集。其 high_sum_total_sales 作业确定了哪些客户相对于每个时间分桶中的其他客户进行了异常数量的购买。在此示例中,为两位客户找到了异常事件
除了检测数据中的异常行为外,您还可以使用机器学习功能来预测未来的行为。
要在 Kibana 中创建预测
在 单指标查看器 中查看您的作业结果(例如,针对
low_request_rate作业)。要找到该视图,请在 异常检测 页面的 操作 列中点击 查看系列 按钮。点击 预测。
指定预测的持续时间。此值表示要超出最后一个已处理记录多远。您必须使用 时间单位。在此示例中,持续时间为一周 (
1w)
在 单指标查看器 中查看预测
图表中的黄色线表示预测的数据值。黄色的阴影区域表示预测值的边界,这也表明了预测的置信度。请注意,边界通常随时间增加(也就是说,置信度降低),因为您正在预测更远的未来。最终,如果置信度太低,预测就会停止。
可选:将预测与实际数据进行比较。
随着作业处理更多数据,您可以再次点击 预测 按钮,并选择将其中一个预测叠加在实际数据上。然后,图表将包含实际数据值、预期值的边界、异常、预测数据值以及预测的边界。这种实际数据和预测数据的组合让您能够了解机器学习功能在多大程度上可以推断数据的未来行为。
如果您想查看 Kibana 示例数据的这种比较,它具有有限数量的文档,您可以重置作业,在创建预测之前只分析一部分数据。例如,从 Kibana 的 作业管理 页面重置您的一个异常检测作业,或使用 重置异常检测作业 API。当您重新启动此作业的数据馈送时,选择样本数据中间的某个日期作为搜索结束日期。默认情况下,数据馈送在到达该日期时停止,异常检测作业关闭。创建预测。然后,您可以重新启动数据馈送以处理剩余数据并生成此处所示的结果类型。
Kibana 示例数据集中的时间戳相对于您添加数据集的时间。但是,其中一些日期是未来的。因此,为了本教程的目的,当您重新启动数据馈送时,请不要使用 无结束时间(实时搜索) 选项。指定适当的结束日期,以便立即处理所有数据。
既然您已经了解了使用示例数据创建预测有多么容易,那么请考虑您可能想要预测自己数据中的哪些类型的事件。有关更多信息和想法,请参阅 预测未来行为。
通过完成本教程,您已经学会了如何在一个简单的示例数据集上检测异常行为。您在 Kibana 中创建了异常检测作业,Kibana 在后台为您打开作业并创建和启动数据馈送。您在 Kibana 的 单指标查看器 和 异常探测器 中检查了机器学习分析的结果。您还通过创建预测来推断作业的未来行为。
如果您现在正在考虑异常检测对您自己的数据最有价值的地方,有三件事需要考虑
- 它必须是时间序列数据。
- 它应该包含对您的业务或系统的健康、安全或成功至关重要的关键绩效指标 (KPI) 的信息。您对数据的了解越深入,就能越快地创建能生成有用洞察的作业。
- 理想情况下,数据位于 Elasticsearch 中,因此您可以创建一个实时检索数据的 datafeed。如果您的数据不在 Elasticsearch 中,则无法使用 Kibana 来创建作业,也无法使用 datafeeds。
通常,最好先为您的关键绩效指标创建单一指标异常检测作业。在检查了这些简单的分析结果后,您将对可能影响因素有更好的了解。您可以根据需要创建多指标作业,拆分数据或创建更复杂的分析函数。有关更复杂配置选项的示例,请参阅 示例。
如果您想查找更多示例作业,请参阅 随附配置。特别是,有一些适用于 Apache 和 Nginx 的示例作业,它们与本教程中的示例非常相似。
如果您遇到问题,我们将竭诚为您服务。如果您是拥有支持合同的现有 Elastic 客户,请在 Elastic 支持门户中创建工单。或者,您也可以在 Elastic 论坛上发帖提问。