From 23391a9b0cd73fd88f8dc824982662c563659b01 Mon Sep 17 00:00:00 2001 From: lizhenxing11 Date: Wed, 30 Nov 2022 11:18:22 +0800 Subject: [PATCH] add sys level anomaly detection and cause inference --- add_metrics_anomaly_trends_indicator.patch | 284 ----- gala-anteater-1.0.0.tar.gz | Bin 81680 -> 0 bytes gala-anteater-1.0.1.tar.gz | Bin 0 -> 85013 bytes gala-anteater.spec | 13 +- update_sys_io_latency_detector_model.patch | 1215 -------------------- 5 files changed, 7 insertions(+), 1505 deletions(-) delete mode 100644 add_metrics_anomaly_trends_indicator.patch delete mode 100644 gala-anteater-1.0.0.tar.gz create mode 100644 gala-anteater-1.0.1.tar.gz delete mode 100644 update_sys_io_latency_detector_model.patch diff --git a/add_metrics_anomaly_trends_indicator.patch b/add_metrics_anomaly_trends_indicator.patch deleted file mode 100644 index 882af81..0000000 --- a/add_metrics_anomaly_trends_indicator.patch +++ /dev/null @@ -1,284 +0,0 @@ -From ece4a0551bd81f64158ab465a865e31e97b63562 Mon Sep 17 00:00:00 2001 -From: lizhenxing11 -Date: Mon, 21 Nov 2022 14:54:20 +0800 -Subject: [PATCH 2/2] Add Metrics Anomaly Trends Indicator - -update config file ---- - anteater/core/feature.py | 8 +++++ - anteater/model/slope.py | 15 +++++++++ - anteater/module/app_sli_detector.py | 20 ++++++++--- - anteater/utils/data_load.py | 18 ++++++++-- - config/module/app_sli_rtt.json | 52 ++++++++++++++++++++--------- - 5 files changed, 90 insertions(+), 23 deletions(-) - -diff --git a/anteater/core/feature.py b/anteater/core/feature.py -index 306d835..6db764d 100644 ---- a/anteater/core/feature.py -+++ b/anteater/core/feature.py -@@ -12,6 +12,13 @@ - # ******************************************************************************/ - - from dataclasses import dataclass -+from enum import Enum -+ -+ -+class AnomalyTrend(Enum): -+ DEFAULT = 0 -+ RISE = 1 -+ FALL = 2 - - - @dataclass -@@ -19,3 +26,4 @@ class Feature: - metric: str - description: str - priority: int = 0 -+ atrend: AnomalyTrend = AnomalyTrend.DEFAULT -diff --git a/anteater/model/slope.py b/anteater/model/slope.py -index 422d6bc..08c4211 100644 ---- a/anteater/model/slope.py -+++ b/anteater/model/slope.py -@@ -29,3 +29,18 @@ def smooth_slope(time_series, windows_length): - val = conv_smooth(time_series.to_df(), box_pts=13) - val = slope(val, win_len=13) - return val[-windows_length:] -+ -+ -+def trend(y, win_len=None): -+ """Gets the trend for the y""" -+ if not win_len: -+ win_len = len(y) // 2 -+ -+ if np.mean(y[:win_len]) < np.mean(y[-win_len:]): -+ return 1 -+ -+ elif np.mean(y[:win_len]) > np.mean(y[-win_len:]): -+ return -1 -+ -+ else: -+ return 0 -diff --git a/anteater/module/app_sli_detector.py b/anteater/module/app_sli_detector.py -index b69f73c..b63f5e2 100644 ---- a/anteater/module/app_sli_detector.py -+++ b/anteater/module/app_sli_detector.py -@@ -20,7 +20,9 @@ import math - from typing import List - - from anteater.core.anomaly import Anomaly -+from anteater.core.feature import AnomalyTrend - from anteater.model.algorithms.spectral_residual import SpectralResidual -+from anteater.model.slope import trend - from anteater.model.smoother import conv_smooth - from anteater.model.three_sigma import three_sigma - from anteater.module.detector import Detector -@@ -134,10 +136,11 @@ class APPSliDetector(Detector): - - return anomalies - -- def detect_features(self, metrics, machine_id: str, top_n): -+ def detect_features(self, machine_id: str, top_n): -+ metric_atrend = {f.metric: f.atrend for f in self.features} - start, end = dt.last(minutes=6) - time_series_list = [] -- for metric in metrics: -+ for metric in metric_atrend.keys(): - time_series = self.data_loader.get_metric( - start, end, metric, label_name='machine_id', label_value=machine_id) - time_series_list.extend(time_series) -@@ -156,8 +159,16 @@ class APPSliDetector(Detector): - if all(x == values[0] for x in values): - continue - -+ if trend(time_series.values) < 0 and \ -+ metric_atrend[time_series.metric] == AnomalyTrend.RISE: -+ continue -+ -+ if trend(time_series.values) > 0 and \ -+ metric_atrend[time_series.metric] == AnomalyTrend.FALL: -+ continue -+ - scores = sr_model.compute_score(values) -- score = max(scores[-13:]) -+ score = max(scores[-25:]) - - if math.isnan(score) or math.isinf(score): - continue -@@ -170,9 +181,8 @@ class APPSliDetector(Detector): - - def report(self, anomaly: Anomaly, machine_id: str): - """Reports a single anomaly at each time""" -- feature_metrics = [f.metric for f in self.features] - description = {f.metric: f.description for f in self.features} -- cause_metrics = self.detect_features(feature_metrics, machine_id, top_n=60) -+ cause_metrics = self.detect_features(machine_id, top_n=60) - cause_metrics = [ - {'metric': cause[0].metric, - 'label': cause[0].labels, -diff --git a/anteater/utils/data_load.py b/anteater/utils/data_load.py -index 108d5ed..f8ce277 100644 ---- a/anteater/utils/data_load.py -+++ b/anteater/utils/data_load.py -@@ -17,7 +17,7 @@ from os import path, sep - from json import JSONDecodeError - from typing import List, Tuple - --from anteater.core.feature import Feature -+from anteater.core.feature import AnomalyTrend, Feature - from anteater.core.kpi import KPI - from anteater.utils.log import logger - -@@ -76,7 +76,21 @@ def load_kpi_feature(file_name) -> Tuple[List[KPI], List[Feature]]: - raise e - - kpis = [KPI(**param) for param in params.get('KPI')] -- features = [Feature(**param) for param in params.get('Features')] -+ -+ features = [] -+ for param in params.get('Features'): -+ parsed_param = {} -+ for key, value in param.items(): -+ if key == 'atrend': -+ if value.lower() == 'rise': -+ value = AnomalyTrend.RISE -+ elif value.lower() == 'fall': -+ value = AnomalyTrend.FALL -+ else: -+ value = AnomalyTrend.DEFAULT -+ parsed_param[key] = value -+ -+ features.append(Feature(**parsed_param)) - - if duplicated_metric([kpi.metric for kpi in kpis]) or \ - duplicated_metric([f.metric for f in features]): -diff --git a/config/module/app_sli_rtt.json b/config/module/app_sli_rtt.json -index 0744416..b7f78b7 100644 ---- a/config/module/app_sli_rtt.json -+++ b/config/module/app_sli_rtt.json -@@ -34,19 +34,23 @@ - }, - { - "metric": "gala_gopher_block_latency_req_jitter", -- "description": "block层request时延抖动异常" -+ "description": "block层request时延抖动异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_block_latency_req_last", -- "description": "block层request时延最近值异常" -+ "description": "block层request时延最近值异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_block_latency_req_max", -- "description": "block层request时延最大值异常" -+ "description": "block层request时延最大值异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_block_latency_req_sum", -- "description": "block层request时延总计值异常" -+ "description": "block层request时延总计值异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_cpu_iowait_total_second", -@@ -54,11 +58,13 @@ - }, - { - "metric": "gala_gopher_cpu_user_total_second", -- "description": "用户态cpu占用时间(不包括nice)异常" -+ "description": "用户态cpu占用时间(不包括nice)异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_cpu_total_used_per", -- "description": "CPU总利用率异常" -+ "description": "CPU总利用率异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_cpu_backlog_drops", -@@ -86,7 +92,8 @@ - }, - { - "metric": "gala_gopher_disk_r_await", -- "description": "读响应时间异常" -+ "description": "读响应时间异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_disk_rareq", -@@ -94,19 +101,23 @@ - }, - { - "metric": "gala_gopher_disk_rspeed", -- "description": "读速率(IOPS)异常" -+ "description": "读速率(IOPS)异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_disk_rspeed_kB", -- "description": "读吞吐量异常" -+ "description": "读吞吐量异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_disk_util", -- "description": "磁盘使用率异常" -+ "description": "磁盘使用率异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_disk_w_await", -- "description": "写响应时间异常" -+ "description": "写响应时间异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_disk_wareq", -@@ -114,19 +125,23 @@ - }, - { - "metric": "gala_gopher_disk_wspeed", -- "description": "写速率(IOPS)异常" -+ "description": "写速率(IOPS)异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_disk_wspeed_kB", -- "description": "写吞吐量异常" -+ "description": "写吞吐量异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_proc_read_bytes", -- "description": "进程实际从磁盘读取的字节数异常" -+ "description": "进程实际从磁盘读取的字节数异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_proc_write_bytes", -- "description": "进程实际从磁盘写入的字节数异常" -+ "description": "进程实际从磁盘写入的字节数异常", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_net_tcp_retrans_segs", -@@ -134,7 +149,12 @@ - }, - { - "metric": "gala_gopher_tcp_link_lost_out", -- "description": "TPC丢包数异常" -+ "description": "TCP丢包数异常" -+ }, -+ { -+ "metric": "gala_gopher_tcp_link_srtt", -+ "description": "TCP超时", -+ "atrend": "rise" - }, - { - "metric": "gala_gopher_tcp_link_notack_bytes", --- -2.37.0.windows.1 - diff --git a/gala-anteater-1.0.0.tar.gz b/gala-anteater-1.0.0.tar.gz deleted file mode 100644 index 05ad264835f7b793577fc4f08fc3de4a85a05a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81680 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 diff --git a/gala-anteater-1.0.1.tar.gz b/gala-anteater-1.0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b309b883e2752133e8e1176646b8cfa7868ccc7f GIT binary patch literal 85013 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%0DX-9kP!nq~IHXxkp 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

k(Jp+in{@4UN6myfg5AW@NXbndw7i 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

obdzn=DFfHgrbeU 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 E0c-IMWB>pF literal 0 HcmV?d00001 diff --git a/gala-anteater.spec b/gala-anteater.spec index 64f4e48..a6d7685 100644 --- a/gala-anteater.spec +++ b/gala-anteater.spec @@ -1,8 +1,8 @@ %define debug_package %{nil} Name: gala-anteater -Version: 1.0.0 -Release: 2 +Version: 1.0.1 +Release: 1 Summary: A time-series anomaly detection platform for operating system. License: MulanPSL2 URL: https://gitee.com/openeuler/gala-anteater @@ -11,9 +11,6 @@ BuildRoot: %{_builddir}/%{name}-%{version} BuildRequires: procps-ng python3-setuptools Requires: python3-gala-anteater = %{version}-%{release} -patch0: update_sys_io_latency_detector_model.patch -patch1: add_metrics_anomaly_trends_indicator.patch - %description Abnormal detection module for A-Ops project @@ -50,7 +47,8 @@ Python3 package of gala-anteater %config(noreplace) %{_sysconfdir}/%{name}/config/module/proc_io_latency.json %config(noreplace) %{_sysconfdir}/%{name}/config/module/sys_io_latency.json %config(noreplace) %{_sysconfdir}/%{name}/config/module/sys_tcp_establish.json -%config(noreplace) %{_sysconfdir}/%{name}/config/module/sys_tcp_transmission.json +%config(noreplace) %{_sysconfdir}/%{name}/config/module/sys_tcp_transmission_latency.json +%config(noreplace) %{_sysconfdir}/%{name}/config/module/sys_tcp_transmission_throughput.json %files -n python3-gala-anteater @@ -59,6 +57,9 @@ Python3 package of gala-anteater %changelog +* Wed Nov 30 2022 Li Zhenxing - 1.0.1-1 +- Add sys level anomaly detection and cause inference + * Tue Nov 22 2022 Li Zhenxing - 1.0.0-2 - Updates anomaly detection model and imporves cause inference result diff --git a/update_sys_io_latency_detector_model.patch b/update_sys_io_latency_detector_model.patch deleted file mode 100644 index 09dd280..0000000 --- a/update_sys_io_latency_detector_model.patch +++ /dev/null @@ -1,1215 +0,0 @@ -From 0b2243b61fe5083784e634db0d97c2888330eb0a Mon Sep 17 00:00:00 2001 -From: lizhenxing11 -Date: Mon, 14 Nov 2022 19:43:17 +0800 -Subject: [PATCH 1/2] Update sys io latency detector model - -Add tcp detector and update model - -fix code check issue ---- - anteater/core/anomaly.py | 8 ++ - anteater/core/kpi.py | 2 +- - anteater/model/three_sigma.py | 37 ++++++ - anteater/module/app_sli_detector.py | 93 ++++++++------- - anteater/module/detector.py | 54 +++++++-- - anteater/module/proc_io_latency_detector.py | 49 +++++--- - anteater/module/sys_io_latency_detector.py | 109 +++++++++--------- - anteater/module/sys_tcp_establish_detector.py | 108 +++++++++-------- - .../module/sys_tcp_transmission_detector.py | 76 ++++++------ - anteater/provider/base.py | 14 ++- - anteater/source/anomaly_report.py | 1 + - anteater/template/template.py | 2 +- - anteater/utils/common.py | 12 ++ - config/gala-anteater.yaml | 6 +- - config/module/app_sli_rtt.json | 15 ++- - config/module/proc_io_latency.json | 14 ++- - config/module/sys_io_latency.json | 9 +- - config/module/sys_tcp_establish.json | 5 +- - config/module/sys_tcp_transmission.json | 33 +++++- - 19 files changed, 416 insertions(+), 231 deletions(-) - create mode 100644 anteater/model/three_sigma.py - -diff --git a/anteater/core/anomaly.py b/anteater/core/anomaly.py -index cce7767..b95eeab 100644 ---- a/anteater/core/anomaly.py -+++ b/anteater/core/anomaly.py -@@ -13,6 +13,8 @@ - - from dataclasses import dataclass - -+from anteater.utils.time_series import TimeSeries -+ - - @dataclass - class Anomaly: -@@ -21,3 +23,9 @@ class Anomaly: - score: float = None - entity_name: str = None - description: str = None -+ -+ -+@dataclass -+class CauseMetric: -+ ts: TimeSeries -+ score: float -diff --git a/anteater/core/kpi.py b/anteater/core/kpi.py -index db4c046..620ffdf 100644 ---- a/anteater/core/kpi.py -+++ b/anteater/core/kpi.py -@@ -21,5 +21,5 @@ class KPI: - entity_name: str = None - enable: bool = False - description: str = "" -- parameter: dict = field(default=dict) -+ params: dict = field(default=dict) - -diff --git a/anteater/model/three_sigma.py b/anteater/model/three_sigma.py -new file mode 100644 -index 0000000..08d05ba ---- /dev/null -+++ b/anteater/model/three_sigma.py -@@ -0,0 +1,37 @@ -+#!/usr/bin/python3 -+# ****************************************************************************** -+# Copyright (c) 2022 Huawei Technologies Co., Ltd. -+# gala-anteater is licensed under Mulan PSL v2. -+# You can use this software according to the terms and conditions of the Mulan PSL v2. -+# You may obtain a copy of Mulan PSL v2 at: -+# http://license.coscl.org.cn/MulanPSL2 -+# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+# See the Mulan PSL v2 for more details. -+# ******************************************************************************/ -+ -+ -+import numpy as np -+ -+ -+def three_sigma(values, obs_size, method="abs"): -+ """The '3-sigma rule' outlier detect function""" -+ if obs_size <= 0: -+ raise ValueError("The obs_size should great than zero!") -+ if len(values) <= obs_size: -+ raise ValueError("The obs_size should be great than values' length") -+ train_val = values[:-obs_size] -+ obs_val = values[-obs_size:] -+ mean = np.mean(train_val) -+ std = np.std(train_val) -+ if method == "abs": -+ outlier = [val for val in obs_val if abs(val - mean) > 3 * std] -+ elif method == 'min': -+ outlier = [val for val in obs_val if val < mean - 3 * std] -+ elif method == 'max': -+ outlier = [val for val in obs_val if val > mean + 3 * std] -+ else: -+ raise ValueError(f'Unknown method {method}') -+ -+ return outlier, mean, std -diff --git a/anteater/module/app_sli_detector.py b/anteater/module/app_sli_detector.py -index e38d53e..b69f73c 100644 ---- a/anteater/module/app_sli_detector.py -+++ b/anteater/module/app_sli_detector.py -@@ -19,17 +19,15 @@ Description: The anomaly detector implementation on APP Sli - import math - from typing import List - --import numpy as np -- - from anteater.core.anomaly import Anomaly - from anteater.model.algorithms.spectral_residual import SpectralResidual --from anteater.model.slope import smooth_slope - from anteater.model.smoother import conv_smooth -+from anteater.model.three_sigma import three_sigma - from anteater.module.detector import Detector - from anteater.source.anomaly_report import AnomalyReport - from anteater.source.metric_loader import MetricLoader - from anteater.template.app_anomaly_template import AppAnomalyTemplate --from anteater.utils.data_load import load_kpi_feature -+from anteater.utils.common import divide - from anteater.utils.datetime import DateTimeManager as dt - from anteater.utils.log import logger - -@@ -40,48 +38,52 @@ class APPSliDetector(Detector): - """ - - def __init__(self, data_loader: MetricLoader, anomaly_report: AnomalyReport): -- super().__init__(data_loader, anomaly_report) -- self.kpis, self.features = load_kpi_feature('app_sli_rtt.json') -+ file_name = 'app_sli_rtt.json' -+ super().__init__(data_loader, anomaly_report, file_name) - - def execute_detect(self, machine_id: str): - for kpi in self.kpis: -- parameter = kpi.parameter - if kpi.kpi_type == 'rtt': -- anomalies = self.detect_rtt(kpi, machine_id, parameter) -+ anomalies = self.detect_rtt(kpi, machine_id) - else: -- anomalies = self.detect_tps(kpi, machine_id, parameter) -+ anomalies = self.detect_tps(kpi, machine_id) - - for anomaly in anomalies: -- self.report(anomaly, kpi.entity_name, machine_id) -+ self.report(anomaly, machine_id) - -- def detect_rtt(self, kpi, machine_id: str, parameter: dict) -> List[Anomaly]: -+ def detect_rtt(self, kpi, machine_id: str) -> List[Anomaly]: - """Detects rtt by rule-based model""" -- start, end = dt.last(minutes=10) -- time_series_list = self.data_loader.get_metric( -+ look_back = kpi.params.get('look_back', None) -+ box_pts = kpi.params.get('box_pts', None) -+ obs_size = kpi.params.get('obs_size', None) -+ outlier_ratio_th = kpi.params.get('outlier_ratio_th', None) -+ -+ start, end = dt.last(minutes=look_back) -+ ts_list = self.data_loader.get_metric( - start, end, kpi.metric, label_name='machine_id', label_value=machine_id) - -- if not time_series_list: -+ if not ts_list: - logger.warning(f'Key metric {kpi.metric} is null on the target machine {machine_id}!') - return [] - - point_count = self.data_loader.expected_point_length(start, end) - anomalies = [] -- threshold = parameter['threshold'] -- min_nsec = parameter['min_nsec'] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or len(time_series.values) > point_count * 1.5: -+ for _ts in ts_list: -+ if len(_ts.values) < point_count * 0.9 or len(_ts.values) > point_count * 1.5: - continue - -- score = max(smooth_slope(time_series, windows_length=13)) -- if math.isnan(score) or math.isinf(score): -- continue -+ smoothed_val = conv_smooth(_ts.values, box_pts=box_pts) -+ outlier, mean, std = three_sigma(smoothed_val, obs_size=obs_size, method='min') -+ ratio = divide(len(outlier), obs_size) - -- avg_nsec = np.mean(time_series.values[-13:]) -- if score >= threshold and avg_nsec >= min_nsec: -+ if outlier and ratio >= outlier_ratio_th: -+ logger.info(f'Ratio: {ratio}, Outlier Ratio TH: {outlier_ratio_th}, ' -+ f'Mean: {mean}, Std: {std}') - anomalies.append( -- Anomaly(metric=time_series.metric, -- labels=time_series.labels, -- score=score, -+ Anomaly(metric=_ts.metric, -+ labels=_ts.labels, -+ score=ratio, -+ entity_name=kpi.entity_name, - description=kpi.description)) - - anomalies = sorted(anomalies, key=lambda x: x.score, reverse=True) -@@ -91,9 +93,14 @@ class APPSliDetector(Detector): - - return anomalies - -- def detect_tps(self, kpi, machine_id: str, parameter: dict) -> List[Anomaly]: -+ def detect_tps(self, kpi, machine_id: str) -> List[Anomaly]: - """Detects tps by rule based model""" -- start, end = dt.last(minutes=10) -+ look_back = kpi.params.get('look_back', None) -+ box_pts = kpi.params.get('box_pts', None) -+ obs_size = kpi.params.get('obs_size', None) -+ outlier_ratio_th = kpi.params.get('outlier_ratio_th', None) -+ -+ start, end = dt.last(minutes=look_back) - time_series_list = self.data_loader.get_metric( - start, end, kpi.metric, label_name='machine_id', label_value=machine_id) - -@@ -103,21 +110,21 @@ class APPSliDetector(Detector): - - point_count = self.data_loader.expected_point_length(start, end) - anomalies = [] -- threshold = parameter['threshold'] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or len(time_series.values) > point_count * 1.5: -+ for _ts in time_series_list: -+ if len(_ts.values) < point_count * 0.9 or len(_ts.values) > point_count * 1.5: - continue -- pre_values = time_series.values[:-25] -- cur_values = time_series.values[-25:] -- mean = np.mean(pre_values) -- std = np.std(pre_values) -- outlier = [val for val in cur_values if val < mean - 3 * std] -+ smoothed_val = conv_smooth(_ts.values, box_pts=box_pts) -+ outlier, mean, std = three_sigma(smoothed_val, obs_size=obs_size, method='min') -+ ratio = divide(len(outlier), obs_size) - -- if outlier and len(outlier) >= len(cur_values) * 0.3: -+ if outlier and ratio >= outlier_ratio_th: -+ logger.info(f'Ratio: {ratio}, Outlier Ratio TH: {outlier_ratio_th}, ' -+ f'Mean: {mean}, Std: {std}') - anomalies.append( -- Anomaly(metric=time_series.metric, -- labels=time_series.labels, -- score=1, -+ Anomaly(metric=_ts.metric, -+ labels=_ts.labels, -+ score=ratio, -+ entity_name=kpi.entity_name, - description=kpi.description)) - - anomalies = sorted(anomalies, key=lambda x: x.score, reverse=True) -@@ -161,7 +168,8 @@ class APPSliDetector(Detector): - - return result[0: top_n] - -- def report(self, anomaly: Anomaly, entity_name: str, machine_id: str): -+ def report(self, anomaly: Anomaly, machine_id: str): -+ """Reports a single anomaly at each time""" - feature_metrics = [f.metric for f in self.features] - description = {f.metric: f.description for f in self.features} - cause_metrics = self.detect_features(feature_metrics, machine_id, top_n=60) -@@ -172,6 +180,5 @@ class APPSliDetector(Detector): - 'description': description.get(cause[0].metric, '')} - for cause in cause_metrics] - timestamp = dt.utc_now() -- template = AppAnomalyTemplate(timestamp, machine_id, anomaly.metric, entity_name) -- template.labels = anomaly.labels -+ template = AppAnomalyTemplate(timestamp, machine_id, anomaly.metric, anomaly.entity_name) - self.anomaly_report.sent_anomaly(anomaly, cause_metrics, template) -diff --git a/anteater/module/detector.py b/anteater/module/detector.py -index 51dabbd..bfe516e 100644 ---- a/anteater/module/detector.py -+++ b/anteater/module/detector.py -@@ -11,37 +11,69 @@ - # See the Mulan PSL v2 for more details. - # ******************************************************************************/ - --from abc import abstractmethod -+from abc import abstractmethod, ABC - - from anteater.core.anomaly import Anomaly - from anteater.source.anomaly_report import AnomalyReport - from anteater.source.metric_loader import MetricLoader -+from anteater.utils.common import same_intersection_key_value -+from anteater.utils.data_load import load_kpi_feature - from anteater.utils.datetime import DateTimeManager as dt - from anteater.utils.log import logger - from anteater.utils.timer import timer - - --class Detector: -- """The base detector class""" -- def __init__(self, data_loader: MetricLoader, anomaly_report: AnomalyReport): -+class Detector(ABC): -+ """The anomaly detector base class""" -+ def __init__( -+ self, -+ data_loader: MetricLoader, -+ anomaly_report: AnomalyReport, -+ file_name: str): -+ """The detector base class initializer""" - self.data_loader = data_loader - self.anomaly_report = anomaly_report -+ self.kpis, self.features = load_kpi_feature(file_name) -+ -+ @staticmethod -+ def filter_ts(ts_list, filters): -+ result = [] -+ for _ts in ts_list: -+ if same_intersection_key_value(_ts.labels, filters): -+ result.append(_ts) -+ -+ return result - - @abstractmethod - def execute_detect(self, machine_id): -+ """Executes anomaly detection on specified machine id""" -+ pass -+ -+ @abstractmethod -+ def report(self, anomaly: Anomaly, machine_id: str): -+ """Reports a single anomaly at each time""" - pass - - @timer - def detect(self): -+ """The main function of detector""" -+ if not self.kpis: -+ logger.debug(f"Null kpis in detector: {self.__class__.__name__}!") -+ return -+ - logger.info(f"Run detector: {self.__class__.__name__}!") -- start, end = dt.last(minutes=1) -- metrics_kpi = [k.metric for k in self.kpis] -- metrics_feat = [f.metric for f in self.features] -- metrics = metrics_kpi + metrics_feat -- machine_ids = self.data_loader.get_unique_machines(start, end, metrics) -+ self.pre_process() -+ machine_ids = self.get_unique_machine_id() - for _id in machine_ids: - self.execute_detect(_id) - -- @abstractmethod -- def report(self, anomaly: Anomaly, entity_name: str, machine_id: str): -+ def pre_process(self): -+ """Executes pre-process for generating necessary parameters""" - pass -+ -+ def get_unique_machine_id(self): -+ """Gets unique machine ids during past minutes""" -+ start, end = dt.last(minutes=1) -+ metrics = [_kpi.metric for _kpi in self.kpis] -+ machine_ids = self.data_loader.get_unique_machines(start, end, metrics) -+ return machine_ids -diff --git a/anteater/module/proc_io_latency_detector.py b/anteater/module/proc_io_latency_detector.py -index ee1d7c6..3ea2c51 100644 ---- a/anteater/module/proc_io_latency_detector.py -+++ b/anteater/module/proc_io_latency_detector.py -@@ -16,11 +16,13 @@ import math - from anteater.core.anomaly import Anomaly - from anteater.model.algorithms.spectral_residual import SpectralResidual - from anteater.model.slope import smooth_slope -+from anteater.model.smoother import conv_smooth -+from anteater.model.three_sigma import three_sigma - from anteater.module.detector import Detector - from anteater.source.anomaly_report import AnomalyReport - from anteater.source.metric_loader import MetricLoader - from anteater.template.sys_anomaly_template import SysAnomalyTemplate --from anteater.utils.data_load import load_kpi_feature -+from anteater.utils.common import divide - from anteater.utils.datetime import DateTimeManager as dt - from anteater.utils.log import logger - -@@ -31,40 +33,50 @@ class ProcIOLatencyDetector(Detector): - """ - - def __init__(self, data_loader: MetricLoader, anomaly_report: AnomalyReport): -- super().__init__(data_loader, anomaly_report) -- self.kpis, self.features = load_kpi_feature('proc_io_latency.json') -+ file_name = 'proc_io_latency.json' -+ super().__init__(data_loader, anomaly_report, file_name) - - def execute_detect(self, machine_id): - for kpi in self.kpis: -- parameter = kpi.parameter -- start, end = dt.last(minutes=10) -- time_series_list = self.data_loader.get_metric( -+ look_back = kpi.params.get('look_back', None) -+ box_pts = kpi.params.get('box_pts', None) -+ obs_size = kpi.params.get('obs_size', None) -+ outlier_ratio_th = kpi.params.get('outlier_ratio_th', None) -+ -+ start, end = dt.last(minutes=look_back) -+ ts_list = self.data_loader.get_metric( - start, end, kpi.metric, label_name='machine_id', label_value=machine_id) - -- if not time_series_list: -+ if not ts_list: - logger.warning(f'Key metric {kpi.metric} is null on the target machine {machine_id}!') - return - - point_count = self.data_loader.expected_point_length(start, end) - anomalies = [] -- threshold = parameter['threshold'] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or len(time_series.values) > point_count * 1.5: -+ for _ts in ts_list: -+ if len(_ts.values) < point_count * 0.9 or len(_ts.values) > point_count * 1.5: - continue - -- if sum(time_series.values) == 0: -+ if sum(_ts.values) == 0: - continue - -- score = max(smooth_slope(time_series, windows_length=13)) -+ score = max(smooth_slope(_ts, windows_length=13)) - - if math.isnan(score) or math.isinf(score): - continue - -- if score > threshold: -+ smoothed_val = conv_smooth(_ts.values, box_pts=box_pts) -+ outlier, mean, std = three_sigma(smoothed_val, obs_size=obs_size, method='min') -+ ratio = divide(len(outlier), obs_size) -+ -+ if outlier and ratio >= outlier_ratio_th: -+ logger.info(f'Ratio: {ratio}, Outlier Ratio TH: {outlier_ratio_th}, ' -+ f'Mean: {mean}, Std: {std}') - anomalies.append( -- Anomaly(metric=time_series.metric, -- labels=time_series.labels, -+ Anomaly(metric=_ts.metric, -+ labels=_ts.labels, - score=score, -+ entity_name=kpi.entity_name, - description=kpi.description)) - - anomalies = sorted(anomalies, key=lambda x: x.score, reverse=True) -@@ -72,7 +84,7 @@ class ProcIOLatencyDetector(Detector): - if anomalies: - logger.info('Sys io latency anomalies was detected.') - for anomaly in anomalies: -- self.report(anomaly, kpi.entity_name, machine_id) -+ self.report(anomaly, machine_id) - - def detect_features(self, machine_id: str, top_n=3): - priorities = {f.metric: f.priority for f in self.features} -@@ -110,7 +122,7 @@ class ProcIOLatencyDetector(Detector): - - return result - -- def report(self, anomaly: Anomaly, entity_name: str, machine_id: str): -+ def report(self, anomaly: Anomaly, machine_id: str): - description = {f.metric: f.description for f in self.features} - cause_metrics = self.detect_features(machine_id, top_n=3) - cause_metrics = [ -@@ -123,6 +135,5 @@ class ProcIOLatencyDetector(Detector): - cause[0].labels.get('comm', ''))} - for cause in cause_metrics] - timestamp = dt.utc_now() -- template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, entity_name) -- template.labels = anomaly.labels -+ template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, anomaly.entity_name) - self.anomaly_report.sent_anomaly(anomaly, cause_metrics, template) -diff --git a/anteater/module/sys_io_latency_detector.py b/anteater/module/sys_io_latency_detector.py -index f459a57..c29ce72 100644 ---- a/anteater/module/sys_io_latency_detector.py -+++ b/anteater/module/sys_io_latency_detector.py -@@ -15,12 +15,13 @@ import math - - from anteater.core.anomaly import Anomaly - from anteater.model.algorithms.spectral_residual import SpectralResidual --from anteater.model.slope import smooth_slope -+from anteater.model.smoother import conv_smooth -+from anteater.model.three_sigma import three_sigma - from anteater.module.detector import Detector - from anteater.source.anomaly_report import AnomalyReport - from anteater.source.metric_loader import MetricLoader - from anteater.template.sys_anomaly_template import SysAnomalyTemplate --from anteater.utils.data_load import load_kpi_feature -+from anteater.utils.common import divide, same_intersection_key_value - from anteater.utils.datetime import DateTimeManager as dt - from anteater.utils.log import logger - -@@ -31,100 +32,104 @@ class SysIOLatencyDetector(Detector): - """ - - def __init__(self, data_loader: MetricLoader, anomaly_report: AnomalyReport): -- super().__init__(data_loader, anomaly_report) -- self.kpis, self.features = load_kpi_feature('sys_io_latency.json') -+ """The system i/o latency detector initializer""" -+ file_name = 'sys_io_latency.json' -+ super().__init__(data_loader, anomaly_report, file_name) - - def execute_detect(self, machine_id: str): -+ """Executes the detector based on machine id""" - kpi = self.kpis[0] -- parameter = kpi.parameter -+ look_back = kpi.params.get('look_back', None) -+ box_pts = kpi.params.get('box_pts', None) -+ obs_size = kpi.params.get('obs_size', None) -+ outlier_ratio_th = kpi.params.get('outlier_ratio_th', None) - -- start, end = dt.last(minutes=10) -- time_series_list = self.data_loader.get_metric( -- start, end, kpi.metric, label_name='machine_id', label_value=machine_id) -+ start, end = dt.last(minutes=look_back) -+ ts_list = self.data_loader.\ -+ get_metric(start, end, kpi.metric, label_name='machine_id', label_value=machine_id) - -- if not time_series_list: -+ if not ts_list: - logger.warning(f'Key metric {kpi.metric} is null on the target machine {machine_id}!') - return - - point_count = self.data_loader.expected_point_length(start, end) - anomalies = [] -- threshold = parameter['threshold'] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or len(time_series.values) > point_count * 1.5: -+ for _ts in ts_list: -+ if len(_ts.values) < point_count * 0.9 or len(_ts.values) > point_count * 1.5: - continue - -- if sum(time_series.values) == 0: -+ if sum(_ts.values) == 0: - continue - -- score = max(smooth_slope(time_series, windows_length=13)) -+ smoothed_val = conv_smooth(_ts.values, box_pts=box_pts) -+ outlier, mean, std = three_sigma(smoothed_val, obs_size=obs_size, method='max') -+ ratio = divide(len(outlier), obs_size) - -- if math.isnan(score) or math.isinf(score): -- continue -- -- if score > threshold: -+ if outlier and ratio >= outlier_ratio_th: -+ logger.info(f'Ratio: {ratio}, Outlier Ratio TH: {outlier_ratio_th}, ' -+ f'Mean: {mean}, Std: {std}') - anomalies.append( -- Anomaly(metric=time_series.metric, -- labels=time_series.labels, -- score=score, -+ Anomaly(metric=_ts.metric, -+ labels=_ts.labels, -+ score=ratio, -+ entity_name=kpi.entity_name, - description=kpi.description)) - -- anomalies = sorted(anomalies, key=lambda x: x.score, reverse=True) -- - if anomalies: - logger.info('Sys io latency anomalies was detected.') -+ anomalies = sorted(anomalies, key=lambda x: x.score, reverse=True) - for anomaly in anomalies: -- self.report(anomaly, kpi.entity_name, machine_id) -+ self.report(anomaly, machine_id) - -- def detect_features(self, machine_id: str, top_n: int): -+ def find_cause_metrics(self, machine_id: str, filters: dict, top_n: int): -+ """Detects the abnormal features and reports the caused metrics""" - priorities = {f.metric: f.priority for f in self.features} - start, end = dt.last(minutes=6) -- time_series_list = [] -+ ts_list = [] - for metric in priorities.keys(): -- time_series = self.data_loader.get_metric( -+ _ts_list = self.data_loader.get_metric( - start, end, metric, label_name='machine_id', label_value=machine_id) -- time_series_list.extend(time_series) -+ for _ts in _ts_list: -+ if same_intersection_key_value(_ts.labels, filters): -+ ts_list.append(_ts) - - point_count = self.data_loader.expected_point_length(start, end) -- sr_model = SpectralResidual(12, 24, 50) -- -+ model = SpectralResidual(12, 24, 50) - result = [] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or \ -- len(time_series.values) > point_count * 1.5: -+ for _ts in ts_list: -+ if len(_ts.values) < point_count * 0.9 or \ -+ len(_ts.values) > point_count * 1.5: - continue - -- values = time_series.values -- -- if all(x == values[0] for x in values): -+ if all(x == _ts.values[0] for x in _ts.values): - continue - -- scores = sr_model.compute_score(values) -- score = max(scores[-13:]) -- -+ score = max(model.compute_score(_ts.values)[-13:]) - if math.isnan(score) or math.isinf(score): - continue - -- result.append((time_series, score)) -+ result.append((_ts, score)) - - result = sorted(result, key=lambda x: x[1], reverse=True)[0: top_n] - result = sorted(result, key=lambda x: priorities[x[0].metric]) - - return result - -- def report(self, anomaly: Anomaly, entity_name: str, machine_id: str): -- feature_metrics = [f.metric for f in self.features] -+ def report(self, anomaly: Anomaly, machine_id: str): -+ """Reports the anomaly with it's caused metrics""" - description = {f.metric: f.description for f in self.features} -- cause_metrics = self.detect_features(machine_id, top_n=3) -+ cause_metrics = self.find_cause_metrics(machine_id, anomaly.labels, top_n=3) - cause_metrics = [ -- {'metric': cause[0].metric, -- 'label': cause[0].labels, -- 'score': cause[1], -- 'description': description.get(cause[0].metric, '').format( -- cause[0].labels.get('disk_name', ''), -- cause[0].labels.get('tgid', ''), -- cause[0].labels.get('comm', ''))} -+ { -+ 'metric': cause[0].metric, -+ 'label': cause[0].labels, -+ 'score': cause[1], -+ 'description': description.get(cause[0].metric, '').format( -+ cause[0].labels.get('disk_name', ''), -+ cause[0].labels.get('tgid', ''), -+ cause[0].labels.get('comm', '')) -+ } - for cause in cause_metrics] - timestamp = dt.utc_now() -- template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, entity_name) -- template.labels = anomaly.labels -+ template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, anomaly.entity_name) - self.anomaly_report.sent_anomaly(anomaly, cause_metrics, template) -diff --git a/anteater/module/sys_tcp_establish_detector.py b/anteater/module/sys_tcp_establish_detector.py -index 4b49b25..3ca61c5 100644 ---- a/anteater/module/sys_tcp_establish_detector.py -+++ b/anteater/module/sys_tcp_establish_detector.py -@@ -11,15 +11,17 @@ - # See the Mulan PSL v2 for more details. - # ******************************************************************************/ - -+from functools import reduce -+from typing import List -+ - import numpy as np - --from anteater.core.anomaly import Anomaly -+from anteater.core.anomaly import Anomaly, CauseMetric - from anteater.module.detector import Detector - from anteater.source.anomaly_report import AnomalyReport - from anteater.source.metric_loader import MetricLoader - from anteater.template.sys_anomaly_template import SysAnomalyTemplate --from anteater.utils.common import divide --from anteater.utils.data_load import load_kpi_feature -+from anteater.utils.common import divide, same_intersection_key_value - from anteater.utils.datetime import DateTimeManager as dt - from anteater.utils.log import logger - -@@ -36,69 +38,85 @@ class SysTcpEstablishDetector(Detector): - """ - - def __init__(self, data_loader: MetricLoader, anomaly_report: AnomalyReport): -- super().__init__(data_loader, anomaly_report) -- self.kpis, self.features = load_kpi_feature('sys_tcp_establish.json') -+ file_name = 'sys_tcp_establish.json' -+ super().__init__(data_loader, anomaly_report, file_name) - -- def execute_detect(self, machine_id: str): -+ self.mean = None -+ self.std = None -+ -+ def pre_process(self): -+ """Calculates ts values mean and std""" - kpi = self.kpis[0] -- start_30_minutes, _ = dt.last(minutes=30) -- start_3_minutes, end = dt.last(minutes=3) -+ look_back = kpi.params.get('look_back', None) - -- pre_ts = self.data_loader.get_metric( -- start_30_minutes, start_3_minutes, kpi.metric, label_name='machine_id', label_value=machine_id) -- pre_establish_time = [t.values[0] for t in pre_ts if t.values] -+ start, _ = dt.last(minutes=look_back) -+ mid, _ = dt.last(minutes=3) - -- ts = self.data_loader.get_metric( -- start_3_minutes, end, kpi.metric, label_name='machine_id', label_value=machine_id) -- establish_time = [t.values[0] for t in ts if t.values] -+ ts_list = self.data_loader.get_metric(start, mid, kpi.metric) -+ establish_time = reduce(lambda x, y: x + y, [list(set(_ts.values)) for _ts in ts_list]) - -- mean = np.mean(pre_establish_time) -- std = np.std(pre_establish_time) -+ self.mean = np.mean(establish_time) -+ self.std = np.std(establish_time) - -- outlier = [val for val in establish_time if abs(val - mean) > 3 * std] -+ def execute_detect(self, machine_id: str): -+ """Executes the detector based on machine id""" -+ kpi = self.kpis[0] -+ outlier_ratio_th = kpi.params.get('outlier_ratio_th', None) - -- if outlier and len(outlier) > len(ts) * 0.3: -+ start, end = dt.last(minutes=3) -+ ts_list = self.data_loader. \ -+ get_metric(start, end, kpi.metric, label_name='machine_id', label_value=machine_id) -+ establish_time = reduce(lambda x, y: x + y, [list(set(_ts.values)) for _ts in ts_list]) -+ -+ outlier = [val for val in establish_time if abs(val - self.mean) > 3 * self.std] -+ ratio = divide(len(outlier), len(establish_time)) -+ if outlier and ratio > outlier_ratio_th: -+ logger.info(f'Ratio: {ratio}, Outlier Ratio TH: {outlier_ratio_th}, ' -+ f'Mean: {self.mean}, Std: {self.std}') - logger.info('Sys tcp establish anomalies was detected.') -- if establish_time: -- percentile = divide(len(outlier), len(establish_time)) -- else: -- percentile = 0 - anomaly = Anomaly( - metric=kpi.metric, - labels={}, -- description=kpi.description.format(percentile, min(outlier))) -- self.report(anomaly, kpi.entity_name, machine_id) -+ entity_name=kpi.entity_name, -+ description=kpi.description.format(ratio, min(outlier))) -+ self.report(anomaly, machine_id) - -- def detect_features(self, machine_id: str): -+ def find_cause_metrics(self, machine_id: str, filters: dict) -> List[CauseMetric]: -+ """Detects the abnormal features and reports the caused metrics""" -+ priorities = {f.metric: f.priority for f in self.features} - start, end = dt.last(minutes=3) -- time_series_list = [] -- metrics = [f.metric for f in self.features] -- for metric in metrics: -- time_series = self.data_loader.get_metric( -- start, end, metric, label_name='machine_id', label_value=machine_id) -- time_series_list.extend(time_series) -+ ts_list = [] -+ for metric in priorities.keys(): -+ _ts_list = self.data_loader.\ -+ get_metric(start, end, metric, label_name='machine_id', label_value=machine_id) -+ filtered_ts_list = self.filter_ts(_ts_list, filters) -+ ts_list.extend(filtered_ts_list) - - result = [] -- for ts in time_series_list: -- if ts.values and max(ts.values) > 0: -- result.append((ts, max(ts.values))) -+ for _ts in ts_list: -+ if _ts.values and max(_ts.values) > 0: -+ cause_metric = CauseMetric(ts=_ts, score=max(_ts.values)) -+ result.append(cause_metric) - -- result = sorted(result, key=lambda x: x[1], reverse=True) -+ result = sorted(result, key=lambda x: x.score, reverse=True) - - return result - -- def report(self, anomaly: Anomaly, entity_name: str, machine_id: str): -+ def report(self, anomaly: Anomaly, machine_id: str): -+ """Reports a single anomaly at each time""" - description = {f.metric: f.description for f in self.features} -- cause_metrics = self.detect_features(machine_id) -+ cause_metrics = self.find_cause_metrics(machine_id, anomaly.labels) - cause_metrics = [ -- {'metric': cause[0].metric, -- 'label': cause[0].labels, -- 'score': cause[1], -- 'description': description.get(cause[0].metric, '').format( -- cause[0].labels.get('ppid', ''), -- cause[0].labels.get('s_port', ''))} -+ { -+ 'metric': cause.ts.metric, -+ 'label': cause.ts.labels, -+ 'score': cause.score, -+ 'description': description.get(cause.ts.metric, '').format( -+ cause.ts.labels.get('ppid', ''), -+ cause.ts.labels.get('s_port', '')) -+ } - for cause in cause_metrics] -+ - timestamp = dt.utc_now() -- template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, entity_name) -- template.labels = anomaly.labels -+ template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, anomaly.entity_name) - self.anomaly_report.sent_anomaly(anomaly, cause_metrics, template) -diff --git a/anteater/module/sys_tcp_transmission_detector.py b/anteater/module/sys_tcp_transmission_detector.py -index 9af4760..ad383b4 100644 ---- a/anteater/module/sys_tcp_transmission_detector.py -+++ b/anteater/module/sys_tcp_transmission_detector.py -@@ -16,11 +16,13 @@ import math - from anteater.core.anomaly import Anomaly - from anteater.model.algorithms.spectral_residual import SpectralResidual - from anteater.model.slope import smooth_slope -+from anteater.model.smoother import conv_smooth -+from anteater.model.three_sigma import three_sigma - from anteater.module.detector import Detector - from anteater.source.anomaly_report import AnomalyReport - from anteater.source.metric_loader import MetricLoader - from anteater.template.sys_anomaly_template import SysAnomalyTemplate --from anteater.utils.data_load import load_kpi_feature -+from anteater.utils.common import divide - from anteater.utils.datetime import DateTimeManager as dt - from anteater.utils.log import logger - -@@ -31,40 +33,45 @@ class SysTcpTransmissionDetector(Detector): - """ - - def __init__(self, data_loader: MetricLoader, anomaly_report: AnomalyReport): -- super().__init__(data_loader, anomaly_report) -- self.kpis, self.features = load_kpi_feature('sys_tcp_transmission.json') -+ file_name = 'sys_tcp_transmission.json' -+ super().__init__(data_loader, anomaly_report, file_name) - - def execute_detect(self, machine_id: str): - for kpi in self.kpis: -- parameter = kpi.parameter -- start, end = dt.last(minutes=10) -- time_series_list = self.data_loader.get_metric( -- start, end, kpi.metric, label_name='machine_id', label_value=machine_id) -+ look_back = kpi.params.get('look_back', None) -+ box_pts = kpi.params.get('box_pts', None) -+ obs_size = kpi.params.get('obs_size', None) -+ outlier_ratio_th = kpi.params.get('outlier_ratio_th', None) - -- if not time_series_list: -+ start, end = dt.last(minutes=look_back) -+ ts_list = self.data_loader.\ -+ get_metric(start, end, kpi.metric, label_name='machine_id', label_value=machine_id) -+ -+ if not ts_list: - logger.warning(f'Key metric {kpi.metric} is null on the target machine {machine_id}!') - return - - point_count = self.data_loader.expected_point_length(start, end) - anomalies = [] -- threshold = parameter['threshold'] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or len(time_series.values) > point_count * 1.5: -+ for _ts in ts_list: -+ if len(_ts.values) < point_count * 0.9 or len(_ts.values) > point_count * 1.5: - continue - -- if sum(time_series.values) == 0: -+ if sum(_ts.values) == 0: - continue - -- score = max(smooth_slope(time_series, windows_length=13)) -- -- if math.isnan(score) or math.isinf(score): -- continue -+ smoothed_val = conv_smooth(_ts.values, box_pts=box_pts) -+ outlier, mean, std = three_sigma(smoothed_val, obs_size=obs_size, method='min') -+ ratio = divide(len(outlier), obs_size) - -- if score > threshold: -+ if outlier and ratio >= outlier_ratio_th: -+ logger.info(f'Ratio: {ratio}, Outlier Ratio TH: {outlier_ratio_th}, ' -+ f'Mean: {mean}, Std: {std}') - anomalies.append( -- Anomaly(metric=time_series.metric, -- labels=time_series.labels, -- score=score, -+ Anomaly(metric=_ts.metric, -+ labels=_ts.labels, -+ score=ratio, -+ entity_name=kpi.entity_name, - description=kpi.description)) - - anomalies = sorted(anomalies, key=lambda x: x.score, reverse=True) -@@ -72,45 +79,45 @@ class SysTcpTransmissionDetector(Detector): - if anomalies: - logger.info('Sys io latency anomalies was detected.') - for anomaly in anomalies: -- self.report(anomaly, kpi.entity_name, machine_id) -+ self.report(anomaly, machine_id) - - def detect_features(self, machine_id: str, top_n=3): - priorities = {f.metric: f.priority for f in self.features} - start, end = dt.last(minutes=6) -- time_series_list = [] -+ ts_list = [] - for metric in priorities.keys(): -- time_series = self.data_loader.get_metric( -- start, end, metric, label_name='machine_id', label_value=machine_id) -- time_series_list.extend(time_series) -+ _ts = self.data_loader.\ -+ get_metric(start, end, metric, label_name='machine_id', label_value=machine_id) -+ ts_list.extend(_ts) - - point_count = self.data_loader.expected_point_length(start, end) -- sr_model = SpectralResidual(12, 24, 50) -+ model = SpectralResidual(12, 24, 50) - - result = [] -- for time_series in time_series_list: -- if len(time_series.values) < point_count * 0.9 or \ -- len(time_series.values) > point_count * 1.5: -+ for _ts in ts_list: -+ if len(_ts.values) < point_count * 0.9 or \ -+ len(_ts.values) > point_count * 1.5: - continue - -- values = time_series.values -+ values = _ts.values - - if all(x == values[0] for x in values): - continue - -- scores = sr_model.compute_score(values) -+ scores = model.compute_score(values) - score = max(scores[-13:]) - - if math.isnan(score) or math.isinf(score): - continue - -- result.append((time_series, score)) -+ result.append((_ts, score)) - - result = sorted(result, key=lambda x: x[1], reverse=True)[0: top_n] - result = sorted(result, key=lambda x: priorities[x[0].metric]) - - return result - -- def report(self, anomaly: Anomaly, entity_name: str, machine_id: str): -+ def report(self, anomaly: Anomaly, machine_id: str): - description = {f.metric: f.description for f in self.features} - cause_metrics = self.detect_features(machine_id, top_n=3) - cause_metrics = [ -@@ -124,6 +131,5 @@ class SysTcpTransmissionDetector(Detector): - cause[0].labels.get('server_port', ''))} - for cause in cause_metrics] - timestamp = dt.utc_now() -- template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, entity_name) -- template.labels = anomaly.labels -+ template = SysAnomalyTemplate(timestamp, machine_id, anomaly.metric, anomaly.entity_name) - self.anomaly_report.sent_anomaly(anomaly, cause_metrics, template) -diff --git a/anteater/provider/base.py b/anteater/provider/base.py -index eda2d1b..35d1d1f 100644 ---- a/anteater/provider/base.py -+++ b/anteater/provider/base.py -@@ -56,16 +56,16 @@ class TimeSeriesProvider: - def fetch(url, params: Dict, **args) -> List: - """Fetches data from prometheus server by http request""" - try: -- response = requests.get(url, params, timeout=30, **args).json() -+ response = requests.get(url, params, timeout=30, **args) - except requests.RequestException as e: - logger.error(f"RequestException: {e}!") - return [] -- -+ response = response.json() - result = [] - if response and response.get("status") == 'success': - result = response.get('data', {}).get('result', []) - else: -- logger.error(f"PrometheusAdapter get data failed, " -+ logger.error(f"Prometheus get data failed, " - f"error: {response.get('error')}, query_url: {url}, params: {params}.") - - return result -@@ -87,17 +87,19 @@ class TimeSeriesProvider: - data = self.fetch(self.url, params, headers=headers) - - for item in data: -- zipped_values = list(zip(*item.get("values"))) -+ zipped_values = list(zip(*item.get('values'))) - time_stamps = list(zipped_values[0]) - values = [float(v) for v in zipped_values[1]] - -- key = tuple(sorted(item.get("metric").items())) -+ key = tuple(sorted(item.get('metric').items())) - if key in tmp_index: - result[tmp_index.get(key)].extend(time_stamps, values) - else: -+ labels = item.get('metric') -+ labels.pop('__name__', None) - time_series = TimeSeries( - metric, -- item.get("metric"), -+ labels, - time_stamps, - values) - tmp_index[key] = len(result) -diff --git a/anteater/source/anomaly_report.py b/anteater/source/anomaly_report.py -index 2205f44..41542b7 100644 ---- a/anteater/source/anomaly_report.py -+++ b/anteater/source/anomaly_report.py -@@ -48,6 +48,7 @@ class AnomalyReport: - entity_name = template.entity_name - labels = anomaly.labels - -+ template.labels = labels - template.entity_id = self.get_entity_id(machine_id, entity_name, labels, keys) - template.keys = keys - template.description = anomaly.description -diff --git a/anteater/template/template.py b/anteater/template/template.py -index 52befaa..d86a8cb 100644 ---- a/anteater/template/template.py -+++ b/anteater/template/template.py -@@ -21,8 +21,8 @@ class Template: - self.machine_id = machine_id - self.metric_id = metric_id - self.entity_name = entity_name -- self.labels = {} - -+ self.labels = {} - self.entity_id = "" - self.description = "" - self.cause_metrics = {} -diff --git a/anteater/utils/common.py b/anteater/utils/common.py -index d6c80ab..a99a1ef 100644 ---- a/anteater/utils/common.py -+++ b/anteater/utils/common.py -@@ -170,3 +170,15 @@ def divide(x, y): - return x / y - else: - return 0 -+ -+ -+def same_intersection_key_value(first: dict, second: dict): -+ """Checks there are same key value pairs between two dictionaries -+ intersections by the key -+ """ -+ same_keys = set(first.keys()) & set(second.keys()) -+ for key in same_keys: -+ if first[key] != second[key]: -+ return False -+ -+ return True -diff --git a/config/gala-anteater.yaml b/config/gala-anteater.yaml -index b771c16..a01eb47 100644 ---- a/config/gala-anteater.yaml -+++ b/config/gala-anteater.yaml -@@ -3,7 +3,7 @@ Global: - is_sys: false - - Kafka: -- server: "9.16.143.92" -+ server: "localhost" - port: "9092" - model_topic: "gala_anteater_hybrid_model" - model_group_id: "gala_anteater_1" -@@ -12,8 +12,8 @@ Kafka: - meta_entity_name: "sli" - - Prometheus: -- server: "10.137.17.122" -- port: "29090" -+ server: "localhost" -+ port: "9090" - steps: 5 - - Aom: -diff --git a/config/module/app_sli_rtt.json b/config/module/app_sli_rtt.json -index 4372f07..0744416 100644 ---- a/config/module/app_sli_rtt.json -+++ b/config/module/app_sli_rtt.json -@@ -6,9 +6,11 @@ - "entity_name": "sli", - "enable": true, - "description": "sli rtt 异常", -- "parameter": { -- "min_nsec": 200000000, -- "threshold": 0.8 -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 - } - }, - { -@@ -17,8 +19,11 @@ - "entity_name": "sli", - "enable": true, - "description": "sli tps 异常", -- "parameter": { -- "threshold": -0.5 -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 - } - } - ], -diff --git a/config/module/proc_io_latency.json b/config/module/proc_io_latency.json -index 05bcd81..967ee10 100644 ---- a/config/module/proc_io_latency.json -+++ b/config/module/proc_io_latency.json -@@ -6,8 +6,11 @@ - "entity_name": "thread", - "enable": true, - "description": "Process IO_wait time (unit: us)", -- "parameter": { -- "threshold": 0.5 -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 - } - }, - { -@@ -16,8 +19,11 @@ - "entity_name": "proc", - "enable": true, - "description": "I/O operation delay at the BIO layer (unit: us)", -- "parameter": { -- "threshold": 0.5 -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 - } - } - ], -diff --git a/config/module/sys_io_latency.json b/config/module/sys_io_latency.json -index 66e5c5a..f790192 100644 ---- a/config/module/sys_io_latency.json -+++ b/config/module/sys_io_latency.json -@@ -5,9 +5,12 @@ - "kpi_type": "", - "entity_name": "block", - "enable": true, -- "description": "Block I/O latency performance", -- "parameter": { -- "threshold": 0.5 -+ "description": "Block I/O latency performance is deteriorating!", -+ "params": { -+ "look_back": 20, -+ "box_pts": 7, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 - } - } - ], -diff --git a/config/module/sys_tcp_establish.json b/config/module/sys_tcp_establish.json -index d695c2c..b6589ed 100644 ---- a/config/module/sys_tcp_establish.json -+++ b/config/module/sys_tcp_establish.json -@@ -6,7 +6,10 @@ - "entity_name": "tcp_link", - "enable": true, - "description": "RTT of syn packet(us): existing {:.0%} syn packets rtt are more than {:.0f} us", -- "parameter": {} -+ "params": { -+ "look_back": 30, -+ "outlier_ratio_th": 0.3 -+ } - } - ], - "Features": [ -diff --git a/config/module/sys_tcp_transmission.json b/config/module/sys_tcp_transmission.json -index 5347cc9..522056f 100644 ---- a/config/module/sys_tcp_transmission.json -+++ b/config/module/sys_tcp_transmission.json -@@ -6,8 +6,37 @@ - "entity_name": "tcp_link", - "enable": true, - "description": "Smoothed Round Trip Time(us)", -- "parameter": { -- "threshold": 0.5 -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 -+ } -+ }, -+ { -+ "metric": "gala_gopher_net_tcp_in_segs", -+ "kpi_type": "in_segs", -+ "entity_name": "tcp_link", -+ "enable": true, -+ "description": "Total number of segments received", -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 -+ } -+ }, -+ { -+ "metric": "gala_gopher_net_tcp_out_segs", -+ "kpi_type": "out_segs", -+ "entity_name": "tcp_link", -+ "enable": true, -+ "description": "Total number of segments sent", -+ "params": { -+ "look_back": 10, -+ "box_pts": 3, -+ "obs_size": 25, -+ "outlier_ratio_th": 0.3 - } - } - ], --- -2.37.0.windows.1 -