按重名添加值

Adding values by duplicated name

我想使用 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 的多个条目。删除重复项很容易,但我想对每个 VM 出现的正常运行时间值求和以避免重复条目,但同时添加它们。

重复的发生是因为在查询结果中,一些 VM 同时显示 w/out 和具有不同正常运行时间值的 FQDN,因此 foreach-object 命令中的 split 命令。不知道为什么会这样。

如果我对问题有误解,请纠正我。

根据您的代码,似乎如果 computer_1 名称是 pc_1,而 computer_2 名称是 pc_1.azure.com,那么您认为它们是同一台计算机吗?所以你想把两台电脑的正常运行时间加在一起?比如pc_1uptime是10,pc_1.azure.comuptime是20,结果应该是vmName:pc_1=>uptime: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}}