.Net分布式异常报警系统-服务端站点管理
对于管理站点, 并没有太复杂的内容, 主要就是对数据库表中的数据进行维护。
管理的实体有3个 WebSite(站点信息), WebService(站点服务器信息), ErrorEntity(异常信息), 其中WebSite和WebService是一对多的关系。 WebSite和ErrorEntity也是一对多的关系。关于实体的维护就不说了, 这里主要说一下报表的开发。
在打开后台站点的时候, 我们首先看到的是一张报表,这里采用的组件是百度的echarts, 报表统计的是当天每个时段的异常数量。
![](https://images0.cnblogs.com/blog2015/365270/201508/241745480778905.png)
这里就是如何把数据库中异常信息按照小时统计出来, 见如下sql
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
select count(ErrorEntity.id) Cnt,datepart(hh,DateTime) Hour from ErrorEntity inner join WebSite on WebSite.WebToken = ErrorEntity.WebToken where WebSite.WebName='{2}' and DateTime between '{0}' and '{1}' group by datepart(hh,DateTime)
DateTime字段是一个标准的时间格式, datepart函数可以取出小时, 再通过group by 就可以按照小时来统计, 当然取出来的都是有数据的时段, 对于没有数据的时段,我们要将对应到数据置为0。从高性能的角度来讲,这并不是一个好的解决方案, 在数据量巨大时, 查询会慢, 我们可以将统计前置, 在HandleService中, 我们就可以进行统计, 当从Redis中获取一个异常信息时, 按照时间,把他累加到一个数组中, 然后定时同步到数据库中。 或者后台异步统计, 每10分钟生成一次数据, 并插入到临时表,查询从临时表查。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var count = new int[24]; string siteName = context.Request.QueryString["WebName"] ?? ""; if (siteName != "") { IEnumerable<ReportDto> reportDtos = _reportBusiness.GetList(string.Format(sql, DateTime.Now.ToString("yyyy-MM-dd 00:00:00"), DateTime.Now.ToString("yyyy-MM-dd 23:59:59"), siteName)); foreach (ReportDto reportDto in reportDtos) { count[reportDto.Hour] = reportDto.Cnt; } } context.Response.Write( string.Join(",", count));