pandorafms/pandora_plugins/EC2/ec2_cloudwatch_plugin.sh

280 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
# Amazon EC2 Pandora FMS Server plugin
# (c) Sancho Lerena 2011
# .. Config
# location of default config file
default_config_file=/usr/share/pandora_server/util/plugin/aws_plugin.conf
default_java_home=/usr
# .. Functions
function help {
echo -e "Amazon EC2 Plugin for Pandora FMS Plugin server. http://pandorafms.com"
echo " "
echo "This plugin is used to check performance of Volumes and Instances in the EC2 Cloud"
echo "Syntax:"
echo -e "\t\t-A Access KEY ID, p.e AKIAILTVCAS26GTKLD4A"
echo -e "\t\t-S Secret Access Key, p.e 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"
echo -e "\t\t-R Region, p.e us-east-1"
echo -e "\t\t-m Metric to gather (see doc for a metric list) "
echo -e "\t\t-n Namespace (p.e: AWS/EC2, AWS/EBS) "
echo -e "\t\t-i Target Instance or Target LB name (p.e: i-9d0b4af1) "
echo -e "\t\t-a Availability Zone option for AWS/ELB (p.e: us-west-1b) "
echo -e "\t\t-z Show default metrics "
echo -e "\t\t-h Show this messages "
echo "Samples:"
echo " ./ec2_plugin.sh -A AKIAILTVCAS26GTKLD4A -S CgmQ6DxUWES05txju+alJLoM57acDudHogkLotWk -i i-9d0b4af1 -n AWS/EC2 -m CPUUtilization"
echo
exit 0
}
function check_required_variables {
_result=OK;
# .. AWS_CLOUDWATCH_HOME
if [ ! -d "$AWS_CLOUDWATCH_HOME" ] || [ ! -x $AWS_CLOUDWATCH_HOME/bin/mon-get-stats ]
then
echo "You need to define AWS_CLOUDWATCH_HOME settings."
_result=NG;
fi
export AWS_CLOUDWATCH_HOME
# .. JAVA_HOME
if [ -z "$JAVA_HOME" ] && [ -d "$default_java_home" ] && [ -x "$default_java_home/bin/java" ]
then
JAVA_HOME=$default_java_home
fi
if [ ! -d "$JAVA_HOME" ] || [ ! -x "$JAVA_HOME/bin/java" ]
then
echo "You need to define JAVA_HOME settings."
_result=NG;
fi
export JAVA_HOME
# .. AWS_CREDENTIAL_FILE
if [ ! -f "$AWS_CREDENTIAL_FILE" ] || [ ! -r "$AWS_CREDENTIAL_FILE" ]
then
echo "You need to define AWS_CREDENTIAL_FILE settings."
_result=NG;
fi
export AWS_CREDENTIAL_FILE
# .. EC2_REGION or AWS_CLOUDWATCH_URL
if [ -z "$AWS_CLOUDWATCH_URL" ] && [ -z "$EC2_REGION" ]
then
echo "You need to define EC2_REGION or AWS_CLOUDWATCH_URL settings."
_result=NG;
fi
if [ -z "$AWS_CLOUDWATCH_URL" ]
then
AWS_CLOUDWATCH_URL="http://monitoring.${EC2_REGION}.amazonaws.com"
fi
export AWS_CLOUDWATCH_URL
# check the result and abort if shomething wrong
if [ "$_result" != "OK" ]
then
echo "Please read the documentation."
echo "aborting..."
exit 1;
fi
# optional settings...
[ -n "$SERVICE_JVM_ARGS" ] && export SERVICE_JVM_ARGS
}
function list_available_metrics {
if [ -n "$list_metrics_in_raw_format" ]
then
${AWS_CLOUDWATCH_HOME}/bin/mon-list-metrics -show-long ${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY}
else
${AWS_CLOUDWATCH_HOME}/bin/mon-list-metrics -show-long ${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY} |
sed -e 's/\([^,]*\),\([^,]*\),{*\([^{}]*\)}.*/\2 \3 \1/' | sort
fi
exit
}
function help_metrics {
echo -e "Amazon EC2 Plugin for Pandora FMS Plugin server. http://pandorafms.com"
echo " "
echo -e "This the default metric list, you can use any metric available these are the default"
echo " "
echo "For AWS/EC2 Namespace"
echo " "
echo "CPUUtilization"
echo "DiskReadBytes"
echo "DiskReadOps"
echo "DiskWriteBytes"
echo "DiskWriteOps"
echo "NetworkIn"
echo "NetworkOut "
echo " "
echo "For AWS/EBS Namespace"
echo " "
echo "VolumeIdleTime"
echo "VolumeQueueLength"
echo "VolumeReadBytes"
echo "VolumeReadOps"
echo "VolumeTotalReadTime"
echo "VolumeTotalWriteTime"
echo "VolumeWriteBytes"
echo "VolumeWriteOps"
echo " "
echo "For AWS/RDS Namespace"
echo " "
echo "CPUUtilization"
echo "DatabaseConnections"
echo "DiskQueueDepth"
echo "FreeStorageSpace"
echo "FreeableMemory"
echo "ReadIOPS"
echo "ReadLatency"
echo "ReadThroughput"
echo "SwapUsage"
echo "WriteIOPS"
echo "WriteLatency"
echo "WriteThroughput"
echo " "
echo "For AWS/ELB Namespace"
echo " "
echo "HTTPCode_Backend_2XX"
echo "HTTPCode_Backend_3XX"
echo "HTTPCode_Backend_4XX"
echo "HTTPCode_Backend_5XX"
echo "HTTPCode_ELB_4XX"
echo "HTTPCode_ELB_5XX"
echo "HealthyHostCount"
echo "Latency"
echo "RequestCount"
echo "UnHealthyHostCount"
echo " "
exit
}
if [ $# -eq 0 ]
then
help
fi
TIMEOUT_CHECK=0
DOMAIN_CHECK=""
IP_CHECK=""
DNS_CHECK=""
# Main parsing code
while getopts ":zhlLf:d:i:n:m:A:S:R:a:C:" optname
do
case "$optname" in
"f")
arg_config_file="$OPTARG" ;;
"h")
help ;;
"l")
list_metrics=1 ;;
"L")
list_metrics_in_raw_format="yes"
list_metrics=1 ;;
"z")
help_metrics ;;
"A")
OPT_ACCESS_KEY="--I $OPTARG" ;;
"S")
OPT_SECRET_KEY="--S $OPTARG" ;;
"R")
OPT_REGION="--region $OPTARG" ;;
"n")
NAMESPACE=$OPTARG ;;
"d")
arg_dimensions="$OPTARG" ;;
"i")
INSTANCE=$OPTARG ;;
"m")
METRIC=$OPTARG ;;
"a")
ZONE=$OPTARG ;;
"C")
CACHENODEID=$OPTARG ;;
*)
help ;;
esac
done
config_file=${arg_config_file:-$default_config_file}
# Read config file
if [ -f "$config_file" ] && [ -r "$config_file" ]
then
. $config_file
else
echo "Cannot read $config_file."
fi
check_required_variables
if [ ! -z $list_metrics ]
then
list_available_metrics
fi
if [ -z "$METRIC" ]
then
help
fi
if [ -z "$NAMESPACE" ]
then
help
fi
case "$NAMESPACE" in
AWS/RDS)
DIMENSIONS="${arg_dimensions:-DBInstanceIdentifier=$INSTANCE}" ;;
AWS/ElastiCache)
DIMENSIONS=${arg_dimensions:-"CacheClusterId=$INSTANCE,CacheNodeId=$CACHENODEID"} ;;
AWS/ELB)
if [ ! -z "$arg_dimensions" ]
then
DIMENSIONS=${arg_dimensions};
else
if [ ! -z "$INSTANCE" ]
then
DIMENSIONS="LoadBalancerName=$INSTANCE"
fi
if [ ! -z "$ZONE" ]
then
DIMENSIONS="${DIMENSIONS:+$DIMENSIONS,}AvailabilityZone=$ZONE"
fi
fi
;;
*)
DIMENSIONS=
#${arg_dimensions:-"InstanceId=$INSTANCE"}
;;
esac
if [ "$DIMENSIONS" == "" ]; then
${AWS_CLOUDWATCH_HOME}/bin/mon-get-stats ${METRIC} --namespace $NAMESPACE \
${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY} -s Average --period 300 | \
tail -1 | \
awk '$3 ~ /^[-]?[0-9]+[.][0-9]+[Ee][+-]?[0-9]+$/{$3 = sprintf("%.3f",$3)} {print $3}'
else
${AWS_CLOUDWATCH_HOME}/bin/mon-get-stats ${METRIC} --namespace $NAMESPACE \
${OPT_REGION} ${OPT_ACCESS_KEY} ${OPT_SECRET_KEY} -s Average --period 300 \
--dimensions "$DIMENSIONS" | tail -1 | \
awk '$3 ~ /^[-]?[0-9]+[.][0-9]+[Ee][+-]?[0-9]+$/{$3 = sprintf("%.3f",$3)} {print $3}'
fi