【发布时间】:2019-09-06 17:40:43
【问题描述】:
我想使用 powershell 生成 Azure 日志分析查询。
但我遇到了一个奇怪的问题。不知道为什么,但它显示了几个虚拟机的重复条目。
我的目标是生成每个虚拟机的正常运行时间值报告。这是我的代码:
$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 出现的正常运行时间值求和,以避免重复条目,但同时添加它们。
重复发生是因为在查询结果中,一些虚拟机显示为不带 FQDN 和具有不同启动时间值的 FQDN,因此在 foreach-object 命令中使用 split 命令。也不知道为什么会这样。
【问题讨论】:
-
能否在 $output 中再次使用 for-each,然后将同名虚拟机的 up_time 相加?
-
多台计算机在不同的域中是否具有相同的名称?例如“MyComputer.domain1.com”和“MyComputer.domain2.com”?您的
($_.Computer.split('.')[0]).ToUpper()会将它们都减少为“MYCOMPUTER”...也许删除split并生成带有全名的报告,看看重复项是否仍然存在... -
@Ivan Yang 我可以,但是怎么做?我不会写一个条件,它会根据虚拟机名称总结正常运行时间值。
标签: azure powershell azure-log-analytics