Overview
Apache Ambari makes managing distributed systems like Apache Hadoop easier. One of the capabilities of Ambari is alerts. Ambari monitors the state of the cluster and can alert based on a web endpoint not being available or the output of a custom script. When an alert is triggered, Ambari displays a notification in the UI but also provides the ability to email, SNMP, or call a custom script.
Integrating Ambari Alerts with External Tools
The Ambari custom script dispatch capability makes it possible to integrate alerts with external tools. We use a custom Python script to dispatch alerts to a shared mailbox and page on call if necessary. This is flexible and the script can be changed after the initial setup without restarting Ambari Server. Another benefit is that the script is called for each alert individually. Alerts are not batched like they are with the built in email notifier.
Creating a Custom Ambari Alert Dispatcher
The below is adopted from the following post with details added since it wasn’t clear what the format of the script should be. We also found that the script API has changed slightly over time adding more parameters to the script (ie: AMBARI-20291).
Create the Ambari Custom Alert Dispatcher Script
#!/usr/bin/env python
from datetime import datetime
import sys
def handle_alert():
'''
# handle_alert method which is called from Ambari
# :param definitionName: the alert definition unique ID
# :param definitionLabel: the human readable alert definition label
# :param serviceName: the service that the alert definition belongs to
# :param alertState: the state of the alert (OK, WARNING, etc)
# :param alertText: the text of the alert
# :param alertTimestamp: the timestamp the alert went off - Added in AMBARI-20291
# :param hostname: the hostname the alert fired off for - Added in AMBARI-20291
'''
definitionName = sys.argv[1]
definitionLabel = sys.argv[2]
serviceName = sys.argv[3]
alertState = sys.argv[4]
alertText = sys.argv[5]
# AMBARI-20291
if len(sys.argv) == 8:
alertTimestamp = sys.argv[6]
hostname = sys.argv[7]
else:
alertTimestamp = 'N/A'
hostname = 'N/A'
# Generate a timestamp for when this script was called
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# Add custom logic here to handle the alert
if __name__ == ' __main__':
if len(sys.argv) >= 6:
handle_alert()
else:
print("Incorrect number of arguments")
sys.exit(1)
Setup Ambari Alert Target
-
vi /etc/ambari-server/conf/ambari.properties
my.custom.alert.dispatcher.script=PATH_TO/ambari_custom_alert_dispatcher.py
ambari-server restart
Create Ambari Alert Target
curl -i \
-u $(whoami) \
-H 'X-Requested-By: ambari' \
-XPOST \
"https://AMBARI_SERVER_HOST:8443/api/v1/alert_targets" \
-d '
{
"AlertTarget":
{
"name": "my_custom_dispatcher",
"description": "My Custom Dispatcher",
"notification_type": "ALERT_SCRIPT",
"global": true,
"alert_states": ["CRITICAL"],
"properties": {
"ambari.dispatch-property.script": "my.custom.alert.dispatcher.script"
}
}
}
'
Delete Ambari Alert Target
curl -i \
-u $(whoami) \
-H 'X-Requested-By: ambari' \
-XDELETE \
"https://AMBARI_SERVER_HOST:8443/api/v1/alert_targets/ALERT_NUMBER"
Top comments (0)