import Window from '../core/Window' import DBService from '../db/DBService' import logger from '../logger/Logger' import DateUtil from '../util/DateUtil' import MailUtil, { MailRequest } from '../util/MailUtil' import BaseEvent from '../core/BaseEvent' // 计算当前的活跃用户数与昨天同一个时刻的活跃用户数的比值 export default class HourlyActiveUserAlertEvent extends BaseEvent { async callback(window: Window) { try { let begin = window.getBegin() let todayDate = DateUtil.getDate(begin) let todayHour = DateUtil.getHour(begin) let content = window.getResult() let todayUserCount = 0 for (const key in content) { // "2019-09-02|||14|||cc.coolline.client|||1.0.4|||googleplay|||Android|||阿拉伯联合酋长国|||8a56ca46b33f4bcf": 1, let fields = key.split("|||") let pkgName = fields[2] if (pkgName == "cc.coolline.client") { todayUserCount++ } } // 前一天 let yesterday = window.getBegin() - 86400 // 知道当前是哪个小时的数据,从DB里捞回昨天同一小时的数据 let yesterdayDate = DateUtil.getDate(yesterday) let yesterdayHour = DateUtil.getHour(yesterday) let dbService = new DBService() let sql = `SELECT COUNT(distinct(userName)) AS num FROM climb.hourly_active_user WHERE pkgName = 'cc.coolline.client' AND queryTime = '${yesterdayDate}' AND hour = '${yesterdayHour}'` let { rows, err } = await dbService.query(sql, []) if (!err) { let yesterdayUserCount = rows[0]["num"] // 今天的人数小于昨天人数的50% if (todayUserCount < yesterdayUserCount * 0.5) { // 发邮件告警 let html = `
| 时间 | 活跃人数 | ` html += ` |
| ${yesterdayDate} ${yesterdayHour}时 | ${yesterdayUserCount} | |
| ${todayDate} ${todayHour}时 | ${todayUserCount} |