UNPKG

whistle.statistics

Version:
83 lines (77 loc) 2.81 kB
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) ;