You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.1 KiB
98 lines
3.1 KiB
const NotificationProvider = require("./notification-provider");
|
|
const axios = require("axios");
|
|
const { UP, DOWN } = require("../../src/util");
|
|
|
|
const opsgenieAlertsUrlEU = "https://api.eu.opsgenie.com/v2/alerts";
|
|
const opsgenieAlertsUrlUS = "https://api.opsgenie.com/v2/alerts";
|
|
let okMsg = "Sent Successfully.";
|
|
|
|
class Opsgenie extends NotificationProvider {
|
|
|
|
name = "Opsgenie";
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
|
let opsgenieAlertsUrl;
|
|
let priority = (!notification.opsgeniePriority) ? 3 : notification.opsgeniePriority;
|
|
const textMsg = "Uptime Kuma Alert";
|
|
|
|
try {
|
|
switch (notification.opsgenieRegion) {
|
|
case "US":
|
|
opsgenieAlertsUrl = opsgenieAlertsUrlUS;
|
|
break;
|
|
case "EU":
|
|
opsgenieAlertsUrl = opsgenieAlertsUrlEU;
|
|
break;
|
|
default:
|
|
opsgenieAlertsUrl = opsgenieAlertsUrlUS;
|
|
}
|
|
|
|
if (heartbeatJSON == null) {
|
|
let notificationTestAlias = "uptime-kuma-notification-test";
|
|
let data = {
|
|
"message": msg,
|
|
"alias": notificationTestAlias,
|
|
"source": "Uptime Kuma",
|
|
"priority": "P5"
|
|
};
|
|
|
|
return this.post(notification, opsgenieAlertsUrl, data);
|
|
}
|
|
|
|
if (heartbeatJSON.status === DOWN) {
|
|
let data = {
|
|
"message": monitorJSON ? textMsg + `: ${monitorJSON.name}` : textMsg,
|
|
"alias": monitorJSON.name,
|
|
"description": msg,
|
|
"source": "Uptime Kuma",
|
|
"priority": `P${priority}`
|
|
};
|
|
|
|
return this.post(notification, opsgenieAlertsUrl, data);
|
|
}
|
|
|
|
if (heartbeatJSON.status === UP) {
|
|
let opsgenieAlertsCloseUrl = `${opsgenieAlertsUrl}/${encodeURIComponent(monitorJSON.name)}/close?identifierType=alias`;
|
|
let data = {
|
|
"source": "Uptime Kuma",
|
|
};
|
|
|
|
return this.post(notification, opsgenieAlertsCloseUrl, data);
|
|
}
|
|
} catch (error) {
|
|
this.throwGeneralAxiosError(error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {BeanModel} notification
|
|
* @param {string} url Request url
|
|
* @param {Object} data Request body
|
|
* @returns {Promise<string>}
|
|
*/
|
|
async post(notification, url, data) {
|
|
let config = {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Authorization": `GenieKey ${notification.opsgenieApiKey}`,
|
|
}
|
|
};
|
|
|
|
let res = await axios.post(url, data, config);
|
|
if (res.status == null) {
|
|
return "Opsgenie notification failed with invalid response!";
|
|
}
|
|
if (res.status < 200 || res.status >= 300) {
|
|
return `Opsgenie notification failed with status code ${res.status}`;
|
|
}
|
|
|
|
return okMsg;
|
|
}
|
|
}
|
|
|
|
module.exports = Opsgenie;
|