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
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'
|
||
![]()
6 years ago
|
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;
|
||
|
|
||
![]()
6 years ago
|
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];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
![]()
6 years ago
|
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++;
|
||
![]()
6 years ago
|
await analyticsConnection.sendTask(task);
|
||
![]()
6 years ago
|
|
||
![]()
6 years ago
|
return new Promise<void>(resolve => {
|
||
![]()
6 years ago
|
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',
|
||
6 years ago
|
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,
|
||
6 years ago
|
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;
|
||
6 years ago
|
}
|