`
bloodwolf_china
  • 浏览: 131312 次
社区版块
存档分类
最新评论

使用highcharts实现实时监控曲线图

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




基本原理如下:

1、使用Filter拦截请求,采集服务器响应数据。
若是要收集响应状态码注意构造新的HttpServletResponse

package com.cmgame.ecms.statistic

import javax.servlet.http.HttpServletResponseWrapper
import javax.servlet.http.HttpServletResponse

/**
 * 功能描述
 * @author huzl
 * @version 0.0.1, 12-7-30 下午3:11
 */
class StatusExposingServletResponse extends HttpServletResponseWrapper {
    private Integer status = SC_OK;;

    public Integer getStatus() {
        return status
    }

    def StatusExposingServletResponse(HttpServletResponse response) {
        super(response);
    }

    @Override
    void sendError(int sc, String msg) {
        super.sendError(sc, msg)
        status = sc;
    }

    @Override
    void sendError(int sc) {
        super.sendError(sc)
        status = sc;
    }

    @Override
    void sendRedirect(String location) {
        super.sendRedirect(location)
        status = SC_MOVED_TEMPORARILY;
    }

    @Override
    void setStatus(int sc) {
        super.setStatus(sc)
        status = sc;
    }

    @Override
    void setStatus(int sc, String sm) {
        super.setStatus(sc, sm)
        status = sc;
    }

}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){
        long startTime = System.currentTimeMillis();
        StatusExposingServletResponse response = new StatusExposingServletResponse(servletResponse);
        Throwable exception = null;
        try {
            filterChain.doFilter(servletRequest,response)
        } catch (Throwable e) {
            exception = e;
            throw e;
        }finally{
            statisticResult.completeRequest(servletRequest,response,exception,startTime);
        }
    }

若只统计错误状态码则区分Response Code是否大于400,小于400的都是正确响应

如200(OK),206(断点续传),301(永久重定向),302(临时重定向),304(内容未变),大于等于400的状态都是错误响应,计算响应速度区间和平均响应时间的代码我就不贴了

2、定时程序或线程把数据入库或保存到内存中。尽量不要使用java内嵌数据库如hsqldb,H2等,因为这些内存数据库运行时会把所有数据加到内存中,不太适合保存数据采集结果

3、使用Highcharts绘制监控页面
可以参照官网例子http://www.highcharts.com/demo/dynamic-update
var charts = new Array();
        var serverCount = 6;
        var lastTimes = new Array();
        var max = ${params.int("max")?:120};
        $(document).ready(function() {
            Highcharts.setOptions({
                global: {
                    useUTC: false
                }
            });


            for (var i = 0; i < serverCount; i++) {
                charts[i] = new Highcharts.Chart({
                    chart: {
                        renderTo: 'container' + i,
                        type: 'spline',
                        events: {
                            load: function() {

                                // set up the updating of the chart each second
                                var series = this.series;
                                var serverIndex = i;
                                lastTimes[serverIndex] = 0;
                                var loadData = function() {
                                                                        $.getJSON("http://${request.serverName}:${request.serverPort}${request.contextPath}/toolkits/queryStatistics.gsp", {"lasTime":lastTimes[serverIndex],"proxy":true,"index":serverIndex,"max":max}, function(data) {
                                        for (var k = 0; k < series.length; k++) {
                                            for (var j = 0; j < data[k].length; j++) {
                                                var point = data[k][j];
                                                var isShift = series[k].data.length >= max;
                                                console.log("series " + k + ".data.length=" + series[k].data.length);
                                                var lastTime = 0;
                                                if (series[k].data.length > 0)
                                                    lastTime = series[k].data[series[k].data.length - 1].x;
                                                if (point[0] > lastTime)
                                                    series[k].addPoint([point[0],point[1]], true, isShift);
                                                lastTimes[serverIndex] = point[0];
                                            }
                                        }
                                    })
                                };

                                loadData();
                                setInterval(loadData, 60000);
                            }
                        }
                    },
                    title: {
                        text: '访问量实时监控'
                    },
                    xAxis: [
                        {
                            type: 'datetime',
                            tickPixelInterval: 120
                        }
                    ],
                    yAxis: [
                        {
                            title: {
                                text: '总请求/分钟',
                                style: {
                                    color: '#3E576F'
                                }
                            }
                        },
                        {
                            title: {
                                text: '平均响应时间',
                                style: {
                                    color: '#00AA00'
                                }
                            },opposite:true
                        }
                    ],
                    plotOptions: {
                        spline: {
                            marker:{
                                enabled: false,
                                states: {
                                    hover: {
                                        enabled: true,
                                        symbol: 'circle',
                                        radius: 5,
                                        lineWidth: 1
                                    }
                                }
                            }
                        }
                    },
                    tooltip: {
                        formatter: function() {
                            return '<b>' + this.series.name + '</b><br/>' +
                                    Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
                                    Highcharts.numberFormat(this.y, 2);
                        }
                    },
                    legend: {
                        enabled: true
                    },
                    exporting: {
                        enabled: false
                    },
                    series: [
                        {
                            name: '总请求数',
                            data: []
                        },
                        {
                            name: '错误请求数',
                            data: []
                        },
                        {
                            name: '平均响应时间',
                            yAxis:1,
                            data: []
                        }
                    ]
                });
            }

        })

需要注意的是:
1、在series的load事件中使用ajax定时加载数据,需要控制当前chart中的Point数据量,
   series.addPoint(point, true, isShift);
   当series中Point数量超过指定值,设定isShift为true,就可以移除第一个Point,防止浏览器内存占用太大无响应
2、ajax请求时只请求最新采集数据,所以每次加载采集数据后把最后时间保留下来,ajax请求时把当前chart中最后时间带上,获取最新数据

如果每秒采集一下数据并保存到数据库,可以扩充一下功能实现BI的数据挖掘和各维度的钻取该也不能。但由于是浏览器使用svg技术绘制曲线,采集的点太多时初次显示还是比较慢。
  • 大小: 71.1 KB
  • 大小: 102.8 KB
分享到:
评论

相关推荐

    highcharts加载多条曲线数据

    Highcharts是一款强大的JavaScript图表库,用于在Web页面上创建各种互动图表,如折线图、柱状图、饼图等。...同时,通过动态加载数据,可以实现图表数据的实时更新,适用于各种数据分析和监控的场景。

    Highcharts AJAX后台JAVA JSON 曲线报表完美可运行例子 不包含官方JS 自己下载

    这种架构在实时监控、数据分析、仪表盘等场景下非常常见,因为它可以实现实时刷新的图表,用户无需手动刷新页面即可看到最新的数据变化。 总结来说,这个例子涉及到的关键知识点有: 1. Highcharts:JavaScript...

    highcharts曲线图

    要实现"实时显示highcharts曲线图,读取本地txt文件",首先需要对Highcharts的基本概念和API有深入理解。Highcharts的核心是配置对象,通过设置这个对象的各种属性,我们可以定制图表的样式、数据、交互行为等。例如...

    highcharts实现从mysql数据库获取数据生成折线图

    本篇将详细介绍如何利用Highcharts结合MySQL数据库,实现在Web应用中动态生成折线图。 首先,我们需要了解Highcharts的基本使用。Highcharts是一个轻量级的图表库,它提供了丰富的API和配置选项,可以自定义图表...

    Highcharts动态曲线图(使用jna监视cpu使用率)

    在这个实例中,我们将关注如何使用Highcharts创建动态曲线图,并结合Java Native Access (JNA)库来实时监控CPU的使用率。 动态曲线图是一种能够实时更新数据的图表,常用于展示随时间变化的趋势。在Highcharts中,...

    highcharts好用的前端统计js

    Highcharts还支持动态更新数据,可以通过调用`series.addPoint()`或`chart.update()`方法来实现图表数据的实时变化,这对于监控类应用非常实用。此外,Highcharts还提供了触摸事件和响应式设计的支持,确保在移动...

    几十种曲线图的项目文件

    2. 动态更新的曲线图:演示了如何实现实时数据更新,这对于监控系统或实时数据分析至关重要。 3. 时间轴缩放和滚动:利用Highstock的功能,用户可以查看不同时间段的数据细节。 4. 雷达图和极坐标图:这些特殊的曲线...

    Highcharts图表使用说明

    曲线图是直线图的一种变体,它使用平滑的曲线来连接数据点,更适合用于展示连续变化的趋势。 ##### 3.4 饼状图 饼状图用于表示各部分占总体的比例关系。Highcharts 的饼状图支持多种样式和动画效果,使得图表更具...

    用php获取数据库中的数据通过ajax传递到hightchart生成实时动态曲线图

    在IT行业中,实时数据可视化是数据分析和展示的重要环节,特别是在Web应用中。...通过结合这些技术,我们可以实现在Web应用中展示实时动态曲线图的功能,这对于监控系统状态、数据分析等场景非常有用。

    jquery曲线图,饼状图插件

    1. **动态数据更新**:这些插件允许实时更新图表,以反映后台数据的变化,这对于监控系统或者数据分析场景非常有用。 2. **多种类型**:不仅限于曲线图,许多插件还支持线性图、柱状图等多种图表类型,满足多样化的...

    动态加载曲线图

    总结,动态加载曲线图是现代数据可视化的关键技术之一,它结合了前端技术与数据处理方法,实现了实时、高效的动态数据展示。通过选择合适的JavaScript库和通信协议,我们可以轻松构建出满足各种需求的动态加载曲线图...

    Highcharts(纯JS图表插件)

    Highcharts是一款功能强大的纯JavaScript图表库,它允许开发者通过简单的JSON数据来创建各种直观、美观的图表,包括柱状图、曲线图、饼图等多种类型。这个插件无需依赖任何其他重型库,如jQuery,因此它能保持轻量级...

    asp生成曲线图

    在ASP中生成曲线图,主要是为了在网页上展示数据,这种图表通常用于数据分析、监控或者报告,使用户能够直观地理解数据的变化趋势。 生成曲线图的关键在于使用合适的图表库或组件。在ASP环境下,可以借助JavaScript...

    JS+FLASH曲线图、饼图显示

    JavaScript中的曲线图可以实时更新,非常适合动态监控数据变化。例如,使用D3.js库,我们可以定义数据数组,通过绑定数据到SVG元素上,然后使用scale函数进行数据映射,最后利用path元素和line函数生成曲线路径。 2...

    jquery图表控件,包括柱状图,曲线图,饼状图,仪表盘等

    本文将深入探讨jQuery图表控件,特别是基于jQuery实现的柱状图、曲线图、饼状图和仪表盘,这些都是数据可视化中不可或缺的元素。 柱状图是一种常用的数据表示方式,它通过矩形的长度来展示各分类的数值大小。在...

    Ping值做曲线图.rar

    总之,"Ping值做曲线图"项目是一个结合了网络诊断、数据分析和可视化技术的实用工具,对于监控网络状态、优化网络性能有着重要的价值。通过这种方式,我们可以更加直观地理解网络延迟的情况,并据此做出相应的调整和...

    Highcharts-2.1.4.zip

    Highcharts是一款强大的JavaScript图表库,用于在Web页面上创建各种数据可视化效果,如曲线区、饼状图和柱状图。版本2.1.4是该库的一个早期版本,但仍然具有很多实用功能。让我们深入了解一下Highcharts的核心特性和...

    Highcharts_强大的jQuery图表制作功能

    ### Highcharts——强大的jQuery图表制作功能 #### 一、Highcharts简介 Highcharts是一个非常流行的...通过简单的定制和配置,Highcharts可以满足不同场景下的需求,无论是数据可视化项目还是实时监控系统。

    HighchartsJS是一个基于SVG和VML渲染的JavaScript图表库

    - **教育**:在教学环境中,教师可以使用Highcharts帮助学生理解数学概念,如函数曲线、概率分布等。 4. **进阶功能** - **高亮和数据列**:可以设置特定数据点的高亮,或通过数据列突出特定时间段的数据。 - **...

    jquery实现统计图

    通过jQuery,我们可以动态地更新数据,实现动态曲线图,这对于实时监控数据变化非常有用。 在描述中提到了“双曲线”,这可能指的是在同一图表中绘制两条曲线。在Chart.js中,可以通过添加额外的数据系列来实现。每...

Global site tag (gtag.js) - Google Analytics