]> arthur.barton.de Git - netdata.git/commitdiff
Initial implementation of Discord notifications
authorlowfive <lowfive@subtl.org>
Mon, 23 Jan 2017 05:07:50 +0000 (23:07 -0600)
committerlowfive <lowfive@subtl.org>
Mon, 23 Jan 2017 05:07:50 +0000 (23:07 -0600)
conf.d/health_alarm_notify.conf
plugins.d/alarm-notify.sh

index b838e8024aac83257e72460a5f09beba0bfc9e38..e8e44d73f464691b611f7c609ac46fe0c118ca8a 100644 (file)
@@ -7,6 +7,7 @@
 # - e-mails (using the sendmail command),
 # - push notifications to your mobile phone (pushover.net),
 # - messages to your slack team (slack.com),
+# - messages to your discord guild (discordapp.com),
 # - messages to your telegram chat / group chat (telegram.org)
 # - sms messages to your cell phone or any sms enabled device (twilio.com)
 # - sms messages to your cell phone or any sms enabled device (messagebird.com)
@@ -22,7 +23,7 @@
 # proxy configuration
 #
 # If you need to send curl based notifications (pushover, pushbullet, slack,
-# telegram) via a proxy, set these to your proxy address:
+# discord, telegram) via a proxy, set these to your proxy address:
 #export http_proxy="http://10.0.0.1:3128/"
 #export https_proxy="http://10.0.0.1:3128/"
 
@@ -62,6 +63,7 @@ curl=""
 #  - pushover user tokens
 #  - telegram chat ids
 #  - slack channels
+#  - discord channels
 #  - hipchat rooms
 #  - sms phone numbers
 #  - pagerduty.com (pd) services
@@ -75,6 +77,7 @@ curl=""
 #  pushover   : "2987343...9437837 8756278...2362736|critical"
 #  telegram   : "111827421 112746832|critical"
 #  slack      : "alarms disasters|critical"
+#  discord    : "alarms disasters|critical"
 #  twilio     : "+15555555555 +17777777777|critical"
 #  messagebird: "+15555555555 +17777777777|critical"
 #  pd         : "<pd_service_key_1> <pd_service_key_2>|critical"
@@ -227,6 +230,25 @@ SLACK_WEBHOOK_URL=""
 DEFAULT_RECIPIENT_SLACK=""
 
 
+#------------------------------------------------------------------------------
+# discord (discordapp.com) global notification options
+
+# multiple recipients can be given like this:
+#                  "CHANNEL1 CHANNEL2 ..."
+
+# enable/disable sending discord notifications
+SEND_DISCORD="YES"
+
+# Create a webhook by following the official documentation -
+# https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks
+DISCORD_WEBHOOK_URL=""
+
+# if a role's recipients are not configured, a notification will be send to
+# this discord channel (empty = do not send a notification for unconfigured
+# roles):
+DEFAULT_RECIPIENT_DISCORD=""
+
+
 #------------------------------------------------------------------------------
 # hipchat global notification options
 
@@ -295,6 +317,8 @@ role_recipients_telegram[sysadmin]="${DEFAULT_RECIPIENT_TELEGRAM}"
 
 role_recipients_slack[sysadmin]="${DEFAULT_RECIPIENT_SLACK}"
 
+role_recipients_discord[sysadmin]="${DEFAULT_RECIPIENT_DISCORD}"
+
 role_recipients_hipchat[sysadmin]="${DEFAULT_RECIPIENT_HIPCHAT}"
 
 role_recipients_twilio[sysadmin]="${DEFAULT_RECIPIENT_TWILIO}"
@@ -316,6 +340,8 @@ role_recipients_telegram[domainadmin]="${DEFAULT_RECIPIENT_TELEGRAM}"
 
 role_recipients_slack[domainadmin]="${DEFAULT_RECIPIENT_SLACK}"
 
+role_recipients_discord[domainadmin]="${DEFAULT_RECIPIENT_DISCORD}"
+
 role_recipients_hipchat[domainadmin]="${DEFAULT_RECIPIENT_HIPCHAT}"
 
 role_recipients_twilio[domainadmin]="${DEFAULT_RECIPIENT_TWILIO}"
@@ -338,6 +364,8 @@ role_recipients_telegram[dba]="${DEFAULT_RECIPIENT_TELEGRAM}"
 
 role_recipients_slack[dba]="${DEFAULT_RECIPIENT_SLACK}"
 
+role_recipients_discord[dba]="${DEFAULT_RECIPIENT_DISCORD}"
+
 role_recipients_hipchat[dba]="${DEFAULT_RECIPIENT_HIPCHAT}"
 
 role_recipients_twilio[dba]="${DEFAULT_RECIPIENT_TWILIO}"
@@ -360,6 +388,8 @@ role_recipients_telegram[webmaster]="${DEFAULT_RECIPIENT_TELEGRAM}"
 
 role_recipients_slack[webmaster]="${DEFAULT_RECIPIENT_SLACK}"
 
+role_recipients_discord[webmaster]="${DEFAULT_RECIPIENT_DISCORD}"
+
 role_recipients_hipchat[webmaster]="${DEFAULT_RECIPIENT_HIPCHAT}"
 
 role_recipients_twilio[webmaster]="${DEFAULT_RECIPIENT_TWILIO}"
@@ -382,6 +412,8 @@ role_recipients_telegram[proxyadmin]="${DEFAULT_RECIPIENT_TELEGRAM}"
 
 role_recipients_slack[proxyadmin]="${DEFAULT_RECIPIENT_SLACK}"
 
+role_recipients_discord[proxyadmin]="${DEFAULT_RECIPIENT_DISCORD}"
+
 role_recipients_hipchat[proxyadmin]="${DEFAULT_RECIPIENT_HIPCHAT}"
 
 role_recipients_twilio[proxyadmin]="${DEFAULT_RECIPIENT_TWILIO}"
index d6f3d8b2ad11f04361d95437143aa59dc36ec00d..b54fd556bedd80d3db245be5e8c66433fdf7006a 100755 (executable)
@@ -16,6 +16,7 @@
 # Supported notification methods:
 #  - emails by @ktsaou
 #  - slack.com notifications by @ktsaou
+#  - discordapp.com notifications by @lowfive
 #  - pushover.net notifications by @ktsaou
 #  - pushbullet.com push notifications by Tiago Peralta @tperalta82 PR #1070
 #  - telegram.org notifications by @hashworks PR #1002
@@ -172,6 +173,7 @@ sendmail=
 
 # enable / disable features
 SEND_SLACK="YES"
+SEND_DISCORD="YES"
 SEND_PUSHOVER="YES"
 SEND_TWILIO="YES"
 SEND_HIPCHAT="YES"
@@ -187,6 +189,11 @@ SLACK_WEBHOOK_URL=
 DEFAULT_RECIPIENT_SLACK=
 declare -A role_recipients_slack=()
 
+# discord configs
+DISCORD_WEBHOOK_URL=
+DEFAULT_RECIPIENT_DISCORD=
+declare -A role_recipients_discord=()
+
 # pushover configs
 PUSHOVER_APP_TOKEN=
 DEFAULT_RECIPIENT_PUSHOVER=
@@ -283,6 +290,7 @@ filter_recipient_by_criticality() {
 # find the recipients' addresses per method
 
 declare -A arr_slack=()
+declare -A arr_discord=()
 declare -A arr_pushover=()
 declare -A arr_pushbullet=()
 declare -A arr_twilio=()
@@ -363,6 +371,14 @@ do
         [ "${r}" != "disabled" ] && filter_recipient_by_criticality slack "${r}" && arr_slack[${r/|*/}]="1"
     done
 
+    # discord
+    a="${role_recipients_discord[${x}]}"
+    [ -z "${a}" ] && a="${DEFAULT_RECIPIENT_DISCORD}"
+    for r in ${a//,/ }
+    do
+        [ "${r}" != "disabled" ] && filter_recipient_by_criticality discord "${r}" && arr_discord[${r/|*/}]="1"
+    done
+
     # pagerduty.com
     a="${role_recipients_pd[${x}]}"
     [ -z "${a}" ] && a="${DEFAULT_RECIPIENT_PD}"
@@ -376,6 +392,10 @@ done
 to_slack="${!arr_slack[*]}"
 [ -z "${to_slack}" ] && SEND_SLACK="NO"
 
+# build the list of discord recipients (channels)
+to_discord="${!arr_discord[*]}"
+[ -z "${to_discord}" ] && SEND_DISCORD="NO"
+
 # build the list of pushover recipients (user tokens)
 to_pushover="${!arr_pushover[*]}"
 [ -z "${to_pushover}" ] && SEND_PUSHOVER="NO"
@@ -420,6 +440,9 @@ done
 # check slack
 [ -z "${SLACK_WEBHOOK_URL}" ] && SEND_SLACK="NO"
 
+# check discord
+[ -z "${DISCORD_WEBHOOK_URL}" ] && SEND_DISCORD="NO"
+
 # check pushover
 [ -z "${PUSHOVER_APP_TOKEN}" ] && SEND_PUSHOVER="NO"
 
@@ -459,6 +482,7 @@ fi
 if [ \( \
            "${SEND_PUSHOVER}"    = "YES" \
         -o "${SEND_SLACK}"       = "YES" \
+        -o "${SEND_DISCORD}"       = "YES" \
         -o "${SEND_HIPCHAT}"     = "YES" \
         -o "${SEND_TWILIO}"      = "YES" \
         -o "${SEND_MESSAGEBIRD}" = "YES" \
@@ -476,6 +500,7 @@ if [ \( \
         SEND_PUSHBULLET="NO"
         SEND_TELEGRAM="NO"
         SEND_SLACK="NO"
+        SEND_DISCORD="NO"
         SEND_TWILIO="NO"
         SEND_HIPCHAT="NO"
         SEND_MESSAGEBIRD="NO"
@@ -495,6 +520,7 @@ if [   "${SEND_EMAIL}"          != "YES" \
     -a "${SEND_PUSHOVER}"       != "YES" \
     -a "${SEND_TELEGRAM}"       != "YES" \
     -a "${SEND_SLACK}"          != "YES" \
+    -a "${SEND_DISCORD}"          != "YES" \
     -a "${SEND_TWILIO}"         != "YES" \
     -a "${SEND_HIPCHAT}"        != "YES" \
     -a "${SEND_MESSAGEBIRD}"    != "YES" \
@@ -1008,6 +1034,66 @@ EOF
     return 1
 }
 
+# -----------------------------------------------------------------------------
+# discord sender
+
+send_discord() {
+    local webhook="${1}/slack" channels="${2}" httpcode sent=0 channel color payload
+
+    [ "${SEND_DISCORD}" != "YES" ] && return 1
+
+    case "${status}" in
+        WARNING)  color="warning" ;;
+        CRITICAL) color="danger" ;;
+        CLEAR)    color="good" ;;
+        *)        color="#777777" ;;
+    esac
+
+    for channel in ${channels}
+    do
+        payload="$(cat <<EOF
+        {
+            "channel": "#${channel}",
+            "username": "netdata on ${host}",
+            "text": "${host} ${status_message}, \`${chart}\` (_${family}_), *${alarm}*",
+            "icon_url": "https://discordapp.com/assets/f78426a064bc9dd24847519259bc42af.png",
+            "attachments": [
+                {
+                    "color": "${color}",
+                    "title": "${alarm}",
+                    "title_link": "${goto_url}",
+                    "text": "${info}",
+                    "fields": [
+                        {
+                            "title": "${chart}",
+                            "value": "${family}"
+                        }
+                    ],
+                    "thumb_url": "${image}",
+                    "footer_icon": "${images_base_url}/images/seo-performance-128.png",
+                    "footer": "${host}",
+                    "ts": ${when}
+                }
+            ]
+        }
+EOF
+        )"
+
+        httpcode=$(${curl} --write-out %{http_code} --silent --output /dev/null -X POST --data-urlencode "payload=${payload}" "${webhook}")
+        if [ "${httpcode}" == "200" ]
+        then
+            info "sent discord notification for: ${host} ${chart}.${name} is ${status} to '${channel}'"
+            sent=$((sent + 1))
+        else
+            error "failed to send discord notification for: ${host} ${chart}.${name} is ${status} to '${channel}', with HTTP error code ${httpcode}."
+        fi
+    done
+
+    [ ${sent} -gt 0 ] && return 0
+
+    return 1
+}
+
 
 # -----------------------------------------------------------------------------
 # prepare the content of the notification
@@ -1108,6 +1194,15 @@ raised_for_html=
 send_slack "${SLACK_WEBHOOK_URL}" "${to_slack}"
 SENT_SLACK=$?
 
+# -----------------------------------------------------------------------------
+# send the discord notification
+
+# discord aggregates posts from the same username
+# so we use "${host} ${status}" as the bot username, to make them diff
+
+send_discord "${DISCORD_WEBHOOK_URL}" "${to_discord}"
+SENT_DISCORD=$?
+
 # -----------------------------------------------------------------------------
 # send the pushover notification
 
@@ -1301,6 +1396,7 @@ if [   ${SENT_EMAIL}        -eq 0 \
     -o ${SENT_PUSHOVER}     -eq 0 \
     -o ${SENT_TELEGRAM}     -eq 0 \
     -o ${SENT_SLACK}        -eq 0 \
+    -o ${SENT_DISCORD}      -eq 0 \
     -o ${SENT_TWILIO}       -eq 0 \
     -o ${SENT_HIPCHAT}      -eq 0 \
     -o ${SENT_MESSAGEBIRD}  -eq 0 \
@@ -1315,3 +1411,4 @@ fi
 
 # we did not send anything
 exit 1
+