如何阻止异常警报进入bezerk

rea*_*der 7 .net error-handling design-patterns exception-handling alerts

假设您有一个.NET系统,当出现错误时需要向系统管理员发送电子邮件通知.例:

try
{
    //do something mission critical 
}
catch(Exception ex)
{
    //send ex to the system administrator
    //give the customer a user-friendly explanation
} 
Run Code Online (Sandbox Code Playgroud)

这段代码被不同的用户每秒调用数百次.

现在让我们假设底层的API /服务/数据库出现问题.这段代码很多次都会失败.糟糕的管理员将在收件箱中唤醒几百万封电子邮件,而开发商将会接到一个粗鲁的电话,而不是今天早上必然会发生这样的事件(咳嗽).

很明显,这不是一个可以很好地扩展的设计.

想到的前几个解决方案在某些方面都存在缺陷:

  • 将错误记录到数据库,然后通过HTTP运行状况检查将高错误计数暴露给外部监视服务(如Pingdom).(到目前为止,我最喜欢的候选人.但是如果数据库出现故障怎么办?)
  • 拥有一个跟踪最近异常的静态缓存,并且警报系统始终首先检查重复项.(看起来不必要的复杂,其次很多错误信息略有不同 - 例如,如果错误中有时间戳,那就没用了.)
  • 在某些错误之后以编程方式使我们的系统脱机或基于对关键依赖关系的持续监控(危险!如果出现瞬态误报怎么办?)
  • 只是不对这些错误发出警报,并依赖系统的不同部分来监视和报告依赖关系.(不满足我们没有预料到的'意外'错误.)

这似乎是一个必须解决的问题,而且我们正以愚蠢的方式解决这个问题.建议表示赞赏,即使它们涉及完全不同的异常管理策略!

Ste*_*owe 5

我想到的最简单的解决方案是为此例外块分配一个ID号(如1),并将最后一次通知的时间记录给管理员.如果通知之间的经过时间不够大(例如,一小时),请不要再次通知管理员

如果这段代码通常会生成多种异常,您可能还想记录异常的类; 如果同一异常的通知之间的经过时间不够大,请不要再次通知管理员