关闭监视器生成的警报

监视器定义对象的运行状况状态。 对象可以有三种运行状况状态之一:绿色(成功或正常)、黄色(警告)或红色(严重或不正常)。 例如,磁盘驱动器容量监视器可能会将绿色定义为小于 85% 的填充百分比,将黄色定义为大于 85% 的填充百分比,将红色定义为大于 90% 的填充百分比。 可以将监视器配置为在状态发生变化时生成警报。

收到警报时,可以在警报详细信息中看到警报是由规则还是监视器生成。 如果警报是由监视器生成的,最佳做法是允许监视器在运行状况恢复正常时自动解析警报。 如果在对象处于警告或不正常状态时关闭警报,则问题仍无法解决,但不会生成其他警报。

如果监视器在运行状况更改为红色时生成警报,并且确实解决了警报,则还必须重置监视器的运行状况状态。 如果未重置监视器,则生成警报的相同条件可能会再次发生,但不会生成任何警报,因为运行状况未更改。

在 2019 年之前的 Operations Manager 中,如果在对象处于警告或不正常状态时关闭警报,则问题仍无法解决,但不会生成进一步的警报。 已在 Operations Manager 2019 中修复此行为,此行为通常会导致出现以下应用场景:系统中没有活动警报,但却存在基础性问题。

使用 Operations Manager 2019 时,除非相应监视器的运行状况状态正常,否则无法关闭监视器生成的警报。 如果尝试关闭由不正常的监视器生成的警报,将显示一条错误消息,并且不会关闭警报。

可以从操作控制台和 Web 控制台检查此新行为。

操作控制台

执行以下步骤:

  1. 打开 Operations Manager 控制台并选择“监视”

    监视概述 显示监视器和当前警报的运行状况状态摘要。

  2. 在导航窗格中选择 “活动警报 ”。

  3. 右键单击警报,该警报由处于不正常状态的监视器生成。

  4. 将解析状态设置为 “已关闭”。

    出现以下消息,指出警报未关闭的原因:

    当前所选内容中的警报无法关闭,因为生成这些警报的监视器仍处于不正常状态。 有关无法关闭的警报的更多详细信息,请查看 Operations Manager Web 控制台中的“警报关闭失败”仪表板

    显示关闭的警报消息操作控制台的屏幕截图。

    注释

    若要关闭此警报,必须手动将相应监视器的运行状况重置为正常状态。 如果 此监视器的 autoresolve 设置为 true,则在重置运行状况后,警报将自动关闭。 否则,在健康状态重置后,必须手动关闭警报。

Web 控制台

  1. 打开 Web 控制台并选择“ 监视”。 监视概述 显示监视器和当前警报的运行状况状态摘要。

  2. 在导航窗格中选择 “活动警报 ”。

  3. 打开警报,该警报由处于不正常状态的监视器生成。

  4. 将解决状态设置为“已关闭”并“保存”更改。

    出现以下消息,指出警报未关闭的原因:

    当前警报无法关闭,因为已生成此警报的监视器仍然不正常

    显示已关闭警报消息 Web 控制台的屏幕截图。

    注释

    若要关闭此警报,必须手动重置生成此警报的相应监视器的运行状况。

手动重置监视器的健康状态以响应相应的警报

执行以下步骤:

  1. 在导航窗格中,选择“警报关闭失败”仪表板。 该仪表板会列出 Operations Manager 因生成警报的监视器运行不正常而无法关闭的警报。

  2. 可以通过以下两种方式重置相应警报的监视器的运行状况状态:

    • 在仪表板中选择一个警报,然后选择仪表板操作 重置警报状态。 或
    • 在此仪表板中选择一个警报,以导航到警报详细钻取页面(此处会显示警报的所有相关信息),然后在任务窗格中选择“重置运行状况任务”

    显示警报的重置监视器运行状况的屏幕截图。

警报更新 API

如果警报关闭是由外部系统(如事件管理系统)触发的,而由于相应的监视器状态不佳未能关闭警报,则异常会连同警报详细信息一起传递,这些信息可能会被其他外部系统使用。

以下现有警报更新 API 可用于外部化警报更新数据。 这两个 API 已得到增强,可以实现此新行为的外部化:

以下示例显示有关如何使用异常 AlertMonitorUnhealthyException 的详细信息。

namespace MonitorAlertClosureFailureExample
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementGroup mg = new ManagementGroup("localhost");

            // Get database availability alerts.
            MonitoringAlertCriteria alertCriteria = new MonitoringAlertCriteria(
                "Name LIKE '%DBStatusMonitor' AND Category = 'AvailabilityHealth'");
            IList<MonitoringAlert> alerts =
                mg.OperationalData.GetMonitoringAlerts(alertCriteria, default(DateTime));

            // Find the "Closed" resolution state that is defined
            // for this Management Group.
            IList<MonitoringAlertResolutionState> alertStates = mg.OperationalData.GetMonitoringAlertResolutionStates();
            MonitoringAlertResolutionState closedState = null;
            foreach (MonitoringAlertResolutionState thisState in alertStates)
            {
                if (thisState.Name == "Closed")
                {
                    closedState = thisState;
                }
            }

            // Close all alerts not already in the "Closed" resolution state.
            foreach (MonitoringAlert a in alerts)
            {
                a.ResolutionState = closedState.ResolutionState;
                string comment = "Closing the Alert";
                try
                {
                    a.Update(comment);
                }
                catch (AlertMonitorUnhealthyException e)
                {
                    // It mean the alert being closed is a monitor alert and the monitor which generated this alert is still unhealthy
                    // take an appropriate action. Here an error message is being displayed at console
                    Console.WriteLine("The alert with Alert Name" + a.Name + "cannot be closed as the monitor which genrated the alert is still unhealthy.")
                }
                catch (Exception e)
                {
                    // generic exception during the update of the alert
                    Console.WriteLine("Closing the alert with alert name" + a.Name + "is failing because" + e.Message)
                }

            }

    }
}


namespace MonitorAlertClosureFailureExample
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementGroup mg = new ManagementGroup("localhost");

            // Get database availability alerts.
            MonitoringAlertCriteria alertCriteria = new MonitoringAlertCriteria(
                "Name LIKE '%DBStatusMonitor' AND Category = 'AvailabilityHealth'");
            IList<MonitoringAlert> alerts =
                mg.OperationalData.GetMonitoringAlerts(alertCriteria, default(DateTime));

            // Find the "Closed" resolution state that is defined
            // for this Management Group.
            IList<MonitoringAlertResolutionState> alertStates = mg.OperationalData.GetMonitoringAlertResolutionStates();
            MonitoringAlertResolutionState closedState = null;
            foreach (MonitoringAlertResolutionState thisState in alertStates)
            {
                if (thisState.Name == "Closed")
                {
                    closedState = thisState;
                }
            }

            // Close all alerts not already in the "Closed" resolution state.
            string comment = "Closing the alert";
            foreach(MonitoringAlert a in alerts)
            {
                a.ResolutionState = closedState.ResolutionState;
            }

            IList<MonitoringAlertUpdateFailure> updateFailures = mg.OperationalData.UpdateMonitoringAlerts(alerts, comment);

            if (updateFailures != null && updateFailures.Count > 0)
            {
                foreach (MonitoringAlertUpdateFailure failure in updateFailures)
                {
                    if(failure.Exception is AlertMonitorUnhealthyException)
                    {
                        // It means the alert being closed is a monitor alert and the monitor which generated this alert is still unhealthy
                        // take an appropriate action. Here an error message is being displayed at console
                        Console.WriteLine("The alert with Alert Name" + a.Name + "cannot be closed as the monitor which genrated the alert is still unhealthy.")
                    }
            }           
        }

    }
}

确定警报是否已自动解决

执行以下步骤:

  1. 选择警报,然后在警报详细信息中选择警报监视器的名称。 此时将打开监视器的属性对话框。

  2. 在监视器属性中,选择“警报”选项卡以查看当监视器返回正常状态时,该选项是否自动解决警报。

关闭监视器生成的警报

执行以下步骤:

  1. 读取警报并检查其属性。 检查警报详细信息,以确定警报是由监视器还是规则生成。 使用警报的产品知识来帮助确定警报的原因。

  2. 排查警报的原因,并采取解决问题所需的操作。

  3. 解决问题后,在警报详细信息中选择“ ”。 这将打开 与警报关联的对象的状态 视图。

  4. 右键单击对象,指向“打开”,然后选择对象名称运行状况资源管理器

  5. 选择生成警报的监视器,然后选择工具栏上的“ 重置运行状况 ”。 关闭运行状况资源管理器和“状态”视图。

  6. 刷新警报视图。 如果警报仍列出,请选择警报,然后在“操作”窗格中选择“ 关闭警报 ”。

注释

以下更新(关闭孤儿警报)适用于 Operations Manager 2019 UR3 及更高版本。

关闭孤立警报

在 Operations Manager 2019 RTM、UR1 和 UR2 中,在某些应用场景中,当运行状况状态非持久时,将无法关闭活动警报,详情如下:

  1. 故障转移:

    • 管理服务器处于脱机状态时可能会触发的故障转移。
    • 由于将新的管理服务器添加到资源池,导致负载均衡。
    • 当无代理计算机发生故障转移并有其他管理服务器在监视时,将会出现新运行状况状态。
  2. 代理断开连接一段时间后重新连接,此时运行状况状态更改不会考虑之前的状态。

  3. 管理服务器先断开连接,然后又重新连接。

  4. 已清除健康服务缓存。

总体而言,健康服务不保留监控器的最后状态;将监控器重置为正常状态时,警报不会被解除。

使用 Operations Manager 2019 UR3 时,所有孤儿警报最终都会关闭,具体时间取决于监视器类型,如下所示:

  • 服务监视器:立即关闭。
  • 所有具有即时按需模块的监视器:立即关闭。
  • 所有没有按需模块的监视器:在第二次运行时关闭,具体取决于频率。
  • 基于事件的监视器:伴随初始化后发生的正常事件而关闭。

当监视器正在初始化时,运行状况状态更改会显示轻微更改;以下是示例:

显示健康状况状态转换的屏幕截图。

如上图所示,在初始化期间,监视器第一次变为正常状态。 然后,它会再次计算并恢复正常运行。 你将看到两次状态变化从 空心状态转换为健康状态。

警报关闭体验中的更改

管理员可以选择关闭运行状况监视器中处于“运行不正常”状态的警报。

在 2019 版本中,除非相应监视器的运行状况正常,否则无法关闭监视器生成的警报。 如果尝试关闭由不正常的监视器生成的警报,将显示一条错误消息,并且不会关闭警报。

管理员可以导航到“管理>设置”并选择以下任一选项来更改此行为:

  • 仅当基本监视器运行状况得到解决或手动重置时,才关闭监视器生成的警报
  • 通过重置基础监视器运行状况来关闭监视器生成的警报:此选项允许以编程方式和 UI 关闭不正常的监视器的警报。 这将重置基本监视器运行状况,从而隐式关闭其相应的警报。 此选项还允许批量关闭监视器生成的警报。

还可以通过查看“警报属性”“历史记录”来跟踪警报是如何关闭的>

显示全局管理组设置的屏幕截图。

显示警报历史记录的屏幕截图。

后续步骤