From: Costa Tsaousis Date: Thu, 15 Dec 2016 22:43:53 +0000 (+0200) Subject: Merge pull request #1373 from jimcooley/master X-Git-Tag: v1.5.0~129 X-Git-Url: https://arthur.barton.de/gitweb/?a=commitdiff_plain;h=f23c73a32b17c27a39ec2f0858fb5645c2f005ec;hp=b7536fbae200e9074806d4c1b8cd8440a3d66565;p=netdata.git Merge pull request #1373 from jimcooley/master pagerduty.com notifications --- diff --git a/conf.d/health_alarm_notify.conf b/conf.d/health_alarm_notify.conf index aa73c948..dea4ea05 100644 --- a/conf.d/health_alarm_notify.conf +++ b/conf.d/health_alarm_notify.conf @@ -9,6 +9,7 @@ # - messages to your slack team (slack.com), # - messages to your telegram chat / group chat (telegram.org) # - sms messages to your cell phone or any sms enabled device (twilio.com) +# - notifications to users on pagerduty.com # # The 'to' line given at netdata alarms defines a *role*, so that many # people can be notified for each role. @@ -62,6 +63,7 @@ curl="" # - telegram chat ids # - slack channels # - sms phone numbers +# - pagerduty.com (pd) services # # You can append |critical to limit the notifications to be sent. # @@ -73,9 +75,10 @@ curl="" # telegram: "111827421 112746832|critical" # slack : "alarms disasters|critical" # twilio : "+15555555555 +17777777777|critical" +# pd : " |critical" # # If a recipient is set to empty string, the default recipient of the given -# notification method (email, pushover, telegram, slack) will be used. +# notification method (email, pushover, telegram, slack, pd) will be used. # To disable a notification, use the recipient called: disabled # This works for all notification methods (including the default recipients). @@ -212,6 +215,25 @@ KAFKA_URL="" KAFKA_SENDER_IP="" +#------------------------------------------------------------------------------ +# pagerduty.com notification options +# +# pagerduty.com notifications require the pagerduty agent to be installed and +# a "Generic API" pagerduty service. +# https://www.pagerduty.com/docs/guides/agent-install-guide/ + +# multiple recipients can be given like this: +# " ..." + +# enable/disable sending pagerduty notifications +SEND_PD="YES" + +# if a role's recipients are not configured, a notification will be sent to +# the "General API" pagerduty.com service that uses this service key. +# (empty = do not send a notification for unconfigured roles): +DEFAULT_RECIPIENT_PD="" + + ############################################################################### # RECIPIENTS PER ROLE @@ -231,6 +253,8 @@ role_recipients_slack[sysadmin]="${DEFAULT_RECIPIENT_SLACK}" role_recipients_twilio[sysadmin]="${DEFAULT_RECIPIENT_TWILIO}" +role_recipients_pd[sysadmin]="${DEFAULT_RECIPIENT_PD}" + # ----------------------------------------------------------------------------- # DNS related alarms @@ -246,6 +270,8 @@ role_recipients_slack[domainadmin]="${DEFAULT_RECIPIENT_SLACK}" role_recipients_twilio[domainadmin]="${DEFAULT_RECIPIENT_TWILIO}" +role_recipients_pd[domainadmin]="${DEFAULT_RECIPIENT_PD}" + # ----------------------------------------------------------------------------- # database servers alarms # mysql, redis, memcached, etc @@ -262,6 +288,8 @@ role_recipients_slack[dba]="${DEFAULT_RECIPIENT_SLACK}" role_recipients_twilio[dba]="${DEFAULT_RECIPIENT_TWILIO}" +role_recipients_pd[dba]="${DEFAULT_RECIPIENT_PD}" + # ----------------------------------------------------------------------------- # web servers alarms # apache, nginx, etc @@ -278,6 +306,8 @@ role_recipients_slack[webmaster]="${DEFAULT_RECIPIENT_SLACK}" role_recipients_twilio[webmaster]="${DEFAULT_RECIPIENT_TWILIO}" +role_recipients_pd[webmaster]="${DEFAULT_RECIPIENT_PD}" + # ----------------------------------------------------------------------------- # proxy servers alarms # apache, nginx, etc @@ -293,3 +323,5 @@ role_recipients_telegram[proxyadmin]="${DEFAULT_RECIPIENT_TELEGRAM}" role_recipients_slack[proxyadmin]="${DEFAULT_RECIPIENT_SLACK}" role_recipients_twilio[proxyadmin]="${DEFAULT_RECIPIENT_TWILIO}" + +role_recipients_pd[proxyadmin]="${DEFAULT_RECIPIENT_PD}" diff --git a/plugins.d/alarm-notify.sh b/plugins.d/alarm-notify.sh index 17b009c9..9f5ca1b0 100755 --- a/plugins.d/alarm-notify.sh +++ b/plugins.d/alarm-notify.sh @@ -21,6 +21,7 @@ # - telegram.org notifications by @hashworks PR #1002 # - twilio.com notifications by Levi Blaney @shadycuz PR #1211 # - kafka notifications +# - pagerduty.com notifications by Jim Cooley @jimcooley PR #1373 # ----------------------------------------------------------------------------- # testing notifications @@ -175,6 +176,7 @@ SEND_TELEGRAM="YES" SEND_EMAIL="YES" SEND_PUSHBULLET="YES" SEND_KAFKA="YES" +SEND_PD="YES" # slack configs SLACK_WEBHOOK_URL= @@ -207,6 +209,10 @@ declare -A role_recipients_telegram=() KAFKA_URL= KAFKA_SENDER_IP= +# pagerduty.com configs +PD_SERVICE_KEY= +declare -A role_recipients_pd=() + # email configs DEFAULT_RECIPIENT_EMAIL="root" declare -A role_recipients_email=() @@ -266,6 +272,7 @@ declare -A arr_pushover=() declare -A arr_pushbullet=() declare -A arr_twilio=() declare -A arr_telegram=() +declare -A arr_pd=() declare -A arr_email=() # netdata may call us with multiple roles, and roles may have multiple but @@ -323,6 +330,14 @@ do do [ "${r}" != "disabled" ] && filter_recipient_by_criticality slack "${r}" && arr_slack[${r/|*/}]="1" done + + # pagerduty.com + a="${role_recipients_pd[${x}]}" + [ -z "${a}" ] && a="${DEFAULT_RECIPIENT_PD}" + for r in ${a//,/ } + do + [ "${r}" != "disabled" ] && filter_recipient_by_criticality pd "${r}" && arr_pd[${r/|*/}]="1" + done done # build the list of slack recipients (channels) @@ -345,6 +360,10 @@ to_twilio="${!arr_twilio[*]}" to_telegram="${!arr_telegram[*]}" [ -z "${to_telegram}" ] && SEND_TELEGRAM="NO" +# build the list of pagerduty recipients (service keys) +to_pd="${!arr_pd[*]}" +[ -z "${to_pd}" ] && SEND_PD="NO" + # build the list of email recipients (email addresses) to_email= for x in "${!arr_email[@]}" @@ -376,6 +395,20 @@ done # check kafka [ -z "${KAFKA_URL}" -o -z "${KAFKA_SENDER_IP}" ] && SEND_KAFKA="NO" +# check pagerduty.com +# if we need pd-send, check for the pd-send command +# https://www.pagerduty.com/docs/guides/agent-install-guide/ +if [ "${SEND_PD}" = "YES" ] + then + pd_send="$(which pd-send 2>/dev/null || command -v pd-send 2>/dev/null)" + if [ -z "${pd_send}" ] + then + # no pd-send available + # disable pagerduty.com + SEND_PD="NO" + fi +fi + # if we need curl, check for the curl command if [ \( "${SEND_PUSHOVER}" = "YES" -o "${SEND_SLACK}" = "YES" -o "${SEND_TWILIO}" = "YES" -o "${SEND_TELEGRAM}" = "YES" -o "${SEND_PUSHBULLET}" = "YES" -o "${SEND_KAFKA}" = "YES" \) -a -z "${curl}" ] then @@ -408,9 +441,10 @@ if [ "${SEND_EMAIL}" != "YES" \ -a "${SEND_TWILIO}" != "YES" \ -a "${SEND_PUSHBULLET}" != "YES" \ -a "${SEND_KAFKA}" != "YES" \ + -a "${SEND_PD}" != "YES" \ ] then - fatal "All notification methods are disabled. Not sending notification to '${role}' for '${name}' = '${value}' of chart '${chart}' for status '${status}'." + fatal "All notification methods are disabled. Not sending notification to '${roles}' for '${name}' = '${value}' of chart '${chart}' for status '${status}'." fi # ----------------------------------------------------------------------------- @@ -638,6 +672,62 @@ send_kafka() { return 1 } +# ----------------------------------------------------------------------------- +# pagerduty.com sender + +send_pd() { + local recipients="${1}" sent=0 + unset t + case ${status} in + CLEAR) t='resolve';; + WARNING) t='trigger';; + CRITICAL) t='trigger';; + esac + + if [ ${SEND_PD} = "YES" -a ! -z "${t}" ] + then + for PD_SERVICE_KEY in ${recipients} + do + d="${status} ${name}=${value} ${units} - ${host}, ${family}" + ${pd_send} -k ${PD_SERVICE_KEY} \ + -t ${t} \ + -d "${d}" \ + -i ${alarm_id} \ + -f 'info'="${info}" \ + -f 'value_w_units'="${value} ${units}" \ + -f 'when'="${when}" \ + -f 'duration'="${duration}" \ + -f 'roles'="${roles}" \ + -f 'host'="${host}" \ + -f 'unique_id'="${unique_id}" \ + -f 'alarm_id'="${alarm_id}" \ + -f 'event_id'="${event_id}" \ + -f 'name'="${name}" \ + -f 'chart'="${chart}" \ + -f 'family'="${family}" \ + -f 'status'="${status}" \ + -f 'old_status'="${old_status}" \ + -f 'value'="${value}" \ + -f 'old_value'="${old_value}" \ + -f 'src'="${src}" \ + -f 'non_clear_duration'="${non_clear_duration}" \ + -f 'units'="${units}" + retval=$? + if [ ${retval} -eq 0 ] + then + info "sent pagerduty.com notification using service key ${PD_SERVICE_KEY::-26}....: ${d}" + sent=$((sent + 1)) + else + error "failed to send pagerduty.com notification using service key ${PD_SERVICE_KEY::-26}.... (error code ${retval}): ${d}" + fi + done + + [ ${sent} -gt 0 ] && return 0 + fi + + return 1 +} + # ----------------------------------------------------------------------------- # twilio sender @@ -928,6 +1018,13 @@ send_kafka SENT_KAFKA=$? +# ----------------------------------------------------------------------------- +# send the pagerduty.com message + +send_pd "${to_pd}" +SENT_PD=$? + + # ----------------------------------------------------------------------------- # send the email @@ -1033,6 +1130,7 @@ if [ ${SENT_EMAIL} -eq 0 \ -o ${SENT_TWILIO} -eq 0 \ -o ${SENT_PUSHBULLET} -eq 0 \ -o ${SENT_KAFKA} -eq 0 \ + -o ${SENT_PD} -eq 0 \ ] then # we did send something