KQL для ARG - проверка, удовлетворяет ли какой-либо элемент массива предикату
Предположим, у меня есть следующий ввод в качестве значения некоторой ячейки таблицы:
Можно ли фильтровать строки, проверяя, удовлетворяет ли какое-либо из значений массива предикату?
В настоящее время я могу подавать заявки только на первое значение.
| where parse_ipv4(tostring(addrs[0].ip)) > parse_ipv4("1.1.1.1")
Однако я не смог применить это ко всем значениям массива.
1 ответ
Azure Resource Graph не поддерживает языковые элементы 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 > Parsed1
Существуют и другие варианты, в зависимости от того, чего вы пытаетесь достичь, например передача данных в качестве параметров в книгах Azure Monitor и повторное использование результатов ARG в Log Analytics, возможно, со ссылкой на externaldata() или список наблюдения в Azure Sentinel.