87 lines
3.4 KiB
JavaScript
87 lines
3.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const nodemailer = require("nodemailer");
|
|
const log = require("./log");
|
|
const CallChain = require("./callchain");
|
|
const Processor = require("./processor");
|
|
const config = require("./config");
|
|
const CHECK_PERIOD = 60; // seconds
|
|
class ClientEntry {
|
|
}
|
|
class MissingEventProcessor extends Processor.AProcessor {
|
|
constructor() {
|
|
super("MissingEventProcessor");
|
|
this.clientMap = new Map();
|
|
this.smtp = nodemailer.createTransport({
|
|
host: config.dict.smtpHost,
|
|
port: config.dict.smtpPort,
|
|
secure: false,
|
|
tls: {
|
|
rejectUnauthorized: false
|
|
}
|
|
});
|
|
this.timer = setInterval(() => {
|
|
this.clientMap.forEach((value, key) => {
|
|
let currentTime = new Date().getTime();
|
|
let elapsedTime = currentTime - value.lastEvent;
|
|
log.info(`Checking ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`);
|
|
if ((value.avgDelay != 0) && (elapsedTime > (value.avgDelay * 3))) {
|
|
let mail = {
|
|
from: config.dict.smtpSender,
|
|
to: config.dict.smtpReceiver,
|
|
subject: `Missing Event Detected for ${key}`,
|
|
text: `Missing Event Detected: ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`
|
|
};
|
|
this.smtp.sendMail(mail)
|
|
.then((v) => {
|
|
log.info(`Missing event info mail sent, ${v.response}`);
|
|
})
|
|
.catch((reason) => {
|
|
log.error(`Failure when sending missing event info: ${reason}`);
|
|
});
|
|
}
|
|
});
|
|
}, CHECK_PERIOD * 1000);
|
|
}
|
|
process(message) {
|
|
let client = message.metadata.client;
|
|
log.info(`Event for client ${client}`);
|
|
let currentTime = new Date().getTime();
|
|
if (this.clientMap.has(client)) {
|
|
let clientEntry = this.clientMap.get(client);
|
|
clientEntry.client = client;
|
|
clientEntry.delay = currentTime - clientEntry.lastEvent;
|
|
clientEntry.lastEvent = currentTime;
|
|
clientEntry.count += 1;
|
|
if (clientEntry.count >= 1) {
|
|
clientEntry.delaySum += clientEntry.delay;
|
|
clientEntry.avgDelay = clientEntry.delaySum / clientEntry.count;
|
|
}
|
|
this.clientMap.set(client, clientEntry);
|
|
log.info(`Entry for ${client} updated`);
|
|
}
|
|
else {
|
|
let clientEntry = new ClientEntry();
|
|
clientEntry.client = client;
|
|
clientEntry.lastEvent = currentTime;
|
|
clientEntry.delay = 0;
|
|
clientEntry.count = -1;
|
|
clientEntry.delaySum = 0;
|
|
clientEntry.avgDelay = 0;
|
|
this.clientMap.set(client, clientEntry);
|
|
log.info(`Entry for ${client} inserted`);
|
|
}
|
|
}
|
|
}
|
|
class MissingEventDetector extends CallChain.ABaseChainItem {
|
|
constructor() {
|
|
super("MissingEventDetector");
|
|
this.missingEventProcessor = new MissingEventProcessor();
|
|
}
|
|
func(message) {
|
|
this.missingEventProcessor.in(message);
|
|
return message;
|
|
}
|
|
}
|
|
exports.MissingEventDetector = MissingEventDetector;
|
|
//# sourceMappingURL=missingeventdetector.js.map
|