import multiprocessing
import os
import random
from configparser import ConfigParser
from unittest import mock
from dbmind.app.monitoring import ad_pool_manager, generic_anomaly_detector
from dbmind.common import utils
from dbmind.common.algorithm import anomaly_detection
from dbmind.common.tsdb.tsdb_client_factory import TsdbClientFactory
from dbmind.common.types import Sequence
from dbmind.cmd import edbmind
from dbmind.components.anomaly_detection import main as ad_main
from dbmind.service import dai
from .conftest import mock_get_metric_sequence
cpus = multiprocessing.cpu_count()
pool = multiprocessing.Pool(cpus)
test_spike_timestamps = [1636992000, 1636992060, 1636992120, 1636992180, 1636992240, 1636992300, 1636992360, 1636992420,
1636992480, 1636992540, 1636992600, 1636992660, 1636992720, 1636992780, 1636992840, 1636992900,
1636992960, 1636993020, 1636993080, 1636993140, 1636993200, 1636993260, 1636993320, 1636993380,
1636993440, 1636993500, 1636993560, 1636993620, 1636993680, 1636993740, 1636993800, 1636993860,
1636993920, 1636993980, 1636994040, 1636994100, 1636994160, 1636994220, 1636994280, 1636994340,
1636994400, 1636994460, 1636994520, 1636994580, 1636994640, 1636994700, 1636994760, 1636994820,
1636994880, 1636994940, 1636995000, 1636995060, 1636995120, 1636995180, 1636995240, 1636995300,
1636995360, 1636995420, 1636995480, 1636995540, 1636995600, 1636995660, 1636995720, 1636995780,
1636995840, 1636995900, 1636995960, 1636996020, 1636996080, 1636996140, 1636996200, 1636996260,
1636996320, 1636996380, 1636996440, 1636996500, 1636996560, 1636996620, 1636996680, 1636996740,
1636996800, 1636996860, 1636996920, 1636996980, 1636997040, 1636997100, 1636997160, 1636997220,
1636997280, 1636997340, 1636997400, 1636997460, 1636997520, 1636997580, 1636997640, 1636997700,
1636997760, 1636997820, 1636997880, 1636997940, 1636998000, 1636998060, 1636998120, 1636998180,
1636998240, 1636998300, 1636998360, 1636998420, 1636998480, 1636998540, 1636998600, 1636998660,
1636998720, 1636998780, 1636998840, 1636998900, 1636998960, 1636999020, 1636999080, 1636999140,
1636999200, 1636999260, 1636999320, 1636999380, 1636999440, 1636999500, 1636999560, 1636999620,
1636999680, 1636999740, 1636999800, 1636999860, 1636999920, 1636999980, 1637000040, 1637000100,
1637000160, 1637000220, 1637000280, 1637000340, 1637000400, 1637000460, 1637000520, 1637000580,
1637000640, 1637000700, 1637000760, 1637000820, 1637000880, 1637000940, 1637001000, 1637001060,
1637001120, 1637001180, 1637001240, 1637001300, 1637001360, 1637001420, 1637001480, 1637001540,
1637001600, 1637001660, 1637001720, 1637001780, 1637001840, 1637001900, 1637001960, 1637002020,
1637002080, 1637002140, 1637002200, 1637002260, 1637002320, 1637002380, 1637002440, 1637002500,
1637002560, 1637002620, 1637002680, 1637002740, 1637002800, 1637002860, 1637002920, 1637002980,
1637003040, 1637003100, 1637003160, 1637003220, 1637003280, 1637003340, 1637003400, 1637003460,
1637003520, 1637003580, 1637003640, 1637003700, 1637003760, 1637003820, 1637003880, 1637003940,
1637004000, 1637004060, 1637004120, 1637004180, 1637004240, 1637004300, 1637004360, 1637004420,
1637004480, 1637004540, 1637004600, 1637004660, 1637004720, 1637004780, 1637004840, 1637004900,
1637004960, 1637005020, 1637005080, 1637005140, 1637005200, 1637005260, 1637005320, 1637005380,
1637005440, 1637005500, 1637005560, 1637005620, 1637005680, 1637005740, 1637005800, 1637005860,
1637005920, 1637005980, 1637006040, 1637006100, 1637006160, 1637006220, 1637006280, 1637006340,
1637006400, 1637006460, 1637006520, 1637006580, 1637006640, 1637006700, 1637006760, 1637006820,
1637006880, 1637006940, 1637007000, 1637007060, 1637007120, 1637007180, 1637007240, 1637007300,
1637007360, 1637007420, 1637007480, 1637007540, 1637007600, 1637007660, 1637007720, 1637007780,
1637007840, 1637007900, 1637007960, 1637008020, 1637008080, 1637008140, 1637008200, 1637008260,
1637008320, 1637008380, 1637008440, 1637008500, 1637008560, 1637008620, 1637008680, 1637008740,
1637008800, 1637008860, 1637008920, 1637008980, 1637009040, 1637009100, 1637009160, 1637009220,
1637009280, 1637009340, 1637009400, 1637009460, 1637009520, 1637009580, 1637009640, 1637009700,
1637009760, 1637009820, 1637009880, 1637009940, 1637010000, 1637010060, 1637010120, 1637010180,
1637010240, 1637010300, 1637010360, 1637010420, 1637010480, 1637010540, 1637010600, 1637010660,
1637010720, 1637010780, 1637010840, 1637010900, 1637010960, 1637011020, 1637011080, 1637011140,
1637011200, 1637011260, 1637011320, 1637011380, 1637011440, 1637011500, 1637011560, 1637011620,
1637011680, 1637011740, 1637011800, 1637011860, 1637011920, 1637011980, 1637012040, 1637012100,
1637012160, 1637012220, 1637012280, 1637012340, 1637012400, 1637012460, 1637012520, 1637012580,
1637012640, 1637012700, 1637012760, 1637012820, 1637012880, 1637012940, 1637013000, 1637013060,
1637013120, 1637013180, 1637013240, 1637013300, 1637013360, 1637013420, 1637013480, 1637013540,
1637013600, 1637013660, 1637013720, 1637013780, 1637013840, 1637013900, 1637013960, 1637014020,
1637014080, 1637014140, 1637014200, 1637014260, 1637014320, 1637014380, 1637014440, 1637014500,
1637014560, 1637014620, 1637014680, 1637014740, 1637014800, 1637014860, 1637014920, 1637014980,
1637015040, 1637015100, 1637015160, 1637015220, 1637015280, 1637015340, 1637015400, 1637015460,
1637015520, 1637015580, 1637015640, 1637015700, 1637015760, 1637015820, 1637015880, 1637015940,
1637016000, 1637016060, 1637016120, 1637016180, 1637016240, 1637016300, 1637016360, 1637016420,
1637016480, 1637016540, 1637016600, 1637016660, 1637016720, 1637016780, 1637016840, 1637016900,
1637016960, 1637017020, 1637017080, 1637017140, 1637017200, 1637017260, 1637017320, 1637017380,
1637017440, 1637017500, 1637017560, 1637017620, 1637017680, 1637017740, 1637017800, 1637017860,
1637017920, 1637017980, 1637018040, 1637018100, 1637018160, 1637018220, 1637018280, 1637018340,
1637018400, 1637018460, 1637018520, 1637018580, 1637018640, 1637018700, 1637018760, 1637018820,
1637018880, 1637018940, 1637019000, 1637019060, 1637019120, 1637019180, 1637019240, 1637019300,
1637019360, 1637019420, 1637019480, 1637019540, 1637019600, 1637019660, 1637019720, 1637019780,
1637019840, 1637019900, 1637019960, 1637020020, 1637020080, 1637020140, 1637020200, 1637020260,
1637020320, 1637020380, 1637020440, 1637020500, 1637020560, 1637020620, 1637020680, 1637020740,
1637020800, 1637020860, 1637020920, 1637020980, 1637021040, 1637021100, 1637021160, 1637021220,
1637021280, 1637021340, 1637021400, 1637021460, 1637021520, 1637021580, 1637021640, 1637021700,
1637021760, 1637021820, 1637021880, 1637021940, 1637022000, 1637022060, 1637022120, 1637022180,
1637022240, 1637022300, 1637022360, 1637022420, 1637022480, 1637022540, 1637022600, 1637022660,
1637022720, 1637022780, 1637022840, 1637022900, 1637022960, 1637023020, 1637023080, 1637023140,
1637023200, 1637023260, 1637023320, 1637023380, 1637023440, 1637023500, 1637023560, 1637023620,
1637023680, 1637023740, 1637023800, 1637023860, 1637023920, 1637023980, 1637024040, 1637024100,
1637024160, 1637024220, 1637024280, 1637024340, 1637024400, 1637024460, 1637024520, 1637024580,
1637024640, 1637024700, 1637024760, 1637024820, 1637024880, 1637024940, 1637025000, 1637025060,
1637025120, 1637025180, 1637025240, 1637025300, 1637025360, 1637025420, 1637025480, 1637025540,
1637025600, 1637025660, 1637025720, 1637025780, 1637025840, 1637025900, 1637025960, 1637026020,
1637026080, 1637026140, 1637026200, 1637026260, 1637026320, 1637026380, 1637026440, 1637026500,
1637026560, 1637026620, 1637026680, 1637026740, 1637026800, 1637026860, 1637026920, 1637026980,
1637027040, 1637027100, 1637027160, 1637027220, 1637027280, 1637027340, 1637027400, 1637027460,
1637027520, 1637027580, 1637027640, 1637027700, 1637027760, 1637027820, 1637027880, 1637027940,
1637028000, 1637028060, 1637028120, 1637028180, 1637028240, 1637028300, 1637028360, 1637028420,
1637028480, 1637028540, 1637028600, 1637028660, 1637028720, 1637028780, 1637028840, 1637028900,
1637028960, 1637029020, 1637029080, 1637029140, 1637029200, 1637029260, 1637029320, 1637029380,
1637029440, 1637029500, 1637029560, 1637029620, 1637029680, 1637029740, 1637029800, 1637029860,
1637029920, 1637029980, 1637030040, 1637030100, 1637030160, 1637030220, 1637030280, 1637030340,
1637030400, 1637030460, 1637030520, 1637030580, 1637030640, 1637030700, 1637030760, 1637030820,
1637030880, 1637030940, 1637031000, 1637031060, 1637031120, 1637031180, 1637031240, 1637031300,
1637031360, 1637031420, 1637031480, 1637031540, 1637031600, 1637031660, 1637031720, 1637031780,
1637031840, 1637031900, 1637031960, 1637032020, 1637032080, 1637032140, 1637032200, 1637032260,
1637032320, 1637032380, 1637032440, 1637032500, 1637032560, 1637032620, 1637032680, 1637032740,
1637032800, 1637032860, 1637032920, 1637032980, 1637033040, 1637033100, 1637033160, 1637033220,
1637033280, 1637033340, 1637033400, 1637033460, 1637033520, 1637033580, 1637033640, 1637033700,
1637033760, 1637033820, 1637033880, 1637033940, 1637034000, 1637034060, 1637034120, 1637034180,
1637034240, 1637034300, 1637034360, 1637034420, 1637034480, 1637034540, 1637034600, 1637034660,
1637034720, 1637034780, 1637034840, 1637034900, 1637034960, 1637035020, 1637035080, 1637035140,
1637035200, 1637035260, 1637035320, 1637035380, 1637035440, 1637035500, 1637035560, 1637035620,
1637035680, 1637035740, 1637035800, 1637035860, 1637035920, 1637035980, 1637036040, 1637036100,
1637036160, 1637036220, 1637036280, 1637036340, 1637036400, 1637036460, 1637036520, 1637036580,
1637036640, 1637036700, 1637036760, 1637036820, 1637036880, 1637036940, 1637037000, 1637037060,
1637037120, 1637037180, 1637037240, 1637037300, 1637037360, 1637037420, 1637037480, 1637037540,
1637037600, 1637037660, 1637037720, 1637037780, 1637037840, 1637037900, 1637037960, 1637038020,
1637038080, 1637038140, 1637038200, 1637038260, 1637038320, 1637038380, 1637038440, 1637038500,
1637038560, 1637038620, 1637038680, 1637038740, 1637038800, 1637038860, 1637038920, 1637038980,
1637039040, 1637039100, 1637039160, 1637039220, 1637039280, 1637039340, 1637039400, 1637039460,
1637039520, 1637039580, 1637039640, 1637039700, 1637039760, 1637039820, 1637039880, 1637039940,
1637040000, 1637040060, 1637040120, 1637040180, 1637040240, 1637040300, 1637040360, 1637040420,
1637040480, 1637040540, 1637040600, 1637040660, 1637040720, 1637040780, 1637040840, 1637040900,
1637040960, 1637041020, 1637041080, 1637041140, 1637041200, 1637041260, 1637041320, 1637041380,
1637041440, 1637041500, 1637041560, 1637041620, 1637041680, 1637041740, 1637041800, 1637041860,
1637041920, 1637041980, 1637042040, 1637042100, 1637042160, 1637042220, 1637042280, 1637042340,
1637042400, 1637042460, 1637042520, 1637042580, 1637042640, 1637042700, 1637042760, 1637042820,
1637042880, 1637042940, 1637043000, 1637043060, 1637043120, 1637043180, 1637043240, 1637043300,
1637043360, 1637043420, 1637043480, 1637043540, 1637043600, 1637043660, 1637043720, 1637043780,
1637043840, 1637043900, 1637043960, 1637044020, 1637044080, 1637044140, 1637044200, 1637044260,
1637044320, 1637044380, 1637044440, 1637044500, 1637044560, 1637044620, 1637044680, 1637044740,
1637044800, 1637044860, 1637044920, 1637044980, 1637045040, 1637045100, 1637045160, 1637045220,
1637045280, 1637045340, 1637045400, 1637045460, 1637045520, 1637045580, 1637045640, 1637045700,
1637045760, 1637045820, 1637045880, 1637045940, 1637046000, 1637046060, 1637046120, 1637046180,
1637046240, 1637046300, 1637046360, 1637046420, 1637046480, 1637046540, 1637046600, 1637046660,
1637046720, 1637046780, 1637046840, 1637046900, 1637046960, 1637047020, 1637047080, 1637047140,
1637047200, 1637047260, 1637047320, 1637047380, 1637047440, 1637047500, 1637047560, 1637047620,
1637047680, 1637047740, 1637047800, 1637047860, 1637047920, 1637047980, 1637048040, 1637048100,
1637048160, 1637048220, 1637048280, 1637048340, 1637048400, 1637048460, 1637048520, 1637048580,
1637048640, 1637048700, 1637048760, 1637048820, 1637048880, 1637048940, 1637049000, 1637049060,
1637049120, 1637049180, 1637049240, 1637049300, 1637049360, 1637049420, 1637049480, 1637049540,
1637049600, 1637049660, 1637049720, 1637049780, 1637049840, 1637049900, 1637049960, 1637050020,
1637050080, 1637050140, 1637050200, 1637050260, 1637050320, 1637050380, 1637050440, 1637050500,
1637050560, 1637050620, 1637050680, 1637050740, 1637050800, 1637050860, 1637050920, 1637050980,
1637051040, 1637051100, 1637051160, 1637051220, 1637051280, 1637051340, 1637051400, 1637051460,
1637051520, 1637051580, 1637051640, 1637051700, 1637051760, 1637051820, 1637051880, 1637051940,
1637052000, 1637052060, 1637052120, 1637052180, 1637052240, 1637052300, 1637052360, 1637052420,
1637052480, 1637052540, 1637052600, 1637052660, 1637052720, 1637052780, 1637052840, 1637052900,
1637052960, 1637053020, 1637053080, 1637053140, 1637053200, 1637053260, 1637053320, 1637053380,
1637053440, 1637053500, 1637053560, 1637053620, 1637053680, 1637053740, 1637053800, 1637053860,
1637053920, 1637053980, 1637054040, 1637054100, 1637054160, 1637054220, 1637054280, 1637054340,
1637054400, 1637054460, 1637054520, 1637054580, 1637054640, 1637054700, 1637054760, 1637054820,
1637054880, 1637054940, 1637055000, 1637055060, 1637055120, 1637055180, 1637055240, 1637055300,
1637055360, 1637055420, 1637055480, 1637055540, 1637055600, 1637055660, 1637055720, 1637055780,
1637055840, 1637055900, 1637055960, 1637056020, 1637056080, 1637056140, 1637056200, 1637056260,
1637056320, 1637056380, 1637056440, 1637056500, 1637056560, 1637056620, 1637056680, 1637056740,
1637056800, 1637056860, 1637056920, 1637056980, 1637057040, 1637057100, 1637057160, 1637057220,
1637057280, 1637057340, 1637057400, 1637057460, 1637057520, 1637057580, 1637057640, 1637057700,
1637057760, 1637057820, 1637057880, 1637057940, 1637058000, 1637058060, 1637058120, 1637058180,
1637058240, 1637058300, 1637058360, 1637058420, 1637058480, 1637058540, 1637058600, 1637058660,
1637058720, 1637058780, 1637058840, 1637058900, 1637058960, 1637059020, 1637059080, 1637059140,
1637059200, 1637059260, 1637059320, 1637059380, 1637059440, 1637059500, 1637059560, 1637059620,
1637059680, 1637059740, 1637059800, 1637059860, 1637059920, 1637059980, 1637060040, 1637060100,
1637060160, 1637060220, 1637060280, 1637060340, 1637060400, 1637060460, 1637060520, 1637060580,
1637060640, 1637060700, 1637060760, 1637060820, 1637060880, 1637060940, 1637061000, 1637061060,
1637061120, 1637061180, 1637061240, 1637061300, 1637061360, 1637061420, 1637061480, 1637061540,
1637061600, 1637061660, 1637061720, 1637061780, 1637061840, 1637061900, 1637061960, 1637062020,
1637062080, 1637062140, 1637062200, 1637062260, 1637062320, 1637062380, 1637062440, 1637062500,
1637062560, 1637062620, 1637062680, 1637062740, 1637062800, 1637062860, 1637062920, 1637062980,
1637063040, 1637063100, 1637063160, 1637063220, 1637063280, 1637063340, 1637063400, 1637063460,
1637063520, 1637063580, 1637063640, 1637063700, 1637063760, 1637063820, 1637063880, 1637063940,
1637064000, 1637064060, 1637064120, 1637064180, 1637064240, 1637064300, 1637064360, 1637064420,
1637064480, 1637064540, 1637064600, 1637064660, 1637064720, 1637064780, 1637064840, 1637064900,
1637064960, 1637065020, 1637065080, 1637065140, 1637065200, 1637065260, 1637065320, 1637065380,
1637065440, 1637065500, 1637065560, 1637065620, 1637065680, 1637065740, 1637065800, 1637065860,
1637065920, 1637065980, 1637066040, 1637066100, 1637066160, 1637066220, 1637066280, 1637066340,
1637066400, 1637066460, 1637066520, 1637066580, 1637066640, 1637066700, 1637066760, 1637066820,
1637066880, 1637066940, 1637067000, 1637067060, 1637067120, 1637067180, 1637067240, 1637067300,
1637067360, 1637067420, 1637067480, 1637067540, 1637067600, 1637067660, 1637067720, 1637067780,
1637067840, 1637067900, 1637067960, 1637068020, 1637068080, 1637068140, 1637068200, 1637068260,
1637068320, 1637068380, 1637068440, 1637068500, 1637068560, 1637068620, 1637068680, 1637068740,
1637068800, 1637068860, 1637068920, 1637068980, 1637069040, 1637069100, 1637069160, 1637069220,
1637069280, 1637069340, 1637069400, 1637069460, 1637069520, 1637069580, 1637069640, 1637069700,
1637069760, 1637069820, 1637069880, 1637069940, 1637070000, 1637070060, 1637070120, 1637070180,
1637070240, 1637070300, 1637070360, 1637070420, 1637070480, 1637070540, 1637070600, 1637070660,
1637070720, 1637070780, 1637070840, 1637070900, 1637070960, 1637071020, 1637071080, 1637071140,
1637071200, 1637071260, 1637071320, 1637071380, 1637071440, 1637071500, 1637071560, 1637071620,
1637071680, 1637071740, 1637071800, 1637071860, 1637071920, 1637071980, 1637072040, 1637072100,
1637072160, 1637072220, 1637072280, 1637072340, 1637072400, 1637072460, 1637072520, 1637072580,
1637072640, 1637072700, 1637072760, 1637072820, 1637072880, 1637072940, 1637073000, 1637073060,
1637073120, 1637073180, 1637073240, 1637073300, 1637073360, 1637073420, 1637073480, 1637073540,
1637073600, 1637073660, 1637073720, 1637073780, 1637073840, 1637073900, 1637073960, 1637074020,
1637074080, 1637074140, 1637074200, 1637074260, 1637074320, 1637074380, 1637074440, 1637074500,
1637074560, 1637074620, 1637074680, 1637074740, 1637074800, 1637074860, 1637074920, 1637074980,
1637075040, 1637075100, 1637075160, 1637075220, 1637075280, 1637075340, 1637075400, 1637075460,
1637075520, 1637075580, 1637075640, 1637075700, 1637075760, 1637075820, 1637075880, 1637075940,
1637076000, 1637076060, 1637076120, 1637076180, 1637076240, 1637076300, 1637076360, 1637076420,
1637076480, 1637076540, 1637076600, 1637076660, 1637076720, 1637076780, 1637076840, 1637076900,
1637076960, 1637077020, 1637077080, 1637077140, 1637077200, 1637077260, 1637077320, 1637077380,
1637077440, 1637077500, 1637077560, 1637077620, 1637077680, 1637077740, 1637077800, 1637077860,
1637077920, 1637077980, 1637078040, 1637078100, 1637078160, 1637078220, 1637078280, 1637078340]
test_spike_data = [50.49714285714286, 27.55818181818182, 17.876666666666665, 17.64, 16.908333333333335, 17.195, 16.25,
16.271666666666665, 16.618333333333336, 16.71166666666667, 17.383333333333333, 16.226666666666667,
15.996666666666668, 15.633333333333333, 15.67, 16.816666666666666, 15.665, 15.468333333333332,
15.936666666666667, 15.543333333333331, 15.645454545454545, 15.058333333333332, 15.15,
15.05833333333333, 15.931666666666665, 16.008333333333336, 16.475, 15.366666666666667,
15.188333333333338, 15.913333333333334, 20.14666666666667, 22.87, 18.926666666666662,
16.439999999999998, 24.28833333333333, 15.173333333333332, 14.101666666666668, 20.433333333333334,
18.52166666666667, 19.62666666666667, 16.103333333333335, 13.133333333333333, 13.48,
13.953333333333331, 13.858333333333334, 13.76, 13.005, 12.878333333333336, 13.368333333333338,
12.831666666666669, 13.201666666666666, 12.605000000000004, 13.015, 13.083333333333336, 13.055,
13.05, 12.496666666666664, 12.906666666666666, 12.880000000000004, 13.785000000000002,
18.101666666666667, 13.175, 13.493333333333332, 13.528333333333334, 13.591666666666669,
14.105000000000002, 13.06333333333333, 13.48, 13.831666666666663, 13.566666666666668,
13.421666666666663, 13.093333333333334, 13.116666666666667, 13.016666666666667, 13.138333333333334,
12.676666666666668, 13.02833333333333, 12.621666666666668, 13.058333333333332, 12.341666666666669,
12.331666666666669, 12.273333333333335, 12.166666666666666, 12.14333333333333, 12.37833333333333,
12.345, 13.458333333333334, 12.095, 12.120000000000005, 12.418333333333337, 13.288333333333332,
20.25, 15.208333333333334, 13.27833333333333, 21.25833333333333, 11.931666666666668,
10.958333333333334, 17.083333333333332, 16.720000000000002, 17.195, 13.365000000000002,
10.785000000000002, 11.031666666666666, 11.25, 11.045, 10.749999999999998, 10.795, 10.78, 11.835,
11.165, 10.603333333333332, 10.186666666666666, 10.386666666666668, 10.476666666666665,
10.249999999999998, 10.678333333333333, 10.078333333333337, 10.025, 10.246666666666668,
10.691666666666668, 14.105000000000002, 10.061666666666666, 10.091666666666669, 9.898333333333332,
10.003333333333336, 9.908333333333331, 9.358333333333333, 9.438333333333333, 9.845,
9.501666666666663, 9.756666666666666, 9.023333333333332, 9.02, 9.325, 9.376666666666669, 9.76,
9.231666666666666, 9.058333333333334, 9.575, 9.285, 9.766666666666667, 8.623333333333333,
9.148333333333332, 8.806666666666667, 8.95, 9.663333333333332, 11.004999999999995, 8.959999999999999,
9.276666666666666, 9.111666666666666, 9.61, 17.965, 12.825000000000005, 10.582, 19.18, 9.38,
8.218333333333334, 14.598333333333334, 12.828333333333337, 14.485, 10.88, 7.883333333333334,
8.188333333333334, 8.651666666666666, 8.264999999999999, 9.375, 8.076666666666666, 8.418333333333335,
8.783333333333333, 8.076666666666668, 8.863333333333333, 7.748333333333334, 8.073333333333332,
8.26833333333333, 8.266666666666667, 8.418333333333333, 8.180000000000001, 8.151666666666667,
8.733333333333333, 8.231666666666666, 10.875, 8.29, 8.643333333333333, 8.928333333333333,
8.353333333333333, 8.533333333333333, 8.123333333333333, 7.918333333333333, 8.406666666666668,
8.231666666666667, 8.518333333333333, 7.726666666666667, 7.831666666666666, 8.08, 7.981666666666666,
8.360000000000001, 7.765, 8.124999999999998, 8.305, 8.333333333333334, 8.405, 8.266666666666667,
8.056666666666667, 7.838333333333334, 8.219999999999999, 8.233333333333333, 10.07, 8.256666666666666,
8.718333333333334, 8.356666666666666, 10.173333333333334, 17.173333333333332, 11.94833333333333,
9.663333333333336, 18.17833333333333, 8.514999999999999, 8.04, 14.570000000000002, 13.13,
13.908333333333337, 10.395, 7.495000000000001, 7.85, 8.115, 7.951666666666665, 7.995,
7.696666666666668, 8.115, 8.171666666666667, 8.316666666666666, 8.056666666666667, 7.466666666666666,
7.686666666666666, 8.328333333333335, 8.093333333333334, 7.956666666666667, 7.600000000000001,
7.788333333333333, 8.196666666666667, 8.391666666666666, 26.73, 7.828333333333336, 8.071666666666669,
8.214999999999998, 8.013333333333334, 8.46, 7.565, 7.798333333333333, 7.916666666666667, 7.94,
7.988333333333333, 7.383333333333335, 7.626666666666668, 8.01, 7.829999999999999, 8.280000000000001,
7.763333333333332, 7.555, 8.254999999999999, 7.704999999999999, 8.42, 7.191666666666666,
7.226666666666667, 7.728333333333334, 7.646666666666667, 8.023333333333333, 9.55, 7.518333333333333,
7.664999999999999, 7.63, 9.148333333333332, 16.491666666666667, 11.776, 9.067272727272728,
17.728333333333335, 8.155000000000001, 7.653333333333332, 14.471666666666664, 12.501666666666663,
13.795000000000002, 10.803333333333333, 7.376666666666666, 7.698333333333334, 7.423333333333335,
7.796666666666668, 8.046666666666669, 7.606666666666666, 7.886666666666667, 7.958333333333332,
8.141666666666666, 8.528333333333334, 7.3066666666666675, 7.908333333333332, 8.126666666666665,
7.838333333333331, 8.715, 7.675, 8.026666666666666, 8.098333333333334, 8.053333333333333,
13.396666666666668, 7.919999999999999, 7.774999999999999, 8.168333333333335, 8.108333333333333,
8.596666666666668, 7.91, 8.018333333333333, 8.39, 7.918333333333333, 8.608333333333334, 7.55,
7.933333333333333, 7.861666666666668, 7.953333333333334, 9.021666666666668, 7.781666666666666,
7.913333333333334, 8.158333333333335, 7.963333333333334, 9.316666666666665, 7.811666666666665,
7.729999999999999, 8.418333333333333, 8.381666666666666, 8.785000000000002, 10.248333333333331,
8.090000000000002, 8.680000000000001, 9.301666666666666, 12.229999999999997, 18.375,
12.188333333333334, 10.171666666666669, 18.40833333333333, 9.321666666666667, 8.598333333333331,
15.066666666666665, 13.590000000000002, 14.821666666666667, 12.108333333333333, 8.40181818181818,
8.888333333333335, 8.831666666666665, 8.985, 10.141666666666667, 8.526666666666667,
8.876666666666667, 9.016666666666667, 9.166666666666666, 10.348333333333333, 9.031666666666666,
9.475, 9.896666666666668, 10.138333333333334, 10.706666666666663, 9.035, 9.733333333333334,
10.208333333333334, 10.19, 56.93666666666667, 11.492727272727272, 11.091666666666669, 11.17,
11.105000000000002, 12.395, 10.708333333333334, 10.846666666666666, 10.745, 11.123333333333337,
13.161666666666669, 11.515, 11.18, 11.116666666666667, 11.086666666666666, 12.620000000000005,
11.366666666666667, 12.383333333333336, 12.168333333333337, 11.638333333333334, 19.27,
13.656666666666665, 12.828333333333337, 16.736666666666668, 14.1, 14.613333333333332,
15.519999999999998, 13.365, 13.343333333333334, 13.916666666666666, 25.261666666666667, 25.285,
21.184, 16.19333333333333, 26.68166666666667, 19.91, 14.961666666666666, 22.42166666666667,
22.95833333333333, 21.581666666666667, 22.93166666666666, 16.330000000000002, 15.784999999999998,
15.45, 15.593333333333328, 18.22, 15.171666666666663, 16.645, 17.833333333333332, 16.561666666666667,
19.77, 17.02, 18.966666666666665, 17.404999999999998, 17.143333333333327, 18.575000000000003,
16.40666666666667, 20.085, 21.25833333333333, 20.66, 50.86833333333333, 23.696666666666665,
20.15833333333333, 19.23, 18.30666666666667, 19.435, 17.305000000000003, 18.38833333333333,
19.031666666666663, 17.76833333333333, 22.02, 17.89166666666667, 17.75166666666667,
18.26833333333333, 17.61666666666667, 21.66166666666666, 20.496666666666663, 19.01833333333333,
18.811666666666667, 18.136666666666667, 23.318333333333328, 19.065, 18.62333333333333,
18.33666666666667, 19.12, 20.06, 20.28, 18.78833333333333, 20.891666666666666, 20.65833333333333,
34.00166666666667, 29.28, 24.040000000000003, 20.925454545454546, 29.219999999999995, 21.275,
18.61090909090909, 24.218333333333334, 24.46, 24.99833333333333, 25.47833333333333,
18.946666666666665, 18.305000000000003, 18.76, 18.425, 20.29, 18.258333333333336, 18.351666666666667,
18.126666666666665, 19.00666666666667, 21.03, 18.055, 18.348333333333333, 18.52, 18.135000000000005,
19.476666666666667, 19.08, 18.17166666666667, 19.65833333333333, 20.821666666666665,
61.95333333333334, 35.64833333333333, 21.77333333333333, 20.415000000000003, 20.275,
20.651666666666667, 19.313333333333336, 19.31, 19.423333333333336, 18.901666666666667,
22.49833333333333, 18.371666666666663, 18.718333333333334, 18.65, 17.566666666666666,
19.566666666666663, 17.933333333333334, 17.34, 18.426666666666662, 18.195, 20.69, 18.03, 18.52,
18.58333333333333, 18.695000000000004, 19.308333333333334, 19.701666666666668, 18.205, 19.035, 18.82,
46.70499999999999, 29.041818181818183, 23.061666666666664, 20.141666666666666, 28.31, 19.505,
17.656666666666663, 24.65833333333333, 22.723333333333333, 23.83, 21.67, 18.065, 17.55666666666667,
18.798333333333336, 17.99666666666667, 18.611666666666668, 18.371666666666663, 18.23,
17.851666666666663, 17.686666666666664, 19.11666666666667, 17.793333333333333, 18.081666666666663,
17.78333333333333, 17.764999999999997, 18.81833333333333, 17.926666666666666, 17.786666666666665,
18.651666666666667, 18.861666666666665, 86.39166666666667, 74.06666666666666, 50.57666666666666,
49.47, 47.36000000000001, 47.38333333333333, 41.00833333333333, 24.30333333333333,
19.313333333333336, 19.38666666666667, 20.185, 19.76833333333333, 18.898333333333333,
18.648333333333333, 18.34, 19.365, 17.669999999999998, 18.003333333333334, 18.235,
18.011666666666667, 18.468333333333334, 17.62666666666667, 18.131666666666664, 18.011666666666667,
17.736666666666668, 18.786666666666665, 19.951666666666668, 18.36666666666667, 18.66166666666667,
20.098333333333336, 23.801666666666662, 27.24833333333333, 21.96666666666667, 19.783636363636365,
27.76333333333333, 18.8, 17.611666666666668, 25.183333333333334, 23.341666666666665, 23.935,
20.51833333333333, 18.493333333333336, 17.80666666666667, 17.94666666666667, 18.76833333333333,
19.57333333333333, 17.915000000000003, 17.33, 18.065, 18.131666666666664, 18.263333333333332,
17.58666666666667, 17.633333333333336, 18.12833333333333, 18.508333333333333, 18.453333333333337,
18.015, 18.41, 18.203333333333333, 19.85, 33.041666666666664, 19.35833333333333, 18.666666666666664,
18.575, 18.736666666666668, 19.19833333333333, 18.74833333333333, 18.68166666666667,
18.756666666666664, 18.791666666666668, 18.88, 18.361666666666668, 18.165000000000003,
18.078333333333333, 18.73333333333333, 18.716666666666665, 17.941666666666666, 18.47,
18.433333333333334, 17.845000000000002, 18.896666666666665, 18.50166666666667, 18.25166666666667,
18.50833333333333, 18.081666666666667, 18.596666666666668, 20.065, 17.716666666666665, 18.595, 19.09,
21.882, 27.146666666666665, 23.24833333333333, 19.89, 28.42, 19.2, 17.993333333333332,
23.445000000000004, 23.481666666666666, 24.251666666666665, 20.49333333333333, 17.89833333333333,
17.650000000000002, 17.62, 18.165000000000003, 19.031666666666663, 18.416666666666664,
18.165000000000003, 17.789999999999996, 17.73, 18.52, 17.226666666666663, 17.388333333333335, 17.985,
18.285, 18.035, 17.715, 18.563333333333333, 18.62833333333333, 17.59, 29.563333333333333,
19.223333333333333, 18.25333333333333, 18.74, 18.225, 18.78, 18.15833333333333, 17.83666666666667,
19.183333333333334, 18.19333333333333, 19.31, 18.23333333333333, 18.27833333333333,
18.083333333333336, 17.69666666666667, 18.881666666666664, 17.768333333333334, 18.509999999999994,
18.911666666666665, 18.295, 18.78833333333333, 18.245, 18.35, 18.77, 18.221666666666668, 18.855,
20.695000000000004, 18.793333333333333, 18.70833333333333, 19.31333333333333, 22.66333333333333,
28.531666666666663, 22.953333333333333, 21.576666666666664, 29.406666666666663, 20.156666666666663,
19.331666666666667, 25.648333333333337, 23.926666666666662, 25.25333333333334, 21.885,
18.456666666666667, 18.87333333333333, 18.836666666666662, 19.08, 20.58, 18.711666666666662,
19.453333333333333, 19.866666666666667, 19.22833333333333, 20.17833333333333, 18.98,
19.66166666666667, 19.445, 19.37, 19.475000000000005, 20.32, 20.131666666666664, 19.59,
21.846666666666664, 87.53272727272729, 75.71666666666665, 51.86833333333333, 50.93500000000001,
49.33833333333333, 49.403333333333336, 38.26833333333334, 25.041666666666668, 24.63833333333333,
24.063333333333333, 22.741666666666664, 20.703333333333333, 20.96333333333333, 20.161666666666665,
20.156666666666663, 21.066666666666663, 19.96166666666667, 19.545, 19.645000000000003,
20.276666666666667, 20.92, 19.226666666666667, 19.178333333333335, 19.75833333333333, 20.015,
19.616666666666664, 21.225, 20.011666666666667, 19.58, 20.828000000000003, 25.456666666666663,
28.955, 23.831666666666667, 21.53, 29.438333333333336, 21.10833333333333, 19.348333333333333,
25.901666666666667, 24.891666666666666, 25.56833333333333, 22.035, 19.138333333333332,
19.543333333333333, 19.55666666666667, 19.355, 19.67333333333333, 19.093333333333334,
18.76333333333333, 19.540000000000003, 19.485, 20.295, 18.91, 19.545, 19.55, 19.466666666666665,
19.28833333333333, 19.578333333333333, 19.24333333333333, 19.58, 19.540000000000003,
26.523333333333337, 19.30666666666667, 20.155, 18.69, 19.510909090909088, 18.19333333333333,
18.840000000000003, 18.786666666666665, 18.48333333333333, 19.605, 19.093333333333334,
18.166666666666668, 18.63833333333333, 18.78, 18.936666666666667, 18.52, 17.708333333333332, 18.395,
18.515, 18.295, 19.523333333333337, 18.238333333333333, 18.37333333333333, 19.06, 17.895,
18.64666666666667, 19.885, 18.35, 17.965, 18.58833333333333, 20.926666666666662, 27.343333333333334,
22.60333333333333, 20.06, 28.036666666666665, 18.85333333333333, 18.695, 23.52, 23.64333333333333,
24.035, 20.601666666666663, 17.62, 17.716666666666665, 18.4, 17.86363636363636, 17.89,
17.196666666666665, 17.781666666666666, 18.48, 18.05666666666667, 19.000000000000004, 17.965,
17.820000000000004, 17.989090909090912, 17.081666666666667, 18.43333333333333, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
def test_threshold_detector():
detector = anomaly_detection.ThresholdDetector(high=10)
sequence = Sequence([1, 2, 3, 4, 5, 6], [1, 1, 12, 2, 2, 2])
anomalies = detector.fit_predict(sequence)
assert anomalies.values == (False, False, True, False, False, False)
detector = anomaly_detection.ThresholdDetector(low=3)
sequence = Sequence([1, 2, 3, 4, 5, 6], [1, 1, 12, 2, 2, 2])
anomalies = detector.fit_predict(sequence)
assert anomalies.values == (True, True, False, True, True, True)
detector = anomaly_detection.ThresholdDetector(high=10, percentage=0.6)
sequence = Sequence([1, 2, 3, 4, 5, 6], [11, 11, 12, 12, 2, 2])
anomalies = detector.fit_predict(sequence)
assert all(anomalies.values)
def test_seasonal_detector():
input_data = [10, 20, 30, 40] * 20 + [1, 1, 1, 1] * 5 + [10, 20, 30, 40] * 20
raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
model = anomaly_detection.SeasonalDetector(outliers=(2, 2), side="negative")
res = model.fit_predict(raw_data)
correct_data = (
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, True,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False, False, False
)
assert res.values == correct_data
def test_level_shift_detector():
input_data = list(range(10)) * 5 + [100] * 10
raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
model = anomaly_detection.LevelShiftDetector(window=5, side='positive')
res = model.fit_predict(raw_data)
correct_data = (
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
True, False, False, False, False, False, False, False, False, False
)
assert res.values == correct_data
def test_spike_detector():
input_data = [0, 1, 0, 1, 0, 0, 1, -15, -1, -2, 1, 1, 1, 0] + [1, 0] * 8
raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
model = anomaly_detection.SpikeDetector(side="negative")
res = model.fit_predict(raw_data)
correct_data = (
False, False, False, False, False, False, False, True, False, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False
)
assert res.values == correct_data
def test_volatility_shift_detector():
random.seed(0)
input_data = [random.uniform(-1, 1) for _ in range(20)] + \
[random.uniform(-10, 10) + 1000 * (-1) ** i for i in range(20)]
raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
model = anomaly_detection.VolatilityShiftDetector(outliers=(None, 6), window=5)
res = model.fit_predict(raw_data)
correct_data = (
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, True, False,
False, False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False, False,
)
assert res.values == correct_data
def test_increase_detector():
random.seed(0)
input_data = [i * 0.05 + 0.7 * random.randint(1, 5) for i in list(range(50))]
raw_data = Sequence(timestamps=list(range(len(input_data))), values=input_data)
detector = anomaly_detection.IncreaseDetector(side="positive")
res = detector.fit_predict(raw_data)
correct_data = (True,) * 50
assert res.values == correct_data
input_data = [(50 - i) * 0.05 + 0.7 * random.randint(1, 5) for i in list(range(50))]
sequence_case = Sequence(timestamps=tuple(range(len(input_data))), values=input_data)
detector = anomaly_detection.IncreaseDetector(side="negative", alpha=0.05)
res = detector.fit_predict(sequence_case)
expected = (True,) * 50
assert res.values == expected
def test_merge_contiguous_anomalies_timestamps():
func = anomaly_detection._utils.merge_contiguous_anomalies_timestamps
assert func([0, 1, 2, 3, 4, 5, 6], [2, 4, 5]) == [[2], [4, 5]]
assert func([0, 1, 2, 3, 4, 5], [2, 4, 5]) == [[2], [4, 5]]
assert func([0, 1, 2, 3, 4, 5], [2, 3, 4, 5]) == [[2, 3, 4, 5]]
assert func([0, 1, 2, 3, 4, 5], [0, 2, 5]) == [[0], [2], [5]]
assert func([0, 1, 2, 5], [0, 2, 5]) == [[0], [2, 5]]
assert func([0, 1, 2], [0, 1, 2]) == [[0, 1, 2]]
def test_pick_out_anomalies():
func = anomaly_detection.pick_out_anomalies
sequence = Sequence(range(5), range(5))
anomalies0 = Sequence(range(5), [True, True, False, False, False])
assert func(sequence, anomalies0) == []
anomalies1 = Sequence(range(5), [True, False, False, False, True])
assert func(sequence, anomalies1) == []
anomalies2 = Sequence(range(5), [False, False, True, False, False])
assert func(sequence, anomalies2) == [Sequence([2], [2])]
anomalies3 = Sequence(range(5), [True, True, False, True, False])
assert func(sequence, anomalies3) == [Sequence([3], [3])]
anomalies4 = Sequence(range(5), [False, True, False, True, False])
assert func(sequence, anomalies4) == [Sequence([1], [1]), Sequence([3], [3])]
anomalies5 = Sequence(range(5), [False, True, True, True, False])
assert func(sequence, anomalies5) == [Sequence([1, 2, 3], [1, 2, 3])]
def test_gradient_detector():
sequence = Sequence(test_spike_timestamps[300:500], test_spike_data[300:500])
detector = anomaly_detection.GradientDetector(side='positive', max_coef=0.001)
anomalies = detector.fit_predict(sequence)
assert all(anomalies.values)
sequence = Sequence(test_spike_timestamps[500:700], test_spike_data[500:700])
detector = anomaly_detection.GradientDetector(side='positive', max_coef=0.001)
anomalies = detector.fit_predict(sequence)
assert not any(anomalies.values)
def test_quantile_detector():
detector = anomaly_detection.QuantileDetector(high=0.9)
sequence = Sequence([1, 2, 3, 4, 5, 6], [1, 1, 12, 2, 2, 2])
anomalies = detector.fit_predict(sequence)
assert anomalies.values == (False, False, True, False, False, False)
def test_esd_test_detector():
detector = anomaly_detection.EsdTestDetector(alpha=0.05)
sequence = Sequence([1, 2, 3, 4, 5, 6], [1, 1, 12, 2, 2, 2])
anomalies = detector.fit_predict(sequence)
assert anomalies.values == (False, False, True, False, False, False)
def test_iqr_detector():
detector = anomaly_detection.InterQuartileRangeDetector(outliers=(3, 3))
sequence = Sequence([1, 2, 3, 4, 5, 6], [1, 1, 12, 2, 2, 2])
anomalies = detector.fit_predict(sequence)
assert anomalies.values == (False, False, True, False, False, False)
def mock_configs(*args):
configs = ConfigParser()
configs.add_section("TSDB")
configs.set('TSDB', 'name', 'prometheus'),
configs.set('TSDB', 'host', 'xx.xx.xx.100'),
configs.set('TSDB', 'port', '1234'),
configs.set('TSDB', 'username', 'aaa'),
configs.set('TSDB', 'password', 'bbb'),
configs.set('TSDB', 'ssl_certfile', ''),
configs.set('TSDB', 'ssl_keyfile', ''),
configs.set('TSDB', 'ssl_keyfile_password', ''),
configs.set('TSDB', 'ssl_ca_file', '')
return configs
def test_detection_interface(monkeypatch):
monkeypatch.setattr(os, 'chdir', mock.MagicMock())
monkeypatch.setattr(utils, 'read_simple_config_file', lambda x: dict())
monkeypatch.setattr(edbmind, 'load_sys_configs', mock_configs)
monkeypatch.setattr(TsdbClientFactory, 'set_client_info', mock.MagicMock())
monkeypatch.setattr(dai, 'get_metric_sequence', mock_get_metric_sequence)
args = ['--conf', '/', '--metric', 'os_cpu_usage', '--start-time', '1673942700000',
'--end-time', '1673942730000', '--host', 'xx.xx.xx.100:1234']
ad_main(['--action', 'overview'] + args)
ad_main(['--action', 'plot'] + args + ['--anomaly', 'level_shift'])
ad_main(['--action', 'plot'] + args + ['--anomaly', 'seasonal'])
ad_main(['--action', 'plot'] + args + ['--anomaly', 'spike'])
ad_main(['--action', 'plot'] + args + ['--anomaly', 'volatility_shift'])
def mock_get_metric_sequence_beta(metric_name, start_time, end_time):
class MockFetcher(dai.LazyFetcher):
def _read_buffer(self):
instance_label = dai._get_data_source_flag(self.metric_name)
self.step = self.step or 5
timestamps = list(range(
int(self.start_time.timestamp()),
int(self.end_time.timestamp()) + self.step,
self.step
))
values = timestamps.copy()
if instance_label in self.labels_like:
instance = self.labels_like.pop(instance_label).split(":")[0]
elif instance_label in self.labels:
instance = self.labels[instance_label]
else:
instance = "some_ip:some_port"
self.labels[instance_label] = instance
seq = Sequence(
timestamps=timestamps,
values=values,
name=self.metric_name,
labels=self.labels,
step=self.step
)
return [seq]
return MockFetcher(metric_name, start_time, end_time)
def test_anomaly_detector_pool(monkeypatch):
def timed_app():
alarm_list = []
for detection in ad_pool_manager.get_anomaly_detectors():
running = detection.get(ad_pool_manager.DetectorParam.RUNNING)
detector = detection.get(ad_pool_manager.DetectorParam.DETECTOR)
if running and detector:
alarm_list.extend(detector.detect())
return alarm_list
instance_label = dai._get_data_source_flag("os_cpu_usage")
monkeypatch.setattr(dai, 'get_metric_sequence', mock_get_metric_sequence_beta)
try:
generic_anomaly_detector.DetectorInfo("os_cpu_usage", "WhatDetector", {}, {})
except Exception as e:
assert str(e) == "'Detector name: WhatDetector was not found.'"
ad_pool_manager.clear_detector()
ad_pool_manager.init_specific_detections()
assert ad_pool_manager.view_detector("all").keys() == \
{'high_disk_usage_detector', 'high_mem_usage_detector',
'high_cpu_usage_detector', 'mem_usage_spike_detector',
'qps_spike_detector'}
ad_pool_manager.clear_detector()
json_dict = (
{
"running": 1,
"duration": 180,
"forecasting_seconds": 0,
"alarm_info": {
"alarm_info": "cpu usage is too high.",
"alarm_content": "cpu usage is too high."
},
"detector_info": [
{
"metric_name": "os_cpu_usage",
"detector_name": "ThresholdDetector",
"metric_filter": {instance_label: "ip1:port1"},
"detector_kwargs": {"high": 0.8}
}
]
}
)
ad_pool_manager.add_detector("test1", json_dict)
assert ad_pool_manager.view_detector("all").keys() == {"test1"}
json_dict = (
{
"running": 1,
"duration": 180,
"forecasting_seconds": 0,
"alarm_info": {
"alarm_content": "cpu usage is too low."
},
"detector_info": [
{
"metric_name": "os_cpu_usage",
"detector_name": "ThresholdDetector",
"metric_filter": {instance_label: "ip1:port1"},
"detector_kwargs": {"low": 0},
"what": "nothing"
},
{
"metric_name": "os_cpu_usage",
"detector_name": "GradientDetector",
"metric_filter": {instance_label: "ip2:port2"},
"detector_kwargs": {"max_coef": 0.8},
"how": "nothing"
}
]
}
)
ad_pool_manager.add_detector("test2", json_dict)
assert ad_pool_manager.view_detector("all").keys() == {"test1", "test2"}
alarms = timed_app()
assert [alarm.alarm_content for alarm in alarms] == ['test1: cpu usage is too high.']
json_dict = (
{
"running": 1,
"duration": 180,
"forecasting_seconds": 0,
"alarm_info": {
"alarm_info": "cpu usage is too low.",
"alarm_content": "cpu usage is too low."
},
"detector_info": [
{
"metric_name": "os_cpu_usage",
"detector_name": "ThresholdDetector",
"metric_filter": {},
"detector_kwargs": {"low": 1e11}
}
]
}
)
ad_pool_manager.add_detector("test3", json_dict)
alarms = timed_app()
assert [alarm.alarm_content for alarm in alarms] == ['test1: cpu usage is too high.',
'test3: cpu usage is too low.']
ad_pool_manager.pause_detector('test1')
alarms = timed_app()
assert [alarm.alarm_content for alarm in alarms] == ['test3: cpu usage is too low.']
ad_pool_manager.resume_detector('test1')
alarms = timed_app()
assert [alarm.alarm_content for alarm in alarms] == ['test1: cpu usage is too high.',
'test3: cpu usage is too low.']
ad_pool_manager.delete_detector("test1")
assert ad_pool_manager.view_detector("all").keys() == {"test2", "test3"}
alarms = timed_app()
assert [alarm.alarm_content for alarm in alarms] == ['test3: cpu usage is too low.']
assert ad_pool_manager.view_detector("all").keys() == {"test2", "test3"}
ad_pool_manager.rebuild_detector()
ad_pool_manager.clear_detector()
assert not ad_pool_manager.view_detector("all")