#!/usr/bin/env bash me="${0}" sendmail="$(which sendmail 2>/dev/null || command -v sendmail 2>/dev/null)" if [ -z "${sendmail}" ] then echo >&2 "I cannot send emails - there is no sendmail command available." fi sendmail_from_pipe() { "${sendmail}" -t if [ $? -eq 0 ] then echo >&2 "${me}: Sent notification email for ${status} on '${chart}.${name}'" return 0 else echo >&2 "${me}: FAILED to send notification email for ${status} on '${chart}.${name}'" return 1 fi } name="${1}" # the name of the alarm, as given in netdata health.d entries chart="${2}" # the name of the chart (type.id) family="${3}" # the family of the chart status="${4}" # the current status : UNITIALIZED, UNDEFINED, CLEAR, WARNING, CRITICAL old_status="${5}" # the previous status: UNITIALIZED, UNDEFINED, CLEAR, WARNING, CRITICAL value="${6}" # the current value old_value="${7}" # the previous value src="${8}" # the line number and file the alarm has been configured duration="${9}" # the duration in seconds the previous state took non_clear_duration="${10}" # the total duration in seconds this is non-clear units="${11}" # the units of the value info="${12}" # a short description of the alarm [ ! -z "${info}" ] && info="
${info}
" # get the system hostname hostname="${NETDATA_HOSTNAME}" [ -z "${hostname}" ] && hostname="${NETDATA_REGISTRY_HOSTNAME}" [ -z "${hostname}" ] && hostname="$(hostname)" goto_url="${NETDATA_REGISTRY_URL}/goto-host-from-alarm.html?machine_guid=${NETDATA_REGISTRY_UNIQUE_ID}&chart=${chart}&family=${family}" # get the current date date="$(date)" duration4human() { local s="${1}" d=0 h=0 m=0 ds="day" hs="hour" ms="minute" ss="second" d=$(( s / 86400 )) s=$(( s - (d * 86400) )) h=$(( s / 3600 )) s=$(( s - (h * 3600) )) m=$(( s / 60 )) s=$(( s - (m * 60) )) if [ ${d} -gt 0 ] then [ ${m} -ge 30 ] && h=$(( h + 1 )) [ ${d} -gt 1 ] && ds="days" [ ${h} -gt 1 ] && hs="hours" if [ ${h} -gt 0 ] then echo "${d} ${ds} and ${h} ${hs}" else echo "${d} ${ds}" fi elif [ ${h} -gt 0 ] then [ ${s} -ge 30 ] && m=$(( m + 1 )) [ ${h} -gt 1 ] && hs="hours" [ ${m} -gt 1 ] && ms="minutes" if [ ${m} -gt 0 ] then echo "${h} ${hs} and ${m} ${ms}" else echo "${h} ${hs}" fi elif [ ${m} -gt 0 ] then [ ${m} -gt 1 ] && ms="minutes" [ ${s} -gt 1 ] && ss="seconds" if [ ${s} -gt 0 ] then echo "${m} ${ms} and ${s} ${ss}" else echo "${m} ${ms}" fi else [ ${s} -gt 1 ] && ss="seconds" echo "${s} ${ss}" fi } severity="${status}" raised_for="
(was ${old_status,,} for $(duration4human ${duration}))" status_message="status unknown" color="grey" alarm="${name} = ${value} ${units}" # prepare the title based on status case "${status}" in CRITICAL) status_message="is critical" color="#ca414b" ;; WARNING) status_message="needs attention" color="#caca4b" ;; CLEAR) status_message="recovered" color="#77ca6d" # don't show the value when the status is CLEAR # for certain alarms, this value might not have any meaning alarm="${name}" ;; esac if [ "${status}" != "WARNING" -a "${status}" != "CRITICAL" -a "${status}" != "CLEAR" ] then # don't do anything if this is not WARNING, CRITICAL or CLEAR echo >&2 "${me}: not sending notification email for ${status} on '${chart}.${name}'" exit 0 elif [ "${old_status}" != "WARNING" -a "${old_status}" != "CRITICAL" -a "${status}" = "CLEAR" ] then # don't do anything if this is CLEAR, but it was not WARNING or CRITICAL echo >&2 "${me}: not sending notification email for ${status} on '${chart}.${name}' (last status was ${old_status})" exit 0 elif [ "${status}" = "CLEAR" ] then severity="Recovered from ${old_status}" if [ $non_clear_duration -gt $duration ] then raised_for="
(had issues for $(duration4human ${non_clear_duration}))" fi elif [ "${old_status}" = "WARNING" -a "${status}" = "CRITICAL" ] then severity="Escalated to ${status}" if [ $non_clear_duration -gt $duration ] then raised_for="
(has issues for $(duration4human ${non_clear_duration}))" fi elif [ "${old_status}" = "CRITICAL" -a "${status}" = "WARNING" ] then severity="Demoted to ${status}" if [ $non_clear_duration -gt $duration ] then raised_for="
(has issues for $(duration4human ${non_clear_duration}))" fi else raised_for= fi # send the email cat <
netdata notification

${hostname} ${status_message}

${chart} Chart
${alarm}${info} Alarm
${family} Family
${severity} Severity
${date} ${raised_for} Time
The source of this alarm is line ${src}
Sent by netdata, the real-time performance monitoring.
EOF