141 lines
3.5 KiB
JavaScript
141 lines
3.5 KiB
JavaScript
import { Config } from "../../components/index.js"
|
||
import _ from "lodash"
|
||
import { si, initDependence } from "./utils.js"
|
||
|
||
export default new class monitor {
|
||
constructor() {
|
||
// 网络
|
||
this._network = null
|
||
// 读写速率
|
||
this._fsStats = null
|
||
// 记录60条数据一分钟记录一次
|
||
this.chartData = {
|
||
network: {
|
||
// 上行
|
||
upload: [],
|
||
// 下行
|
||
download: []
|
||
},
|
||
fsStats: {
|
||
// 读
|
||
readSpeed: [],
|
||
// 写
|
||
writeSpeed: []
|
||
},
|
||
// cpu
|
||
cpu: [],
|
||
// 内存
|
||
ram: []
|
||
}
|
||
this.valueObject = {
|
||
networkStats: "rx_sec,tx_sec,iface",
|
||
currentLoad: "currentLoad",
|
||
mem: "active",
|
||
fsStats: "wx_sec,rx_sec"
|
||
}
|
||
this.chartDataKey = "yenai:state:chartData"
|
||
|
||
this.init()
|
||
}
|
||
|
||
set network(value) {
|
||
if (_.isNumber(value[0]?.tx_sec) && _.isNumber(value[0]?.rx_sec)) {
|
||
this._network = value
|
||
this._addData(this.chartData.network.upload, [ Date.now(), value[0].tx_sec ])
|
||
this._addData(this.chartData.network.download, [ Date.now(), value[0].rx_sec ])
|
||
}
|
||
}
|
||
|
||
get network() {
|
||
return this._network
|
||
}
|
||
|
||
set fsStats(value) {
|
||
if (_.isNumber(value?.wx_sec) && _.isNumber(value?.rx_sec)) {
|
||
this._fsStats = value
|
||
this._addData(this.chartData.fsStats.writeSpeed, [ Date.now(), value.wx_sec ])
|
||
this._addData(this.chartData.fsStats.readSpeed, [ Date.now(), value.rx_sec ])
|
||
}
|
||
}
|
||
|
||
get fsStats() {
|
||
return this._fsStats
|
||
}
|
||
|
||
async init() {
|
||
if (!await initDependence()) return
|
||
await this.getRedisChartData()
|
||
// 给有问题的用户关闭定时器
|
||
if (!Config.state.statusTask) return
|
||
|
||
if (Config.state.statusPowerShellStart) si.powerShellStart()
|
||
// 初始化数据
|
||
this.getData()
|
||
// 网速
|
||
const Timer = setInterval(async() => {
|
||
let data = await this.getData()
|
||
if (_.isEmpty(data)) clearInterval(Timer)
|
||
}, 60000)
|
||
}
|
||
|
||
async getData() {
|
||
const data = await si.get(this.valueObject)
|
||
_.forIn(data, (value, key) => {
|
||
if (_.isEmpty(value)) {
|
||
logger.debug(`获取${key}数据失败,停止获取对应数据`)
|
||
delete this.valueObject[key]
|
||
}
|
||
})
|
||
const {
|
||
fsStats,
|
||
networkStats,
|
||
mem: { active },
|
||
currentLoad: { currentLoad }
|
||
} = data
|
||
this.fsStats = fsStats
|
||
this.network = networkStats
|
||
if (_.isNumber(active)) {
|
||
this._addData(this.chartData.ram, [ Date.now(), active ])
|
||
}
|
||
if (_.isNumber(currentLoad)) {
|
||
this._addData(this.chartData.cpu, [ Date.now(), currentLoad ])
|
||
}
|
||
this.setRedisChartData()
|
||
return data
|
||
}
|
||
|
||
async getRedisChartData() {
|
||
let data = await redis.get(this.chartDataKey)
|
||
if (data) {
|
||
this.chartData = JSON.parse(data)
|
||
return true
|
||
}
|
||
return false
|
||
}
|
||
|
||
async setRedisChartData() {
|
||
try {
|
||
await redis.set(this.chartDataKey, JSON.stringify(this.chartData), { EX: 86400 })
|
||
} catch (error) {
|
||
console.log(error)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 向数组中添加数据,如果数组长度超过允许的最大值,则删除最早添加的数据
|
||
* @param {Array} arr - 要添加数据的数组
|
||
* @param {*} data - 要添加的新数据
|
||
* @param {number} [maxLen] - 数组允许的最大长度,默认值为60
|
||
* @returns {void}
|
||
*/
|
||
_addData(arr, data, maxLen = 60) {
|
||
if (data === null || data === undefined) return
|
||
// 如果数组长度超过允许的最大值,删除第一个元素
|
||
if (arr.length >= maxLen) {
|
||
_.pullAt(arr, 0)
|
||
}
|
||
// 添加新数据
|
||
arr.push(data)
|
||
}
|
||
}()
|