debug improved
This commit is contained in:
5
dist/callchain.js
vendored
5
dist/callchain.js
vendored
@ -23,6 +23,7 @@ class AChainItem extends events.EventEmitter {
|
|||||||
this.next = next;
|
this.next = next;
|
||||||
}
|
}
|
||||||
send(message) {
|
send(message) {
|
||||||
|
log.info(`Calling ${this.label} with ${message}`);
|
||||||
this.emit('yourturn', message);
|
this.emit('yourturn', message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -36,7 +37,7 @@ class AAsyncBaseChainItem extends AChainItem {
|
|||||||
this.next.begin();
|
this.next.begin();
|
||||||
}
|
}
|
||||||
this.addListener('yourturn', (message) => {
|
this.addListener('yourturn', (message) => {
|
||||||
log.info(`Calling ${this.toString()}`);
|
log.info(`Executing ${this.toString()}`);
|
||||||
this.func(message, this.next.send);
|
this.func(message, this.next.send);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -51,7 +52,7 @@ class ABaseChainItem extends AChainItem {
|
|||||||
this.next.begin();
|
this.next.begin();
|
||||||
}
|
}
|
||||||
this.addListener('yourturn', (message) => {
|
this.addListener('yourturn', (message) => {
|
||||||
log.info(`Calling ${this.toString()}`);
|
log.info(`Executing ${this.toString()}`);
|
||||||
let result = this.func(message);
|
let result = this.func(message);
|
||||||
this.next.send(result);
|
this.next.send(result);
|
||||||
});
|
});
|
||||||
|
26
dist/log.js
vendored
26
dist/log.js
vendored
@ -2,6 +2,8 @@
|
|||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const chalk = require("chalk");
|
const chalk = require("chalk");
|
||||||
const moment = require("moment");
|
const moment = require("moment");
|
||||||
|
const config = require("./config");
|
||||||
|
const nodemailer = require("nodemailer");
|
||||||
var Level;
|
var Level;
|
||||||
(function (Level) {
|
(function (Level) {
|
||||||
Level[Level["All"] = 0] = "All";
|
Level[Level["All"] = 0] = "All";
|
||||||
@ -28,6 +30,30 @@ function setLevel(value) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.setLevel = setLevel;
|
exports.setLevel = setLevel;
|
||||||
|
function sendAlarmMail(message) {
|
||||||
|
let transport = nodemailer.createTransport({
|
||||||
|
host: config.dict.smtpHost,
|
||||||
|
port: config.dict.smtpPort,
|
||||||
|
secure: false,
|
||||||
|
tls: {
|
||||||
|
rejectUnauthorized: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let mail = {
|
||||||
|
from: config.dict.smtpSender,
|
||||||
|
to: config.dict.smtpReceiver,
|
||||||
|
subject: "Alarm from Dispatcher",
|
||||||
|
text: message
|
||||||
|
};
|
||||||
|
transport.sendMail(mail)
|
||||||
|
.then((v) => {
|
||||||
|
info(`Alarm mail sent, ${message}, ${v.response}`);
|
||||||
|
})
|
||||||
|
.catch((reason) => {
|
||||||
|
error(`Failure when sending alarm mail: ${message}, ${reason}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.sendAlarmMail = sendAlarmMail;
|
||||||
function info(message) {
|
function info(message) {
|
||||||
if (level < Level.NoDebugNoInfo) {
|
if (level < Level.NoDebugNoInfo) {
|
||||||
console.log(`${timestamp()} ${chalk.bold.cyan('[ II ]')} ${message}`);
|
console.log(`${timestamp()} ${chalk.bold.cyan('[ II ]')} ${message}`);
|
||||||
|
6
dist/main.js
vendored
6
dist/main.js
vendored
@ -13,8 +13,10 @@ const ESP_THERM_TOPIC = 'IoT/espThermometer2/#';
|
|||||||
dispatcher.register(ESP_THERM_TOPIC, 'toJson', EspThermToJson.espThermToJson);
|
dispatcher.register(ESP_THERM_TOPIC, 'toJson', EspThermToJson.espThermToJson);
|
||||||
let missingeventdetector = new MissingEventDetector.MissingEventDetector();
|
let missingeventdetector = new MissingEventDetector.MissingEventDetector();
|
||||||
dispatcher.register(ESP_THERM_TOPIC, 'MissingEventDetector', missingeventdetector);
|
dispatcher.register(ESP_THERM_TOPIC, 'MissingEventDetector', missingeventdetector);
|
||||||
let mongo = new MongoSave.MongoSave(config.dict.mongoDbUrl);
|
if (!config.dict.disableDatabaseAccess) {
|
||||||
dispatcher.register(ESP_THERM_TOPIC, 'MongoSave', mongo);
|
let mongo = new MongoSave.MongoSave(config.dict.mongoDbUrl);
|
||||||
|
dispatcher.register(ESP_THERM_TOPIC, 'MongoSave', mongo);
|
||||||
|
}
|
||||||
dispatcher.exec();
|
dispatcher.exec();
|
||||||
log.info("Dispatcher running");
|
log.info("Dispatcher running");
|
||||||
//# sourceMappingURL=main.js.map
|
//# sourceMappingURL=main.js.map
|
32
dist/missingeventdetector.js
vendored
32
dist/missingeventdetector.js
vendored
@ -1,10 +1,8 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const nodemailer = require("nodemailer");
|
|
||||||
const log = require("./log");
|
const log = require("./log");
|
||||||
const CallChain = require("./callchain");
|
const CallChain = require("./callchain");
|
||||||
const Processor = require("./processor");
|
const Processor = require("./processor");
|
||||||
const config = require("./config");
|
|
||||||
const CHECK_PERIOD = 60; // seconds
|
const CHECK_PERIOD = 60; // seconds
|
||||||
class ClientEntry {
|
class ClientEntry {
|
||||||
}
|
}
|
||||||
@ -12,40 +10,20 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
constructor() {
|
constructor() {
|
||||||
super("MissingEventProcessor");
|
super("MissingEventProcessor");
|
||||||
this.clientMap = new Map();
|
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.timer = setInterval(() => {
|
||||||
this.clientMap.forEach((value, key) => {
|
this.clientMap.forEach((value, key) => {
|
||||||
let currentTime = new Date().getTime();
|
let currentTime = new Date().getTime();
|
||||||
let elapsedTime = currentTime - value.lastEvent;
|
let elapsedTime = currentTime - value.lastEvent;
|
||||||
log.info(`Checking ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`);
|
log.info(`MissingEventProcessor: Checking ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`);
|
||||||
if ((value.avgDelay != 0) && (elapsedTime > (value.avgDelay * 3))) {
|
if ((value.avgDelay != 0) && (elapsedTime > (value.avgDelay * 3))) {
|
||||||
let mail = {
|
log.sendAlarmMail(`Missing Event Detected: ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`);
|
||||||
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);
|
}, CHECK_PERIOD * 1000);
|
||||||
}
|
}
|
||||||
process(message) {
|
process(message) {
|
||||||
let client = message.metadata.client;
|
let client = message.metadata.client;
|
||||||
log.info(`Event for client ${client}`);
|
log.info(`MissingEventProcessor: Event for client ${client}`);
|
||||||
let currentTime = new Date().getTime();
|
let currentTime = new Date().getTime();
|
||||||
if (this.clientMap.has(client)) {
|
if (this.clientMap.has(client)) {
|
||||||
let clientEntry = this.clientMap.get(client);
|
let clientEntry = this.clientMap.get(client);
|
||||||
@ -58,7 +36,7 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
clientEntry.avgDelay = clientEntry.delaySum / clientEntry.count;
|
clientEntry.avgDelay = clientEntry.delaySum / clientEntry.count;
|
||||||
}
|
}
|
||||||
this.clientMap.set(client, clientEntry);
|
this.clientMap.set(client, clientEntry);
|
||||||
log.info(`Entry for ${client} updated`);
|
log.info(`MissingEventProcessor: Entry for ${client} updated`);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let clientEntry = new ClientEntry();
|
let clientEntry = new ClientEntry();
|
||||||
@ -69,7 +47,7 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
clientEntry.delaySum = 0;
|
clientEntry.delaySum = 0;
|
||||||
clientEntry.avgDelay = 0;
|
clientEntry.avgDelay = 0;
|
||||||
this.clientMap.set(client, clientEntry);
|
this.clientMap.set(client, clientEntry);
|
||||||
log.info(`Entry for ${client} inserted`);
|
log.info(`MissingEventProcessor: Entry for ${client} inserted`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
dist/mqttdispatcher.js
vendored
10
dist/mqttdispatcher.js
vendored
@ -79,22 +79,22 @@ class MqttDispatcher {
|
|||||||
for (let field in registeredTopicFields) {
|
for (let field in registeredTopicFields) {
|
||||||
let regField = registeredTopicFields[field];
|
let regField = registeredTopicFields[field];
|
||||||
let recvField = receivedTopicFields[field];
|
let recvField = receivedTopicFields[field];
|
||||||
log.info(`recv: ${recvField}, reg: ${regField}`);
|
log.debug(`topicMatch: recv: ${recvField}, reg: ${regField}`);
|
||||||
if (regField === "#") {
|
if (regField === "#") {
|
||||||
log.info('true');
|
log.debug('topicMatch: true 1');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (regField != recvField && regField != "+") {
|
if (regField != recvField && regField != "+") {
|
||||||
log.info('false');
|
log.debug('topicMatch: false 1');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (registeredTopicFields.length == receivedTopicFields.length) {
|
if (registeredTopicFields.length == receivedTopicFields.length) {
|
||||||
log.info('true');
|
log.debug('topicMatch: true 2');
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log.info('false');
|
log.debug('topicMatch: false 2');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ export abstract class AChainItem extends events.EventEmitter implements Receivab
|
|||||||
}
|
}
|
||||||
|
|
||||||
public send(message : any) : void {
|
public send(message : any) : void {
|
||||||
|
log.info(`Calling ${this.label} with ${message}`)
|
||||||
this.emit('yourturn', message)
|
this.emit('yourturn', message)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +58,7 @@ export abstract class AAsyncBaseChainItem extends AChainItem {
|
|||||||
this.next.begin()
|
this.next.begin()
|
||||||
}
|
}
|
||||||
this.addListener('yourturn', (message : any) : void => {
|
this.addListener('yourturn', (message : any) : void => {
|
||||||
log.info(`Calling ${this.toString()}`)
|
log.info(`Executing ${this.toString()}`)
|
||||||
this.func(message, this.next.send)
|
this.func(message, this.next.send)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -75,7 +76,7 @@ export abstract class ABaseChainItem extends AChainItem {
|
|||||||
this.next.begin()
|
this.next.begin()
|
||||||
}
|
}
|
||||||
this.addListener('yourturn', (message : any) : void => {
|
this.addListener('yourturn', (message : any) : void => {
|
||||||
log.info(`Calling ${this.toString()}`)
|
log.info(`Executing ${this.toString()}`)
|
||||||
let result : any = this.func(message)
|
let result : any = this.func(message)
|
||||||
this.next.send(result)
|
this.next.send(result)
|
||||||
})
|
})
|
||||||
|
@ -29,7 +29,7 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
this.clientMap.forEach((value : ClientEntry, key : string) : void => {
|
this.clientMap.forEach((value : ClientEntry, key : string) : void => {
|
||||||
let currentTime : number = new Date().getTime()
|
let currentTime : number = new Date().getTime()
|
||||||
let elapsedTime : number = currentTime - value.lastEvent
|
let elapsedTime : number = currentTime - value.lastEvent
|
||||||
log.info(`Checking ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`)
|
log.info(`MissingEventProcessor: Checking ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`)
|
||||||
|
|
||||||
if ((value.avgDelay != 0) && (elapsedTime > (value.avgDelay * 3))) {
|
if ((value.avgDelay != 0) && (elapsedTime > (value.avgDelay * 3))) {
|
||||||
log.sendAlarmMail(`Missing Event Detected: ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`)
|
log.sendAlarmMail(`Missing Event Detected: ${key}, elapsed: ${elapsedTime / 1000}, avg. delay: ${value.avgDelay / 1000}`)
|
||||||
@ -40,7 +40,7 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
|
|
||||||
protected process(message : any) : void {
|
protected process(message : any) : void {
|
||||||
let client = message.metadata.client
|
let client = message.metadata.client
|
||||||
log.info(`Event for client ${client}`)
|
log.info(`MissingEventProcessor: Event for client ${client}`)
|
||||||
let currentTime : number = new Date().getTime()
|
let currentTime : number = new Date().getTime()
|
||||||
if (this.clientMap.has(client)) {
|
if (this.clientMap.has(client)) {
|
||||||
let clientEntry = <ClientEntry>this.clientMap.get(client)
|
let clientEntry = <ClientEntry>this.clientMap.get(client)
|
||||||
@ -53,7 +53,7 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
clientEntry.avgDelay = clientEntry.delaySum / clientEntry.count
|
clientEntry.avgDelay = clientEntry.delaySum / clientEntry.count
|
||||||
}
|
}
|
||||||
this.clientMap.set(client, clientEntry)
|
this.clientMap.set(client, clientEntry)
|
||||||
log.info(`Entry for ${client} updated`)
|
log.info(`MissingEventProcessor: Entry for ${client} updated`)
|
||||||
} else {
|
} else {
|
||||||
let clientEntry : ClientEntry = new ClientEntry()
|
let clientEntry : ClientEntry = new ClientEntry()
|
||||||
clientEntry.client = client
|
clientEntry.client = client
|
||||||
@ -63,7 +63,7 @@ class MissingEventProcessor extends Processor.AProcessor {
|
|||||||
clientEntry.delaySum = 0
|
clientEntry.delaySum = 0
|
||||||
clientEntry.avgDelay = 0
|
clientEntry.avgDelay = 0
|
||||||
this.clientMap.set(client, clientEntry)
|
this.clientMap.set(client, clientEntry)
|
||||||
log.info(`Entry for ${client} inserted`)
|
log.info(`MissingEventProcessor: Entry for ${client} inserted`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,21 +104,21 @@ export class MqttDispatcher implements IDispatcher {
|
|||||||
for (let field in registeredTopicFields) {
|
for (let field in registeredTopicFields) {
|
||||||
let regField = registeredTopicFields[field]
|
let regField = registeredTopicFields[field]
|
||||||
let recvField = receivedTopicFields[field]
|
let recvField = receivedTopicFields[field]
|
||||||
log.info(`recv: ${recvField}, reg: ${regField}`)
|
log.debug(`topicMatch: recv: ${recvField}, reg: ${regField}`)
|
||||||
if (regField === "#") {
|
if (regField === "#") {
|
||||||
log.info('true')
|
log.debug('topicMatch: true 1')
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if (regField != recvField && regField != "+") {
|
if (regField != recvField && regField != "+") {
|
||||||
log.info('false')
|
log.debug('topicMatch: false 1')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (registeredTopicFields.length == receivedTopicFields.length) {
|
if (registeredTopicFields.length == receivedTopicFields.length) {
|
||||||
log.info('true')
|
log.debug('topicMatch: true 2')
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
log.info('false')
|
log.debug('topicMatch: false 2')
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user