使用 per4j 做一个接口访问频次监视系统 (B)
在使用 per4j 做一个接口访问频次监视系统 (A)篇中,已经可以通过自定的Log4jDBAppender
将 per4j
的日志写入到日志数据库中;
接下来实现接口访问频次可视化的监视,步骤如下:
- 使用
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
并保存下来待分析使用;