如何使用Powershell检索Azure中警报的当前状态

时间:2017-02-22 14:47:22

标签: powershell azure azure-automation

我正在编写一个Powershell Runbook,它将扩展VM ScaleSet,直到解决了Application Insights警报。

为此,我需要在我的Powershell脚本中查询警报的状态,即如果警报已被触发或解决则为no。

我尝试使用Get-AzureRmAlertRuleGet-AzureRmAlertHistory,但这只能分别给出警报规则的禁用/启用状态,或者对规则本身执行的操作(即更新规则,或删除警报等)。

有没有办法简单地知道当前是否正在触发或解决警报?

1 个答案:

答案 0 :(得分:0)

所以我也积极地处理这个问题并且认为我会分享我发现的东西。

以下内容来自Microsoft documentation

  

Get-AzureRmAlertHistory cmdlet会在启用,禁用,解雇已解决等情况下获取警报的历史记录。

虽然搞乱了这个命令,我发现如果你不给它任何参数,它只会返回当天的历史记录;但是,当您使用-StartTime-EndTime参数时,您可以从过去获取警报的详细信息。

虽然这并没有在单个命令中为您提供警报的当前状态,但可以将一些逻辑放在一起,以便在给定时间范围内获取最新警报并检查其中的状态。

出于我的目的,此代码会检查从警报webhook调用的Runbook中的兄弟警报的状态。所以我可以根据webhook中提供的数据收集时间范围。我知道这对所有情况都不是一个完美的解决方案,但至少它可以作为一个起点。

注意:我使用的AzureRM.Insights模块版本3.2.1的行为可能会有所不同,具体取决于您正在使用的此模块的版本。

更新

当我继续处理代码时,我发现使用-ResourceId参数进行过滤存在一些问题。当您为要查找历史记录的警报提供ResourceId时,它将不会返回任何结果。据我所知,当使用仅Get-AzureRmAlertHistory参数的-ResourceId cmdlet时,在返回警报对象时,不会填充ResourceId。我确实设法找到了两种让它工作的方法。

  1. -DetailedOutput参数之前传递-ResourceId参数。事实证明,ResourceId填充在DetailedOutput中并且可以在那里匹配;但是,如果首先传递-ResourceId,则cmdlet的作用就像在返回详细输出之前首先计算该值一样。

      

    Get-AzureRmAlertHistory -StartTime 2018-01-16 -EndTime 2018-01-17 -DetailedOutput -ResourceId $AlertResourceID

  2. 属性 CorrelationId 包含ResourceId。使用Where-Object语法,您可以使用Regex匹配ResourceId。

      

    Get-AzureRmAlertHistory -StartTime 2018-01-16 -EndTime 2018-01-17 | Where-Object {$_.CorrelationId -Match "$AlertResourceID/incidents/.*"}

  3. 现在您已拥有所需的记录,您可以在Sort-Object属性上使用简单的-EventTimestamp并将结果分配给变量。然后,如果您引用分配了结果的变量的 -1 索引,它应该为您提供最新的警报实例以及警报状态。

      

    $AlertHistory = Get-AzureRmAlertHistory -StartTime 2018-01-16 -EndTime 2018-01-17 | Where-Object {$_.CorrelationId -Match "$AlertResourceID/incidents/.*"} | Sort-Object -Property EventTimestamp;

         

    $AlertHistory[-1];