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.
100 lines
2.9 KiB
100 lines
2.9 KiB
import { Segment, SegmentKey } from '../model/segment'; |
|
import { MetricExpanded } from '../model/metric'; |
|
import { SegmentsSet } from '../model/segment_set'; |
|
import { AnomalyKey, AnomalyType, AnomalySegment } from '../model/anomaly'; |
|
|
|
import { BackendSrv } from 'grafana/app/core/services/backend_srv'; |
|
|
|
|
|
|
|
export class AnomalyService { |
|
constructor(private _backendURL: string, private _backendSrv: BackendSrv) { |
|
} |
|
|
|
async postNewAnomalyType(metric: MetricExpanded, newAnomalyType: AnomalyType, panelId: number) { |
|
return this._backendSrv.post( |
|
this._backendURL + '/anomalies', |
|
{ |
|
name: newAnomalyType.name, |
|
metric: metric.toJSON(), |
|
panelUrl: window.location.origin + window.location.pathname + `?panelId=${panelId}&fullscreen` |
|
} |
|
) |
|
}; |
|
|
|
async updateSegments( |
|
key: AnomalyKey, addedSegments: SegmentsSet<Segment>, removedSegments: SegmentsSet<Segment> |
|
): Promise<SegmentKey[]> { |
|
|
|
const getJSONs = (segs: SegmentsSet<Segment>) => segs.getSegments().map(segment => ({ |
|
"start": segment.from, |
|
"finish": segment.to |
|
})); |
|
|
|
var payload = { |
|
name: key, |
|
added_segments: getJSONs(addedSegments), |
|
removed_segments: removedSegments.getSegments().map(s => s.key) |
|
} |
|
|
|
var data = await this._backendSrv.patch(this._backendURL + '/segments', payload); |
|
if(data.added_ids === undefined) { |
|
throw new Error('Server didn`t send added_ids'); |
|
} |
|
|
|
return data.added_ids as SegmentKey[]; |
|
} |
|
|
|
async getSegments(key: AnomalyKey, from?: number, to?: number): Promise<AnomalySegment[]> { |
|
var payload: any = { anomaly_id: key }; |
|
if(from !== undefined) { |
|
payload['from'] = from; |
|
} |
|
if(to !== undefined) { |
|
payload['to'] = to; |
|
} |
|
var data = await this._backendSrv.get( |
|
this._backendURL + '/segments', |
|
payload |
|
); |
|
if(data.segments === undefined) { |
|
throw new Error('Server didn`t return segments array'); |
|
} |
|
var segments = data.segments as { id: number, start: number, finish: number, labeled: boolean }[]; |
|
return segments.map(s => new AnomalySegment(s.labeled, s.id, s.start, s.finish)); |
|
} |
|
|
|
async * getAnomalyTypeStatusGenerator(key: AnomalyKey, duration: number) { |
|
let statusCheck = async () => { |
|
var data = await this._backendSrv.get( |
|
this._backendURL + '/anomalies/status', { name: key } |
|
); |
|
return data.status as string; |
|
} |
|
|
|
let timeout = async () => new Promise( |
|
resolve => setTimeout(resolve, duration) |
|
); |
|
|
|
while(true) { |
|
yield await statusCheck(); |
|
await timeout(); |
|
} |
|
|
|
} |
|
|
|
async getAlertEnabled(key: AnomalyKey): Promise<boolean> { |
|
var data = await this._backendSrv.get( |
|
this._backendURL + '/alerts', { anomaly_id: key } |
|
); |
|
return data.enable as boolean; |
|
|
|
} |
|
|
|
async setAlertEnabled(key: AnomalyKey, value: boolean): Promise<void> { |
|
return this._backendSrv.post( |
|
this._backendURL + '/alerts', { anomaly_id: key, enable: value } |
|
); |
|
} |
|
|
|
}
|
|
|