import Window from '../core/Window' import DateUtil from '../util/DateUtil' import AWSUtil from '../util/AWSUtil' import Util from '../util/Util' import Object from '../model/Object' import request from 'request' import MailUtil, { MailRequest } from '../util/MailUtil' import BaseEvent from '../core/BaseEvent' const deviceNames: any = { "02:54:16:65:97:e6": "美国1", "02:30:34:7a:6e:26": "美国2", "02:61:7a:f9:c3:06": "美国3", "02:e3:08:bb:e6:18": "新加坡", "06:11:2c:a5:77:52": "德国", "02:c5:ad:bd:48:c2": "澳大利亚", "06:a8:a1:79:ea:70": "巴林" } // 每半小时监听国家连通率事件,修改IP,发出邮件 export default class HalfHourlyConnectRateEvent extends BaseEvent { getConnectCount(result: any, deviceId: string, country: string): any { let metrics: Object = { fail: 0, total: 0, errors: {} } for (const deviceIdx in result) { let device = deviceIdx.split("-")[0] if (device == deviceId) { let metric = result[deviceIdx][country] if (metric) { // console.log(metric) let total = metric["total"] let fail = metric["fail"] let errors = metric["errors"] metrics["fail"] += fail metrics["total"] += total let oldErrors = metrics["errors"] metrics["errors"] = this.mergeErrors(oldErrors, errors) } } } return metrics } async callback(window: Window) { let begin = window.getBegin() let date = DateUtil.getDate(begin) let hour = DateUtil.getHour(begin) let result = window.getResult() let countries = ["土库曼斯坦", "土耳其", "阿拉伯联合酋长国"] let deviceIds = [] // 先取出物理矿机的device for (const key in result) { deviceIds.push(key.split("-")[0]) } deviceIds = Array.from(new Set(deviceIds)) console.log(deviceIds) let warningDevices: Object = {} for (const deviceId of deviceIds) { for (const country of countries) { let connectCount = this.getConnectCount(result, deviceId, country) let total = connectCount["total"] let fail = connectCount["fail"] if (fail > 100 && (fail / total) >= 0.4) { if (!warningDevices[deviceId]) { warningDevices[deviceId] = {} } warningDevices[deviceId][country] = { total, fail, rate: (fail * 100 / total).toFixed(2) + "%", errors: JSON.stringify(connectCount["errors"]) } } } } console.log(warningDevices) if (Util.isEmptyObject(warningDevices)) { return } let html = "" for (const deviceId in warningDevices) { let name = deviceNames[deviceId] let country2metric = warningDevices[deviceId] for (const country in country2metric) { const metric = country2metric[country] let total = metric["total"] let fail = metric["fail"] let rate = metric["rate"] let errors = metric["errors"] html += `` } } html += `
矿机名称国家连接总次数连接错误次数连接错误率错误分布
${name}${country}${total}${fail}${rate}${errors}
` html += "
自动修改了以下矿机的IP
" html += "" // 记录需要重启的矿机 let ips = [] let awsUtil = new AWSUtil() for (const deviceId in warningDevices) { let name = deviceNames[deviceId] let result = await awsUtil.updateIP(name) let status = result.isSuccess ? "成功" : "失败" if (result.isSuccess) { ips.push(result.intranetIP) } html += `` } html += `
矿机名称旧IP新IP修改状态额外信息
${name}${result.oldIP}${result.newIP}${status}${result.msg}
` MailUtil.send(new MailRequest(`连通率告警-${date} ${hour}时`, html)) // 重启矿机容器组 this.restartMinerPods(ips) } restartMinerPods(ips: string[]) { request({ url: `http://52.74.232.107:35500/deploy/deleteMiners`, method: 'POST', json: true, body: ips }, (err, resp, data) => { if (err) { console.log(err) } else { console.log("重启矿机成功", data) } }) } mergeErrors(oldErrors: any, newErrors: any) { if (!oldErrors) { return newErrors } for (const error in newErrors) { const count = newErrors[error] if (oldErrors[error]) { oldErrors[error] += count } else { oldErrors[error] = count } } return oldErrors } }