From b32fd7e77a05b70759fe1a30f353f76c73f43d02 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 15 Dec 2022 17:06:17 +0100 Subject: [PATCH] Fix item tags support --- .../QueryEditor/MetricsQueryEditor.tsx | 65 ++++++++++++++++--- 1 file changed, 55 insertions(+), 10 deletions(-) diff --git a/src/datasource/components/QueryEditor/MetricsQueryEditor.tsx b/src/datasource/components/QueryEditor/MetricsQueryEditor.tsx index 7e899a7..4e9dd1d 100644 --- a/src/datasource/components/QueryEditor/MetricsQueryEditor.tsx +++ b/src/datasource/components/QueryEditor/MetricsQueryEditor.tsx @@ -8,7 +8,8 @@ import { QueryEditorRow } from './QueryEditorRow'; import { MetricPicker } from '../../../components'; import { getVariableOptions } from './utils'; import { ZabbixDatasource } from '../../datasource'; -import { ZabbixMetricsQuery } from '../../types'; +import { ZabbixMetricsQuery, ZBXItem, ZBXItemTag } from '../../types'; +import { itemTagToString } from '../../utils'; export interface Props { query: ZabbixMetricsQuery; @@ -68,6 +69,31 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => { return options; }, [query.group.filter, query.host.filter]); + const loadTagOptions = async (group: string, host: string) => { + if (!datasource.zabbix.isZabbix54OrHigher()) { + return []; + } + + const groupFilter = datasource.replaceTemplateVars(group); + const hostFilter = datasource.replaceTemplateVars(host); + const items = await datasource.zabbix.getAllItems(groupFilter, hostFilter, null, null, {}); + const tags: ZBXItemTag[] = _.flatten(items.map((item: ZBXItem) => item.tags || [])); + + const tagList = _.uniqBy(tags, (t) => t.tag + t.value || '').map((t) => itemTagToString(t)); + let options: Array> = tagList?.map((tag) => ({ + value: tag, + label: tag, + })); + options = _.uniqBy(options, (o) => o.value); + options.unshift(...getVariableOptions()); + return options; + }; + + const [{ loading: tagsLoading, value: tagOptions }, fetchTags] = useAsyncFn(async () => { + const options = await loadTagOptions(query.group.filter, query.host.filter); + return options; + }, [query.group.filter, query.host.filter]); + const loadItemOptions = async (group: string, host: string, app: string, itemTag: string) => { const groupFilter = datasource.replaceTemplateVars(group); const hostFilter = datasource.replaceTemplateVars(host); @@ -115,6 +141,10 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => { fetchApps(); }, [groupFilter, hostFilter]); + useEffect(() => { + fetchTags(); + }, [groupFilter, hostFilter]); + useEffect(() => { fetchItems(); }, [groupFilter, hostFilter, appFilter, tagFilter]); @@ -127,6 +157,8 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => { }; }; + const supportsApplications = datasource.zabbix.supportsApplications(); + return ( <> @@ -150,15 +182,28 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => { - - - + {supportsApplications && ( + + + + )} + {!supportsApplications && ( + + + + )}