Fix item tag filter, #1594

This commit is contained in:
Alexander Zobnin
2023-03-23 14:40:22 +01:00
parent fc1d809dc1
commit 24285a9483
4 changed files with 39 additions and 20 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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;
} }

View File

@@ -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