系统简介

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

问题

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

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. 烂泥:学习ubuntu远程桌面(一):配置远程桌面

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器目前安装的都是ubuntu 14.04系统,而且由于业务需要,需要使用到ubuntu的远程桌面功能.所以本篇文章都是围绕ubuntu的远程桌面来 ...

  2. ln

    文件描述符是相对进程而言的,一个文件可以有多个文件描述符,但只有一个inode,inode一样就是同一个文件,文件名不同也是同一个 硬链接 两个文件是指向同一个存储区,inode号一样,并没有开辟新的 ...

  3. JavaScript目录菜单滚动反显组件的实现

    JavaScript目录菜单滚动反显组件,有以下两个特点 每个导航菜单项(nav)对应页面一个内容区域(content) 滚动页面到特定内容区域(content)时,对应的菜单会自动切换,一般会添加一 ...

  4. C语言中链表怎么删除结点?

    第一个方法: /*根据姓名删除链表的中的学生记录*/ void deleteByName(struct STUDENT * head) { struct STUDENT *p,*q; ]; if(he ...

  5. MMORPG大型游戏设计与开发(规范)

    一件事如果没有规范.章法,那么做这件事起来往往会遇到许多难题,特别是在多人协作的时候,没有到规范通常让每个人多多少少都面临着头疼的困难.举个例子,多个人要做一桌美味的饺子,有买材料.做面皮.弄肉(菜) ...

  6. NOIP2006能量项链[环形DP]

    题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...

  7. java 解决中文乱码

    //1.代码解决 public class LuanMa { public static String getNewString(String luanma){ String result = &qu ...

  8. AC日记——将字符串中的小写字母换成大写字母 openjudge 1.7 13

    13:将字符串中的小写字母转换成大写字母 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个字符串,将其中所有的小写字母转换成大写字母. 输入 输入一行,包含一个字符串(长度不 ...

  9. 搞netty

    开始搞netty了 查了下资料 在使用NIO 的时候,最好不要配置 SO_LINGER,假设设置了该參数,在 close的时候如缓冲区有数据待写出,会抛出 IOException. // 在netty ...

  10. java 26 - 7 网络编程之 TCP协议代码优化

    上次所写的代码中,客户端和服务器端所进行的数据传输所用的是字节流. 优化: A:这次,为了高效,对这个字节流通过转换流来进行包装,包装成高效字符流. B:这次,传输的数据是通过键盘录入的数据. 服务器 ...