WSysmonitor.mjs

import v8 from 'v8'
import os from 'node:os'
// import process from 'node:process'
import osu from 'node-os-utils'
import nodeDiskInfo from 'node-disk-info'
import get from 'lodash-es/get.js'
import isNumber from 'lodash-es/isNumber.js'


let cv = 1024 * 1024 * 1024 //byte -> g


/**
 * 系統資訊監控
 *
 * @class
 * @param {Object} [opt={}] 輸入設定物件,預設{}
 * @param {String} [opt.timeCpuUsage=200] 輸入偵測CPU使用率時取樣時間數字,單位ms,預設200
 * @returns {Object} 回傳系統資訊物件
 * @example
 *
 * import wsm from 'w-sysmonitor'
 *
 * wsm()
 *     .then((r) => {
 *         console.log(r)
 *         // => {
 *         //   cpuInfo: {
 *         //     totalIdle: 619133495,
 *         //     totalTick: 725060735,
 *         //     avgIdle: 77391686.875,
 *         //     avgTotal: 90632591.875
 *         //   },
 *         //   cpuCount: 8,
 *         //   cpuUsedPercentage: 3.87,
 *         //   cpuModel: 'Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz',
 *         //   disksInfo: [
 *         //     {
 *         //       name: 'C:',
 *         //       display: '本機固定式磁碟',
 *         //       total: 292.30057525634766,
 *         //       free: 105.25997543334961,
 *         //       used: 187.04059982299805,
 *         //       usedPercentage: 63.9891316186988
 *         //     },
 *         //     {
 *         //       name: 'D:',
 *         //       display: '本機固定式磁碟',
 *         //       total: 660.8984336853027,
 *         //       free: 124.43569946289062,
 *         //       used: 536.4627342224121,
 *         //       usedPercentage: 81.17173636363275
 *         //     },
 *         //     {
 *         //       name: 'G:',
 *         //       display: '本機固定式磁碟',
 *         //       total: 102,
 *         //       free: 83.06204223632812,
 *         //       used: 18.937957763671875,
 *         //       usedPercentage: 18.566625258501837
 *         //     }
 *         //   ],
 *         //   diskCount: 3,
 *         //   diskTotal: 1055.1990089416504,
 *         //   diskFree: 312.75771713256836,
 *         //   diskUsed: 742.441291809082,
 *         //   diskUsedPercentage: 70.36030981053896,
 *         //   memInfo: {
 *         //     totalMemMb: 16182.2,
 *         //     usedMemMb: 10579.27,
 *         //     freeMemMb: 5602.93,
 *         //     usedMemPercentage: 65.38,
 *         //     freeMemPercentage: 34.62
 *         //   },
 *         //   memFree: 5.471611328125,
 *         //   memTotal: 15.8029296875,
 *         //   memUsed: 10.331318359375,
 *         //   memUsedPercentage: 65.38,
 *         //   heapInfo: {
 *         //     total_heap_size: 7385088,
 *         //     total_heap_size_executable: 524288,
 *         //     total_physical_size: 7385088,
 *         //     total_available_size: 4339566408,
 *         //     used_heap_size: 5561400,
 *         //     heap_size_limit: 4345298944,
 *         //     malloced_memory: 262256,
 *         //     peak_malloced_memory: 7010040,
 *         //     does_zap_garbage: 0,
 *         //     number_of_native_contexts: 2,
 *         //     number_of_detached_contexts: 0,
 *         //     total_global_handles_size: 8192,
 *         //     used_global_handles_size: 5856,
 *         //     external_memory: 666592
 *         //   },
 *         //   heapTotal: 4.046875,
 *         //   heapFree: 4.041536159813404,
 *         //   heapUsed: 0.005338840186595917,
 *         //   heapUsedPercentage: 0.1319250084718682,
 *         //   netsInfo: {
 *         //     'Wi-Fi': [ [Object], [Object] ],
 *         //   },
 *         //   osPlatform: 'win32',
 *         //   osUptime: 153059,
 *         //   osHostname: 'DESKTOP-6R7USAO',
 *         //   osType: 'Windows_NT',
 *         //   osArch: 'x64',
 *         //   osMachine: 'x86_64',
 *         //   userInfo: {
 *         //     uid: -1,
 *         //     gid: -1,
 *         //     username: 'username',
 *         //     homedir: 'C:\\Users\\username',
 *         //     shell: null
 *         //   }
 *         // }
 *     })
 *     .catch((err) => {
 *         console.log(err)
 *     })
 *
 */
async function WSysmonitor(opt = {}) {

    //timeCpuUsage
    let timeCpuUsage = get(opt, 'timeCpuUsage')
    if (!isNumber(timeCpuUsage)) {
        timeCpuUsage = 200
    }

    // let cpuUsage = process.cpuUsage()

    //cpu
    let cpu = ''
    try {
        cpu = osu.cpu
    }
    catch (err) {}

    //cpuInfo
    let cpuInfo = {
        totalIdle: '',
        totalTick: '',
        avgIdle: '',
        avgTotal: '',
    }
    try {
        cpuInfo = cpu.average()
    }
    catch (err) {}
    //   cpuInfo: {
    //     totalIdle: 619133495,
    //     totalTick: 725060735,
    //     avgIdle: 77391686.875,
    //     avgTotal: 90632591.875
    //   },

    //cpuCount
    let cpuCount = ''
    try {
        cpuCount = cpu.count()
    }
    catch (err) {}
    //   cpuCount: 8,

    //cpuUsedPercentage
    let cpuUsedPercentage = ''
    await cpu.usage(timeCpuUsage) //interval是等待回應ms, 故得要考慮呼叫頻率再設定
        .then((r) => {
            cpuUsedPercentage = r
        })
        .catch((err) => {
            console.log('catch cpu.usage', err)
        })
    //   cpuUsedPercentage: 3.87,

    // let cpuLoadavg = cpu.loadavg()
    // let cpuLoadavgTime = cpu.loadavgTime(1)
    // let cpuLoadavg = os.loadavg() //windows無效

    //cpuModel
    let cpuModel = ''
    try {
        cpuModel = cpu.model()
    }
    catch (err) {}
    //   cpuModel: 'Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz',

    //disksInfo, diskCount, diskTotal, diskFree, diskUsed, diskUsedPercentage
    let disksInfo = ''
    let diskCount = 0
    let diskTotal = 0
    let diskFree = 0
    let diskUsed = 0
    let diskUsedPercentage = 0
    await nodeDiskInfo.getDiskInfo() //測試大概花100ms
        .then((r) => {
        // disksInfo = r
            disksInfo = r.map((v, k) => {
            // console.log(k, v)
            // 0 Drive {
            //   _filesystem: '本機固定式磁碟',
            //   _blocks: 313855352832,
            //   _used: 200868184064,
            //   _available: 112987168768,
            //   _capacity: '64%',
            //   _mounted: 'C:'
            // }
                let vv = {
                    name: v._mounted,
                    display: v._filesystem,
                    total: v._blocks / cv, //g
                    free: v._available / cv, //g
                    used: v._used / cv, //g
                    // usedPercentageStr: v._capacity,
                    usedPercentage: v._used / v._blocks * 100,
                }
                diskTotal += vv.total
                diskFree += vv.free
                diskUsed += vv.used
                return vv
            })
            diskCount = disksInfo.length
            diskUsedPercentage = diskUsed / diskTotal * 100
        })
        .catch((err) => {
            console.log('catch nodeDiskInfo.getDiskInfo', err)
        })
    //   disksInfo: [
    //     {
    //       name: 'C:',
    //       display: '本機固定式磁碟',
    //       total: 292.30057525634766,
    //       free: 105.25997543334961,
    //       used: 187.04059982299805,
    //       usedPercentage: 63.9891316186988
    //     },
    //     {
    //       name: 'D:',
    //       display: '本機固定式磁碟',
    //       total: 660.8984336853027,
    //       free: 124.43569946289062,
    //       used: 536.4627342224121,
    //       usedPercentage: 81.17173636363275
    //     },
    //     {
    //       name: 'G:',
    //       display: '本機固定式磁碟',
    //       total: 102,
    //       free: 83.06204223632812,
    //       used: 18.937957763671875,
    //       usedPercentage: 18.566625258501837
    //     }
    //   ],
    //   diskCount: 3,
    //   diskTotal: 1055.1990089416504,
    //   diskFree: 312.75771713256836,
    //   diskUsed: 742.441291809082,
    //   diskUsedPercentage: 70.36030981053896,

    //mem
    let mem = ''
    try {
        mem = osu.mem
    }
    catch (err) {}

    //memInfo, memFree, memTotal, memUsed, memUsedPercentage
    let memInfo = ''
    let memFree = 0
    // let memFreePercentage = 0
    let memTotal = 0
    let memUsed = 0
    let memUsedPercentage = 0
    await mem.info()
        .then((r) => {
            memInfo = r
            memFree = r.freeMemMb / 1024 //mb -> g
            memTotal = r.totalMemMb / 1024 //mb -> g
            memUsed = r.usedMemMb / 1024 //mb -> g
            // memFreePercentage = r.freeMemPercentage
            memUsedPercentage = r.usedMemPercentage
        })
        .catch((err) => {
            console.log('catch mem.info', err)
        })
    //   memInfo: {
    //     totalMemMb: 16182.2,
    //     usedMemMb: 10579.27,
    //     freeMemMb: 5602.93,
    //     usedMemPercentage: 65.38,
    //     freeMemPercentage: 34.62
    //   },
    //   memFree: 5.471611328125,
    //   memTotal: 15.8029296875,
    //   memUsed: 10.331318359375,
    //   memUsedPercentage: 65.38,

    //heapInfo
    let heapInfo = ''
    try {
        heapInfo = v8.getHeapStatistics()
        // total_heap_size: Number of bytes V8 has allocated for the heap. This can grow if usedHeap needs more.
        // used_heap_size: Number of bytes in used by application data
        // total_heap_size_executable: Number of bytes for compiled bytecode and JITed code
        // heap_size_limit: The absolute limit the heap cannot exceed (default limit or --max_old_space_size)
    }
    catch (err) {}
    //   heapInfo: {
    //     total_heap_size: 7385088,
    //     total_heap_size_executable: 524288,
    //     total_physical_size: 7385088, // total_physical_size: Committed size
    //     total_available_size: 4339566408,
    //     used_heap_size: 5561400,
    //     heap_size_limit: 4345298944,
    //     malloced_memory: 262256,
    //     peak_malloced_memory: 7010040,
    //     does_zap_garbage: 0,
    //     number_of_native_contexts: 2,
    //     number_of_detached_contexts: 0,
    //     total_global_handles_size: 8192,
    //     used_global_handles_size: 5856,
    //     external_memory: 666592
    //   },

    // heapTotal, heapFree, heapUsed, heapUsedPercentage
    let heapTotal = ''
    try {
        heapTotal = heapInfo.heap_size_limit / cv //g
    }
    catch (err) {}
    let heapFree = ''
    try {
        heapFree = heapInfo.total_available_size / cv //g
    }
    catch (err) {}
    let heapUsed = ''
    try {
        heapUsed = heapTotal - heapFree //g
    }
    catch (err) {}
    let heapUsedPercentage = ''
    try {
        heapUsedPercentage = heapUsed / heapTotal * 100
    }
    catch (err) {}
    //   heapTotal: 4.046875,
    //   heapFree: 4.041536159813404,
    //   heapUsed: 0.005338840186595917,
    //   heapUsedPercentage: 0.1319250084718682,

    //netsInfo
    let netsInfo = ''
    try {
        netsInfo = os.networkInterfaces()
    }
    catch (err) {}
    //   netsInfo: {
    //     'Wi-Fi': [ [Object], [Object] ],
    //   },

    // let os = osu.os

    // let osOos = ''
    // await os.oos()
    //     .then((r) => {
    //         osOos = r
    //     })
    //     .catch((err) => {
    //         console.log('catch os.oos', err)
    //     })

    //osPlatform, osUptime, osHostname, osType, osArch, osMachine
    let osPlatform = ''
    try {
        osPlatform = os.platform()
    }
    catch (err) {}
    let osUptime = ''
    try {
        osUptime = os.uptime()
    }
    catch (err) {}
    // let osIp = os.ip()
    let osHostname = ''
    try {
        osHostname = os.hostname()
    }
    catch (err) {}
    let osType = ''
    try {
        osType = os.type()
    }
    catch (err) {}
    let osArch = ''
    try {
        osArch = os.arch()
    }
    catch (err) {}
    let osMachine = ''
    try {
        osMachine = os.machine()
    }
    catch (err) {}
    //   osPlatform: 'win32',
    //   osUptime: 153059,
    //   osHostname: 'DESKTOP-6R7USAO',
    //   osType: 'Windows_NT',
    //   osArch: 'x64',
    //   osMachine: 'x86_64',

    // let drive = osu.drive

    // let driveInfo = ''
    // await drive.info()
    //     .then((r) => {
    //         driveInfo = r
    //     })
    //     .catch((err) => {
    //         console.log('catch drive.info', err)
    //     })

    // let netstat = osu.netstat

    // let netstatStats = ''
    // await netstat.stats()
    //     .then((r) => {
    //         netstatStats = r
    //     })
    //     .catch((err) => {
    //         console.log('catch netstat.stats', err)
    //     })
    // let netstatInOut = ''
    // await netstat.inOut()
    //     .then((r) => {
    //         netstatInOut = r
    //     })
    //     .catch((err) => {
    //         console.log('catch netstat.inOut', err)
    //     })

    //userInfo
    let userInfo = {
        uid: '',
        gid: '',
        username: '',
        homedir: '',
        shell: '',
    }
    try {
        userInfo = os.userInfo()
    }
    catch (err) {}
    //   userInfo: {
    //     uid: -1,
    //     gid: -1,
    //     username: 'username',
    //     homedir: 'C:\\Users\\username',
    //     shell: null
    //   }

    // let osCmd = osu.osCmd

    // let userName = ''
    // await osCmd.whoami()
    //     .then((r) => {
    //         userName = r
    //     })
    //     .catch((err) => {
    //         console.log('catch osCmd.whoami', err)
    //     })

    //rr
    let rr = {
        cpuInfo,
        cpuCount,
        // cpuUsage,
        // cpuLoadavg,
        cpuUsedPercentage,
        cpuModel,
        // cpuLoadavg,
        // cpuLoadavgTime,
        // driveInfo,
        disksInfo,
        diskCount,
        diskTotal,
        diskFree,
        diskUsed,
        diskUsedPercentage,
        memInfo,
        memFree,
        // memFreePercentage,
        memTotal,
        memUsed,
        memUsedPercentage,
        heapInfo,
        heapTotal,
        heapFree,
        heapUsed,
        heapUsedPercentage,
        netsInfo,
        // netstatStats,
        // netstatInOut,
        // osOos,
        osPlatform,
        osUptime,
        // osIp,
        osHostname,
        osType,
        osArch,
        osMachine,
        userInfo,
        // userName,
    }

    return rr
}


export default WSysmonitor