【问题标题】:Adding values by duplicated name通过重复名称添加值
【发布时间】: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


【解决方案1】:

如果我误解了这个问题,请纠正我。

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

【讨论】:

  • 非常感谢您的帮助!我设法通过将此行添加到我的 powershell 脚本来修复它: $output = $output |组对象-属性“VM 名称”| Select-Object - 唯一名称,@{L="VM Uptime (in Hours)";E={($_.group | Measure-Object -Property "VM Uptime (in Hours)" -Sum).sum}}
猜你喜欢
  • 2012-08-13
  • 2021-06-12
  • 2020-11-30
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2011-07-11
  • 2013-10-10
  • 2023-03-22
相关资源
最近更新 更多