通过重复的名称添加值

时间:2019-09-04 14:58:59

标签: azure powershell azure-log-analytics

我想使用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命令。不知道为什么也会发生这种情况。

1 个答案:

答案 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

下面的屏幕快照显示了拆分计算机名称的效果:

enter image description here

使用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}}