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 * as utils from './utils';
import ts, { groupBy_perf as groupBy } from './timeseries';
import { getTemplateSrv } from '@grafana/runtime';
import { DataFrame, Field } from '@grafana/data';
const SUM = ts.SUM;
const COUNT = ts.COUNT;
@@ -72,38 +74,40 @@ function sortSeries(direction, timeseries: any[]) {
}], direction);
}
function setAlias(alias, timeseries) {
// TODO: use getTemplateSrv() when available (since 7.0)
if (this.templateSrv && timeseries && timeseries.scopedVars) {
alias = this.templateSrv.replace(alias, timeseries.scopedVars);
function setAlias(alias: string, field: Field) {
if (field?.state?.scopedVars) {
alias = getTemplateSrv().replace(alias, field?.state?.scopedVars);
}
timeseries.target = alias;
return timeseries;
field.name = alias;
return field;
}
function replaceAlias(regexp, newAlias, timeseries) {
let pattern;
function replaceAlias(regexp: string, newAlias: string, field: Field) {
let pattern: string | RegExp;
if (utils.isRegex(regexp)) {
pattern = utils.buildRegex(regexp);
} else {
pattern = regexp;
}
let alias = timeseries.target.replace(pattern, newAlias);
// TODO: use getTemplateSrv() when available (since 7.0)
if (this.templateSrv && timeseries && timeseries.scopedVars) {
alias = this.templateSrv.replace(alias, timeseries.scopedVars);
let alias = field.name.replace(pattern, newAlias);
if (field?.state?.scopedVars) {
alias = getTemplateSrv().replace(alias, field?.state?.scopedVars);
}
timeseries.target = alias;
return timeseries;
field.name = alias;
return field;
}
function setAliasByRegex(alias, timeseries) {
timeseries.target = extractText(timeseries.target, alias);
return timeseries;
function setAliasByRegex(alias: string, field: Field) {
try {
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 extractedValue = extractPattern.exec(str);
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.
*/
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);
console.log(isMetricQuery);
if (isMetricQuery && ENABLE_BACKEND_QUERIES) {
return this.backendQuery(options);
}
@@ -200,19 +197,19 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
const { intervalMs, maxDataPoints, range, requestId } = request;
const targets = request.targets;
const queries = _.compact(targets.map((q) => {
// Add range variables
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 (q.hide) {
if (query.hide) {
return null;
}
// Add range variables
request.scopedVars = Object.assign({}, request.scopedVars, utils.getRangeScopedVars(request.range));
// Prevent changes of original object
let target = _.cloneDeep(q);
let target = _.cloneDeep(query);
// Migrate old targets
target = migrations.migrate(target);
@@ -243,7 +240,6 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
body.to = range.to.valueOf().toString();
}
console.log(body);
return getBackendSrv()
.fetch({
url: '/api/ds/query',
@@ -254,7 +250,7 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
.pipe(
map((rsp: any) => {
const resp = toDataQueryResponse(rsp);
console.log(resp);
this.applyFrontendFunctions(resp, request);
return resp;
}),
catchError((err) => {
@@ -373,6 +369,23 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
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) {
const transformFunctions = bindFunctionDefs(target.functions, 'Transform');
const aggregationFunctions = bindFunctionDefs(target.functions, 'Aggregate');
@@ -937,3 +950,13 @@ export function base64StringToArrowTable(text: string) {
});
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;
}