使用 per4j 做一个接口访问频次监视系统 (B)

使用 per4j 做一个接口访问频次监视系统 (A)篇中,已经可以通过自定的Log4jDBAppenderper4j 的日志写入到日志数据库中;

接下来实现接口访问频次可视化的监视,步骤如下:

  • 使用 nodejs 提供接口查询接口;
  • 客户端使用chartjs展示;

使用 nodejs 提供接口查询接口;

返回的数据格式为:

{
    MAX: number,
    MIN: number,
    COUNT: number,
    AVG: number
}

nodejs 的查询数据库的模块函数为:

var mysql = require('mysql');  
var pool = mysql.createPool({  
……
});
exports.showDetail = function(from, to, callback) {  
    pool.getConnection(function(error, connection) {
        var dayOfMonth = (new Date(from)).getDate();
        var sql = 'select TAG,max(duration) MAX, ' + 
                  'min(duration) MIN, count(id) COUNT,' + 
                  'sum(duration)/count(id) AVG from performance_log_' + dayOfMonth + ' ' +
                  'where start between ' + from + ' and ' + to + ' ' +
                  'group by tag';

        connection.query(sql, function(error, rows, fields) {
            if(error) { callback(error); return; }
            callback(null, rows);

            connection.release();
        });
    });
};

使用 express 暴露查询接口

var express = require('express');  
var app = express();  
……
app.get('/performance_detail', function(req, res) {  
    var requestData = req.query;
    var from = parseInt(requestData.from);
    var to = parseInt(requestData.to);

    summary.showDetail(from, to, function(error, data) {

        res.json(data);
    });
});

客户端使用chartjs展示;

客户端使用 ajax 与 node express server 通讯获取到时间段内的统计数据,并使用chartjs渲染结果;并使用 setInterval(task, interval)来实现timer 获取新数据并渲染;具体代码不再展示;

一分钟更新一次,效果如下:

在此基础上,我增加了指定的接口访问频次,和每5分钟访问频次的 TOP10 的接口分布图,效果分别如下:

在此基础上实现接口平均消耗时长、最优和最差的表现、稳定性等性能参数就不是问题了;

后续剩下的问题

  • MySQL 按日期存储的日志可以定期清除;
  • 清除之前可以统计出接口的性能表现最差(max(duration))的 topN 并保存下来待分析使用;

http://www.chartjs.org/

http://nodejs.org/

http://expressjs.jser.us/