You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.5 KiB

6 years ago
import {
6 years ago
AnalyticUnit,
6 years ago
AnalyticUnitId,
findById,
6 years ago
setPredictionTime,
6 years ago
setStatus
6 years ago
} from '../models/analytic_unit'
import { getTarget } from './metrics_controler';
import { getLabeledSegments, insertSegments, removeSegments } from './segments_controller'
import { AnalyticsConnection } from '../services/analytics_service'
6 years ago
const taskMap = {};
let nextTaskId = 0;
const analyticsConnection = new AnalyticsConnection(onResponse);
function onResponse(response: any) {
6 years ago
let taskId = response.__task_id;
let status = response.status;
if(status === 'success' || status === 'failed') {
if(taskId in taskMap) {
let resolver = taskMap[taskId];
resolver(response);
delete taskMap[taskId];
}
}
}
async function runTask(task): Promise<any> {
6 years ago
let anomaly: AnalyticUnit = findById(task.analyticUnitId);
6 years ago
task.metric = {
datasource: anomaly.metric.datasource,
6 years ago
targets: anomaly.metric.targets.map(getTarget)
6 years ago
};
task.__task_id = nextTaskId++;
await analyticsConnection.sendTask(task);
return new Promise<void>(resolve => {
taskMap[task.__task_id] = resolve;
6 years ago
})
}
6 years ago
export async function runLearning(id: AnalyticUnitId) {
let segments = getLabeledSegments(id);
setStatus(id, 'learning');
let anomaly: AnalyticUnit = findById(id);
6 years ago
let pattern = anomaly.type;
6 years ago
let task = {
6 years ago
analyticUnitId: id,
6 years ago
type: 'learn',
pattern,
6 years ago
segments: segments
};
let result = await runTask(task);
if (result.status === 'success') {
6 years ago
setStatus(id, 'ready');
insertSegments(id, result.segments, false);
setPredictionTime(id, result.lastPredictionTime);
6 years ago
} else {
6 years ago
setStatus(id, 'failed', result.error);
6 years ago
}
}
6 years ago
export async function runPredict(id: AnalyticUnitId) {
let unit: AnalyticUnit = findById(id);
let pattern = unit.type;
6 years ago
let task = {
type: 'predict',
6 years ago
predictor_id: id,
pattern,
6 years ago
lastPredictionTime: unit.lastPredictionTime
6 years ago
};
let result = await runTask(task);
if(result.status === 'failed') {
return [];
}
// Merging segments
6 years ago
let segments = getLabeledSegments(id);
6 years ago
if(segments.length > 0 && result.segments.length > 0) {
let lastOldSegment = segments[segments.length - 1];
let firstNewSegment = result.segments[0];
if(firstNewSegment.start <= lastOldSegment.finish) {
result.segments[0].start = lastOldSegment.start;
6 years ago
removeSegments(id, [lastOldSegment.id]);
6 years ago
}
}
6 years ago
insertSegments(id, result.segments, false);
setPredictionTime(id, result.last_prediction_time);
6 years ago
return result.segments;
}