Apply alias functions on the frontend

This commit is contained in:
Alexander Zobnin
2021-05-26 12:19:45 +03:00
parent ff16e2fe8d
commit d5265921ee
2 changed files with 56 additions and 29 deletions

View File

@@ -3,6 +3,8 @@ import _ from 'lodash';
// import { getTemplateSrv } from '@grafana/runtime'; // import { getTemplateSrv } from '@grafana/runtime';
import * as utils from './utils'; import * as utils from './utils';
import ts, { groupBy_perf as groupBy } from './timeseries'; import ts, { groupBy_perf as groupBy } from './timeseries';
import { getTemplateSrv } from '@grafana/runtime';
import { DataFrame, Field } from '@grafana/data';
const SUM = ts.SUM; const SUM = ts.SUM;
const COUNT = ts.COUNT; const COUNT = ts.COUNT;
@@ -72,38 +74,40 @@ function sortSeries(direction, timeseries: any[]) {
}], direction); }], direction);
} }
function setAlias(alias, timeseries) { function setAlias(alias: string, field: Field) {
// TODO: use getTemplateSrv() when available (since 7.0) if (field?.state?.scopedVars) {
if (this.templateSrv && timeseries && timeseries.scopedVars) { alias = getTemplateSrv().replace(alias, field?.state?.scopedVars);
alias = this.templateSrv.replace(alias, timeseries.scopedVars);
} }
timeseries.target = alias; field.name = alias;
return timeseries; return field;
} }
function replaceAlias(regexp, newAlias, timeseries) { function replaceAlias(regexp: string, newAlias: string, field: Field) {
let pattern; let pattern: string | RegExp;
if (utils.isRegex(regexp)) { if (utils.isRegex(regexp)) {
pattern = utils.buildRegex(regexp); pattern = utils.buildRegex(regexp);
} else { } else {
pattern = regexp; pattern = regexp;
} }
let alias = timeseries.target.replace(pattern, newAlias); let alias = field.name.replace(pattern, newAlias);
// TODO: use getTemplateSrv() when available (since 7.0) if (field?.state?.scopedVars) {
if (this.templateSrv && timeseries && timeseries.scopedVars) { alias = getTemplateSrv().replace(alias, field?.state?.scopedVars);
alias = this.templateSrv.replace(alias, timeseries.scopedVars);
} }
timeseries.target = alias; field.name = alias;
return timeseries; return field;
} }
function setAliasByRegex(alias, timeseries) { function setAliasByRegex(alias: string, field: Field) {
timeseries.target = extractText(timeseries.target, alias); try {
return timeseries; field.name = extractText(field.name, alias);
} catch (error) {
console.error('Failed to apply RegExp:', error?.message || error);
}
return field;
} }
function extractText(str, pattern) { function extractText(str: string, pattern: string) {
const extractPattern = new RegExp(pattern); const extractPattern = new RegExp(pattern);
const extractedValue = extractPattern.exec(str); const extractedValue = extractPattern.exec(str);
return extractedValue[0]; return extractedValue[0];

View File

@@ -102,10 +102,7 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
* @return {Object} Grafana metrics object with timeseries data for each target. * @return {Object} Grafana metrics object with timeseries data for each target.
*/ */
query(options: DataQueryRequest<any>): Promise<DataQueryResponse> | Observable<DataQueryResponse> { query(options: DataQueryRequest<any>): Promise<DataQueryResponse> | Observable<DataQueryResponse> {
console.log(options);
const isMetricQuery = options.targets.every(q => q.queryType === c.MODE_METRICS ||q.mode === c.MODE_METRICS); const isMetricQuery = options.targets.every(q => q.queryType === c.MODE_METRICS ||q.mode === c.MODE_METRICS);
console.log(isMetricQuery);
if (isMetricQuery && ENABLE_BACKEND_QUERIES) { if (isMetricQuery && ENABLE_BACKEND_QUERIES) {
return this.backendQuery(options); return this.backendQuery(options);
} }
@@ -200,19 +197,19 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
const { intervalMs, maxDataPoints, range, requestId } = request; const { intervalMs, maxDataPoints, range, requestId } = request;
const targets = request.targets; const targets = request.targets;
const queries = _.compact(targets.map((q) => {
const datasourceId = this.id;
// Don't request for hidden targets
if (q.hide) {
return null;
}
// Add range variables // Add range variables
request.scopedVars = Object.assign({}, request.scopedVars, utils.getRangeScopedVars(request.range)); request.scopedVars = Object.assign({}, request.scopedVars, utils.getRangeScopedVars(request.range));
const queries = _.compact(targets.map((query) => {
const datasourceId = this.id;
// Don't request for hidden targets
if (query.hide) {
return null;
}
// Prevent changes of original object // Prevent changes of original object
let target = _.cloneDeep(q); let target = _.cloneDeep(query);
// Migrate old targets // Migrate old targets
target = migrations.migrate(target); target = migrations.migrate(target);
@@ -243,7 +240,6 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
body.to = range.to.valueOf().toString(); body.to = range.to.valueOf().toString();
} }
console.log(body);
return getBackendSrv() return getBackendSrv()
.fetch({ .fetch({
url: '/api/ds/query', url: '/api/ds/query',
@@ -254,7 +250,7 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
.pipe( .pipe(
map((rsp: any) => { map((rsp: any) => {
const resp = toDataQueryResponse(rsp); const resp = toDataQueryResponse(rsp);
console.log(resp); this.applyFrontendFunctions(resp, request);
return resp; return resp;
}), }),
catchError((err) => { catchError((err) => {
@@ -373,6 +369,23 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
return timeseries; return timeseries;
} }
applyFrontendFunctions(response: DataQueryResponse, request: DataQueryRequest<any>) {
for (let i = 0; i < response.data.length; i++) {
const frame: DataFrame = response.data[i];
const target = getRequestTarget(request, frame.refId);
// Apply alias functions
const aliasFunctions = bindFunctionDefs(target.functions, 'Alias');
for (let fieldIndex = 0; fieldIndex < frame.fields.length; fieldIndex++) {
const field = frame.fields[fieldIndex];
if (field.type !== FieldType.time) {
utils.sequence(aliasFunctions)(field);
}
}
}
return response;
}
applyDataProcessingFunctions(timeseries_data, target) { applyDataProcessingFunctions(timeseries_data, target) {
const transformFunctions = bindFunctionDefs(target.functions, 'Transform'); const transformFunctions = bindFunctionDefs(target.functions, 'Transform');
const aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate'); const aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');
@@ -937,3 +950,13 @@ export function base64StringToArrowTable(text: string) {
}); });
return arr; return arr;
} }
function getRequestTarget(request: DataQueryRequest<any>, refId: string): any {
for (let i = 0; i < request.targets.length; i++) {
const target = request.targets[i];
if (target.refId === refId) {
return target;
}
}
return null;
}