本文介绍如何在时序引擎中不间断地进行时序异常检测。

异常检测状态

介绍

异常检测状态是指在单次查询异常的检测过程中算法分析出的数据分布状态与统计信息。该状态决定了时序异常检测算法检测结果的精确性。不同场景中异常检测状态的影响如下:
  • 默认情况下,在不间断检测场景中为了保持异常检测算法的精确性,每次检测结束后,异常检测状态会保留一定的时间。如果您执行的是不间断进行时序异常检测,算法的精确性会随着检测过程的进行而不断优化和提升,最终提供准确的检测结果。
  • 在特殊场景中(例如:随机检测),您可以通过设置异常检测算法的公共参数adhoc_state将异常检测状态限制在本次查询检测中,可以控制检测中的异常检测状态是否在查询结束后立即清理(不影响其他查询)。
说明
  • 在异常检测算法中如果需要设置warmupCount参数(表示至少需要多少个数据点才会开始报异常),请确保指定adhoc_state=true时本次查询检测的数据点数量满足warmupCount参数要求的数据点数量。
  • 如果异常检测查询中采用相同的异常检测算法和训练参数,那么多次查询之间会共享异常检测状态。
  • 关于异常检测算法的介绍请参见时序异常检测

使用示例

  • 示例一:对时序数据表sensor中指定时间范围的温度使用esd算法进行时序异常检测,同时将esd算法的异常检测状态限制在当前执行的查询中。
    说明 在时序数据不变的情况下,反复执行以下时序异常检测都会得到相同的结果。
    SELECT device_id, region, time,
    anomaly_detect(temperature, 'esd', 'adhoc_state=true') AS detect_result
    FROM sensor WHERE device_id IN ('F07A1260') AND time >= '2022-01-01 00:00:00' AND time < '2022-01-01 00:01:00' SAMPLE BY 0;
    返回结果如下:
    +-----------+----------+---------------------------+---------------+
    | device_id |  region  |           time            | detect_result |
    +-----------+----------+---------------------------+---------------+
    | F07A1260  | north-cn | 2022-01-01T00:00:00+08:00 | false         |
    | F07A1260  | north-cn | 2022-01-01T00:00:01+08:00 | false         |
    | F07A1260  | north-cn | 2022-01-01T00:00:02+08:00 | true          |
    +-----------+----------+---------------------------+---------------+
  • 示例二:对时序数据表sensor中指定时间范围的温度使用esd算法不间断地进行时序异常检测。
    说明
    • 每隔10分钟进行一次时序异常检测操作。
    • 异常检测查询采用相同的异常检测算法(esd)和训练参数,所以多次查询之间会共享异常检测状态。第二次查询结果更精准的原因是第二次查询结果会参考第一次查询的异常检测状态。
    1. 第一次查询检测。
      SELECT device_id, region, time,
      anomaly_detect(temperature, 'esd') AS detect_result
      FROM sensor WHERE device_id IN ('F07A1260') AND time >= '2022-01-01 00:00:00' AND time < '2022-01-01 00:10:00' SAMPLE BY 0;
      返回结果如下:
      +-----------+----------+---------------------------+---------------+
      | device_id |  region  |           time            | detect_result |
      +-----------+----------+---------------------------+---------------+
      | F07A1260  | north-cn | 2022-01-01T00:00:00+08:00 | false         |
      | F07A1260  | north-cn | 2022-01-01T00:01:00+08:00 | false         |
      | F07A1260  | north-cn | 2022-01-01T00:02:00+08:00 | true          |
      |                          ...........                             |
      | F07A1260  | north-cn | 2022-01-01T00:09:00+08:00 | false         |
      +-----------+----------+---------------------------+---------------+
    2. 第二次查询检测。
      SELECT device_id, region, time,
      anomaly_detect(temperature, 'esd') AS detect_result
      FROM sensor WHERE device_id IN ('F07A1260') AND time >= '2022-01-01 00:10:00' AND time < '2022-01-01 00:20:00' SAMPLE BY 0;
      返回结果如下:
      +-----------+----------+---------------------------+---------------+
      | device_id |  region  |           time            | detect_result |
      +-----------+----------+---------------------------+---------------+
      | F07A1260  | north-cn | 2022-01-01T00:10:00+08:00 | false         |
      | F07A1260  | north-cn | 2022-01-01T00:11:00+08:00 | false         |
      | F07A1260  | north-cn | 2022-01-01T00:12:00+08:00 | false         |
      |                          ...........                             |
      | F07A1260  | north-cn | 2022-01-01T00:19:00+08:00 | true          |
      +-----------+----------+---------------------------+---------------+

创建不间断异常查询

如果异常检测查询中采用相同的异常检测算法和训练参数,那么多次检测查询之间会共享异常检测状态。所以不间断查询可以不断更新和维护异常检测状态。理想情况下,随着不间断查询的进行,异常检测状态对时间线数据的覆盖率也逐渐提升,因此检测结果的准确度也会提高到稳定状态。

不间断查询功能需要您通过编码或第三方工具来进行定时SQL查询,但是Lindorm时序引擎默认提供了持续查询功能,通过该功能可以定时执行SQL语句并将执行结果写入至时序数据表中。

语法

CREATE CONTINUOUS QUERY [database_name.] cq_name WITH (  INTERVAL='interval_string' ) AS anomaly_detect_statement

参数

参数 说明
database_name 需要不间断查询的数据库名,不指定时默认当前数据库。
cq_name 自定义不间断查询的名称。
interval_string 用于指定不间断查询的计算时间窗口。例如:1h30s表示一小时30秒。支持以下单位:
  • d:天。
  • h:小时。
  • m:分钟。
  • s:秒。
anomaly_detect_statement 数据写入语句,语法中使用ANOMALY_DETECT函数实现异常查询检测,具体请参见时序异常检测函数

示例

创建不间断查询语句:指定每分钟对tsdb.some_table最近一分钟的数据进行esd异常检测,并将检测结果写入tsdb.table_anomaly_points表中。
CREATE CONTINUOUS QUERY tsdb.cq_detector WITH (INTERVAL = '1m') AS
INSERT INTO tsdb.table_anomaly_points
SELECT tag1, tag2, time, anomaly_detect(field, 'esd') AS result FROM tsdb.some_table
WHERE tag1 = 'cn-shanghai' SAMPLE BY 0;