diff --git a/server/notification-providers/opsgenie.js b/server/notification-providers/opsgenie.js new file mode 100644 index 000000000..16bf9fc60 --- /dev/null +++ b/server/notification-providers/opsgenie.js @@ -0,0 +1,97 @@ +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} + */ + 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; diff --git a/server/notification.js b/server/notification.js index 1897f5cc0..f69e0a384 100644 --- a/server/notification.js +++ b/server/notification.js @@ -23,6 +23,7 @@ const Mattermost = require("./notification-providers/mattermost"); const Ntfy = require("./notification-providers/ntfy"); const Octopush = require("./notification-providers/octopush"); const OneBot = require("./notification-providers/onebot"); +const Opsgenie = require("./notification-providers/opsgenie"); const PagerDuty = require("./notification-providers/pagerduty"); const PagerTree = require("./notification-providers/pagertree"); const PromoSMS = require("./notification-providers/promosms"); @@ -83,6 +84,7 @@ class Notification { new Ntfy(), new Octopush(), new OneBot(), + new Opsgenie(), new PagerDuty(), new PagerTree(), new PromoSMS(), diff --git a/src/components/NotificationDialog.vue b/src/components/NotificationDialog.vue index c3851b568..ce38c90ea 100644 --- a/src/components/NotificationDialog.vue +++ b/src/components/NotificationDialog.vue @@ -129,6 +129,7 @@ export default { "ntfy": "Ntfy", "octopush": "Octopush", "OneBot": "OneBot", + "Opsgenie": "Opsgenie", "PagerDuty": "PagerDuty", "pushbullet": "Pushbullet", "PushByTechulus": "Push by Techulus", diff --git a/src/components/notifications/Opsgenie.vue b/src/components/notifications/Opsgenie.vue new file mode 100644 index 000000000..3f07d0528 --- /dev/null +++ b/src/components/notifications/Opsgenie.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/components/notifications/index.js b/src/components/notifications/index.js index ed9dde0f1..03bdbf410 100644 --- a/src/components/notifications/index.js +++ b/src/components/notifications/index.js @@ -21,6 +21,7 @@ import Mattermost from "./Mattermost.vue"; import Ntfy from "./Ntfy.vue"; import Octopush from "./Octopush.vue"; import OneBot from "./OneBot.vue"; +import Opsgenie from "./Opsgenie.vue"; import PagerDuty from "./PagerDuty.vue"; import PagerTree from "./PagerTree.vue"; import PromoSMS from "./PromoSMS.vue"; @@ -76,6 +77,7 @@ const NotificationFormList = { "ntfy": Ntfy, "octopush": Octopush, "OneBot": OneBot, + "Opsgenie": Opsgenie, "PagerDuty": PagerDuty, "PagerTree": PagerTree, "promosms": PromoSMS,