Files
yenai-plugin/model/State/Monitor.js
2024-05-20 20:33:38 +08:00

141 lines
3.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}
}()