diff --git a/src/datasource-zabbix/dataProcessor.ts b/src/datasource-zabbix/dataProcessor.ts index 5df0af0..07ace3c 100644 --- a/src/datasource-zabbix/dataProcessor.ts +++ b/src/datasource-zabbix/dataProcessor.ts @@ -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]; diff --git a/src/datasource-zabbix/datasource.ts b/src/datasource-zabbix/datasource.ts index 3d81b37..51d0621 100644 --- a/src/datasource-zabbix/datasource.ts +++ b/src/datasource-zabbix/datasource.ts @@ -102,10 +102,7 @@ export class ZabbixDatasource extends DataSourceApi): Promise | Observable { - 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 { + // 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 { const resp = toDataQueryResponse(rsp); - console.log(resp); + this.applyFrontendFunctions(resp, request); return resp; }), catchError((err) => { @@ -373,6 +369,23 @@ export class ZabbixDatasource extends DataSourceApi) { + 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, 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; +}