Fix item tags support
This commit is contained in:
@@ -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,6 +182,7 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => {
|
|||||||
</InlineField>
|
</InlineField>
|
||||||
</QueryEditorRow>
|
</QueryEditorRow>
|
||||||
<QueryEditorRow>
|
<QueryEditorRow>
|
||||||
|
{supportsApplications && (
|
||||||
<InlineField label="Application" labelWidth={12}>
|
<InlineField label="Application" labelWidth={12}>
|
||||||
<MetricPicker
|
<MetricPicker
|
||||||
width={24}
|
width={24}
|
||||||
@@ -159,6 +192,18 @@ export const MetricsQueryEditor = ({ query, datasource, onChange }: Props) => {
|
|||||||
onChange={onFilterChange('application')}
|
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}
|
||||||
|
|||||||
Reference in New Issue
Block a user