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 溫水青蛙 閱讀(21710) 評論(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  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 怀集县| 崇明县| 娱乐| 陕西省| 鹤峰县| 新竹市| 三明市| 新郑市| 庆元县| 乌恰县| 纳雍县| 孝义市| 大姚县| 泰宁县| 台江县| 林西县| 青岛市| 林周县| 峨山| 兴宁市| 银川市| 香港| 罗山县| 金昌市| 河津市| 沧州市| 柳林县| 沙河市| 鄂托克旗| 昔阳县| 秦安县| 沿河| 南皮县| 繁峙县| 通州区| 华池县| 正阳县| 甘南县| 高陵县| 明光市| 陵川县|