Fix item tags support

This commit is contained in:
Alexander Zobnin
2022-12-15 17:06:17 +01:00
parent e3e896742b
commit b32fd7e77a

View File

@@ -8,7 +8,8 @@ import { QueryEditorRow } from './QueryEditorRow';
import { MetricPicker } from '../../../components'; import { MetricPicker } from '../../../components';
import { getVariableOptions } from './utils'; import { getVariableOptions } from './utils';
import { ZabbixDatasource } from '../../datasource'; import { ZabbixDatasource } from '../../datasource';
import { ZabbixMetricsQuery } from '../../types'; import { ZabbixMetricsQuery, ZBXItem, ZBXItemTag } from '../../types';
import { itemTagToString } from '../../utils';
export interface Props { export interface Props {
query: ZabbixMetricsQuery; query: ZabbixMetricsQuery;
@@ -68,6 +69,31 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => {
return options; return options;
}, [query.group.filter, query.host.filter]); }, [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<SelectableValue<string>> = 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 loadItemOptions = async (group: string, host: string, app: string, itemTag: string) => {
const groupFilter = datasource.replaceTemplateVars(group); const groupFilter = datasource.replaceTemplateVars(group);
const hostFilter = datasource.replaceTemplateVars(host); const hostFilter = datasource.replaceTemplateVars(host);
@@ -115,6 +141,10 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => {
fetchApps(); fetchApps();
}, [groupFilter, hostFilter]); }, [groupFilter, hostFilter]);
useEffect(() => {
fetchTags();
}, [groupFilter, hostFilter]);
useEffect(() => { useEffect(() => {
fetchItems(); fetchItems();
}, [groupFilter, hostFilter, appFilter, tagFilter]); }, [groupFilter, hostFilter, appFilter, tagFilter]);
@@ -127,6 +157,8 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => {
}; };
}; };
const supportsApplications = datasource.zabbix.supportsApplications();
return ( return (
<> <>
<QueryEditorRow> <QueryEditorRow>
@@ -150,15 +182,28 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => {
</InlineField> </InlineField>
</QueryEditorRow> </QueryEditorRow>
<QueryEditorRow> <QueryEditorRow>
<InlineField label="Application" labelWidth={12}> {supportsApplications && (
<MetricPicker <InlineField label="Application" labelWidth={12}>
width={24} <MetricPicker
value={query.application.filter} width={24}
options={appOptions} value={query.application.filter}
isLoading={appsLoading} options={appOptions}
onChange={onFilterChange('application')} isLoading={appsLoading}
/> onChange={onFilterChange('application')}
</InlineField> />
</InlineField>
)}
{!supportsApplications && (
<InlineField label="Item tag" labelWidth={12}>
<MetricPicker
width={24}
value={query.itemTag.filter}
options={tagOptions}
isLoading={tagsLoading}
onChange={onFilterChange('itemTag')}
/>
</InlineField>
)}
<InlineField label="Item" labelWidth={12}> <InlineField label="Item" labelWidth={12}>
<MetricPicker <MetricPicker
width={24} width={24}