mirror of
https://github.com/smartyellow/status.git
synced 2024-11-22 10:37:34 +01:00
142 lines
4.2 KiB
JavaScript
142 lines
4.2 KiB
JavaScript
'use strict';
|
|
|
|
const { makeId } = require('core/makeid');
|
|
|
|
async function processOutage({ outage, server, settings, onDateUpdated }) {
|
|
if (typeof onDateUpdated !== 'function') {
|
|
onDateUpdated = () => null;
|
|
}
|
|
|
|
for (const [ id, testResult ] of Object.entries(outage)) {
|
|
// Update check date
|
|
server.storage.store('smartyellow/webservice').update(
|
|
{ id },
|
|
{ $set: { lastChecked: new Date() } }
|
|
).then(() => onDateUpdated(id));
|
|
|
|
// Get service entry
|
|
const service = await server
|
|
.storage
|
|
.store('smartyellow/webservice')
|
|
.findOne({ id });
|
|
|
|
// Get last heartbeat
|
|
const heartbeat = await server
|
|
.storage
|
|
.store('smartyellow/webserviceheartbeat')
|
|
.find({ webservice: id })
|
|
.toArray();
|
|
const lastBeat = heartbeat[heartbeat.length - 1];
|
|
|
|
// Encountered an error while checking status
|
|
if (testResult.error) {
|
|
server.error('Error while checking status of ' + id);
|
|
server.error(testResult);
|
|
}
|
|
|
|
// Service is down
|
|
else if (!testResult.serviceUp) {
|
|
// Don't perform automatic actions if already done
|
|
if ((lastBeat && lastBeat.down == false) || !lastBeat) {
|
|
// Insert heartbeat if last one is not valid anymore
|
|
try {
|
|
server.storage.store('smartyellow/webserviceheartbeat').insert({
|
|
id: makeId(10),
|
|
down: true,
|
|
webservice: id,
|
|
testResult,
|
|
date: new Date(),
|
|
});
|
|
}
|
|
catch (err) {
|
|
server.error('could not save web service heartbeat');
|
|
server.error(err);
|
|
}
|
|
|
|
// Send e-mail notification
|
|
if (server.sendEmail && settings.emailSender && settings.emailRecipient) {
|
|
try {
|
|
const date = new Date().toLocaleString('en-GB', {
|
|
dateStyle: 'full',
|
|
timeStyle: 'full',
|
|
timeZone: 'Etc/UTC',
|
|
});
|
|
const a = await server.sendEmail({
|
|
sender: settings.emailSender,
|
|
to: settings.emailRecipient,
|
|
subject: `[outage] ${service.name} is down`,
|
|
body: `Dear recipient,
|
|
|
|
As of ${date} UTC time, the service "${service.name}" does not meet the requirements for being
|
|
considered as working.
|
|
|
|
Technical information containing the reason for this alert:
|
|
${JSON.stringify(testResult, null, 2)}
|
|
|
|
Please always check this before taking action. This is an automated message.`,
|
|
});
|
|
console.log(a);
|
|
}
|
|
catch (err) {
|
|
server.error('could not send endpoint status notification e-mail');
|
|
server.error(err);
|
|
}
|
|
}
|
|
|
|
// Draft outage entry
|
|
if (settings.draftOutageEntries) {
|
|
try {
|
|
server
|
|
.storage
|
|
.store('smartyellow/webserviceoutage')
|
|
.insert({
|
|
id: makeId(),
|
|
name: {
|
|
en: `[automatic] Outage for ${service.name.en}`,
|
|
},
|
|
state: 'concept',
|
|
resolved: false,
|
|
services: [ service.id ],
|
|
tags: [ 'automatically created' ],
|
|
notes: [ {
|
|
date: new Date(),
|
|
userId: 'system',
|
|
text: `Automatically created outage. Reason: ${JSON.stringify(testResult, null, 2)}`,
|
|
} ],
|
|
});
|
|
}
|
|
catch (err) {
|
|
server.error('could not automatically draft outage entry');
|
|
server.error(err);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Service up
|
|
else {
|
|
// Don't perform automatic actions if already done
|
|
if ((lastBeat && lastBeat.down == true) || !lastBeat) {
|
|
// Insert heartbeat if last one is not valid anymore
|
|
try {
|
|
await server.storage.store('smartyellow/webserviceheartbeat').insert({
|
|
id: makeId(10),
|
|
down: false,
|
|
webservice: id,
|
|
testResult,
|
|
date: new Date(),
|
|
});
|
|
}
|
|
catch (err) {
|
|
server.error('could not save web service heartbeat');
|
|
server.error(err);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
module.exports = { processOutage };
|