Fix item tag filter, #1594
This commit is contained in:
@@ -2,7 +2,6 @@ package zabbix
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"regexp"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -243,8 +242,15 @@ func (ds *Zabbix) GetItemTags(ctx context.Context, groupFilter string, hostFilte
|
|||||||
allItems, err = ds.GetAllItems(ctx, hostids, nil, itemType, showDisabled, "")
|
allItems, err = ds.GetAllItems(ctx, hostids, nil, itemType, showDisabled, "")
|
||||||
|
|
||||||
var allTags []ItemTag
|
var allTags []ItemTag
|
||||||
|
tagsMap := make(map[string]ItemTag)
|
||||||
for _, item := range allItems {
|
for _, item := range allItems {
|
||||||
allTags = append(allTags, item.Tags...)
|
for _, itemTag := range item.Tags {
|
||||||
|
tagStr := itemTagToString(itemTag)
|
||||||
|
tagsMap[tagStr] = itemTag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, t := range tagsMap {
|
||||||
|
allTags = append(allTags, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
return filterTags(allTags, tagFilter)
|
return filterTags(allTags, tagFilter)
|
||||||
@@ -376,18 +382,15 @@ func (ds *Zabbix) GetAllItems(ctx context.Context, hostids []string, appids []st
|
|||||||
params["selectTags"] = "extend"
|
params["selectTags"] = "extend"
|
||||||
if len(itemTagFilter) > 0 {
|
if len(itemTagFilter) > 0 {
|
||||||
allTags := strings.Split(itemTagFilter, ",")
|
allTags := strings.Split(itemTagFilter, ",")
|
||||||
re := regexp.MustCompile(`(?m).*?([a-zA-Z0-9\s\-_]*):\s*([a-zA-Z0-9\-_\/:]*)`)
|
tagsParams := make([]map[string]string, 0)
|
||||||
var tagsParams []map[string]string
|
for _, tagStr := range allTags {
|
||||||
for i := 0; i < len(allTags); i++ {
|
tag := parseItemTag(tagStr)
|
||||||
res := re.FindAllStringSubmatch(allTags[i], -1)
|
tagParam := map[string]string{
|
||||||
for i := range res {
|
"tag": tag.Tag,
|
||||||
tagParam := map[string]string{
|
"value": tag.Value,
|
||||||
"tag": res[i][1],
|
"operator": "1",
|
||||||
"value": res[i][2],
|
|
||||||
"operator": "1",
|
|
||||||
}
|
|
||||||
tagsParams = append(tagsParams, tagParam)
|
|
||||||
}
|
}
|
||||||
|
tagsParams = append(tagsParams, tagParam)
|
||||||
}
|
}
|
||||||
params["tags"] = tagsParams
|
params["tags"] = tagsParams
|
||||||
params["evaltype"] = 2
|
params["evaltype"] = 2
|
||||||
|
|||||||
@@ -100,3 +100,17 @@ func itemTagToString(tag ItemTag) string {
|
|||||||
return tag.Tag
|
return tag.Tag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseItemTag(tagStr string) ItemTag {
|
||||||
|
tag := ItemTag{}
|
||||||
|
firstIdx := strings.Index(tagStr, ":")
|
||||||
|
if firstIdx > 0 {
|
||||||
|
tag.Tag = strings.TrimSpace(tagStr[:firstIdx])
|
||||||
|
if firstIdx < len(tagStr)-1 {
|
||||||
|
tag.Value = strings.TrimSpace(tagStr[firstIdx+1:])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tag.Tag = strings.TrimSpace(tagStr)
|
||||||
|
}
|
||||||
|
return tag
|
||||||
|
}
|
||||||
|
|||||||
@@ -433,10 +433,12 @@ export function parseTags(tagStr: string): any[] {
|
|||||||
// Parses string representation of tag into the object
|
// Parses string representation of tag into the object
|
||||||
export function parseItemTag(tagStr: string): ZBXItemTag {
|
export function parseItemTag(tagStr: string): ZBXItemTag {
|
||||||
const itemTag: ZBXItemTag = { tag: '', value: '' };
|
const itemTag: ZBXItemTag = { tag: '', value: '' };
|
||||||
const tagParts = tagStr.split(': ');
|
const firstIdx = tagStr.indexOf(':');
|
||||||
itemTag.tag = tagParts[0];
|
if (firstIdx > 0) {
|
||||||
if (tagParts[1]) {
|
itemTag.tag = tagStr.slice(0, firstIdx).trim();
|
||||||
itemTag.value = tagParts[1];
|
itemTag.value = tagStr.slice(Math.min(firstIdx + 1, tagStr.length)).trim();
|
||||||
|
} else {
|
||||||
|
itemTag.tag = tagStr.trim();
|
||||||
}
|
}
|
||||||
return itemTag;
|
return itemTag;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { ShowProblemTypes, ZBXProblem, ZBXTrigger } from '../../../types';
|
|||||||
import { APIExecuteScriptResponse, JSONRPCError, ZBXScript } from './types';
|
import { APIExecuteScriptResponse, JSONRPCError, ZBXScript } from './types';
|
||||||
import { BackendSrvRequest, getBackendSrv } from '@grafana/runtime';
|
import { BackendSrvRequest, getBackendSrv } from '@grafana/runtime';
|
||||||
import { rangeUtil } from '@grafana/data';
|
import { rangeUtil } from '@grafana/data';
|
||||||
|
import { parseItemTag } from '../../../utils';
|
||||||
|
|
||||||
const DEFAULT_ZABBIX_VERSION = '3.0.0';
|
const DEFAULT_ZABBIX_VERSION = '3.0.0';
|
||||||
|
|
||||||
@@ -206,10 +207,9 @@ export class ZabbixAPIConnector {
|
|||||||
if (itemTagFilter) {
|
if (itemTagFilter) {
|
||||||
const allTags = itemTagFilter.split(',');
|
const allTags = itemTagFilter.split(',');
|
||||||
let tagsParam = [];
|
let tagsParam = [];
|
||||||
const regex = /.*?([a-zA-Z0-9\s\-_]*):\s*([a-zA-Z0-9\-_\/:]*)/;
|
|
||||||
for (let i = 0; i < allTags.length; i++) {
|
for (let i = 0; i < allTags.length; i++) {
|
||||||
const matches = allTags[i].match(regex);
|
const tag = parseItemTag(allTags[i]);
|
||||||
tagsParam.push({ tag: matches[1].replace('/', ''), value: matches[2].trim(), operator: '1' });
|
tagsParam.push({ tag: tag.tag, value: tag.value, operator: '1' });
|
||||||
}
|
}
|
||||||
params.tags = tagsParam;
|
params.tags = tagsParam;
|
||||||
// Use OR eval type
|
// Use OR eval type
|
||||||
|
|||||||
Reference in New Issue
Block a user