|
|
|
from anomaly_model import AnomalyModel
|
|
|
|
from pattern_detection_model import PatternDetectionModel
|
|
|
|
import queue
|
|
|
|
import threading
|
|
|
|
import json
|
|
|
|
import logging
|
|
|
|
import sys
|
|
|
|
import traceback
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.DEBUG,
|
|
|
|
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
|
|
|
|
filename='analytic_toolset.log',
|
|
|
|
filemode='a')
|
|
|
|
logger = logging.getLogger('analytic_toolset')
|
|
|
|
|
|
|
|
|
|
|
|
class worker(object):
|
|
|
|
models_cache = {}
|
|
|
|
thread = None
|
|
|
|
queue = queue.Queue()
|
|
|
|
|
|
|
|
def start(self):
|
|
|
|
self.thread = threading.Thread(target=self.run)
|
|
|
|
self.thread.start()
|
|
|
|
|
|
|
|
def stop(self):
|
|
|
|
if self.thread:
|
|
|
|
self.queue.put(None)
|
|
|
|
self.thread.join()
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
while True:
|
|
|
|
task = self.queue.get()
|
|
|
|
if task['type'] == "stop":
|
|
|
|
break
|
|
|
|
self.do_task(task)
|
|
|
|
self.queue.task_done()
|
|
|
|
|
|
|
|
def add_task(self, task):
|
|
|
|
self.queue.put(task)
|
|
|
|
|
|
|
|
def do_task(self, task):
|
|
|
|
try:
|
|
|
|
type = task['type']
|
|
|
|
anomaly_id = task['anomaly_id']
|
|
|
|
if type == "predict":
|
|
|
|
last_prediction_time = task['last_prediction_time']
|
|
|
|
pattern = task['pattern']
|
|
|
|
result = self.do_predict(anomaly_id, last_prediction_time, pattern)
|
|
|
|
elif type == "learn":
|
|
|
|
segments = task['segments']
|
|
|
|
pattern = task['pattern']
|
|
|
|
result = self.do_learn(anomaly_id, segments, pattern)
|
|
|
|
else:
|
|
|
|
result = {
|
|
|
|
'status': "failed",
|
|
|
|
'error': "unknown type " + str(type)
|
|
|
|
}
|
|
|
|
except Exception as e:
|
|
|
|
#traceback.extract_stack()
|
|
|
|
error_text = traceback.format_exc()
|
|
|
|
logger.error("Exception: '%s'" % error_text)
|
|
|
|
result = {
|
|
|
|
'task': type,
|
|
|
|
'status': "failed",
|
|
|
|
'anomaly_id': anomaly_id,
|
|
|
|
'error': str(e)
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
|
|
|
|
def do_learn(self, anomaly_id, segments, pattern):
|
|
|
|
model = self.get_model(anomaly_id, pattern)
|
|
|
|
model.synchronize_data()
|
|
|
|
last_prediction_time = model.learn(segments)
|
|
|
|
# TODO: we should not do predict before labeling in all models, not just in drops
|
|
|
|
if pattern == 'drops' and len(segments) == 0:
|
|
|
|
result = {
|
|
|
|
'status': 'success',
|
|
|
|
'anomaly_id': anomaly_id,
|
|
|
|
'segments': [],
|
|
|
|
'last_prediction_time': last_prediction_time
|
|
|
|
}
|
|
|
|
else:
|
|
|
|
result = self.do_predict(anomaly_id, last_prediction_time, pattern)
|
|
|
|
|
|
|
|
result['task'] = 'learn'
|
|
|
|
return result
|
|
|
|
|
|
|
|
def do_predict(self, anomaly_id, last_prediction_time, pattern):
|
|
|
|
model = self.get_model(anomaly_id, pattern)
|
|
|
|
model.synchronize_data()
|
|
|
|
segments, last_prediction_time = model.predict(last_prediction_time)
|
|
|
|
return {
|
|
|
|
'task': "predict",
|
|
|
|
'status': "success",
|
|
|
|
'anomaly_id': anomaly_id,
|
|
|
|
'segments': segments,
|
|
|
|
'last_prediction_time': last_prediction_time
|
|
|
|
}
|
|
|
|
|
|
|
|
def get_model(self, anomaly_id, pattern):
|
|
|
|
if anomaly_id not in self.models_cache:
|
|
|
|
if pattern == "general approach":
|
|
|
|
model = AnomalyModel(anomaly_id)
|
|
|
|
else:
|
|
|
|
model = PatternDetectionModel(anomaly_id, pattern)
|
|
|
|
self.models_cache[anomaly_id] = model
|
|
|
|
return self.models_cache[anomaly_id]
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
w = worker()
|
|
|
|
logger.info("Worker was started")
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
text = input("")
|
|
|
|
task = json.loads(text)
|
|
|
|
logger.info("Received command '%s'" % text)
|
|
|
|
if task['type'] == "stop":
|
|
|
|
logger.info("Stopping...")
|
|
|
|
break
|
|
|
|
print(json.dumps({
|
|
|
|
'task': task['type'],
|
|
|
|
'anomaly_id': task['anomaly_id'],
|
|
|
|
'__task_id': task['__task_id'],
|
|
|
|
'status': "in progress"
|
|
|
|
}))
|
|
|
|
sys.stdout.flush()
|
|
|
|
res = w.do_task(task)
|
|
|
|
res['__task_id'] = task['__task_id']
|
|
|
|
print(json.dumps(res))
|
|
|
|
sys.stdout.flush()
|
|
|
|
except Exception as e:
|
|
|
|
logger.error("Exception: '%s'" % str(e))
|
|
|
|
|