zoukankan      html  css  js  c++  java
  • .Net分布式异常报警系统-服务端站点管理

    对于管理站点, 并没有太复杂的内容, 主要就是对数据库表中的数据进行维护。 
    管理的实体有3个 WebSite(站点信息), WebService(站点服务器信息), ErrorEntity(异常信息), 其中WebSite和WebService是一对多的关系。 WebSite和ErrorEntity也是一对多的关系。关于实体的维护就不说了, 这里主要说一下报表的开发。 
    在打开后台站点的时候, 我们首先看到的是一张报表,这里采用的组件是百度的echarts, 报表统计的是当天每个时段的异常数量。 
     
    这里就是如何把数据库中异常信息按照小时统计出来, 见如下sql
    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) 
    View Code
    DateTime字段是一个标准的时间格式, datepart函数可以取出小时, 再通过group by 就可以按照小时来统计, 当然取出来的都是有数据的时段, 对于没有数据的时段,我们要将对应到数据置为0。从高性能的角度来讲,这并不是一个好的解决方案, 在数据量巨大时, 查询会慢, 我们可以将统计前置, 在HandleService中, 我们就可以进行统计, 当从Redis中获取一个异常信息时, 按照时间,把他累加到一个数组中, 然后定时同步到数据库中。 或者后台异步统计, 每10分钟生成一次数据, 并插入到临时表,查询从临时表查。 
                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));  
    View Code
  • 相关阅读:
    【C++】未定义的标识符“_TCHAR*”
    【C++】编写动态库DLL
    【C++】使用SQLite步骤及示例
    【VS】如何查询该项目是什么样工程类型
    新概念英语第一册单词
    地道情景表达一
    日常学习经典口语一
    全国省市区sql脚本
    关于Object.defineProperty
    响应式原理
  • 原文地址:https://www.cnblogs.com/beyondbit/p/4755447.html
Copyright © 2011-2022 走看看