<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    iamhuzl

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      1 隨筆 :: 13 文章 :: 21 評論 :: 0 Trackbacks

       最近一段時間由于服務(wù)器響應(yīng)有些異常,所以花了半天做了一個簡單實時監(jiān)控頁面。如下圖



    基本原理如下:
    1、使用Filter攔截請求,采集服務(wù)器響應(yīng)數(shù)據(jù)。
    若是要收集響應(yīng)狀態(tài)碼注意構(gòu)造新的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     }
    若只統(tǒng)計錯誤狀態(tài)碼則區(qū)分Response Code是否大于400,小于400的都是正確響應(yīng)
    如200(OK),206(斷點續(xù)傳),301(永久重定向),302(臨時重定向),304(內(nèi)容未變),大于等于400的狀態(tài)都是錯誤響應(yīng),計算響應(yīng)速度區(qū)間和平均響應(yīng)時間的代碼我就不貼了
    2、定時程序或線程把數(shù)據(jù)入庫或保存到內(nèi)存中。
    盡量不要使用java內(nèi)嵌數(shù)據(jù)庫如hsqldb,H2等,因為這些內(nèi)存數(shù)據(jù)庫運(yùn)行時會把所有數(shù)據(jù)加到內(nèi)存中,不太適合保存數(shù)據(jù)采集結(jié)果
    3、使用Highcharts繪制監(jiān)控頁面
    可以參照官網(wǎng)例子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: '訪問量實時監(jiān)控'
     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: '平均響應(yīng)時間',
     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: '總請求數(shù)',
    106                             data: []
    107                         },
    108                         {
    109                             name: '錯誤請求數(shù)',
    110                             data: []
    111                         },
    112                         {
    113                             name: '平均響應(yīng)時間',
    114                             yAxis:1,
    115                             data: []
    116                         }
    117                     ]
    118                 });
    119             }
    120 
    121         })

    需要注意的是:
    1、在series的load事件中使用ajax定時加載數(shù)據(jù),需要控制當(dāng)前chart中的Point數(shù)據(jù)量,
       series.addPoint(point, true, isShift);
       當(dāng)series中Point數(shù)量超過指定值,設(shè)定isShift為true,就可以移除第一個Point,防止瀏覽器內(nèi)存占用太大無響應(yīng)
    2、ajax請求時只請求最新采集數(shù)據(jù),所以每次加載采集數(shù)據(jù)后把最后時間保留下來,ajax請求時把當(dāng)前chart中最后時間帶上,獲取最新數(shù)據(jù)
    3、其他非關(guān)鍵代碼就不附上了,因為使用grails工程而且與項目xiangg
    posted on 2012-08-03 00:42 溫水青蛙 閱讀(21707) 評論(15)  編輯  收藏

    評論

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2012-08-05 21:47 tong
    你好我有個項目要用到這個插件,就是在一個圖表中顯示兩條折線圖。不需要實時更新。數(shù)據(jù)是通過json傳遞的,我現(xiàn)在不明白的是json傳過來的數(shù)據(jù)怎么綁定到頁面端  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2012-08-06 09:14 溫水青蛙
    【在series的load事件中使用ajax定時加載數(shù)據(jù)】,series即是代表曲線的對象。仔細(xì)看上面的代碼,chart的events中有一個load事件接口暴露出來了,在chart加載完成后,即可以調(diào)用ajax或通過其他方式獲取數(shù)據(jù)后直接調(diào)用series的addPoint方法把數(shù)據(jù)添加進(jìn)去。頁面自動刷新展示曲線。可以參考官網(wǎng)的api說明  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2012-12-11 15:31 Coo
    可不可以在下面添加滾動條,這樣就不用移除第一個點了  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2012-12-13 09:12 溫水青蛙
    不是顯示問題,如果不移除前面的點,統(tǒng)計參數(shù)太多造成javascript繪制很慢,最后肯定瀏覽器內(nèi)存滿了  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 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);
    }
    我這樣像曲線中添加新點,為什么當(dāng)i=0的時候,添加不上呢(其他能添加)?x是獲取的系統(tǒng)當(dāng)前時間,y是后臺獲取的一個數(shù)據(jù),是有數(shù)據(jù)的  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-01-15 11:14 viectn
    你好,請問你的頁面時怎么展示的?能把頁面代碼看下嗎謝謝  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-09-06 16:05 放下
    你的頁面能顯示出來嗎?我表示懷疑!  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-09-13 10:52 fireli
    你好,我想看看你輸出到前臺的數(shù)據(jù)格式,不知道可不可以

    我現(xiàn)在在做多曲線的實時刷新,遇到了些問題,希望能在這里得到些幫助  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-09-22 17:22 放下
    你這個木有初始化數(shù)據(jù)應(yīng)該顯示不出來吧!  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-10-09 11:15 夏雪冬日
    mark  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-10-22 14:15 魏丹丹
    @fireli@fireli
    我現(xiàn)在也遇到了些問題,請問您解決了嗎,能不能讓我看看您的源代碼啊,郵箱504521063@qq.com  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖[未登錄] 2013-11-26 16:43 Jackson
    我現(xiàn)在遇到了數(shù)據(jù)回調(diào)之后,如何進(jìn)行不同的數(shù)據(jù)創(chuàng)建相對應(yīng)的highcharts數(shù)據(jù)統(tǒng)計圖。

    希望能在這里得到些幫助!

    謝謝  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2013-11-27 10:13 溫水青蛙
    那就是創(chuàng)建相應(yīng)的highcharts對象,在series的load事件中編寫相對應(yīng)的數(shù)據(jù)回調(diào)方法。series的load是對應(yīng)一個highcharts對象。  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2014-05-17 23:20 zuidaima
    highcharts代碼下載地址:http://www.zuidaima.com/share/search.htm?key=highcharts  回復(fù)  更多評論
      

    # re: 使用highcharts實現(xiàn)實時監(jiān)控曲線圖 2014-09-25 14:43 zuidaima
    Highcharts demo教程源代碼下載:http://zuidaima.com/share/khighcharts-p1-s1.htm  回復(fù)  更多評論
      


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 99re热免费精品视频观看| 国产婷婷高清在线观看免费| 亚洲香蕉免费有线视频| 毛片高清视频在线看免费观看| 国产午夜亚洲精品不卡| 午夜影视日本亚洲欧洲精品一区| 免费看h片的网站| 黄色免费网址大全| 亚洲一区精品中文字幕| 国产成人aaa在线视频免费观看| 国内精品99亚洲免费高清| 国产成+人+综合+亚洲专| 91麻豆精品国产自产在线观看亚洲| 亚洲美女视频免费| 又硬又粗又长又爽免费看 | 叮咚影视在线观看免费完整版| 亚洲精品动漫在线| 亚洲第一黄片大全| 国产一卡2卡3卡4卡无卡免费视频| 一级特级女人18毛片免费视频| 亚洲av永久无码精品三区在线4 | 亚洲AV无码一区二区一二区| 亚洲精品视频在线| 亚洲欧洲精品成人久久奇米网| 成人性生交大片免费看无遮挡 | 曰批全过程免费视频在线观看| 男女一边桶一边摸一边脱视频免费 | 伊人久久五月丁香综合中文亚洲 | 老司机午夜精品视频在线观看免费 | 亚洲AV无码久久| 亚洲国产精品国产自在在线| 97视频免费在线| 免费国产黄网站在线观看视频| 一级毛片免费播放试看60分钟| 亚洲熟女精品中文字幕| 亚洲国产精品成人精品小说| 亚洲av无码乱码国产精品fc2| 亚洲熟妇无码另类久久久| 免费在线观看a级毛片| 成人黄动漫画免费网站视频| 国产精品成人免费福利|