whistle.statistics
Version:
statistics for whistle.nohost
83 lines (77 loc) • 2.81 kB
JavaScript
const {loadCollection, db} = require('./db');
var pvCache = {}; //按照分钟换成数据
const noop = () => {
};
const getHeader = (req, name) => {
const value = req.headers[name];
return value ? decodeURIComponent(value) : '';
};
var pvCollection = null;
/**
* 格式化时间
* @param time
* @param fmt
* @returns {*}
*/
const formatTime = (time, fmt) => {
var timeObj = new Date(time);
var o = {
"M+": timeObj.getMonth() + 1, //月份
"d+": timeObj.getDate(), //日
"h+": timeObj.getHours(), //小时
"m+": timeObj.getMinutes(), //分
"s+": timeObj.getSeconds(), //秒
"q+": Math.floor((timeObj.getMonth() + 3) / 3), //季度
"S": timeObj.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (timeObj.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
};
/**
* 保存到db
* @param data
*/
const savePvData = async (data) => {
console.log("saveToDB start:", new Date().getTime());
let account = data['account'];
let interval = 5 * 60 * 1000 ; //上报间隔,5分钟聚合上报
let m = Math.floor(new Date().getTime() / interval) * interval ;
console.log("m:" ,m);
if (!pvCache[m]) {
pvCollection = pvCollection || await loadCollection('pv', db);
for (let t in pvCache) {
let tData = pvCache[t];
for (let account in tData) {
let result = pvCollection.insert({
account: account,
value: tData[account],
time: parseInt(t),
});
console.log("saveToDB result :", result);
}
}
db.saveDatabase();
console.log("saveToDB end:", new Date().getTime());
//保存完之后清空缓存数据
pvCache = {};
pvCache[m] = {};
}
pvCache[m][account] = pvCache[m][account] ? pvCache[m][account] + 1 : 1;
console.log("saveToCache end:", new Date().getTime());
};
const sort = (property , orderBy) => {
return function (obj1, obj2) {
var value1 = obj1[property];
var value2 = obj2[property];
return orderBy == "DESC" ? value2 - value1 : value1 - value2; // 升序
}
}
exports.noop = noop;
exports.formatTime = formatTime;
exports.getXWhistleResponseFor = req => getHeader(req, "x-whistle-response-for");
exports.savePvData = data => savePvData(data);
exports.sort = (property , orderBy) => sort(property , orderBy) ;