Browse Source
* add data puller * Do not send response on PUSH event * Stub analytics PUSH message handlingpull/1/head
5 changed files with 119 additions and 5 deletions
@ -0,0 +1,93 @@ |
|||||||
|
import { AnalyticsTask, AnalyticsTaskType } from '../models/analytics_task_model'; |
||||||
|
import * as AnalyticUnit from '../models/analytic_unit_model'; |
||||||
|
import { AnalyticsService } from './analytics_service'; |
||||||
|
import { HASTIC_API_KEY } from '../config'; |
||||||
|
|
||||||
|
import { queryByMetric } from 'grafana-datasource-kit'; |
||||||
|
|
||||||
|
import * as _ from 'lodash'; |
||||||
|
|
||||||
|
|
||||||
|
declare type UnitTime = { |
||||||
|
unit: AnalyticUnit.AnalyticUnit, |
||||||
|
time: number |
||||||
|
}; |
||||||
|
|
||||||
|
export class DataPuller { |
||||||
|
|
||||||
|
private PULL_PERIOD_MS: number = 5000; |
||||||
|
private _interval: number = 1000; |
||||||
|
private _timer: any = null; |
||||||
|
private _unitTimes: { [id: string]: UnitTime } = {}; |
||||||
|
|
||||||
|
constructor(private analyticsService: AnalyticsService){}; |
||||||
|
|
||||||
|
public addUnit(unit: AnalyticUnit.AnalyticUnit) { |
||||||
|
let time = unit.lastDetectionTime || Date.now(); |
||||||
|
let unitTime: UnitTime = {unit, time }; |
||||||
|
this._unitTimes[unit.id] = unitTime; |
||||||
|
} |
||||||
|
|
||||||
|
public deleteUnit(id: AnalyticUnit.AnalyticUnitId) { |
||||||
|
delete this._unitTimes[id]; |
||||||
|
} |
||||||
|
|
||||||
|
private pullData(unit: AnalyticUnit.AnalyticUnit, from: number, to: number) { |
||||||
|
if(!unit) { |
||||||
|
throw Error(`puller: can't pull undefined unit`); |
||||||
|
} |
||||||
|
return queryByMetric(unit.metric, unit.panelUrl, from, to, HASTIC_API_KEY); |
||||||
|
} |
||||||
|
|
||||||
|
private pushData(unit: AnalyticUnit.AnalyticUnit, data: any) { |
||||||
|
if(unit === undefined || data === undefined) { |
||||||
|
throw Error(`can't push unit: ${unit} data: ${data}`); |
||||||
|
} |
||||||
|
let task = new AnalyticsTask(unit.id, AnalyticsTaskType.PUSH, data); |
||||||
|
this.analyticsService.sendTask(task); |
||||||
|
} |
||||||
|
|
||||||
|
//TODO: group analyticUnits by panelID and send same dataset for group
|
||||||
|
public runPuller() { |
||||||
|
this._timer = setTimeout(this.puller.bind(this), this._interval); |
||||||
|
console.log('Data puller runned'); |
||||||
|
} |
||||||
|
|
||||||
|
public stopPuller() { |
||||||
|
if(this._timer) { |
||||||
|
clearTimeout(this._timer); |
||||||
|
this._timer = null; |
||||||
|
this._interval = 0; |
||||||
|
console.log('Data puller stopped'); |
||||||
|
} |
||||||
|
console.log('Data puller already stopped'); |
||||||
|
} |
||||||
|
|
||||||
|
private async puller() { |
||||||
|
|
||||||
|
if(_.isEmpty(this._unitTimes)) { |
||||||
|
this._interval = this.PULL_PERIOD_MS; |
||||||
|
this._timer = setTimeout(this.puller.bind(this), this._interval); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
let now = Date.now(); |
||||||
|
|
||||||
|
_.forOwn(this._unitTimes, async value => { |
||||||
|
if(!value.unit.alert) { |
||||||
|
return; |
||||||
|
} |
||||||
|
let data = await this.pullData(value.unit, value.time, now); |
||||||
|
if(data.values.length === 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
let payload = { data, from: value.time, to: now}; |
||||||
|
value.time = now; |
||||||
|
this.pushData(value.unit, payload);
|
||||||
|
}); |
||||||
|
|
||||||
|
this._timer = setTimeout(this.puller.bind(this), this._interval); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue