Skip to content

Instantly share code, notes, and snippets.

@g3rhard
Forked from lichti/new_relic_alert.sh
Created August 29, 2018 11:20
Show Gist options
  • Save g3rhard/17c49e8437c2e545391c209607011cf3 to your computer and use it in GitHub Desktop.
Save g3rhard/17c49e8437c2e545391c209607011cf3 to your computer and use it in GitHub Desktop.
Script to enable or disable newrelic alerts
#!/bin/bash
if [ ! -x /usr/bin/curl ]; then
echo "Please install curl"
exit 1
fi
if [ ! -x /usr/bin/jq ]; then
echo "Please install jq"
exit 1
fi
if [ ! -x /usr/bin/python ]; then
echo "Please install python"
exit 1
fi
if [ ! -x /usr/bin/awk ]; then
echo "Please install awk"
exit 1
fi
if [ $# -eq 0 ]; then
set -- '-h' "$@"
fi
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
-k|--key)
API_KEY="$2"
shift
;;
-p|--policy)
POLICY_NAME="$2"
shift
;;
-a|--alert)
ALERT_NAME_IN="$2"
shift
;;
-e|--enable)
ENABLED='true'
;;
-d|--disable)
DISABLED='false'
;;
--add-host|--add-hosts)
ADD_HOST_IN="$2"
shift
;;
--rm-host|--rm-hosts)
RM_HOST_IN="$2"
shift
;;
--add-application|--add-applications)
ADD_APM_IN="$2"
shift
;;
--rm-application|--rm-applications)
RM_APM_IN="$2"
shift
;;
--add-channel|--add-channels)
ADD_CHANNEL_IN="$2"
shift
;;
--rm-channel|--rm-channels)
RM_CHANNEL_IN="$2"
shift
;;
--debug)
DEBUG=true
;;
-h|--help)
echo "$0"
echo " -k, --key <newrelic api key>"
echo " -p, --policy <policy name>"
echo " -a, --alert <alert name>"
echo " -e, --enable"
echo " -d, --disable"
echo " --add-host, --add-hosts <hostname>"
echo " --rm-host, --rm-hosts <hostname>"
echo " --add-application, --add-applications <apm name>"
echo " --rm-application, --rm-applications <apm name>"
echo " --add-channel, --add-channels <channel name>"
echo " --rm-channel, --rm-channels <channel name>"
echo " --debug"
echo " -h, --help"
exit 1
;;
*)
echo "$key: unknown option"
echo "Use: $0 --help"
exit 1
;;
esac
shift
done
if [ -n "$ENABLED" ] && [ -n "$DISABLED" ]; then
echo "Use -d or -e"
exit 1
elif [ -n "$ENABLED" ]; then
ALERT_ENABLED=$ENABLED
elif [ -n "$DISABLED" ]; then
ALERT_ENABLED=$DISABLED
fi
if [ -z "$API_KEY" ]; then echo "key not defined"; exit 1; fi
if [ -z "$POLICY_NAME" ]; then echo "policy name not defined"; exit 1; fi
#if [ -z "$ALERT_NAME_IN" ]; then echo "alert name not defined"; exit 1; fi
#if [ -z "$ADD_HOST_IN" ]; then echo "alert name not defined"; exit 1; fi
#if [ -z "$ALERT_ENABLED" ]; then echo "you must specify enable or disable"; exit 1; fi
if [ -n "$DEBUG" ]; then
echo "API KEY: $API_KEY"
echo "POLICY NAME: $POLICY_NAME"
echo "ALERT NAME: $ALERT_NAME_IN"
echo "ALERT ENABLED: $ALERT_ENABLED"
echo "ADD HOST IN: $ADD_HOST_IN"
echo "RM HOST IN: $RM_HOST_IN"
echo "ADD APM IN: $ADD_APM_IN"
echo "RM APM IN: $RM_APM_IN"
echo "ADD CHANNEL IN: $ADD_CHANNEL_IN"
echo "RM CHANNEL IN: $RM_CHANNEL_IN"
fi
POLICY_ESCAPED=$(python -c "import urllib; print urllib.quote('''${POLICY_NAME}''')")
if [ -n "$DEBUG" ]; then echo "POLICY ESCAPED: $POLICY_ESCAPED"; fi
POLICY_ID=$(curl -X GET 'https://api.newrelic.com/v2/alerts_policies.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[name]=${POLICY_ESCAPED}" | jq '.policies[0] .id')
if [ -n "$DEBUG" ]; then echo "POLICY ID: $POLICY_ID"; fi
if [ $POLICY_ID != 'null' ]; then
OIFS=$IFS
IFS=','
if [ -n "$ALERT_NAME_IN" ]; then
for ALERT_NAME in $ALERT_NAME_IN
do
echo "$ALERT_NAME"
ALERT_JSON=$(curl -X GET 'https://api.newrelic.com/v2/alerts_conditions.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "policy_id=${POLICY_ID}" | jq --arg name "${ALERT_NAME}" '.conditions[] | select(.name | contains($name))')
if [ -n "$DEBUG" ]; then echo "ALERT_JSON: $ALERT_JSON"; fi
if [ -n "$ALERT_JSON" ]; then
ALERT_ID=$(echo "${ALERT_JSON}" | jq '.id')
if [ -n "$DEBUG" ]; then echo "ALERT ID: $ALERT_ID"; fi
if [ -n "$ALERT_ENABLED" ]; then
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg enabled ${ALERT_ENABLED} '.enabled = $enabled')
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi
fi
if [ -n "$ADD_HOST_IN" ]; then
for HOST in $ADD_HOST_IN
do
SERVER_ID=$(curl -X GET 'https://api.newrelic.com/v2/servers.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[host]=${HOST}" | jq '.servers[0] .id')
if [ -n "$DEBUG" ]; then echo "SERVER ID: $SERVER_ID"; fi
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg server_id ${SERVER_ID} '.entities += [$server_id]')
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi
done
fi
if [ -n "$RM_HOST_IN" ]; then
for HOST in $RM_HOST_IN
do
SERVER_ID=$(curl -X GET 'https://api.newrelic.com/v2/servers.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[host]=${HOST}" | jq '.servers[0] .id')
if [ -n "$DEBUG" ]; then echo "SERVER ID: $SERVER_ID"; fi
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg server_id ${SERVER_ID} '.entities -= [$server_id]')
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi
done
fi
if [ -n "$ADD_APM_IN" ]; then
for APM in $ADD_APM_IN
do
APM_ID=$(curl -X GET 'https://api.newrelic.com/v2/applications.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[name]=${APM}" | jq '.applications[0] .id')
if [ -n "$DEBUG" ]; then echo "APM ID: $APM_ID"; fi
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg apm_id ${APM_ID} '.entities += [$apm_id]')
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi
done
fi
if [ -n "$RM_APM_IN" ]; then
for APM in $RM_APM_IN
do
APM_ID=$(curl -X GET 'https://api.newrelic.com/v2/applications.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[name]=${APM}" | jq '.applications[0] .id')
if [ -n "$DEBUG" ]; then echo "APM ID: $APM_ID"; fi
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg apm_id ${APM_ID} '.entities -= [$apm_id]')
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi
done
fi
ALERT_JSON=$(echo "${ALERT_JSON}" | jq 'del(.id) | { condition: . }')
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi
RESPONSE=$(curl -X PUT "https://api.newrelic.com/v2/alerts_conditions/${ALERT_ID}.json" -H "X-Api-Key: ${API_KEY}" -s -i -H 'Content-Type: application/json' -d "${ALERT_JSON}")
if [ -n "$DEBUG" ]; then echo "RESPONSE: $RESPONSE"; fi
CODE=$(echo "$RESPONSE" | grep 'HTTP' | awk '{print $2}')
if [ $CODE -ne 200 ]; then
exit 1
fi
else
echo 'Invalid alert name'
exit 1
fi
done
fi
if [ -n "$ADD_CHANNEL_IN" ]; then
for CHANNEL in $ADD_CHANNEL_IN
do
CHANNEL_ID=$(curl -X GET 'https://api.newrelic.com/v2/alerts_channels.json' -H "X-Api-Key: ${API_KEY}" -s | jq --arg channel ${CHANNEL} '.channels[] | select(.name | contains($channel)) | .id')
if [ -n "$DEBUG" ]; then echo "CHANNEL ID: $CHANNEL_ID"; fi
if [ -n "$CHANNEL_ID" ]; then
OUTPUT=$(curl -X PUT 'https://api.newrelic.com/v2/alerts_policy_channels.json' -H "X-Api-Key: ${API_KEY}" -s -H 'Content-Type: application/json' -G -d "policy_id=${POLICY_ID}&channel_ids=${CHANNEL_ID}")
if [ -n "$DEBUG" ]; then echo "OUTPUT CHANNEL: $OUTPUT"; fi
else
echo "$CHANNEL not found"
fi
done
fi
if [ -n "$RM_CHANNEL_IN" ]; then
for CHANNEL in $RM_CHANNEL_IN
do
CHANNEL_ID=$(curl -X GET 'https://api.newrelic.com/v2/alerts_channels.json' -H "X-Api-Key: ${API_KEY}" -s | jq --arg channel ${CHANNEL} '.channels[] | select(.name | contains($channel)) | .id')
if [ -n "$DEBUG" ]; then echo "CHANNEL ID: $CHANNEL_ID"; fi
if [ -n "$CHANNEL_ID" ]; then
OUTPUT=$(curl -X DELETE 'https://api.newrelic.com/v2/alerts_policy_channels.json' -H "X-Api-Key: ${API_KEY}" -s -H 'Content-Type: application/json' -G -d "policy_id=${POLICY_ID}&channel_id=${CHANNEL_ID}")
if [ -n "$DEBUG" ]; then echo "OUTPUT CHANNEL: $OUTPUT"; fi
else
echo "$CHANNEL not found"
fi
done
fi
IFS=$OIFS
else
echo 'Invalid policy name'
exit 1
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment