Apply alias functions on the frontend
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user