如何关闭监视器生成的警报

监视器定义对象的运行状况状态。 对象可以有三种运行状况状态之一:绿色(成功或正常)、黄色(警告)或红色(严重或不正常)。 例如,磁盘驱动器容量监视器可能会将绿色定义为小于 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 时,所有孤立警报最终都会关闭,具体取决于监视器类型,如下所示:

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

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

显示运行状况状态转换的屏幕截图。

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

警报关闭体验中的更改

在 Operations Manager 2022 中,管理员可以选择关闭处于不正常状态的运行状况监视器的警报。

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

在 Operations Manager 2022 中,管理员可以通过导航到“管理”>“设置”并选择以下任一选项来更改此行为

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

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

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

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

后续步骤