KQL для ARG — Проверка, удовлетворяет ли какой-либо элемент массива предикату

#kql #azure-resource-graph

Вопрос:

Предположим, у меня есть следующие входные данные в качестве некоторого значения ячейки таблицы:

Адреса
[{«ip»: «1.1.1.1»},{«ip»: «2.2.2.2»},{«ip»: «3.3.3.3»},{«ip»: «4.4.4.4»}]

Можно ли отфильтровать строки, проверив, удовлетворяет ли какое-либо из значений массива предикату?

В настоящее время я могу подать заявку только на первое значение.

 | where parse_ipv4(tostring(addrs[0].ip)) gt; parse_ipv4("1.1.1.1")  

Однако я не смог применить это для всех значений массива.

Попытался использовать mvexpand (это единственная опция в kql для arg) следующим образом:

 | extend addrs = properties.addrs | mvexpand bagexpansion = array addrs  

Однако это, кажется, отбрасывает все значения массива, кроме первого.

Ответ №1:

График ресурсов Azure не поддерживает элементы языка KQL, такие как «let», что затрудняет создание пользовательских данных. Одним из способов обойти это может быть расширение столбца существующей таблицы


Если вы хотите провести точное сравнение, то объединения будет достаточно

 resources | take 1 | project ComparisonIPs = pack_array("1.1.1.1","2.2.2.2","3.3.3.3","4.4.4.4") | mv-expand ComparisonIPs to typeof(string) | join kind = innerunique (  // Your  resources  | where type == "microsoft.network/publicipaddresses"  | project ipAddress = tostring(parse_json(properties).ipAddress), id ) on $left.ComparisonIPs == $right.ipAddress  

В качестве альтернативы для сравнения предиката создайте общий столбец для объединения двух наборов данных, выполните внутреннее объединение, а затем выполните сравнение результирующего набора

 resources | take 1 | project ComparisonIPs = pack_array("1.1.1.1","2.2.2.2","3.3.3.3","4.4.4.4") | mv-expand ComparisonIPs to typeof(string) | extend Parsed = parse_ipv4(ComparisonIPs) | extend JoinColumn = "1" | join kind = inner ( resources  | where type == "microsoft.network/publicipaddresses"  | project ipAddress = tostring(parse_json(properties).ipAddress)  | extend Parsed = parse_ipv4(ipAddress)  | extend JoinColumn = "1" ) on JoinColumn | where Parsed gt; Parsed1  

Существуют и другие варианты, в зависимости от того, чего вы пытаетесь достичь, например, передача данных в качестве параметров в книгах Azure Monitor и повторное использование результатов ARG в Log Analytics, возможно, со ссылкой на внешние данные() или список наблюдения в Azure Sentinel.