iamhuzl

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  1 随笔 :: 13 文章 :: 21 评论 :: 0 Trackbacks

   最近一段时间由于服务器响应有些异常,所以花了半天做了一个简单实时监控页面。如下图



基本原理如下:
1、使用Filter拦截请求,采集服务器响应数据。
若是要收集响应状态码注意构造新的HttpServletResponse 
 2 
 3 import javax.servlet.http.HttpServletResponseWrapper
 4 import javax.servlet.http.HttpServletResponse
 5 
 6 /**
 7  * 功能描述
 8  * @author huzl
 9  * @version 0.0.1, 12-7-30 下午3:11
10  */
11 class StatusExposingServletResponse extends HttpServletResponseWrapper {
12     private Integer status = SC_OK;;
13 
14     public Integer getStatus() {
15         return status
16     }
17 
18     def StatusExposingServletResponse(HttpServletResponse response) {
19         super(response);
20     }
21 
22     @Override
23     void sendError(int sc, String msg) {
24         super.sendError(sc, msg)
25         status = sc;
26     }
27 
28     @Override
29     void sendError(int sc) {
30         super.sendError(sc)
31         status = sc;
32     }
33 
34     @Override
35     void sendRedirect(String location) {
36         super.sendRedirect(location)
37         status = SC_MOVED_TEMPORARILY;
38     }
39 
40     @Override
41     void setStatus(int sc) {
42         super.setStatus(sc)
43         status = sc;
44     }
45 
46     @Override
47     void setStatus(int sc, String sm) {
48         super.setStatus(sc, sm)
49         status = sc;
50     }
51 
52 }
53 
54 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){
55         long startTime = System.currentTimeMillis();
56         StatusExposingServletResponse response = new StatusExposingServletResponse(servletResponse);
57         Throwable exception = null;
58         try {
59             filterChain.doFilter(servletRequest,response)
60         } catch (Throwable e) {
61             exception = e;
62             throw e;
63         }finally{
64             statisticResult.completeRequest(servletRequest,response,exception,startTime);
65         }
66     }
若只统计错误状态码则区分Response Code是否大于400,小于400的都是正确响应
如200(OK),206(断点续传),301(永久重定向),302(临时重定向),304(内容未变),大于等于400的状态都是错误响应,计算响应速度区间和平均响应时间的代码我就不贴了
2、定时程序或线程把数据入库或保存到内存中。
尽量不要使用java内嵌数据库如hsqldb,H2等,因为这些内存数据库运行时会把所有数据加到内存中,不太适合保存数据采集结果
3、使用Highcharts绘制监控页面
可以参照官网例子http://www.highcharts.com/demo/dynamic-update
  1 var charts = new Array();
  2         var serverCount = 6;
  3         var lastTimes = new Array();
  4         var max = ${params.int("max")?:120};
  5         $(document).ready(function() {
  6             Highcharts.setOptions({
  7                 global: {
  8                     useUTC: false
  9                 }
 10             });
 11 
 12 
 13             for (var i = 0; i < serverCount; i++) {
 14                 charts[i] = new Highcharts.Chart({
 15                     chart: {
 16                         renderTo: 'container' + i,
 17                         type: 'spline',
 18                         events: {
 19                             load: function() {
 20 
 21                                 // set up the updating of the chart each second
 22                                 var series = this.series;
 23                                 var serverIndex = i;
 24                                 lastTimes[serverIndex] = 0;
 25                                 var loadData = function() {
 26                                                                         $.getJSON("http://${request.serverName}:${request.serverPort}${request.contextPath}/toolkits/queryStatistics.gsp", {"lasTime":lastTimes[serverIndex],"proxy":true,"index":serverIndex,"max":max}, function(data) {
 27                                         for (var k = 0; k < series.length; k++) {
 28                                             for (var j = 0; j < data[k].length; j++) {
 29                                                 var point = data[k][j];
 30                                                 var isShift = series[k].data.length >= max;
 31                                                 console.log("series " + k + ".data.length=" + series[k].data.length);
 32                                                 var lastTime = 0;
 33                                                 if (series[k].data.length > 0)
 34                                                     lastTime = series[k].data[series[k].data.length - 1].x;
 35                                                 if (point[0] > lastTime)
 36                                                     series[k].addPoint([point[0],point[1]], true, isShift);
 37                                                 lastTimes[serverIndex] = point[0];
 38                                             }
 39                                         }
 40                                     })
 41                                 };
 42 
 43                                 loadData();
 44                                 setInterval(loadData, 60000);
 45                             }
 46                         }
 47                     },
 48                     title: {
 49                         text: '访问量实时监控'
 50                     },
 51                     xAxis: [
 52                         {
 53                             type: 'datetime',
 54                             tickPixelInterval: 120
 55                         }
 56                     ],
 57                     yAxis: [
 58                         {
 59                             title: {
 60                                 text: '总请求/分钟',
 61                                 style: {
 62                                     color: '#3E576F'
 63                                 }
 64                             }
 65                         },
 66                         {
 67                             title: {
 68                                 text: '平均响应时间',
 69                                 style: {
 70                                     color: '#00AA00'
 71                                 }
 72                             },opposite:true
 73                         }
 74                     ],
 75                     plotOptions: {
 76                         spline: {
 77                             marker:{
 78                                 enabled: false,
 79                                 states: {
 80                                     hover: {
 81                                         enabled: true,
 82                                         symbol: 'circle',
 83                                         radius: 5,
 84                                         lineWidth: 1
 85                                     }
 86                                 }
 87                             }
 88                         }
 89                     },
 90                     tooltip: {
 91                         formatter: function() {
 92                             return '<b>' + this.series.name + '</b><br/>' +
 93                                     Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
 94                                     Highcharts.numberFormat(this.y, 2);
 95                         }
 96                     },
 97                     legend: {
 98                         enabled: true
 99                     },
100                     exporting: {
101                         enabled: false
102                     },
103                     series: [
104                         {
105                             name: '总请求数',
106                             data: []
107                         },
108                         {
109                             name: '错误请求数',
110                             data: []
111                         },
112                         {
113                             name: '平均响应时间',
114                             yAxis:1,
115                             data: []
116                         }
117                     ]
118                 });
119             }
120 
121         })

需要注意的是:
1、在series的load事件中使用ajax定时加载数据,需要控制当前chart中的Point数据量,
   series.addPoint(point, true, isShift);
   当series中Point数量超过指定值,设定isShift为true,就可以移除第一个Point,防止浏览器内存占用太大无响应
2、ajax请求时只请求最新采集数据,所以每次加载采集数据后把最后时间保留下来,ajax请求时把当前chart中最后时间带上,获取最新数据
3、其他非关键代码就不附上了,因为使用grails工程而且与项目xiangg
posted on 2012-08-03 00:42 温水青蛙 阅读(21686) 评论(15)  编辑  收藏

评论

# re: 使用highcharts实现实时监控曲线图 2012-08-05 21:47 tong
你好我有个项目要用到这个插件,就是在一个图表中显示两条折线图。不需要实时更新。数据是通过json传递的,我现在不明白的是json传过来的数据怎么绑定到页面端  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2012-08-06 09:14 温水青蛙
【在series的load事件中使用ajax定时加载数据】,series即是代表曲线的对象。仔细看上面的代码,chart的events中有一个load事件接口暴露出来了,在chart加载完成后,即可以调用ajax或通过其他方式获取数据后直接调用series的addPoint方法把数据添加进去。页面自动刷新展示曲线。可以参考官网的api说明  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2012-12-11 15:31 Coo
可不可以在下面添加滚动条,这样就不用移除第一个点了  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2012-12-13 09:12 温水青蛙
不是显示问题,如果不移除前面的点,统计参数太多造成javascript绘制很慢,最后肯定浏览器内存满了  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2012-12-19 16:36 Coo
for(var i=0; i<series.length; i++) { var y = eval(res2[i]); series[i].addPoint([x, y], true, false);
}
我这样像曲线中添加新点,为什么当i=0的时候,添加不上呢(其他能添加)?x是获取的系统当前时间,y是后台获取的一个数据,是有数据的  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-01-15 11:14 viectn
你好,请问你的页面时怎么展示的?能把页面代码看下吗谢谢  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-09-06 16:05 放下
你的页面能显示出来吗?我表示怀疑!  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-09-13 10:52 fireli
你好,我想看看你输出到前台的数据格式,不知道可不可以

我现在在做多曲线的实时刷新,遇到了些问题,希望能在这里得到些帮助  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-09-22 17:22 放下
你这个木有初始化数据应该显示不出来吧!  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-10-09 11:15 夏雪冬日
mark  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-10-22 14:15 魏丹丹
@fireli@fireli
我现在也遇到了些问题,请问您解决了吗,能不能让我看看您的源代码啊,邮箱504521063@qq.com  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图[未登录] 2013-11-26 16:43 Jackson
我现在遇到了数据回调之后,如何进行不同的数据创建相对应的highcharts数据统计图。

希望能在这里得到些帮助!

谢谢  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2013-11-27 10:13 温水青蛙
那就是创建相应的highcharts对象,在series的load事件中编写相对应的数据回调方法。series的load是对应一个highcharts对象。  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2014-05-17 23:20 zuidaima
highcharts代码下载地址:http://www.zuidaima.com/share/search.htm?key=highcharts  回复  更多评论
  

# re: 使用highcharts实现实时监控曲线图 2014-09-25 14:43 zuidaima
Highcharts demo教程源代码下载:http://zuidaima.com/share/khighcharts-p1-s1.htm  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: