|
|
|
import _ from 'lodash';
|
|
|
|
import { PanelOptions, Aggregation, Threshold } from 'types';
|
|
|
|
|
|
|
|
import { filterMetricListByAlias, getAggregatedValueFromSerie } from '../utils';
|
|
|
|
|
|
|
|
// Convert Grafana options into Chartwerk Gauge options
|
|
|
|
export class Options {
|
|
|
|
private minValue: number | undefined;
|
|
|
|
private maxValue: number | undefined;
|
|
|
|
private thresholds: { value: number, color: string }[] = [];
|
|
|
|
|
|
|
|
constructor(private grafanaSeriesList: any[], private grafanaOptions: PanelOptions) {
|
|
|
|
this._setMin();
|
|
|
|
this._setMax();
|
|
|
|
this._setThresholds();
|
|
|
|
}
|
|
|
|
|
|
|
|
private _setMin(): void {
|
|
|
|
if (!this.grafanaOptions.gauge.min.useMetric) {
|
|
|
|
this.minValue = this.grafanaOptions.gauge.min.value;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const aggregatedValue = this.getLastValueFromMetrics(this.grafanaOptions.gauge.min.metricName, 'Min');
|
|
|
|
this.minValue = aggregatedValue ? aggregatedValue : undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
private _setMax(): void {
|
|
|
|
if (!this.grafanaOptions.gauge.max.useMetric) {
|
|
|
|
this.maxValue = this.grafanaOptions.gauge.max.value;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const aggregatedValue = this.getLastValueFromMetrics(this.grafanaOptions.gauge.max.metricName, 'Max');
|
|
|
|
this.maxValue = aggregatedValue ? aggregatedValue : undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
private _setThresholds(): void {
|
|
|
|
if (_.isEmpty(this.grafanaOptions.gauge.thresholds.thresholds)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
for (let [idx, threshold] of this.grafanaOptions.gauge.thresholds.thresholds.entries()) {
|
|
|
|
this._setThreshold(threshold, idx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private _setThreshold(threshold: Threshold, idx: number): void {
|
|
|
|
const value = threshold.useMetric ? this.getLastValueFromMetrics(threshold.metricName, `Threshold ${idx}`) : threshold.value;
|
|
|
|
if(value === null || value === undefined) {
|
|
|
|
// TODO: may be throw an error
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.thresholds.push({
|
|
|
|
value,
|
|
|
|
color: threshold.color
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private _valueFormatter(value: number): string {
|
|
|
|
const decimals = this.grafanaOptions.gauge.decimals || 2;
|
|
|
|
return `${value.toFixed(decimals)} ${this.grafanaOptions.gauge.unit}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
getChartwerkOptions(): any {
|
|
|
|
console.log('opt', this.maxValue, this.minValue);
|
|
|
|
return {
|
|
|
|
maxValue: this.maxValue,
|
|
|
|
minValue: this.minValue,
|
|
|
|
valueFormatter: (val: number) => this._valueFormatter(val),
|
|
|
|
defaultColor: this.grafanaOptions.gauge.thresholds.defaultColor,
|
|
|
|
valueArcBackgroundColor: this.grafanaOptions.gauge.thresholds.arcBackground,
|
|
|
|
reversed: this.grafanaOptions.gauge.reversed,
|
|
|
|
stops: this.thresholds,
|
|
|
|
valueFontSize: this.grafanaOptions.gauge.valueSize,
|
|
|
|
// @ts-ignore
|
|
|
|
icons: [{ src: 'https://cityhost.ua/upload_img/blog5ef308ea5529c_trash2-01.jpg', position: 'middle', size: 30 }],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
getLastValueFromMetrics(metricName: string | undefined, optionName: string): number | null {
|
|
|
|
const filteredSeries = filterMetricListByAlias(
|
|
|
|
this.grafanaSeriesList,
|
|
|
|
metricName,
|
|
|
|
optionName
|
|
|
|
);
|
|
|
|
const serie = filteredSeries[0];
|
|
|
|
// Last value for now
|
|
|
|
return getAggregatedValueFromSerie(serie, Aggregation.LAST);
|
|
|
|
}
|
|
|
|
}
|