pandora
Version:
A powerful and lightweight application manager for Node.js applications powered by TypeScript.
79 lines (67 loc) • 2.42 kB
text/typescript
;
import {getDaemonLogger} from '../universal/LoggerBroker';
import {ILogger, LoggerRotator} from 'pandora-service-logger';
import {
CpuUsageGaugeSet,
NetTrafficGaugeSet,
SystemMemoryGaugeSet,
SystemLoadGaugeSet,
MetricsActuatorServer
} from 'pandora-metrics';
import {GlobalConfigProcessor} from '../universal/GlobalConfigProcessor';
import {Hub} from 'pandora-hub';
const debug = require('debug')('pandora:cluster:monitor');
/**
* Class Monitor
*/
export class Monitor {
private daemonLogger = getDaemonLogger();
private globalConfigProcesser = GlobalConfigProcessor.getInstance();
private globalConfig = this.globalConfigProcesser.getAllProperties();
private ipcHub = new Hub();
private server;
/**
* Start Monitor
* @return {Promise<void>}
*/
async start() {
await this.ipcHub.start();
// start logger rotator serivce
debug('start a monitor logger rotator service');
const loggerRotator = new LoggerRotator({
logger: <ILogger> this.daemonLogger
});
await loggerRotator.startService();
// start metrics server
debug('start a metrics server');
this.server = new MetricsActuatorServer({
config: this.globalConfig['actuator'],
logger: this.daemonLogger,
metricsManager: new this.globalConfig['metricsManager']()
});
// register some default metrics
let metricsManager = this.server.getMetricsManager();
metricsManager.register('system', 'system', new CpuUsageGaugeSet());
metricsManager.register('system', 'system', new NetTrafficGaugeSet());
metricsManager.register('system', 'system', new SystemMemoryGaugeSet());
metricsManager.register('system', 'system', new SystemLoadGaugeSet());
// metricsManager.register('system', 'system', new DiskStatGaugeSet());
debug('start a metrics reporter');
for (let reporterName in this.globalConfig['reporter']) {
const reporterObj = this.globalConfig['reporter'][reporterName];
if (reporterObj['enabled']) {
let reporterIns = new reporterObj['target'](this.server, reporterObj.initConfig || {});
reporterIns.start(reporterObj['interval']);
this.daemonLogger.info(`${reporterName} reporter started`);
}
}
this.daemonLogger.info('monitor started');
}
/**
* @return {Promise<void>}
*/
async stop() {
await this.ipcHub.stop();
await this.server.destroy();
}
}