280 lines
6.7 KiB
Bash
Executable File
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 CgmQ6DxUWES05txju+alJLoM57acDudHogkLotWk"
|
|
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
|
|
|