summaryrefslogtreecommitdiffstats
path: root/server/notification-providers/pagerduty.js
diff options
context:
space:
mode:
Diffstat (limited to 'server/notification-providers/pagerduty.js')
-rw-r--r--server/notification-providers/pagerduty.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/server/notification-providers/pagerduty.js b/server/notification-providers/pagerduty.js
new file mode 100644
index 0000000..c60d782
--- /dev/null
+++ b/server/notification-providers/pagerduty.js
@@ -0,0 +1,114 @@
+const NotificationProvider = require("./notification-provider");
+const axios = require("axios");
+const { UP, DOWN, getMonitorRelativeURL } = require("../../src/util");
+const { setting } = require("../util-server");
+let successMessage = "Sent Successfully.";
+
+class PagerDuty extends NotificationProvider {
+ name = "PagerDuty";
+
+ /**
+ * @inheritdoc
+ */
+ async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
+ try {
+ if (heartbeatJSON == null) {
+ const title = "Uptime Kuma Alert";
+ const monitor = {
+ type: "ping",
+ url: "Uptime Kuma Test Button",
+ };
+ return this.postNotification(notification, title, msg, monitor);
+ }
+
+ if (heartbeatJSON.status === UP) {
+ const title = "Uptime Kuma Monitor ✅ Up";
+ const eventAction = notification.pagerdutyAutoResolve || null;
+
+ return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, eventAction);
+ }
+
+ if (heartbeatJSON.status === DOWN) {
+ const title = "Uptime Kuma Monitor 🔴 Down";
+ return this.postNotification(notification, title, heartbeatJSON.msg, monitorJSON, "trigger");
+ }
+ } catch (error) {
+ this.throwGeneralAxiosError(error);
+ }
+ }
+
+ /**
+ * Check if result is successful, result code should be in range 2xx
+ * @param {object} result Axios response object
+ * @returns {void}
+ * @throws {Error} The status code is not in range 2xx
+ */
+ checkResult(result) {
+ if (result.status == null) {
+ throw new Error("PagerDuty notification failed with invalid response!");
+ }
+ if (result.status < 200 || result.status >= 300) {
+ throw new Error("PagerDuty notification failed with status code " + result.status);
+ }
+ }
+
+ /**
+ * Send the message
+ * @param {BeanModel} notification Message title
+ * @param {string} title Message title
+ * @param {string} body Message
+ * @param {object} monitorInfo Monitor details (For Up/Down only)
+ * @param {?string} eventAction Action event for PagerDuty (trigger, acknowledge, resolve)
+ * @returns {Promise<string>} Success message
+ */
+ async postNotification(notification, title, body, monitorInfo, eventAction = "trigger") {
+
+ if (eventAction == null) {
+ return "No action required";
+ }
+
+ let monitorUrl;
+ if (monitorInfo.type === "port") {
+ monitorUrl = monitorInfo.hostname;
+ if (monitorInfo.port) {
+ monitorUrl += ":" + monitorInfo.port;
+ }
+ } else if (monitorInfo.hostname != null) {
+ monitorUrl = monitorInfo.hostname;
+ } else {
+ monitorUrl = monitorInfo.url;
+ }
+
+ const options = {
+ method: "POST",
+ url: notification.pagerdutyIntegrationUrl,
+ headers: { "Content-Type": "application/json" },
+ data: {
+ payload: {
+ summary: `[${title}] [${monitorInfo.name}] ${body}`,
+ severity: notification.pagerdutyPriority || "warning",
+ source: monitorUrl,
+ },
+ routing_key: notification.pagerdutyIntegrationKey,
+ event_action: eventAction,
+ dedup_key: "Uptime Kuma/" + monitorInfo.id,
+ }
+ };
+
+ const baseURL = await setting("primaryBaseURL");
+ if (baseURL && monitorInfo) {
+ options.client = "Uptime Kuma";
+ options.client_url = baseURL + getMonitorRelativeURL(monitorInfo.id);
+ }
+
+ let result = await axios.request(options);
+ this.checkResult(result);
+ if (result.statusText != null) {
+ return "PagerDuty notification succeed: " + result.statusText;
+ }
+
+ return successMessage;
+ }
+}
+
+module.exports = PagerDuty;