【问题标题】:KQL for ARG - Checking if any element of array satisfies a predicateARG 的 KQL - 检查数组的任何元素是否满足谓词
【发布时间】:2021-10-26 18:13:42
【问题描述】:

假设我有以下输入作为某个表格单元格值:

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

但是这似乎删除了除第一个之外的所有数组值。

【问题讨论】:

    标签: kql azure-resource-graph


    【解决方案1】:

    Azure Resource Graph 不支持“let”等 KQL 语言元素,这使得创建自定义数据变得困难,解决此问题的一种方法是扩展现有表的列


    如果您想进行精确比较,那么连接就足够了

    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 中的监视列表。

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      相关资源
      最近更新 更多