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 += `| ${name} | ${country} | ${total} | ${fail} | ${rate} | ${errors} |
`
}
}
html += `
`
html += "
自动修改了以下矿机的IP
"
html += "| 矿机名称 | 旧IP | 新IP | 修改状态 | 额外信息 |
"
// 记录需要重启的矿机
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 += `| ${name} | ${result.oldIP} | ${result.newIP} | ${status} | ${result.msg} |
`
}
html += `
`
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
}
}