|
|
@ -1,4 +1,4 @@ |
|
|
|
import { PanelOptions, Aggregation, Threshold } from 'types'; |
|
|
|
import { PanelOptions, Aggregation, Threshold, Icon, IconPosition, Condition } from 'types'; |
|
|
|
|
|
|
|
|
|
|
|
import { filterMetricListByAlias, getAggregatedValueFromSerie } from '../utils'; |
|
|
|
import { filterMetricListByAlias, getAggregatedValueFromSerie } from '../utils'; |
|
|
|
|
|
|
|
|
|
|
@ -13,11 +13,13 @@ export class Options { |
|
|
|
private minValue: number | undefined; |
|
|
|
private minValue: number | undefined; |
|
|
|
private maxValue: number | undefined; |
|
|
|
private maxValue: number | undefined; |
|
|
|
private thresholds: { value: number, color: string }[] = []; |
|
|
|
private thresholds: { value: number, color: string }[] = []; |
|
|
|
|
|
|
|
private icons: { src: string, position: string, size: number}[] = []; |
|
|
|
|
|
|
|
|
|
|
|
constructor(private grafanaSeriesList: any[], private grafanaOptions: PanelOptions) { |
|
|
|
constructor(private grafanaSeriesList: any[], private grafanaOptions: PanelOptions) { |
|
|
|
this._setMin(); |
|
|
|
this._setMin(); |
|
|
|
this._setMax(); |
|
|
|
this._setMax(); |
|
|
|
this._setThresholds(); |
|
|
|
this._setThresholds(); |
|
|
|
|
|
|
|
this._setIcons(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private _setMin(): void { |
|
|
|
private _setMin(): void { |
|
|
@ -65,8 +67,81 @@ export class Options { |
|
|
|
return `${value.toFixed(decimals)} ${suffix}`; |
|
|
|
return `${value.toFixed(decimals)} ${suffix}`; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private _setIcons(): void { |
|
|
|
|
|
|
|
if (_.isEmpty(this.grafanaOptions.gauge.icons)) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
for (let [idx, icon] of this.grafanaOptions.gauge.icons.entries()) { |
|
|
|
|
|
|
|
this._setIcon(icon, idx); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private _setIcon(icon: Icon, idx: number): void { |
|
|
|
|
|
|
|
if (!this._areIconConditionsFulfilled(icon, idx)) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
this.icons.push({ |
|
|
|
|
|
|
|
src: icon.url, |
|
|
|
|
|
|
|
size: icon.size, |
|
|
|
|
|
|
|
position: this._getChartwerkIconPosition(icon.position), |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private _areIconConditionsFulfilled(icon: Icon, iconIdx: number): boolean { |
|
|
|
|
|
|
|
if(_.isEmpty(icon.metrics)) { |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// check each condition and return false if something goes wrong
|
|
|
|
|
|
|
|
for (let [conditionIdx, metric] of icon.metrics.entries()) { |
|
|
|
|
|
|
|
const value = this.getLastValueFromMetrics(metric, `Icon ${iconIdx + 1}, Condition ${conditionIdx}`); |
|
|
|
|
|
|
|
if(value === null || value === undefined) { |
|
|
|
|
|
|
|
// TODO: may be throw an error
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!this.checkIconCondition(value, icon.values[conditionIdx], icon.conditions[conditionIdx])) { |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private checkIconCondition(metricValue: number, inputValue: number, condition: Condition): boolean { |
|
|
|
|
|
|
|
if (inputValue === undefined || inputValue === null) { |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
switch (condition) { |
|
|
|
|
|
|
|
case Condition.EQUAL: |
|
|
|
|
|
|
|
return metricValue === inputValue; |
|
|
|
|
|
|
|
case Condition.GREATER: |
|
|
|
|
|
|
|
return metricValue > inputValue; |
|
|
|
|
|
|
|
case Condition.GREATER_OR_EQUAL: |
|
|
|
|
|
|
|
return metricValue >= inputValue; |
|
|
|
|
|
|
|
case Condition.LESS: |
|
|
|
|
|
|
|
return metricValue < inputValue; |
|
|
|
|
|
|
|
case Condition.LESS_OR_EQUAL: |
|
|
|
|
|
|
|
return metricValue <= inputValue; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
throw new Error(`Unknown condition: ${condition}`); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private _getChartwerkIconPosition(position: IconPosition): string { |
|
|
|
|
|
|
|
// TODO: use chartwerk types
|
|
|
|
|
|
|
|
switch (position) { |
|
|
|
|
|
|
|
case IconPosition.MIDDLE: |
|
|
|
|
|
|
|
return 'middle'; |
|
|
|
|
|
|
|
case IconPosition.UPPER_LEFT: |
|
|
|
|
|
|
|
return 'left'; |
|
|
|
|
|
|
|
case IconPosition.UPPER_RIGHT: |
|
|
|
|
|
|
|
return 'right'; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
throw new Error(`Unknown Icon Position ${position}`); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
getChartwerkOptions(): any { |
|
|
|
getChartwerkOptions(): any { |
|
|
|
console.log('opt', this.maxValue, this.minValue); |
|
|
|
|
|
|
|
return { |
|
|
|
return { |
|
|
|
maxValue: this.maxValue, |
|
|
|
maxValue: this.maxValue, |
|
|
|
minValue: this.minValue, |
|
|
|
minValue: this.minValue, |
|
|
@ -76,12 +151,12 @@ export class Options { |
|
|
|
reversed: this.grafanaOptions.gauge.reversed, |
|
|
|
reversed: this.grafanaOptions.gauge.reversed, |
|
|
|
stops: this.thresholds, |
|
|
|
stops: this.thresholds, |
|
|
|
valueFontSize: this.grafanaOptions.gauge.valueSize, |
|
|
|
valueFontSize: this.grafanaOptions.gauge.valueSize, |
|
|
|
// @ts-ignore
|
|
|
|
icons: this.icons, |
|
|
|
icons: [{ src: 'https://cityhost.ua/upload_img/blog5ef308ea5529c_trash2-01.jpg', position: 'middle', size: 30 }], |
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
getLastValueFromMetrics(metricName: string | undefined, optionName: string): number | null { |
|
|
|
getLastValueFromMetrics(metricName: string | undefined, optionName: string): number | null { |
|
|
|
|
|
|
|
// optionName -> helper in Error, mb use option path instead
|
|
|
|
const filteredSeries = filterMetricListByAlias( |
|
|
|
const filteredSeries = filterMetricListByAlias( |
|
|
|
this.grafanaSeriesList, |
|
|
|
this.grafanaSeriesList, |
|
|
|
metricName, |
|
|
|
metricName, |
|
|
|