Массив циклов Кусто с вложенным запросом

#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: