Share via


粒度警报的自定义 APM 规则

八月份,Michael 撰写了一篇有关使用警报的博文。该博文的其中一个关键要点是 – 对于每个应用程序和每个应用程序组件 – 我们有四项警报规则,这些规则可以从 APM 模板打开或关闭。下面是引用的原文:

警报规则

对于我们提醒的每种类型的事件都有一项规则:性能、连接性、安全性和应用程序故障。当在被监控的应用程序中检测到这些类型的事件时,我们发出单独的警报。由于单个性能事件或异常事件并不意味着应用程序不健康,因此,这些警报并不影响被监控的应用程序的健康状况。

以上博文是在测试版期间撰写,UI 在此之后已经有所改进,但这些规则仍然存在,并且按照与描述相同的方法发挥作用。 

在预发布版本中,模板 UI 中的选项如下所示:

虽然创作指南描述了选项的使用目标,但在这里,我想向大家更多地介绍一些促进“深入了解”的设置。

顶部有两个打开和关闭以下选项的复选框:

  • 提醒“性能”事件(“打开性能事件警报”)
  • 提醒“异常”事件(“打开异常事件警报”)- 当启用此复选框时,允许您配置另外三个选项(异常类型细分):
    • 安全警报
    • 连接警报
    • 应用程序故障警报

总之,这些复选框的作用是启用和禁用前面提到的警报规则。您可以在“操作控制台”的“创作”窗格中的“规则”下找到这些规则:

规则名称应完全一目了解,以便理解哪项规则与哪个选项相对应。

虽然这种机制足够灵活,适合最常见的使用情形,但我想向大家介绍一下完整的端到端工作机制,并说明该解决方案如何强大和灵活,以及如何进一步利用 APM 配置超出 UI 所允许的更多的粒度警报 - 同时只需少量的 XML 编辑。

如果注意一下这些规则(在“操作控制台”中,或者通过开启 MP 并查看其 XML),它们都非常相似:它们具有查找入站 APM 事件的“数据源”,以及将这些事件转变为警报的“写入操作”。

 

数据源具有如下所示的配置:

正如在上面的屏幕截图中可以看到的那样,相同的数据源用于所有四项规则,而“AspectType”用于区分不同的性能、连接性、安全性和应用程序故障事件

这非常适合大多数情形,而且我们选择默认设置的假设前提是操作人员会对性能、连接性和安全性事件更感兴趣 - 这些是他们能够操作的事件 - 但不一定与“应用程序故障”事件有关,因为这些事件(往往)是由于代码中存在缺陷,而且(通常)只有开发人员才能修复这些异常。

即使这一模型相当不错,但我发现,在某些情况下,人们可能希望定义更精细的警报规则。特别是,我认为我们的 APM 默认配置中已经非常充分地定义了连接性和安全性事件,而且这些事件通常无关痛痒,除非真的发生错误。对于性能事件和应用程序故障,这一点并不一定总是正确的。例如,您可能希望收到:

  1. 仅针对特定网页或方法的性能事件警报(这也可以通过定义一项事务来实现,但具体取决于选择了哪种首选方法 - 我将在以后的博文中说明这些事务)
  2. 针对所有情形的性能事件警报,但不包括“众所周知”访问缓慢而又无法修复/优化的特定页面/方法(这属于甚至无法通过一项事务而得以实现的情况)
  3. 仅针对特定类型的异常而非其他异常类型的应用程序故障事件警报
  4. 针对所有异常的应用程序故障事件警报,但不包括已知会引发未处理的异常、但不会导致不良用户体验或无法修复的特定页面
  5. 针对所有异常的应用程序故障事件警报,但不包括开发人员无法修复的特定异常类型
    • 第 5 项所指的一种特定情况是,当某人调用 ASP.NET 应用程序上不存在的页面时,导致引发“System.Web.HttpException”并显示 HTTP 404 错误(未找到页面)代码 – 这是 ASP.NET 中的一项设计:如果调用一个 .aspx 页面,ASP.NET 引擎将尝试检索该页面并引发 HTTP 错误;当爬网程序或漏洞评估工具访问站点,并搜索“众所周知”但并不存在的页面时,这会导致许多问题(实际上我们在 microsoft.com 网站的生产部署监控部分观察到这种情况)

对于所有这些情形(以及更多情形),存在一种相当简单的解决方案:通过添加表达式筛选器编写新的 APM 警报规则。我们基本上将获得类似下面的工作流程:

下面粘贴的是一项样本规则:它看起来与之前描述的“默认”APM 警报规则非常相似(而且事实上源自该规则)– 仅仅添加了高亮显示的条件检测。这一项规则代表以上列表的第 5 项示例 - 从根本上来说,它应筛选出那些“页面不存在”的 404 错误,但仍然对每个其他异常发出警报。

<Rule ID="Apm.AlertAppFailureAspectRule.Exclude404.message.Sample" Enabled="false" ConfirmDelivery="true" Target="APM!Microsoft.SystemCenter.Apm.ApplicationInstance" Remotable="false"> <Category>Alert</Category> <DataSources> <DataSource ID="LOBProvider" TypeID="APM!Microsoft.SystemCenter.Apm.LobDataProvider"> <Name>$Target/Property[Type="APM!Microsoft.SystemCenter.Apm.ApplicationInstanceBase"]/ApplicationName$</Name> <AspectType>applicationfailure</AspectType> </DataSource> </DataSources> <ConditionDetection ID="FilterExceptionClass" TypeID="System!System.ExpressionFilter"> <Expression> <Not> <Expression> <And> <Expression> <SimpleExpression> <ValueExpression> <XPathQuery Type="String">EventData/exceptionclass</XPathQuery> </ValueExpression> <Operator>Equal</Operator> <ValueExpression> <Value Type="String">System.Web.HttpException</Value> </ValueExpression> </SimpleExpression> </Expression> <Expression> <RegExExpression> <ValueExpression> <XPathQuery Type="String">EventData/message</XPathQuery> </ValueExpression> <Operator>ContainsSubstring</Operator> <Pattern>does not exist</Pattern> </RegExExpression> </Expression> </And> </Expression> </Not> </Expression> </ConditionDetection> <WriteActions> <WriteAction ID="AlertWriteAction" TypeID="Health!System.Health.GenerateAlert"> <Priority>1</Priority> <Severity>1</Severity> <AlertMessageId>$MPElement[Name='Apm.AlertAppFailureAspectRule.Exclude404.message.Sample.AlertMessage']$</AlertMessageId> <AlertParameters> <AlertParameter1>$Target/Property[Type="APM!Microsoft.SystemCenter.Apm.ApplicationInstanceBase"]/ApplicationName$</AlertParameter1> <AlertParameter2>$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</AlertParameter2> <AlertParameter3>$Data/EventData/exceptionclass$</AlertParameter3> <AlertParameter4>$Data/EventData/message$</AlertParameter4> <AlertParameter5>$Data/EventData/name$</AlertParameter5> <AlertParameter6>$Data/EventData/ViewDetail$</AlertParameter6> </AlertParameters> <Suppression> <SuppressionValue>$Data/EventData/eventConsolidationHash$</SuppressionValue> </Suppression> <Custom1>ApplicationFailure</Custom1> </WriteAction> </WriteActions> </Rule>

这项规则仍然对“外观”与内置规则非常相似的其他异常生成警报,但不会引发针对 HTTP 404 的“文件不存在”错误的警报。应注意的是,上面的示例对 .NET Framework/Windows 本地化版本不起作用,因为我搜索的是错误消息中的英文字符串 (“does not exist”)。这并不真的意味着生产质量 MP 考虑了所有情形,它只是作为您如何能够通过添加筛选条件构建自己的工作流程的简单示例,而且我的目标主要是帮助大家了解如何将 APM 组件在 Operations Manager 2012 中拼接在一起,从而凭借这方面的经验知识,可以变得具有创造性并令其适合您的需要。

总之,还有另外一种方法是挖掘实际的 HTTP 错误代码,该代码同样隐藏在 DataItem 中。为此,我们可以重新编写表达式筛选器,如下所示:

<ConditionDetection ID="FilterExceptionClass" TypeID="System!System.ExpressionFilter"> <Expression> <Not> <Expression> <And> <Expression> <SimpleExpression> <ValueExpression> <XPathQuery Type="String">EventData/exceptionclass</XPathQuery> </ValueExpression> <Operator>Equal</Operator> <ValueExpression> <Value Type="String">System.Web.HttpException</Value> </ValueExpression> </SimpleExpression> </Expression> <Expression> <SimpleExpression> <ValueExpression> <XPathQuery Type="String">EventData/log/events/event[1]/variable[1]/variables/variable[name='_httpCode']/value</XPathQuery> </ValueExpression> <Operator>Equal</Operator> <ValueExpression> <Value Type="String">404</Value> </ValueExpression> </SimpleExpression> </Expression> </And> </Expression> </Not> </Expression> </ConditionDetection>

由于博客布局的原因,上面的代码不便阅读(但应可以完整地复制/粘贴),因此我在本文的末尾附上了一个包含此规则的两种变体的管理包。它还包含另外两个(非常相似的)示例,共计三项规则针对“应用程序故障”事件,一项规则针对“性能”事件。默认情况下禁用所有规则,以防止在导入 MP 时,您的环境中出现重复警报 - 如果使用这些规则,可能需要首先禁用模板中针对“内置”规则的复选框。然后,您可以决定默认情况下打开这些新规则,或者选择性地覆盖这些规则,如同您对任何其他规则执行的操作那样。

另外请注意,条件检测筛选器中包含的一些条件无法从操作控制台进行编辑,而且通过 GUI 编辑的标记替换警报消息也很可能中断。这些内容最好是在 XML 中进行编辑。

此外,这些条件可能需要作为调试的一部分而经常调整 - 已知问题可能值得重新考虑,新问题可能会出现,而您需要开始筛选等等。

这些规则及其筛选器仅影响警报;数据库中仍然收集所有 APM 事件,而且可以通过 AppDiagnostics 控制台看到这些事件 - 因此实际的事件插入由不同的规则驱动(使用相同的数据源模块和不同的写入操作)。

AppDiagnostics 中存储事件并且可以看到这些事件之后,我们还提供各种方法以便从数据库中自动删除这些事件,或者将那些不认为有用或有趣,或可能增加问题的事件标记为“有意设计”(by design)。这是 AppDiagnostics(规则管理向导)中的一项问题管理功能 – 虽然它不能防止存储这些事件,或者第一时间引发警报 - 但有助于保持数据库“干净”,我喜欢将其视为一种“智能”整理。对于问题管理功能,要说的还有很多 - 在以后的博文中,我会尽量再次讲述这一功能及其规则。

 

.Net 监控,其乐无穷!

 

免责声明

本文按“原样”提供,不包含任何保证,而且不授予任何权利。使用文中包含的实用程序受 https://www.microsoft.com/info/copyright.htm 中指定的条款约束。