azure 基于参数过滤查询

bprjcwpo  于 2023-08-07  发布在  其他
关注(0)|答案(3)|浏览(97)

使用KQL创建工作簿磁贴,其中使用了参数-在本例中为VirtualMachines。
如果我在参数中只选择了1个虚拟机的情况下运行以下操作,将显示结果。如果我选择了2个或更多VM,则会出现错误,说明无法解析结果,错误输出显示VM 1、VM 2。
为参数配置的分隔符为,
如何更正以下查询以使用多个VirtualMachine参数选择?

InsightsMetrics
| where Origin == "vm.azm.ms"
| where Namespace == "LogicalDisk" and Name == "FreeSpacePercentage"
| extend Disk=tostring(todynamic(Tags)["vm.azm.ms/mountId"])
| extend vmName = tostring(toupper(Computer))
| extend VM_Name = tostring(split(vmName,'.')[0]) 
| summarize AggregatedValue = avg(Val) by VM_Name, Disk, _ResourceId
| where VM_Name in '{VirtualMachines:label}'
| top 30 by AggregatedValue asc

字符串
谢啦,谢啦

rn0zuynd

rn0zuynd1#

如果我在参数中只选择了1个虚拟机的情况下运行以下操作,将显示结果。如果我选择了2个或更多VM,则会出现错误,说明无法解析结果,错误输出显示VM1、VM2。
感谢Craig提出同样的建议。
应将["VM1", "VM2"]替换为包含所选VMs的实际参数名称。

方法:1

InsightsMetrics
| where Origin == "vm.azm.ms"
| where Namespace == "LogicalDisk" and Name == "FreeSpacePercentage"
| extend Disk=tostring(todynamic(Tags)["vm.azm.ms/mountId"])
| extend vmName = tostring(toupper(Computer))
| extend VM_Name = tostring(split(vmName,'.')[0]) 
| summarize AggregatedValue = avg(Val) by VM_Name, Disk, _ResourceId
| where VM_Name in ("CH1-DMAVM","SQL01","AppBE00","DC01")
| top 30 by AggregatedValue asc

字符串

输出:


的数据

方法二:

要使查询能够使用多个VirtualMachine参数选择,您应该使用in运算符沿着dynamic函数来构造适当的动态表达式,而不是使用in运算符。

let selectedVMs = dynamic(["SQL01", "SQL10", "DC01","AppBE00"]);
InsightsMetrics
| where Origin == "vm.azm.ms"
| where Namespace == "LogicalDisk" and Name == "FreeSpacePercentage"
| extend Disk = tostring(todynamic(Tags)["vm.azm.ms/mountId"])
| extend vmName = tostring(toupper(Computer))
| extend VM_Name = tostring(split(vmName, '.')[0])
| summarize AggregatedValue = avg(Val) by VM_Name, Disk, _ResourceId
| where VM_Name in (selectedVMs)
| top 30 by AggregatedValue asc


通过使用in (selectedVMs)表达式,查询将根据selectedVMs数组中的VM names筛选结果。

输出:


mcdcgff0

mcdcgff02#

谢谢大家的帮助。我通过使用以下代码实现了这一点:

let machines = dynamic('{VirtualMachines:label}');
let vms = split(machines, ', ');
InsightsMetrics
| where Origin == "vm.azm.ms"
| where Namespace == "LogicalDisk" and Name == "FreeSpacePercentage"
| extend Disk=tostring(todynamic(Tags)["vm.azm.ms/mountId"])
| extend vmName = tostring(toupper(Computer))
| extend VM_Name = tostring(split(vmName,'.')[0]) 
| summarize AggregatedValue = avg(Val) by VM_Name, Disk, _ResourceId
| where VM_Name in~ (vms)
| top 30 by AggregatedValue asc

字符串

voj3qocg

voj3qocg3#

仅供参考:对于工作簿中的单值参数,参数的值只是文本,因此需要在查询文本中用引号将其括起来
因此,如果VirtualMachines是一个单值参数,您可以在查询中这样使用它:

...
| where machine == "{VirtualMachines}"

字符串
然后就变成了

...
| where machine == "the value of the parameter"


在查询时间。
但是,当使用 * 多值下拉参数 * 时,参数设置有用于引号(默认为')和分隔符(默认为,)的选项,因此您必须像这样使用它:

...
| where machine in ({VirtualMachines}) // note NO QUOTES HERE


在查询时被解析为

...
| where machine in ('value1', 'value2', 'value3') // note NO QUOTES HERE


对于多值参数,特别是可选的,最好的方法是使用let:

let machines = dynamic([{VirtualMachines}]); // turns into a KQL array,even if param is empty


因为这样你就可以像

let machines = dynamic([{VirtualMachines}]); // turns into a KQL array,even if param is empty
...
| where machine in (machines) // note NO QUOTES HERE


这在语法上是有效的,即使没有选择任何计算机(因此,如果没有选择任何计算机,您可以像|where array_length(machines)==0 or machine in (machines)一样允许所有计算机

相关问题