#azure-data-explorer #kql
#azure-data-explorer #kql
Вопрос:
Я пытаюсь определить массив и перебирать его в цикле, ища трассировки для того, где сообщение содержит элемент в моем массиве. Возможно ли это сделать? Например:
let myIds = datatable (name: string)
[
"111",
"222",
"333",
];
forach (id in myIds)
{
traces
| where message contains id
}
Я знаю, что это неправильный синтаксис, приведенный выше, но, надеюсь, это объясняет, чего я пытаюсь достичь. В двух словах, выполните цикл по массиву и выполните поиск в моих журналах (в частности, трассировки).
Ответ №1:
Первый вариант заключается в использовании has_any
. Это более простое решение, которое может подойти для вашего варианта использования, но только если ваш идентификатор отображается в виде отдельного термина в сообщении.
Итак, если сообщение имеет форму «бла-бла-бла ID: 111», оно будет получено, но если оно является частью другого слова, то этого не произойдет (потому что has
работает немного иначе, чем contains
).
let myIds = datatable (name: string) [ "111","222","333"];
let traces=datatable(message:string) ["aaaaaaaaaaaaaaaa", "blah blah 111", "blah111 blah", "111blah"];
traces
| where message has_any (myIds)
Если вам нужна функциональность contains
(если вам нужно найти каждый отдельный экземпляр 111), вы можете использовать mv-apply
. Это перебирает вашу myIds
подтаблицу и выполняет сравнение с каждой записью по отдельности, а затем объединяет все результаты. Имейте в виду, что это означает, что вы можете получить дубликаты, если в одном сообщении совпадают несколько идентификаторов.
let myIds = datatable (name: string) [ "111","222","333"] | summarize make_set(name);
let traces=datatable(message:string) ["aaaaaaaaaaaaaaaa", "blah blah 111", "blah111 blah", "111blah"];
traces
| mv-apply id=toscalar(myIds) to typeof(string) on (where message contains id)
Ответ №2:
вы можете изучить использование mv-expand
или mv-apply