我正在编写一个Powershell Runbook,它将扩展VM ScaleSet,直到解决了Application Insights警报。
为此,我需要在我的Powershell脚本中查询警报的状态,即如果警报已被触发或解决则为no。
我尝试使用Get-AzureRmAlertRule
和Get-AzureRmAlertHistory
,但这只能分别给出警报规则的禁用/启用状态,或者对规则本身执行的操作(即更新规则,或删除警报等)。
有没有办法简单地知道当前是否正在触发或解决警报?
答案 0 :(得分:0)
所以我也积极地处理这个问题并且认为我会分享我发现的东西。
以下内容来自Microsoft documentation:
Get-AzureRmAlertHistory
cmdlet会在启用,禁用,解雇,已解决等情况下获取警报的历史记录。
虽然搞乱了这个命令,我发现如果你不给它任何参数,它只会返回当天的历史记录;但是,当您使用-StartTime
和-EndTime
参数时,您可以从过去获取警报的详细信息。
虽然这并没有在单个命令中为您提供警报的当前状态,但可以将一些逻辑放在一起,以便在给定时间范围内获取最新警报并检查其中的状态。
出于我的目的,此代码会检查从警报webhook调用的Runbook中的兄弟警报的状态。所以我可以根据webhook中提供的数据收集时间范围。我知道这对所有情况都不是一个完美的解决方案,但至少它可以作为一个起点。
注意:我使用的AzureRM.Insights模块版本3.2.1的行为可能会有所不同,具体取决于您正在使用的此模块的版本。
当我继续处理代码时,我发现使用-ResourceId
参数进行过滤存在一些问题。当您为要查找历史记录的警报提供ResourceId时,它将不会返回任何结果。据我所知,当使用仅Get-AzureRmAlertHistory
参数的-ResourceId
cmdlet时,在返回警报对象时,不会填充ResourceId。我确实设法找到了两种让它工作的方法。
在-DetailedOutput
参数之前传递-ResourceId
参数。事实证明,ResourceId填充在DetailedOutput中并且可以在那里匹配;但是,如果首先传递-ResourceId
,则cmdlet的作用就像在返回详细输出之前首先计算该值一样。
Get-AzureRmAlertHistory -StartTime 2018-01-16 -EndTime 2018-01-17 -DetailedOutput -ResourceId $AlertResourceID
属性 CorrelationId 包含ResourceId。使用Where-Object
语法,您可以使用Regex匹配ResourceId。
Get-AzureRmAlertHistory -StartTime 2018-01-16 -EndTime 2018-01-17 | Where-Object {$_.CorrelationId -Match "$AlertResourceID/incidents/.*"}
现在您已拥有所需的记录,您可以在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];