node-os-utils
Version:
Advanced cross-platform operating system monitoring utilities with TypeScript support
433 lines • 14.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CPUMonitor = void 0;
const base_monitor_1 = require("../core/base-monitor");
const types_1 = require("../types");
/**
* CPU 监控器
*
* 提供 CPU 相关的监控功能,包括基本信息、使用率、温度、频率等
*/
class CPUMonitor extends base_monitor_1.BaseMonitor {
constructor(adapter, config = {}, cache) {
super(adapter, config, cache);
this.cpuConfig = { ...this.getDefaultConfig(), ...config };
}
/**
* 获取 CPU 基本信息
*/
async info() {
const cacheKey = 'cpu-info';
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.info');
const rawData = await this.adapter.getCPUInfo();
return this.transformCPUInfo(rawData);
}, this.cpuConfig.cacheTTL || 30000 // CPU 信息缓存 30 秒
);
}
/**
* 获取 CPU 使用率
*/
async usage() {
const cacheKey = `cpu-usage-${this.cpuConfig.samplingInterval || 1000}`;
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.usage');
const rawData = await this.adapter.getCPUUsage();
const usageData = this.transformCPUUsage(rawData);
return usageData.overall;
}, this.cpuConfig.cacheTTL || 1000 // 使用率缓存较短
);
}
/**
* 获取详细的 CPU 使用率信息
*/
async usageDetailed() {
const cacheKey = `cpu-usage-detailed-${this.cpuConfig.samplingInterval || 1000}`;
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.usage');
const rawData = await this.adapter.getCPUUsage();
return this.transformCPUUsage(rawData);
}, this.cpuConfig.cacheTTL || 1000);
}
/**
* 获取每个 CPU 核心的使用率
*/
async usageByCore() {
const cacheKey = `cpu-usage-cores-${this.cpuConfig.samplingInterval || 1000}`;
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.perCore');
const rawData = await this.adapter.getCPUUsage();
const usageData = this.transformCPUUsage(rawData);
return usageData.cores || [];
}, this.cpuConfig.cacheTTL || 1000);
}
/**
* 获取系统负载平均值
*/
async loadAverage() {
const cacheKey = 'cpu-loadavg';
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.usage');
const rawData = await this.adapter.getSystemLoad();
return this.transformLoadAverage(rawData);
}, this.cpuConfig.cacheTTL || 5000);
}
/**
* 获取 CPU 温度
*/
async temperature() {
if (!this.cpuConfig.includeTemperature) {
return this.createErrorResult(this.createUnsupportedError('cpu.temperature (disabled in config)'));
}
const cacheKey = 'cpu-temperature';
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.temperature');
const rawData = await this.adapter.getCPUTemperature();
return this.transformTemperature(rawData);
}, this.cpuConfig.cacheTTL || 5000);
}
/**
* 获取 CPU 频率信息
*/
async frequency() {
if (!this.cpuConfig.includeFrequency) {
return this.createErrorResult(this.createUnsupportedError('cpu.frequency (disabled in config)'));
}
const cacheKey = 'cpu-frequency';
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.frequency');
// 频率信息通常在 CPU 基本信息中包含
const rawData = await this.adapter.getCPUInfo();
return this.extractFrequencyInfo(rawData);
}, this.cpuConfig.cacheTTL || 10000);
}
/**
* 获取 CPU 缓存信息
*/
async getCacheInfo() {
if (!this.cpuConfig.includeCache) {
return this.createErrorResult(this.createUnsupportedError('cpu.cache (disabled in config)'));
}
const cacheKey = 'cpu-cache';
return this.executeWithCache(cacheKey, async () => {
this.validatePlatformSupport('cpu.cache');
const rawData = await this.adapter.getCPUInfo();
return this.extractCacheInfo(rawData);
}, this.cpuConfig.cacheTTL || 30000);
}
/**
* 获取 CPU 核心数
*/
async coreCount() {
const cacheKey = 'cpu-core-count';
return this.executeWithCache(cacheKey, async () => {
const rawData = await this.adapter.getCPUInfo();
return {
physical: rawData.cores || rawData.count || 1,
logical: rawData.threads || rawData.count || 1
};
}, this.cpuConfig.cacheTTL || 60000 // 核心数很少变化,缓存 1 分钟
);
}
/**
* 配置采样间隔
*/
withSamplingInterval(interval) {
this.cpuConfig.samplingInterval = interval;
return this;
}
/**
* 配置是否包含温度信息
*/
withTemperature(include) {
this.cpuConfig.includeTemperature = include;
return this;
}
/**
* 配置是否包含频率信息
*/
withFrequency(include) {
this.cpuConfig.includeFrequency = include;
return this;
}
/**
* 配置是否包含缓存信息
*/
withCacheInfo(include) {
this.cpuConfig.includeCache = include;
return this;
}
/**
* 配置是否按核心监控
*/
withPerCore(enable) {
this.cpuConfig.perCore = enable;
return this;
}
/**
* 获取默认配置
*/
getDefaultConfig() {
return {
interval: 1000,
timeout: 10000,
cacheEnabled: true,
cacheTTL: 5000,
samples: 1,
includeDetails: true,
samplingInterval: 1000,
includeTemperature: false, // 默认不包含温度,可能需要特殊权限
includeFrequency: true,
includeCache: true,
perCore: false,
loadAverageWindows: [1, 5, 15]
};
}
// 私有转换方法
/**
* 转换 CPU 基本信息
*/
transformCPUInfo(rawData) {
return {
model: rawData.model || 'Unknown',
manufacturer: rawData.manufacturer || rawData.vendor || 'Unknown',
architecture: rawData.architecture || rawData.arch || 'Unknown',
cores: rawData.cores || rawData.count || 1,
threads: rawData.threads || rawData.cores || rawData.count || 1,
baseFrequency: rawData.baseFrequency || rawData.frequency || 0,
maxFrequency: rawData.maxFrequency || rawData.frequency || 0,
cache: this.transformCacheInfo(rawData.cache || {}),
features: rawData.features || [],
vendorId: rawData.vendorId || rawData.vendor_id,
family: rawData.family,
modelNumber: rawData.modelNumber || rawData.model_number,
stepping: rawData.stepping
};
}
/**
* 转换 CPU 使用率信息
*/
transformCPUUsage(rawData) {
return {
overall: this.safeParseNumber(rawData.overall || rawData.usage),
cores: rawData.cores || [],
user: this.safeParseNumber(rawData.user),
system: this.safeParseNumber(rawData.system || rawData.sys),
idle: this.safeParseNumber(rawData.idle),
iowait: this.safeParseNumber(rawData.iowait),
irq: this.safeParseNumber(rawData.irq),
softirq: this.safeParseNumber(rawData.softirq)
};
}
/**
* 转换负载平均值
*/
transformLoadAverage(rawData) {
return {
load1: this.safeParseNumber(rawData.load1),
load5: this.safeParseNumber(rawData.load5),
load15: this.safeParseNumber(rawData.load15)
};
}
/**
* 转换温度信息
*/
transformTemperature(rawData) {
if (!Array.isArray(rawData)) {
return [];
}
return rawData.map(item => this.safeParseNumber(item.temperature || item.temp || 0));
}
/**
* 转换缓存信息
*/
transformCacheInfo(rawCache) {
const cache = {};
if (rawCache.l1d !== undefined) {
cache.l1d = new types_1.DataSize(this.safeParseNumber(rawCache.l1d));
}
if (rawCache.l1i !== undefined) {
cache.l1i = new types_1.DataSize(this.safeParseNumber(rawCache.l1i));
}
if (rawCache.l2 !== undefined) {
cache.l2 = new types_1.DataSize(this.safeParseNumber(rawCache.l2));
}
if (rawCache.l3 !== undefined) {
cache.l3 = new types_1.DataSize(this.safeParseNumber(rawCache.l3));
}
return cache;
}
/**
* 提取频率信息
*/
extractFrequencyInfo(rawData) {
const frequencies = [];
if (rawData.baseFrequency) {
frequencies.push({
type: 'base',
frequency: this.safeParseNumber(rawData.baseFrequency)
});
}
if (rawData.maxFrequency) {
frequencies.push({
type: 'max',
frequency: this.safeParseNumber(rawData.maxFrequency)
});
}
// 如果有每核心频率信息
if (rawData.cores && Array.isArray(rawData.cores)) {
rawData.cores.forEach((core, index) => {
if (core.frequency) {
frequencies.push({
type: 'core',
core: index,
frequency: this.safeParseNumber(core.frequency)
});
}
});
}
return frequencies;
}
/**
* 提取缓存信息
*/
extractCacheInfo(rawData) {
const cache = {};
// 尝试从不同字段提取缓存信息
if (rawData.cache) {
return this.transformCacheInfo(rawData.cache);
}
// 如果是 CPU 数组,取第一个 CPU 的缓存信息
if (rawData.cpus && Array.isArray(rawData.cpus) && rawData.cpus.length > 0) {
const firstCpu = rawData.cpus[0];
// Linux /proc/cpuinfo 格式
if (firstCpu['cache size']) {
const cacheSize = this.parseCacheSize(firstCpu['cache size']);
if (cacheSize > 0) {
cache.l3 = new types_1.DataSize(cacheSize);
}
}
}
return cache;
}
/**
* 解析缓存大小字符串
*/
parseCacheSize(cacheStr) {
const match = cacheStr.match(/(\d+)\s*([KMGT]?B?)/i);
if (!match)
return 0;
const value = this.safeParseNumber(match[1]);
const unit = match[2].toUpperCase();
const multipliers = {
'B': 1,
'KB': 1024,
'MB': 1024 * 1024,
'GB': 1024 * 1024 * 1024,
'K': 1024,
'M': 1024 * 1024,
'G': 1024 * 1024 * 1024
};
return value * (multipliers[unit] || 1);
}
/**
* 安全解析数字
*/
safeParseNumber(value) {
if (typeof value === 'number') {
return isNaN(value) ? 0 : value;
}
if (typeof value === 'string') {
const parsed = parseFloat(value);
return isNaN(parsed) ? 0 : parsed;
}
return 0;
}
// ==================== 向后兼容的同步方法 ====================
/**
* 获取系统负载平均值(同步版本,向后兼容)
* @returns 负载平均值数组 [1分钟, 5分钟, 15分钟] 或 'not supported'
*/
loadavg() {
try {
// 尝试使用 Node.js 内置的 os.loadavg()
const os = require('os');
return os.loadavg();
}
catch (error) {
return 'not supported';
}
}
/**
* 获取指定时间窗口的负载平均值(同步版本,向后兼容)
* @param minutes 时间窗口(1, 5, 或 15 分钟)
* @returns 指定时间窗口的负载平均值或 'not supported'
*/
loadavgTime(minutes) {
try {
const loads = this.loadavg();
if (loads === 'not supported') {
return 'not supported';
}
const loadArray = loads;
switch (minutes) {
case 1: return loadArray[0];
case 5: return loadArray[1];
case 15: return loadArray[2];
default: return 'not supported';
}
}
catch (error) {
return 'not supported';
}
}
/**
* 获取 CPU 平均信息(同步版本,向后兼容)
* @returns CPU 平均信息对象或 'not supported'
*/
average() {
try {
// 这个方法在旧版本中可能返回负载平均值或其他统计信息
const loads = this.loadavg();
if (loads === 'not supported') {
return 'not supported';
}
return {
loadavg: loads,
usage: 0 // 同步方法无法获取实时使用率,返回 0
};
}
catch (error) {
return 'not supported';
}
}
/**
* 获取 CPU 型号(同步版本,向后兼容)
* @returns CPU 型号字符串或 'not supported'
*/
model() {
try {
const os = require('os');
const cpus = os.cpus();
return cpus && cpus.length > 0 ? cpus[0].model : 'Unknown';
}
catch (error) {
return 'not supported';
}
}
/**
* 获取 CPU 核心数(同步版本,向后兼容)
* @returns CPU 核心数或 'not supported'
*/
count() {
try {
const os = require('os');
return os.cpus().length;
}
catch (error) {
return 'not supported';
}
}
}
exports.CPUMonitor = CPUMonitor;
//# sourceMappingURL=cpu-monitor.js.map