教程:异常检测入门
Elastic Stack Serverless
准备好试用异常检测了吗?按照本教程进行操作:
- 试用数据可视化工具
- 为 Kibana 示例数据创建异常检测作业
- 使用结果识别数据中可能的异常
在本教程结束时,您应该对机器学习有一个很好的了解,并希望受到启发,使用它来检测您自己的数据中的异常。
需要更多上下文?查看Elasticsearch 简介,了解术语并理解 Elasticsearch 的基本工作原理。
在使用机器学习功能之前,您必须安装 Elasticsearch 和 Kibana。Elasticsearch 存储数据和分析结果。Kibana 提供了一个有用的用户界面来创建和查看作业。
提示您可以在自己的硬件或 Elastic Cloud 上运行 Elasticsearch 和 Kibana。 免费试用 Elastic Cloud。
验证您的环境是否已正确设置以使用机器学习功能。如果启用了 Elasticsearch 安全功能,要完成本教程,您需要一个有权管理异常检测作业的用户。请参阅设置和安全。
-
- 从 Kibana 主页,单击试用示例数据,然后打开其他示例数据集部分。
- 选择一个数据集。在本教程中,您将使用 示例 Web 日志。在这里时,您可以随意单击所有可用示例数据集上的 添加数据。
这些数据集现在可以在 Kibana 的机器学习作业中进行分析。
要从机器学习分析中获得最佳结果,您必须了解您的数据。您必须知道其数据类型以及值的范围和分布。数据可视化工具使您可以探索数据中的字段
在您的 Web 浏览器中打开 Kibana。如果您在本地运行 Kibana,请转到
http://localhost: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 日志 配置。 - 接受默认值,然后单击 创建作业。
该向导创建三个作业和三个数据馈送。
如果您想查看您的作业和数据源的所有配置详情,可以在 Machine Learning > Anomaly Detection > Jobs 页面上进行查看。或者,您也可以在 GitHub 上查看配置文件。不过,就本教程而言,这里是对每个作业目标的快速概述。
low_request_rate
使用low_count
函数查找异常低的请求速率。response_code_rates
使用count
函数,并按response.keyword
值对分析进行分区,以查找按 HTTP 响应代码划分的异常事件速率。url_scanning
使用high_distinct_count
函数,并对clientip
字段执行群体分析,以查找访问异常高数量的不同 URL 的客户端 IP。
下一步是查看结果,了解这些作业生成了哪些类型的洞察!
在数据源启动并且异常检测作业处理了一些数据后,您可以在 Kibana 中查看结果。
根据您机器的容量,您可能需要等待几秒钟,让机器学习分析生成初始结果。

机器学习功能分析输入数据流,对其行为进行建模,并根据每个作业中的检测器执行分析。当事件发生在模型之外时,该事件被识别为异常。您可以立即看到所有三个作业都发现了异常,这些异常在每个作业的泳道中用红色块表示。
Kibana 中有两个工具可以检查异常检测作业的结果:Anomaly Explorer 和 Single Metric Viewer。您可以通过单击左上角的图标在这些工具之间切换。您还可以编辑作业选择以检查不同的异常检测作业子集。
其中一个示例作业 (low_request_rate
) 是一个单指标异常检测作业。它有一个使用 low_count
函数的单个检测器和有限的作业属性。如果您想确定您网站上的请求速率何时显著下降,您可以使用这样的作业。
让我们首先在 Single Metric Viewer 中查看这个简单的作业。
- 在 Machine Learning 中选择 Jobs 选项卡以查看您的异常检测作业列表。
- 单击您的
low_request_rate
作业的 Actions 列中的图表图标,以在 Single Metric Viewer 中查看其结果。 - 使用日期选择器的相对模式选择过去一周的开始日期和未来一个月的结束日期,以覆盖大多数分析的数据点。

此视图包含一个图表,该图表表示随时间变化的实际值和预期值。仅当作业启用了 model_plot_config
时,此视图才可用。它只能显示单个时间序列。
图表中的蓝线代表实际数据值。阴影蓝色区域表示预期值的范围。上下界之间的区域是模型的最可能值,使用 95% 的置信水平。也就是说,实际值有 95% 的几率落在此范围内。如果值超出此区域,则通常会被识别为异常。
如果您从数据的开始到结束滑动时间选择器,您可以看到模型如何在处理更多数据时得到改进。一开始,预期值的范围相当广泛,并且模型没有捕捉到数据中的周期性。但它很快学会并开始反映您数据中的模式。
模型预测范围之外的任何数据点都标记为异常。为了提供结果的合理视图,将为每个桶时间间隔计算一个异常得分。异常得分是一个从 0 到 100 的值,表示与先前看到的异常相比,异常的显著性。高异常值以红色显示,低得分值以蓝色显示。具有高异常得分的间隔非常重要,需要进行调查。
将时间选择器滑动到包含红色异常数据点的时间序列部分。如果您将鼠标悬停在该点上,您可以看到更多信息。
您可能会注意到时间序列中有一个高峰。但是,它没有被突出显示为异常,因为此作业仅查找低计数。
对于每个异常,您可以在查看器的 Anomalies 部分中看到关键详细信息,例如时间、实际值和预期(“典型”)值及其概率。例如

在 Actions 列中,还有其他选项,例如 Raw data,它在 Discover 中生成相关文档的查询。您可以选择使用 自定义 URL 在操作菜单中添加更多链接。
默认情况下,该表包含时间线的选定部分中严重程度为“警告”或更高的所有异常。例如,如果您只对关键异常感兴趣,您可以更改此表的严重程度阈值。
Anomaly explanation 部分为您提供有关每个异常的更多见解,例如其类型和影响,以便更容易解释作业结果。
您可以选择通过在 Single Metric Viewer 中拖动选择一段时间并添加描述来注释您的作业结果。注释是指特定时间段内的事件的注释。它们可以由用户创建,也可以由异常检测作业自动生成,以反映模型更改和值得注意的事件。

在识别出异常后,下一步通常是尝试确定这些情况的上下文。例如,是否有其他因素导致了问题?异常是否仅限于特定的应用程序或服务器?您可以通过分层其他作业或创建多指标作业来开始排除这些情况。
从概念上讲,您可以将多指标异常检测作业视为运行多个独立的单指标作业。但是,通过将它们捆绑到多指标作业中,您可以查看作业中所有指标和所有实体的总体得分和共享影响因素。因此,多指标作业比拥有许多独立的单指标作业更具可扩展性。当您具有跨检测器共享的影响因素时,它们还可以提供更好的结果。
当您创建异常检测作业时,您可以将字段标识为影响因素。这些字段包含有关影响或导致异常的某人或某物的信息。response_code_rates
和 url_scanning
作业中都有影响因素。
最佳实践是不要选择太多影响因素。例如,您通常不需要超过三个。如果您选择许多影响因素,结果可能会让人不知所措,并且分析会产生少量开销。有关更多详细信息,请参阅 影响因素。
您还可以配置您的异常检测作业以基于分类字段将单个时间序列拆分为多个时间序列。例如,response_code_rates
作业具有一个检测器,该检测器基于 response.keyword
拆分数据,然后使用 count
函数来确定事件数量何时异常。如果您想查看按响应代码划分的高请求速率和低请求速率,您可以使用这样的作业。
让我们首先在 Anomaly Explorer 中查看 response_code_rates
作业
- 在 Machine Learning 中选择 Jobs 选项卡以查看您的异常检测作业列表。
- 在 Anomaly Explorer 中打开
response_code_rates
作业,方法是单击作业行中相应的图标以查看其结果。
对于这个特定的作业,您可以选择查看每个客户端 IP 或响应代码的单独泳道。例如

由于该作业使用 response.keyword
作为其分区字段,因此分析是分段的,以便您具有该字段的每个不同值的完全不同的基线。通过按实体查看时间模式,您可能会发现原本隐藏在汇总视图中的内容。
在异常时间线下,有一个包含注释的部分。您可以使用 Annotations 部分右侧的选择器来过滤事件的类型。

在 Anomaly Explorer 的左侧,有一个列表,其中包含同一时间段内所有检测到的异常的最高影响因素。该列表包括最大异常得分,在本例中,这些得分针对每个存储桶、跨所有检测器为每个影响因素聚合。还有一个每个影响因素的异常得分总和。您可以使用此列表来帮助您缩小导致因素的范围,并专注于最异常的实体。
单击泳道中的某个部分以获取有关该时间段内异常的更多信息。例如,单击 response.keyword
值为 404
的泳道中的红色部分

您可以看到发生异常的准确时间。如果作业中有多个检测器或指标,您可以看到哪个检测器捕获了异常。您还可以通过单击 Actions 菜单中的 View Series 按钮切换到在 Single Metric Viewer 中查看此时间序列。
在图表下方,有一个表格提供更多信息,例如典型值和实际值,以及导致异常的影响因素。例如

如果你的任务有多个检测器,该表格会聚合异常情况,以显示每个检测器和实体的最高严重性异常。实体是found for列中显示的字段值。要查看所有异常情况而不进行任何聚合,请将Interval设置为Show all
。
在此示例数据中,404 响应代码的激增受到特定客户端的影响。这种情况可能表明客户端正在访问不寻常的页面或扫描你的站点,以查看他们是否可以访问不寻常的 URL。这种异常行为值得进一步调查。
你在Anomaly Explorer的每个部分中看到的异常得分可能略有不同。出现这种差异的原因是,对于每个任务,都有桶结果、影响者结果和记录结果。为每种类型的结果生成异常得分。异常时间线使用桶级别的异常得分。顶部影响者列表使用影响者级别的异常得分。异常列表使用记录级别的异常得分。
最后的示例任务 (url_scanning
) 是一个群体异常检测任务。正如我们在 response_code_rates
任务结果中看到的那样,有些客户端似乎正在访问异常大量的 URL。url_scanning
示例任务提供了另一种方法来调查此类问题。它有一个使用 url.keyword
上的 high_distinct_count
函数的单个检测器,用于检测该字段中异常高数量的不同值。然后,它分析这种行为是否在客户端群体中有所不同,如 clientip
字段所定义的那样。
如果你在 Anomaly Explorer 中检查 url_scanning
异常检测任务的结果,你将注意到其图表的格式不同。例如

在这种情况下,每个客户端 IP 的指标都相对于每个桶中的其他客户端 IP 进行分析,我们可以再次看到 30.156.16.164
客户端 IP 的行为异常。
如果你想尝试另一个群体异常检测任务的示例,请添加示例电子商务订单数据集。它的 high_sum_total_sales
任务确定哪些客户相对于每个时间桶中的其他客户进行了异常大量的购买。在此示例中,为两个客户找到了异常事件

除了检测数据中的异常行为外,你还可以使用机器学习功能来预测未来行为。
要在 Kibana 中创建预测
在单指标查看器中查看你的任务结果(例如,对于
low_request_rate
任务)。要找到该视图,请单击 Anomaly Detection 页面上 Actions 列中的 View series 按钮。单击 Forecast。
为你的预测指定一个持续时间。此值表示超出处理的最后一个记录的推断范围。你必须使用时间单位。在此示例中,持续时间为一周 (
1w
)在单指标查看器中查看预测
图表中的黄色线代表预测的数据值。阴影黄色区域代表预测值的范围,这也给出了预测的可信度指示。请注意,范围通常随时间增加(也就是说,置信度降低),因为你正在更远地预测未来。最终,如果置信度太低,预测就会停止。
可选:将预测与实际数据进行比较。
当任务处理更多数据时,你可以再次单击 Forecast 按钮,并选择查看叠加在实际数据上的预测之一。然后,图表包含实际数据值、预期值的范围、异常、预测数据值和预测的范围。实际数据和预测数据的这种组合使你能够了解机器学习功能在推断数据的未来行为方面的能力。
如果你想查看 Kibana 示例数据的这种类型的比较(该数据具有有限数量的文档),你可以在创建预测之前重置任务并仅分析数据的子集。例如,从 Kibana 的 Job Management 页面重置你的一个异常检测任务,或使用 重置异常检测任务 API。当你为此任务重新启动数据源时,选择示例数据中间的日期作为搜索结束日期。默认情况下,当数据源到达该日期时,它将停止,并且异常检测任务将关闭。创建预测。然后,你可以重新启动数据源以处理剩余数据并生成此处显示的类型的结果。
Kibana 示例数据集具有相对于你添加数据集的时间的时间戳。但是,其中一些日期在将来。因此,为了本教程的目的,当你重新启动数据源时,请不要使用 No end time (Real-time search) 选项。指定适当的结束日期,以便立即处理所有数据。
既然你已经了解了使用示例数据创建预测是多么容易,请考虑你可能希望在自己的数据中预测哪种类型的事件。有关更多信息和想法,请参阅预测未来行为。
通过完成本教程,你已经学习了如何检测一组简单示例数据中的异常行为。你在 Kibana 中创建了异常检测任务,这会在底层为你打开任务并创建和启动数据源。你在 Kibana 的 Single Metric Viewer 和 Anomaly Explorer 中检查了机器学习分析的结果。你还通过创建预测来推断任务的未来行为。
如果你现在正在考虑异常检测对你自己的数据最有效,则需要考虑以下三件事
- 它必须是时间序列数据。
- 它应该是包含你业务或系统的运行状况、安全性或成功关键绩效指标的信息。你越了解数据,你就能越快地创建生成有用见解的任务。
- 理想情况下,数据位于 Elasticsearch 中,因此你可以创建一个数据源来实时检索数据。如果你的数据位于 Elasticsearch 之外,则无法使用 Kibana 创建任务,也无法使用数据源。
通常,最好从关键绩效指标的单指标异常检测任务开始。在你检查这些简单分析结果后,你将更好地了解影响因素可能是什么。你可以创建多指标任务并拆分数据,或者根据需要创建更复杂的分析函数。有关更复杂配置选项的示例,请参阅示例。
如果你想查找更多示例任务,请参阅提供的配置。特别是,有Apache和Nginx的示例任务,它们与本教程中的示例非常相似。
如果遇到问题,我们将竭诚为您服务。如果你是拥有支持合同的现有 Elastic 客户,请在Elastic 支持门户中创建工单。或者在Elastic 论坛中发帖。