Azure资源图KQL -过滤具有给定前缀的标记的虚拟机

ghhaqwfi  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(76)

我们在Azure中创建了很多虚拟机。每个虚拟机都有标签。其中一些标记的键是动态构造的。这样的键具有固定前缀和动态后缀。我们想要一种方法来过滤所有具有2个或更多给定前缀的密钥的虚拟机。
考虑以下虚拟机:

  • VM1:{name:"vm-1",tags:{"bingo-1 ":1," tringo-2 ":1," key1 ":联系我们
  • VM1:{name:"vm-1",tags:{"tringo-2 ":1," key2 ":联系我们
  • VM1:{name:"vm-1",tags:{"bingo-1 ":1," key3 ":联系我们

预期输出:vm-1,因为它是唯一一个同时包含两个tag-key-prefixes的VM。
尝试:我得到了这个工作,但这似乎不是最佳的,因为它调用了bag_keys函数两次。

resources
 | where type =~ 'Microsoft.Compute/virtualMachines'
 | where resourceGroup =~ 'test-resource-group'
 | where bag_keys(tags) hasprefix "bingo-"
 | where bag_keys(tags) hasprefix "tringo-"
 | project name

这和预期的一样工作,但代价是调用了两次bag_keys。有没有一种更习惯、更优化的方法来实现相同的功能,而不需要两次调用bag_keys?

5cg8jx4n

5cg8jx4n1#

我没有使用两个where操作符,而是首先包含mv-expand操作符来将标签连接到一个记录中,然后使用and来检查和过滤两个前缀的标签,以优化代码。

resources
| where type =~ 'Microsoft.Compute/virtualMachines'
| where resourceGroup =~ '<resourcegroup>'
| mvexpand tags
| extend tagKey = tostring(bag_keys(tags)[0])
| extend tagValue = tostring(tags[tagKey])
| where tagKey hasprefix "creat"  and tagKey hasprefix "cr"
| project name, tags, tagKey, tagValue

更新:

如注解中所示,您可以使用extend运算符。它以这种方式创建一个新列,其中包含tags对象中的所有键。

extend tagKeys = bag_keys(tags) 
| where tagKeys hasprefix "bingo-" and tagKeys hasprefix "tringo-"

参考@John Kilmister的资源图浏览器查询article,以获取更多相关的查询示例。

相关问题