From 39a1101cad2b4ac809c8f832146eb5ff14e7de75 Mon Sep 17 00:00:00 2001 From: Alexey Velikiy Date: Sat, 9 Mar 2019 12:34:08 +0400 Subject: [PATCH] Better hastic datasource logic in code and messages #209 (#211) * some refactorings + types * hasticServerURL better usage * more renaming + fixes --- .../controllers/analytic_controller.ts | 19 ++++---- src/panel/graph_panel/graph_ctrl.ts | 43 +++++++++-------- .../graph_panel/services/analytic_service.ts | 48 +++++++++++-------- 3 files changed, 60 insertions(+), 50 deletions(-) diff --git a/src/panel/graph_panel/controllers/analytic_controller.ts b/src/panel/graph_panel/controllers/analytic_controller.ts index a32525f..57d3a8d 100644 --- a/src/panel/graph_panel/controllers/analytic_controller.ts +++ b/src/panel/graph_panel/controllers/analytic_controller.ts @@ -218,7 +218,7 @@ export class AnalyticController { this.analyticUnits.forEach(a => this._runStatusWaiter(a)); } - async fetchAnalyticUnitsSegments(from: number, to: number) { + async fetchAnalyticUnitsSegments(from: number, to: number): Promise { if(!_.isNumber(+from)) { throw new Error('from isn`t number'); } @@ -258,7 +258,6 @@ export class AnalyticController { return []; } - await this._analyticService.updateMetric(unit.id, this._currentMetric, this._currentDatasource); const newIds = await this._analyticService.updateSegments( unit.id, this._labelingDataAddedSegments, this._labelingDataRemovedSegments @@ -270,7 +269,7 @@ export class AnalyticController { } // TODO: move to renderer - updateFlotEvents(isEditMode: boolean, options: any) { + updateFlotEvents(isEditMode: boolean, options: any): void { if(options.grid.markings === undefined) { options.markings = []; } @@ -332,7 +331,7 @@ export class AnalyticController { } - deleteLabelingAnalyticUnitSegmentsInRange(from: number, to: number) { + deleteLabelingAnalyticUnitSegmentsInRange(from: number, to: number): void { const allRemovedSegs = this.labelingUnit.removeSegmentsInRange(from, to); allRemovedSegs.forEach(s => { if(!this._labelingDataAddedSegments.has(s.id)) { @@ -342,7 +341,7 @@ export class AnalyticController { this._labelingDataAddedSegments.removeInRange(from, to); } - toggleLabelingMode(labelingMode: LabelingMode) { + toggleLabelingMode(labelingMode: LabelingMode): void { if(!this.inLabelingMode) { throw new Error(`Can't enter ${labelingMode} mode when labeling mode is disabled`); } @@ -353,7 +352,7 @@ export class AnalyticController { } } - async removeAnalyticUnit(id: AnalyticUnitId, silent: boolean = false) { + async removeAnalyticUnit(id: AnalyticUnitId, silent: boolean = false): Promise { if(id === this._selectedAnalyticUnitId) { this.dropLabeling(); } @@ -363,12 +362,12 @@ export class AnalyticController { } } - async toggleAnalyticUnitAlert(analyticUnit: AnalyticUnit) { + async toggleAnalyticUnitAlert(analyticUnit: AnalyticUnit): Promise { analyticUnit.alert = analyticUnit.alert ? true : false; await this._analyticService.setAnalyticUnitAlert(analyticUnit); } - async fetchAnalyticUnitName(analyticUnit: AnalyticUnit) { + async fetchAnalyticUnitName(analyticUnit: AnalyticUnit): Promise { let updateObj = { id: analyticUnit.id, name: analyticUnit.name @@ -376,13 +375,13 @@ export class AnalyticController { await this._analyticService.updateAnalyticUnit(analyticUnit.id, updateObj); } - async updateThresholds() { + async updateThresholds(): Promise { const ids = _.map(this._panelObject.analyticUnits, (analyticUnit: any) => analyticUnit.id); const thresholds = await this._analyticService.getThresholds(ids); this._thresholds = thresholds; } - getThreshold(id: AnalyticUnitId) { + getThreshold(id: AnalyticUnitId): Threshold { let threshold = _.find(this._thresholds, { id }); if(threshold === undefined) { threshold = { diff --git a/src/panel/graph_panel/graph_ctrl.ts b/src/panel/graph_panel/graph_ctrl.ts index cfbe5c0..8b179d1 100644 --- a/src/panel/graph_panel/graph_ctrl.ts +++ b/src/panel/graph_panel/graph_ctrl.ts @@ -144,7 +144,6 @@ class GraphCtrl extends MetricsPanelCtrl { constructor( $scope, $injector, private $http, private annotationsSrv, - private keybindingSrv, private backendSrv: BackendSrv, private popoverSrv, private contextSrv @@ -184,14 +183,14 @@ class GraphCtrl extends MetricsPanelCtrl { this.rebindKeys(); } - getBackendURL(): string { - const datasourceId = this.panel.hasticDatasource; - if(datasourceId !== undefined && datasourceId !== null) { - const datasource = _.find(this._hasticDatasources, { id: datasourceId }); - if(datasource.access === 'proxy') { - return `/api/datasources/proxy/${datasource.id}`; + getHasticDatasourceURL(): string { + const hasticDatasourceId = this.panel.hasticDatasource; + if(hasticDatasourceId !== undefined && hasticDatasourceId !== null) { + const hasticDatasource = _.find(this._hasticDatasources, { id: hasticDatasourceId }); + if(hasticDatasource.access === 'proxy') { + return `/api/datasources/proxy/${hasticDatasource.id}`; } - return datasource.url; + return hasticDatasource.url; } return undefined; } @@ -210,18 +209,16 @@ class GraphCtrl extends MetricsPanelCtrl { return _.keys(this._analyticUnitTypes); } - async runBackendConnectivityCheck() { - const backendURL = this.getBackendURL(); - + async runDatasourceConnectivityCheck() { try { - const connected = await this.analyticService.isBackendOk(); + const connected = await this.analyticService.isDatasourceOk(); if(connected) { this.updateAnalyticUnitTypes(); appEvents.emit( 'alert-success', [ - 'Connected to Hastic server', - `Hastic server: "${backendURL}"` + 'Connected to Hastic Datasource', + `Hastic datasource URL: "${this.analyticService.hasticDatasourceURL}"` ] ); } @@ -299,12 +296,12 @@ class GraphCtrl extends MetricsPanelCtrl { this.processor = new DataProcessor(this.panel); await this._fetchHasticDatasources(); - const backendURL = this.getBackendURL(); + const hasticDatasourceURL = this.getHasticDatasourceURL(); - this.analyticService = new AnalyticService(backendURL, this.$http); - this.runBackendConnectivityCheck(); - this.analyticsController = new AnalyticController(this.panel, this.analyticService, this.events); + this.analyticService = new AnalyticService(hasticDatasourceURL, this.$http); + this.runDatasourceConnectivityCheck(); + this.analyticsController = new AnalyticController(this.panel, this.analyticService, this.events); this.analyticsController.fetchAnalyticUnitsStatuses(); this._graphRenderer = new GraphRenderer( @@ -645,8 +642,12 @@ class GraphCtrl extends MetricsPanelCtrl { } private async _updatePanelInfo() { - const datasource = await this._getDatasourceByName(this.panel.datasource); - const backendUrl = this.getBackendURL(); + let datasource = undefined; + if(this.panel.datasource) { + datasource = await this._getDatasourceByName(this.panel.datasource); + } + + const backendUrl = this.getHasticDatasourceURL(); let grafanaVersion = 'unknown'; if(_.has(window, 'grafanaBootData.settings.buildInfo.version')) { @@ -655,7 +656,7 @@ class GraphCtrl extends MetricsPanelCtrl { this._panelInfo = { grafanaVersion, grafanaUrl: window.location.host, - datasourceType: datasource.type, + datasourceType: datasource === undefined ? 'unknown' : datasource.type, hasticServerUrl: backendUrl }; } diff --git a/src/panel/graph_panel/services/analytic_service.ts b/src/panel/graph_panel/services/analytic_service.ts index b98a540..bd4a33e 100644 --- a/src/panel/graph_panel/services/analytic_service.ts +++ b/src/panel/graph_panel/services/analytic_service.ts @@ -1,10 +1,11 @@ -import { Segment, SegmentId } from '../models/segment'; +import { SegmentId } from '../models/segment'; import { MetricExpanded } from '../models/metric'; import { DatasourceRequest } from '../models/datasource'; import { SegmentsSet } from '../models/segment_set'; import { AnalyticUnitId, AnalyticUnit, AnalyticSegment } from '../models/analytic_unit'; import { ServerInfo } from '../models/info'; import { Threshold } from '../models/threshold'; + import { appEvents } from 'grafana/app/core/core'; @@ -12,12 +13,12 @@ export class AnalyticService { private _isUp = false; constructor( - private _backendURL: string, + private _hasticDatasourceURL: string, private $http ) { } async getAnalyticUnitTypes() { - return await this.get('/analyticUnits/types'); + return this.get('/analyticUnits/types'); } async getThresholds(ids: AnalyticUnitId[]) { @@ -28,8 +29,8 @@ export class AnalyticService { return resp.thresholds.filter(t => t !== null); } - async updateThreshold(threshold: Threshold) { - return await this.patch('/threshold', threshold); + async updateThreshold(threshold: Threshold): Promise { + return this.patch('/threshold', threshold); } async postNewItem( @@ -49,7 +50,11 @@ export class AnalyticService { return response.id as AnalyticUnitId; } - async updateMetric(analyticUnitId: AnalyticUnitId, metric: MetricExpanded, datasource: DatasourceRequest) { + async updateMetric( + analyticUnitId: AnalyticUnitId, + metric: MetricExpanded, + datasource: DatasourceRequest + ) { await this.patch('/analyticUnits/metric', { analyticUnitId, metric: metric.toJSON(), @@ -61,8 +66,8 @@ export class AnalyticService { return this.delete('/analyticUnits', { id }); } - async isBackendOk(): Promise { - if(!this._checkBackendUrl()) { + async isDatasourceOk(): Promise { + if(!this._checkDatasourceConfig()) { this._isUp = false; return false; } @@ -71,7 +76,9 @@ export class AnalyticService { } async updateSegments( - id: AnalyticUnitId, addedSegments: SegmentsSet, removedSegments: SegmentsSet + id: AnalyticUnitId, + addedSegments: SegmentsSet, + removedSegments: SegmentsSet ): Promise { const getJSONs = (segs: SegmentsSet) => segs.getSegments().map(segment => ({ from: segment.from, @@ -184,7 +191,7 @@ export class AnalyticService { private async _analyticRequest(method: string, url: string, data?: any) { try { method = method.toUpperCase(); - url = this._backendURL + url; + url = this._hasticDatasourceURL + url; let requestObject: any = { method, url }; if(method === 'GET' || method === 'DELETE') { requestObject.params = data; @@ -196,7 +203,7 @@ export class AnalyticService { return response.data; } catch(error) { if(error.xhrStatus === 'error') { - this.displayConnectionAlert(); + this.displayConnectionErrorAlert(); this._isUp = false; } else { this._isUp = true; @@ -205,14 +212,17 @@ export class AnalyticService { } } - - private _checkBackendUrl(): boolean { - if(this._backendURL === null || this._backendURL === undefined || this._backendURL === '') { + get hasticDatasourceURL(): string { + return this._hasticDatasourceURL; + } + + private _checkDatasourceConfig(): boolean { + if(this._hasticDatasourceURL === null || this._hasticDatasourceURL === undefined || this._hasticDatasourceURL === '') { appEvents.emit( 'alert-warning', [ - `Datasource (or URL in datasource) is missing`, - `Please set it in datasource config. More info: https://github.com/hastic/hastic-grafana-app/wiki/Getting-started` + `Hastic Datasource is missing`, + `Please setup Hastic Datasource. More info: https://github.com/hastic/hastic-grafana-app/wiki/Getting-started` ] ); return false; @@ -236,12 +246,12 @@ export class AnalyticService { return this._analyticRequest('DELETE', url, data); } - private displayConnectionAlert() { + private displayConnectionErrorAlert() { appEvents.emit( 'alert-error', [ - 'No connection to Hastic server', - `Hastic server: "${this._backendURL}"`, + 'No connection to Hastic Datasource', + `Hastic Datasource URL: "${this._hasticDatasourceURL}"`, ] ); }