summaryrefslogtreecommitdiffstats
path: root/health/notifications
diff options
context:
space:
mode:
authorDim-P <Dim-P@users.noreply.github.com>2023-04-10 08:38:51 +0100
committerGitHub <noreply@github.com>2023-04-10 10:38:51 +0300
commit7433c6cde9016f2c37d97be159e2656d8de77fd7 (patch)
tree03642600bfdcab5473aafaebe8b1f452cf0052e8 /health/notifications
parent395ee693499b11ad597e5f5ae23a96523c615591 (diff)
Add support for alert notifications to ntfy.sh (#14875)
Diffstat (limited to 'health/notifications')
-rw-r--r--health/notifications/Makefile.am1
-rwxr-xr-xhealth/notifications/alarm-notify.sh.in64
-rw-r--r--health/notifications/gotify/README.md2
-rwxr-xr-xhealth/notifications/health_alarm_notify.conf25
-rw-r--r--health/notifications/ntfy/Makefile.inc12
-rw-r--r--health/notifications/ntfy/README.md66
6 files changed, 166 insertions, 4 deletions
diff --git a/health/notifications/Makefile.am b/health/notifications/Makefile.am
index f026171a7e..3114abc4ea 100644
--- a/health/notifications/Makefile.am
+++ b/health/notifications/Makefile.am
@@ -37,6 +37,7 @@ include irc/Makefile.inc
include kavenegar/Makefile.inc
include messagebird/Makefile.inc
include msteams/Makefile.inc
+include ntfy/Makefile.inc
include opsgenie/Makefile.inc
include pagerduty/Makefile.inc
include pushbullet/Makefile.inc
diff --git a/health/notifications/alarm-notify.sh.in b/health/notifications/alarm-notify.sh.in
index 0090427a0c..f77d3d750d 100755
--- a/health/notifications/alarm-notify.sh.in
+++ b/health/notifications/alarm-notify.sh.in
@@ -39,6 +39,7 @@
# - Stackpulse Event by @thiagoftsm
# - Opsgenie by @thiaoftsm #9858
# - Gotify by @coffeegrind123
+# - ntfy.sh by @Dim-P
# -----------------------------------------------------------------------------
# testing notifications
@@ -176,6 +177,7 @@ sms
hangouts
dynatrace
matrix
+ntfy
"
# -----------------------------------------------------------------------------
@@ -654,6 +656,9 @@ filter_recipient_by_criticality() {
# check gotify
{ [ -z "${GOTIFY_APP_TOKEN}" ] || [ -z "${GOTIFY_APP_URL}" ]; } && SEND_GOTIFY="NO"
+# check ntfy
+[ -z "${DEFAULT_RECIPIENT_NTFY}" ] && SEND_NTFY="NO"
+
# check stackpulse
[ -z "${STACKPULSE_WEBHOOK}" ] && SEND_STACKPULSE="NO"
@@ -692,7 +697,8 @@ if [ "${SEND_PUSHOVER}" = "YES" ] ||
[ "${SEND_DYNATRACE}" = "YES" ] ||
[ "${SEND_STACKPULSE}" = "YES" ] ||
[ "${SEND_OPSGENIE}" = "YES" ] ||
- [ "${SEND_GOTIFY}" = "YES" ]; then
+ [ "${SEND_GOTIFY}" = "YES" ] ||
+ [ "${SEND_NTFY}" = "YES" ]; then
# if we need curl, check for the curl command
if [ -z "${curl}" ]; then
curl="$(command -v curl 2>/dev/null)"
@@ -723,6 +729,7 @@ if [ "${SEND_PUSHOVER}" = "YES" ] ||
SEND_STACKPULSE="NO"
SEND_OPSGENIE="NO"
SEND_GOTIFY="NO"
+ SEND_NTFY="NO"
fi
fi
@@ -863,7 +870,8 @@ for method in "${SEND_EMAIL}" \
"${SEND_DYNATRACE}" \
"${SEND_STACKPULSE}" \
"${SEND_OPSGENIE}" \
- "${SEND_GOTIFY}" ; do
+ "${SEND_GOTIFY}" \
+ "${SEND_NTFY}" ; do
if [ "${method}" == "YES" ]; then
proceed=1
@@ -2403,6 +2411,50 @@ EOF
}
# -----------------------------------------------------------------------------
+# ntfy sender
+
+send_ntfy() {
+ local httpcode priority recipients=${1} sent=0 msg
+
+ [ "${SEND_NTFY}" != "YES" ] && return 1
+
+ case "${status}" in
+ WARNING) emoji="warning" ;;
+ CRITICAL) emoji="red_circle" ;;
+ CLEAR) emoji="white_check_mark" ;;
+ *) emoji="white_circle" ;;
+ esac
+
+ case ${status} in
+ WARNING) priority="high";;
+ CRITICAL) priority="urgent";;
+ *) priority="default" ;;
+ esac
+
+ for recipient in ${recipients}; do
+ msg="${host} ${status_message}: ${alarm} - ${info}"
+ httpcode=$(docurl -X POST \
+ -H "Icon: https://raw.githubusercontent.com/netdata/netdata/master/web/gui/dashboard/images/favicon-196x196.png" \
+ -H "Title: ${host}: ${name}" \
+ -H "Tags: ${emoji}" \
+ -H "Priority: ${priority}" \
+ -H "Actions: view, View node, ${goto_url}, clear=true;" \
+ -d "${msg}" \
+ ${recipient})
+ if [ "${httpcode}" == "200" ]; then
+ info "sent ntfy notification for: ${host} ${chart}.${name} is ${status} to '${recipient}'"
+ sent=$((sent + 1))
+ else
+ error "failed to send ntfy notification for: ${host} ${chart}.${name} is ${status} to '${recipient}', with HTTP response status code ${httpcode}."
+ fi
+ done
+
+ [ ${sent} -gt 0 ] && return 0
+
+ return 1
+}
+
+# -----------------------------------------------------------------------------
# prepare the content of the notification
# the url to send the user on click
@@ -3609,6 +3661,11 @@ send_gotify
SENT_GOTIFY=$?
# -----------------------------------------------------------------------------
+# send messages to ntfy
+send_ntfy "${DEFAULT_RECIPIENT_NTFY}"
+SENT_NTFY=$?
+
+# -----------------------------------------------------------------------------
# let netdata know
for state in "${SENT_EMAIL}" \
"${SENT_PUSHOVER}" \
@@ -3638,7 +3695,8 @@ for state in "${SENT_EMAIL}" \
"${SENT_DYNATRACE}" \
"${SENT_STACKPULSE}" \
"${SENT_OPSGENIE}" \
- "${SENT_GOTIFY}"; do
+ "${SENT_GOTIFY}" \
+ "${SENT_NTFY}"; do
if [ "${state}" -eq 0 ]; then
# we sent something
exit 0
diff --git a/health/notifications/gotify/README.md b/health/notifications/gotify/README.md
index 4bd50ebcad..4f6760f644 100644
--- a/health/notifications/gotify/README.md
+++ b/health/notifications/gotify/README.md
@@ -32,7 +32,7 @@ You will need:
Edit `health_alarm_notify.conf`, changes to this file do not require restarting Netdata:
-1. Set `SET_GOTIFY` to `YES`
+1. Set `SEND_GOTIFY` to `YES`
2. Set `GOTIFY_APP_TOKEN` to the app token you generated
3. `GOTIFY_APP_URL` to point to your Gotify instance, for example `https://push.example.domain/`
diff --git a/health/notifications/health_alarm_notify.conf b/health/notifications/health_alarm_notify.conf
index 4878661aaf..b7fa6e7968 100755
--- a/health/notifications/health_alarm_notify.conf
+++ b/health/notifications/health_alarm_notify.conf
@@ -22,6 +22,7 @@
# - message to Microsoft Teams (through webhook)
# - message to Rocket.Chat (through webhook)
# - message to Google Hangouts Chat (through webhook)
+# - push notifications to your mobile phone or desktop (ntfy.sh)
#
# The 'to' line given at netdata alarms defines a *role*, so that many
# people can be notified for each role.
@@ -854,6 +855,18 @@ MATRIX_ACCESSTOKEN=
DEFAULT_RECIPIENT_MATRIX=""
#------------------------------------------------------------------------------
+# ntfy.sh global notification options
+
+# enable/disable sending ntfy notifications
+SEND_NTFY="YES"
+
+# if a role's recipients are not configured, a notification will be sent to
+# this ntfy server / topic combination (empty = do not send a notification for
+# unconfigured roles).
+# Multiple recipients can be given like this: "https://SERVER1/TOPIC1 https://SERVER2/TOPIC2 ..."
+DEFAULT_RECIPIENT_NTFY=""
+
+#------------------------------------------------------------------------------
# custom notifications
#
@@ -997,6 +1010,8 @@ role_recipients_stackpulse[sysadmin]="${DEFAULT_RECIPIENT_STACKPULSE}"
role_recipients_gotify[sysadmin]="${DEFAULT_RECIPIENT_GOTIFY}"
+role_recipients_ntfy[sysadmin]="${DEFAULT_RECIPIENT_NTFY}"
+
# -----------------------------------------------------------------------------
# DNS related alarms
@@ -1056,6 +1071,8 @@ role_recipients_stackpulse[domainadmin]="${DEFAULT_RECIPIENT_STACKPULSE}"
role_recipients_gotify[domainadmin]="${DEFAULT_RECIPIENT_GOTIFY}"
+role_recipients_ntfy[domainadmin]="${DEFAULT_RECIPIENT_NTFY}"
+
# -----------------------------------------------------------------------------
# database servers alarms
# mysql, redis, memcached, postgres, etc
@@ -1116,6 +1133,8 @@ role_recipients_stackpulse[dba]="${DEFAULT_RECIPIENT_STACKPULSE}"
role_recipients_gotify[dba]="${DEFAULT_RECIPIENT_GOTIFY}"
+role_recipients_ntfy[dba]="${DEFAULT_RECIPIENT_NTFY}"
+
# -----------------------------------------------------------------------------
# web servers alarms
# apache, nginx, lighttpd, etc
@@ -1176,6 +1195,8 @@ role_recipients_stackpulse[webmaster]="${DEFAULT_RECIPIENT_STACKPULSE}"
role_recipients_gotify[webmaster]="${DEFAULT_RECIPIENT_GOTIFY}"
+role_recipients_ntfy[webmaster]="${DEFAULT_RECIPIENT_NTFY}"
+
# -----------------------------------------------------------------------------
# proxy servers alarms
# squid, etc
@@ -1236,6 +1257,8 @@ role_recipients_stackpulse[proxyadmin]="${DEFAULT_RECIPIENT_STACKPULSE}"
role_recipients_gotify[proxyadmin]="${DEFAULT_RECIPIENT_GOTIFY}"
+role_recipients_ntfy[proxyadmin]="${DEFAULT_RECIPIENT_NTFY}"
+
# -----------------------------------------------------------------------------
# peripheral devices
# UPS, photovoltaics, etc
@@ -1293,3 +1316,5 @@ role_recipients_matrix[sitemgr]="${DEFAULT_RECIPIENT_MATRIX}"
role_recipients_stackpulse[sitemgr]="${DEFAULT_RECIPIENT_STACKPULSE}"
role_recipients_gotify[sitemgr]="${DEFAULT_RECIPIENT_GOTIFY}"
+
+role_recipients_ntfy[sitemgr]="${DEFAULT_RECIPIENT_NTFY}"
diff --git a/health/notifications/ntfy/Makefile.inc b/health/notifications/ntfy/Makefile.inc
new file mode 100644
index 0000000000..b2045192cf
--- /dev/null
+++ b/health/notifications/ntfy/Makefile.inc
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# THIS IS NOT A COMPLETE Makefile
+# IT IS INCLUDED BY ITS PARENT'S Makefile.am
+# IT IS REQUIRED TO REFERENCE ALL FILES RELATIVE TO THE PARENT
+
+# install these files
+dist_noinst_DATA += \
+ ntfy/README.md \
+ ntfy/Makefile.inc \
+ $(NULL)
+
diff --git a/health/notifications/ntfy/README.md b/health/notifications/ntfy/README.md
new file mode 100644
index 0000000000..bc33d3cfcd
--- /dev/null
+++ b/health/notifications/ntfy/README.md
@@ -0,0 +1,66 @@
+# Ntfy agent alert notifications
+
+Learn how to send alerts to an ntfy server using Netdata's Agent alert notification feature, which supports dozens of endpoints, user roles, and more.
+
+> ### Note
+>
+> This file assumes you have read the [Introduction to Agent alert notifications](https://github.com/netdata/netdata/blob/master/health/notifications/README.md), detailing how the Netdata Agent's alert notification method works.
+
+[Ntfy](https://ntfy.sh/) (pronounce: notify) is a simple HTTP-based [pub-sub](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) notification service. It allows you to send notifications to your phone or desktop via scripts from any computer, entirely without signup, cost or setup. It's also [open source](https://github.com/binwiederhier/ntfy) if you want to run your own server.
+
+This is what you will get:
+
+<img src="https://user-images.githubusercontent.com/5953192/230661442-a180abe2-c8bd-496e-88be-9038e62fb4f7.png" alt="Example alarm notifications in Ntfy" width="60%"></img>
+
+## Prerequisites
+
+You will need:
+
+- (Optional) A [self-hosted ntfy server](https://docs.ntfy.sh/faq/#can-i-self-host-it), in case you don't want to use https://ntfy.sh
+- A new [topic](https://ntfy.sh/#subscribe) for the notifications to be published to
+- terminal access to the Agent you wish to configure
+
+## Configure Netdata to send alert notifications to Ntfy
+
+> ### Info
+>
+> This file mentions editing configuration files.
+>
+> - To edit configuration files in a safe way, we provide the [`edit config` script](https://github.com/netdata/netdata/blob/master/docs/configure/nodes.md#use-edit-config-to-edit-configuration-files) located in your [Netdata config directory](https://github.com/netdata/netdata/blob/master/docs/configure/nodes.md#the-netdata-config-directory) (typically is `/etc/netdata`) that creates the proper file and opens it in an editor automatically.
+> Note that to run the script you need to be inside your Netdata config directory.
+>
+> It is recommended to use this way for configuring Netdata.
+
+Edit `health_alarm_notify.conf`, changes to this file do not require restarting Netdata:
+
+1. Set `SEND_NTFY` to `YES`
+2. Set `DEFAULT_RECIPIENT_NTFY` to the URL formed by the server-topic combination you want the alert notifications to be sent to. Unless you are hosting your own server, the server should always be set to [https://ntfy.sh](https://ntfy.sh)
+
+ You can define multiple recipient URLs like this: `https://SERVER1/TOPIC1 https://SERVER2/TOPIC2`
+ All roles will default to this variable if left unconfigured.
+
+> ### Warning
+> All topics published on https://ntfy.sh are public, so anyone can subscribe to them and follow your notifications. To avoid that, ensure the topic is unique enough using a long, randomly generated ID, like in the following examples.
+>
+
+An example of a working configuration with two topics as recipients, using the [https://ntfy.sh](https://ntfy.sh) server would be:
+
+```conf
+SEND_NTFY="YES"
+DEFAULT_RECIPIENT_NTFY="https://ntfy.sh/netdata-X7seHg7d3Tw9zGOk https://ntfy.sh/netdata-oIPm4IK1IlUtlA30"
+```
+
+You can then have different servers and/or topics per **role**, by editing `DEFAULT_RECIPIENT_NTFY` with the server-topic combination you want, in the following entries at the bottom of the same file:
+
+```conf
+role_recipients_ntfy[sysadmin]="https://SERVER1/TOPIC1"
+role_recipients_ntfy[domainadmin]="https://SERVER2/TOPIC2"
+role_recipients_ntfy[dba]="https://SERVER3/TOPIC3"
+role_recipients_ntfy[webmaster]="https://SERVER4/TOPIC4"
+role_recipients_ntfy[proxyadmin]="https://SERVER5/TOPIC5"
+role_recipients_ntfy[sitemgr]="https://SERVER6/TOPIC6"
+```
+
+## Test the notification method
+
+To test this alert refer to the ["Testing Alert Notifications"](https://github.com/netdata/netdata/blob/master/health/notifications/README.md#testing-alert-notifications) section of the Agent alert notifications page.