我想使用Powershell生成Azure日志分析查询。
但是我陷入了一个奇怪的问题。不知道为什么,但是它显示了几个虚拟机的重复条目。
我的目标是为每个VM生成正常运行时间值的报告。这是我的代码:
$startime = '2019-08-01';
$endtime = '2019-08-31';
$queryResults = Invoke-AzOperationalInsightsQuery -WorkspaceId "..." -Query "let start_time=startofday(datetime('$startime'));
let end_time=endofday(datetime('$endtime'));
Heartbeat
| where TimeGenerated > start_time and TimeGenerated < end_time
| summarize heartbeat_per_hour=count() by bin_at(TimeGenerated, 1h, start_time), Computer
| extend available_per_hour=iff(heartbeat_per_hour>0, true, false)
| summarize total_available_hours=countif(available_per_hour==true) by Computer
"
$output = $QueryResults.Results | foreach-object {
[PSCustomObject]
@{
"VM Name" = ($_.Computer.split('.')[0]).ToUpper()
"VM Uptime (in Hours)" = $_.total_available_hours
}
}
在$output
变量中,我看到了几个虚拟机的多个条目。删除重复项很容易,但是我想对每个VM发生的正常运行时间的值求和,以避免重复项,但要同时添加它们。
发生重复是因为在查询结果中,某些虚拟机同时显示为w / out和FQDN,且具有不同的正常运行时间值,因此在foreach-object命令中使用split命令。不知道为什么也会发生这种情况。
答案 0 :(得分:1)
如果我对这个问题有误解,请纠正我。
根据您的代码,似乎如果computer_1的名称为pc_1,而computer_2的名称为pc_1.azure.com,那么您认为它们是同一台计算机吗?所以您想将两台计算机的正常运行时间加在一起?像pc_1正常运行时间是10,pc_1.azure.com正常运行时间是20,结果应该是vmName:pc_1 =>正常运行时间:30?对吧?
如果是这样,您有两种方法可以实现。第一种方法是用kusto重新编写查询,第二种方法是重新编写powershell代码。
在这里,我只是通过分割计算机名称来重新编写您的kusto查询,如下所示:
let start_time=startofday(datetime('$startime'));
let end_time=endofday(datetime('$endtime'));
Heartbeat
| where TimeGenerated > start_time and TimeGenerated < end_time
| extend aa=split(Computer, ".")
| extend bb=array_slice(aa, 0, 0)
| extend my_Computer=strcat_array(bb,"")
| summarize heartbeat_per_hour=count() by bin_at(TimeGenerated, 1h, start_time), my_Computer
| extend available_per_hour=iff(heartbeat_per_hour>0, true, false)
| summarize total_available_hours=countif(available_per_hour==true) by my_Computer
下面的屏幕快照显示了拆分计算机名称的效果:
使用powershell的第二种方法,例如注释中提到的op:
$output = $output | Group-Object -Property "VM Name" | Select-Object -unique Name, @{L="VM Uptime (in Hours)";E={($_.group | Measure-Object -Property "VM Uptime (in Hours)" -Sum).sum}}