ARG 的 KQL - 检查数组的任何元素是否满足谓词
KQL for ARG - Checking if any element of array satisfies a predicate
假设我有以下输入作为一些 table 单元格值:
Addrs
[{"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)) > parse_ipv4("1.1.1.1")
但是我无法将此应用于数组的所有值。
尝试以下列方式使用 mvexpand(这是 kql 中 arg 的唯一选项):
| extend addrs = properties.addrs
| mvexpand bagexpansion = array addrs
然而,这似乎会删除除第一个以外的所有数组值。
Azure Resource Graph 不支持“let”等 KQL 语言元素,这使得创建自定义数据变得困难,解决此问题的一种方法是扩展现有 table
的列
如果你想做一个精确的比较,一个join就足够了
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 工作簿中,并在 Log Analytics 中重用 ARG 结果,可能引用 externaldata() 或 Azure Sentinel 中的监视列表.
假设我有以下输入作为一些 table 单元格值:
Addrs |
---|
[{"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)) > parse_ipv4("1.1.1.1")
但是我无法将此应用于数组的所有值。
尝试以下列方式使用 mvexpand(这是 kql 中 arg 的唯一选项):
| extend addrs = properties.addrs
| mvexpand bagexpansion = array addrs
然而,这似乎会删除除第一个以外的所有数组值。
Azure Resource Graph 不支持“let”等 KQL 语言元素,这使得创建自定义数据变得困难,解决此问题的一种方法是扩展现有 table
的列如果你想做一个精确的比较,一个join就足够了
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 工作簿中,并在 Log Analytics 中重用 ARG 结果,可能引用 externaldata() 或 Azure Sentinel 中的监视列表.