概念

在本文中,我们将介绍 Timeseries Insights API 中常见的概念,并尝试直观地说明它们的含义。

事件

事件是数据点,也是 Timeseries Insights API 处理的原始输入。从概念上讲,它表示某个代理执行的操作(例如客户端的交易或新闻报道的发布),或某项观察(例如温度传感器的读数或机器上的 CPU 使用率)。

事件包含:

  • 不同维度的一组值,表示用于描述事件的属性,例如标签或数值测量。
  • 表示事件发生时间的时间戳。在汇总事件以形成时序时,系统会使用此时间戳。
  • 群组 ID。

维度

维度表示数据集中事件的属性类型及其可取值的域。维度可以是:

  • 分类。此维度上的事件属性可以包含有限/有限的值之一(通常是字符串)。例如:包含新闻报道的数据集中的国家/地区或发布商名称,包含生产监控数据的数据集中的机器名称。
  • 数值。事件的衡量值或一般数字属性。示例:新闻报道的网页浏览量、生产环境监控数据的 CPU 使用率或错误数量。

数据集

数据集是指在项目中具有唯一名称的事件集合。查询在同一数据集中执行。

群组

您可以通过指定相同的组 ID(请参阅 Event.groupId)将事件分组。该组类似于互联网活动的“会话”。

最常见的是,为每个事件记录分配一个唯一的组 ID。群组 ID 的用例还包括但不限于:

  • 来自多个 Event 记录的同一事件(具有相同或相似时间戳)的事件标识符,尤其是当同一事件的不同属性来自不同的来源且在进入系统之前未合并时。例如,监控同一设备的多个传感器可以各自生成单独的事件记录。
  • 一组相关事件(通常具有短时间内的时间戳)的会话标识符。例如,网络浏览会话中的活动。另一个示例是出租车行程的日志条目。
  • 用户账号标识符,因此具有相同组 ID 的所有事件记录都属于同一用户。

该组的用途是计算同一组事件(维度)之间的相关性。例如,如果您的数据集包含监控数据(例如 CPU、RAM 等),则一个组可以包含来自一个进程的所有监控数据。这样,我们最终就能检测到 CPU 使用率增加与其他事件(例如之前某个时间点的二进制版本更新)相关。

如果不确定,或者不想计算这类相关性,则每个事件都应具有全局唯一的组 ID。省略 groupId 也会产生类似的效果,系统会根据内容和时间戳生成内部 groupId

切片

切片是指数据集中所有事件的子集,这些事件在某些维度中具有某些给定值。对于分类维度,给定值是单个固定值;对于数值维度,给定值是范围。

例如,假设我们有一个数据集,其中包含某个国际零售商的销售数据,并且每个事件都是具有以下分类维度的销售:销售发生的国家/地区、产品名称、生产产品的公司名称。在本例中,slice 示例包括:给定产品的所有销售额、给定公司生产的所有产品在给定国家/地区的所有销售额。

时间序列

我们所处理的时序是离散时序,由等时间间隔的数据点组成。连续时序点之间的时间间隔长度称为时序的粒度

时序的计算方式如下:

  • 对于给定 slice,收集 [detectionTime - TimeseriesParams.forecastHistory, detectionTime + granularity] 时间间隔内的所有事件。
  • 根据时间戳和粒度对这些事件进行分组。如果 E.eventTime 位于 [T, T + granularity] 时间间隔内,系统会将事件 E 分配给从时间 T 开始的点。
  • 针对时序中的每个时间点,根据指定的数值维度作为指标 (TimeseriesParams.metric) 汇总事件,该指标代表这些时间点的值。聚合可以通过统计(如果未指定 metric,通常是事件的所有维度都是分类维度)、求和或求平均值(如果指定了 metric)来完成。

时间序列点

每个时序点都有一个关联的时间

time 实际上是长度为 granularity 且以 time 为开始时间的间隔。

如果指定了指标 (TimeseriesParams.metric),则该指标需要是数值维度。时间范围内所有事件的 metric 维度中的维度值使用 TimeseriesParams.metricAggregationMethod 汇总为该时间点的 value

如果未指定指标,则相应数据点的 value 为相应时间间隔内的事件数。

预测

预测给定时序的未来值的过程。预测会使用时序的开头部分作为训练数据来构建模型。

Horizon

我们将预测从检测时间到时间范围(由 ForecastParams.horizonTime 字段给出)内的时序值。

直观地讲,此字段会告诉我们应该预测未来多长时间。虽然在将 Slice 归类为异常时,我们主要关注检测点的值,但我们允许预测额外的点,因为这可能会为用户提供有用的信息。

检测时间和检测点

检测时间(由 QueryDataSetRequest.detectionTime 指定)是系统分析是否存在任何潜在异常的时间点。

检测点是检测时间的时序点。

预期偏差

根据时序的稳定性和可预测性,我们对预测结果的信心可能会有所不同。置信度反映在 EvaluatedSlice.expectedDeviation 字段中,该字段指定与我们为检测时间预测的值相比,可接受的绝对偏差。

异常值

如果某个slice 在检测期间的预测值与实际值之间的偏差高于我们预期的偏差,则该 slice 会被视为异常值。

我们将实际偏差与预期偏差之间的差距称为异常得分

anomalyScore = (detectionPointActual - detectionPointForecast) / expectedDeviation

一般来说,得分低于 1.0 反映的是考虑到 slice 历史记录的常见变化,而得分高于 1.0 则需要引起注意,得分越高,异常越严重。

噪声阈值

如前所述,异常得分显示了与正常值的偏差在统计学上有多显著。不过,在许多情况下,这种偏差可能并不重要,因为绝对值的变化可能不受关注。

例如,如果某个时序的所有值均在 (9.9, 10.1) 范围内均匀分布,则 expectedDeviation 将约为 0.1。如果 detectionPointForecast10.0detectionPointActual10.3,则 anomalyScore 将为 3.0

如果绝对值较大的变化对您来说更重要,噪声阈值提供了一种方法,可通过降低异常得分来惩罚变化幅度低于该阈值的 Slice:

anomalyScore = (detectionPointActual - detectionPointForecast) / (expectedDeviation + noiseThreshold)

后续步骤