本文介紹如何在時序引擎中不間斷地進行時序異常檢測。

異常檢測狀態

介紹

異常檢測狀態是指在單次查詢異常的檢測過程中算法分析出的數據分布狀態與統計信息。該狀態決定了時序異常檢測算法檢測結果的精確性。不同場景中異常檢測狀態的影響如下:
  • 默認情況下,在不間斷檢測場景中為了保持異常檢測算法的精確性,每次檢測結束后,異常檢測狀態會保留一定的時間。如果您執行的是不間斷進行時序異常檢測,算法的精確性會隨著檢測過程的進行而不斷優化和提升,最終提供準確的檢測結果。
  • 在特殊場景中(例如:隨機檢測),您可以通過設置異常檢測算法的公共參數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;