系统简介

分布式异常报警系统就是收集系统运行过程中产生的未处理异常,检查系统运行的状态,并将异常信息统一发送到服务端,由服务端将信息通知到相关的责任人。 

问题

我们在项目开发中可能遇到以下几个问题:

1. 项目在运行的过程中, 会因为意外情况产生异常, 对于一些异常, 我们会通过try..catch来捕获,并记录到日志。 但是对于某些异常,我们在编码的时候并没有预料到,也没有try..catch捕获,结果异常被抛到了最外层, 因为这些异常我们并没有捕获到, 所以也没有办法去记录, 导致系统一些不稳定的情况存在。
2. 对于异常, 会随其他的一些日志信息一起记录到本地文件中, 如果要查看, 就需要登录到服务器上去查看,如果线上服务器有权限管理, 要登录上去还是一件麻烦的事情。 另外日志也仅仅是被记录, 并没有及时通知到相关责任人。 
3. 对于正在运行的系统,我们也会对其进行监控, 我们一般会采用zabbix之类的软件监控CPU, 硬盘, 网络, 内存等信息, 除了这些信息, 我们可能还关心我们的软件系统是否正常运行, 因为有可能在CPU, 硬盘, 网络, 内存等一些正常,软件系统却不能工作了,比如我们的软件系统依赖A服务, A服务宕机了, 我们的软件系统所在的服务器看上去一切正常, 但是此时软件系统已经不能算是正常状态了。 

解决

对于以上的三种情况, 都已经有了对应的解决方案,
对于第一种情况: 可以在Application_Error中捕获异常, 也可以注册一个module,在module中捕获,或者在编码层面上考虑的尽可能全面。 来杜绝这种全局异常。 
对于第二种情况, 会有专业的分布式日志系统来帮助我们收集日志, 集中分析处理。 并通知到责任人。 
对于第三种情况: 除了系统级的监控,对于某些业务, 我们会在代码中通过"埋点"的方式来进行更细粒度监控来发现问题。 另外现在的服务都是集群部署, 负载均衡软件可以检查到异常服务器, 并将异常服务器从集群中剔除。 

项目由来

对于以上的解决方案, 有些显得“非常专业”, 对于一些普通的项目, 还没有必要“杀鸡用牛刀”,基于这种情况, 我决定开发一套自己的异常报警系统,主要功能如下:
1. 记录项目中那些没有被捕获的全局异常, 
2. 将记录到的全局异常, 通过网络发送到服务端, 对于那些已经在项目中使用Application_Error捕获全局异常或者在流程中通过try..catch捕获的异常的情况, 依然可以使用此项目, 项目会提供API接口, 可以通过API将异常发送到服务端, 
3. 除了记录异常,我们也会主动地去监控站点健康情况, 方式就是通过模拟web请求去访问指定的页面, 如果返回http的status是200,或者返回内容为ok 那就表示这个站点是正常的, 这个页面可以是普通的首页,  当然如果有条件, 建议开发一个特定的页面, 在这个页面内, 对这个系统所以来的环境进行检查。 (比如, 这个系统依赖数据库和A服务, 那在这个页面中就去尝试访问以下数据库和A服务,如果一切正常, 那就返回ok)
4. 对于发送到服务端的异常信息, 通过邮件, 短信的方式通知到相关的负责人。
5. 异常会记录到持久化的数据库, 方便后台查看和统计。

开发简介

开发语言为C#。
开发工具包括Visual studio 2013, sql server 2008R2 , Redis。
适用于.net Web项目, 对于其他winform或则Java项目, 提供了基于http的接口, 数据格式为json, 可以通过此接口上传异常信息。 

项目架构

项目架构图如下:
 
 
1. 客户端通过module捕获全局异常, 并且包装了http接口,将异常信息发送到服务端
2. 服务端采用http协议, 接收客户端传递的异常,并发送异常到Redis
3. HandleService从redis中读取异常信息并进行处理, 主要包括入库, 查找相关负责人,通知到相关责任人。
4. HealthyCheckService读取站点信息, 并对站点进行访问, 检查状态,并将异常信息上传到服务端。 
5. Admin后台管理, 主要是查看异常信息, 管理站点及网站负责人信息。 

后记

最后, 对项目做一些额外的说明:
1. 项目的想法来源于elmah,它主要功能是记录网站异常信息,并提供邮件通知功能, 但是他只能记录单个网站, 没有办法做多个网站的日志汇总。  如果你网站规模不大,或者想有针对性的监控, 使用它做异常监控绝对是一个不错的选择, 此项目开源, 可以扩展。
2. 对于一个服务端项目来说, 异常并不是经常发生的, 但是发生后,需要立刻知道, 所以我并没有在本地做local queue, 也没有批量上传,而是选择立刻上传。 
3. 在项目开发过程中, 博客园小胡子哥的http://www.cnblogs.com/hustskyking/p/fe-monitor.html 这篇博客介绍了前端的异常日志收集,非常精彩, 异常收集的方式和这个项目类似,可以结合小胡子哥的做法扩展为可收集前端异常。
4. 日志的报警信息通过短信和邮件发送, 因为短信是需要连接短信网关的, 所以在这个项目中并没有实现, 但是有一个细节问题:在做短信通知的时候, 要做一个缓存。比如站点因为某些原因, 一下子产生了100个相同异常, 我们短信通知一次就可以了。 
5. 异常信息比较敏感, 对于专业人士, 可以根据异常信息来猜测你系统的漏洞, 所以异常信息要保存在相对安全的地方。 

.Net分布式异常报警系统-简介的更多相关文章

  1. .Net分布式异常报警系统-服务端站点管理

    管理站点 对于管理站点, 并没有太复杂的内容, 主要就是对数据库表中的数据进行维护.  管理的实体有3个 WebSite(站点信息), WebService(站点服务器信息), ErrorEntity ...

  2. .Net分布式异常报警系统-服务端Service

    服务端的2个Service 1. HandleService: 从Redis中获取异常信息, 入库并发送通知到相关责任人.  2. HealthyCheckService: 对站点指定页面进行模拟访问 ...

  3. .Net分布式异常报警系统-客户端及服务端API

    客户端 客户端的作用就是捕获未处理异常, 发送异常到服务端. 关于捕获未处理异常的方法参考 http://www.cnblogs.com/youring2/archive/2012/04/25/246 ...

  4. .Net分布式异常报警系统-项目介绍

    后台管理  首页统计的是当天每个时段的异常数量, 使用的是echarts组件, 红框所示, 可以选择不同的系统进行查看.     得益于echarts的强大功能, 你可以使用柱状图来查看.     站 ...

  5. asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  6. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  7. Net Core免费开源分布式异常日志收集框架Exceptionless

    asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 https://www.cnblogs.com/yilezhu/p/9193723.htm ...

  8. 【转】asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  9. Dubbo 分布式服务框架简介

    1.分布式服务框架 1.1 Dubbo 简介 Dubbo 是一个分布式服务框架,以及阿里巴巴内部的 SOA 服务化治理方案的核心框架.其功能主要包括:高性能 NIO 通讯及多协议集成,服务动态寻址与路 ...

随机推荐

  1. Rac grid用户启停监听报错无权限

    [grid@max1 ~]$ lsnrctl stop LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-NOV-2016 00:20: ...

  2. .NET/ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

  3. MongoDB学习笔记——Master/Slave主从复制

    Master/Slave主从复制 主从复制MongoDB中比较常用的一种方式,如果要实现主从复制至少应该有两个MongoDB实例,一个作为主节点负责客户端请求,另一个作为从节点负责从主节点映射数据,提 ...

  4. 将表里的数据批量生成INSERT语句的存储过程 继续增强版

    文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...

  5. Windows7 系统 CMD命令行,点阵字体不能改变大小以及中文乱码的问题

    之前装了oracle 11g后,发现开机速度竟然奇葩的达到了3分钟.经过旁边大神指点,说是因为oracle某个(具体不清楚)服务,在断网的时候会不断的ping网络,导致速度变慢.然后就关服务呗,然后一 ...

  6. Stanford机器学习笔记-9. 聚类(Clustering)

    9. Clustering Content 9. Clustering 9.1 Supervised Learning and Unsupervised Learning 9.2 K-means al ...

  7. HOLOLENS的空间管理

    http://blog.csdn.net/sun_t89/article/details/52460272

  8. 嵌入式Linux驱动学习之路(八)创建最小的根文件系统

    busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...

  9. 转: rapidJSON与jsoncpp语法说明

    转:  http://www.voidcn.com/blog/hudejun007/article/p-1811986.html

  10. Noip2000 T3 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...