blob: f6505af6f31fa86c30a86f6a47c30126ac582c07 [file] [log] [blame]
#!/bin/bash
if [ $# -lt 3 ]; then
echo "USAGE: $0 <cluster-list-file> <month-list> <result-format>"
echo
echo "The result format must be 'table' or 'csv'."
echo
echo "For example:"
echo " $0 \"clusters.txt\" \"2019-01\" \"table\""
echo " $0 \"clusters.txt\" \"2019-01 2019-02\" \"csv\""
echo
exit 1
fi
clusters_file=$1
months=$2
format=$3
if [ "$format" != "table" -a "$format" != "csv" ]; then
echo "ERROR: invalid result format, should be 'table' or 'csv'."
exit 1
fi
pwd="$( cd "$( dirname "$0" )" && pwd )"
shell_dir="$( cd $pwd/.. && pwd )"
cd $shell_dir
all_result="/tmp/pegasus.stat_available.all_result"
rm $all_result &>/dev/null
echo "stat_time = `date`"
echo "month_list = $months"
echo
echo "Stat method:"
echo " - for each cluster, there is a collector which sends get/set requests to detect table every 3 seconds."
echo " - every minute, the collector will write a record of Send and Succeed count into detect table."
echo " - to stat cluster availability, we scan all the records for the months from detect table, calculate the"
echo " total Send count and total Succeed count, and calculate the availability by:"
echo " Available = TotalSucceedCount / TotalSendCount"
echo
echo "Columns:"
echo " - cluster: name of the cluster"
echo " - rs_count: current count of replica servers"
echo " - version: current version of replica servers"
echo " - minutes: record count in detect table for the months"
echo " - available: cluster availability"
echo " - app_count: current count of tables in the cluster"
echo " - storage_gb: current total data size in GB of tables in the cluster"
echo
if [ "$format" == "table" ]; then
printf '%-30s%-12s%-12s%-12s%-12s%-12s%-12s\n' cluster rs_count version minutes available app_count storage_gb
elif [ "$format" == "csv" ]; then
echo "cluster,rs_count,version,minutes,available,table_count,storage_gb"
else
echo "ERROR: invalid format: $format"
exit 1
fi
cluster_count=0
rs_count_sum=0
app_count_sum=0
data_size_sum=0
while read cluster
do
rs_count=`echo server_info | ./run.sh shell -n $cluster 2>&1 | grep 'replica-server' | wc -l`
rs_version=`echo server_info | ./run.sh shell -n $cluster 2>&1 | grep 'replica-server' | \
grep -o 'Pegasus Server [^ ]*' | head -n 1 | sed 's/SNAPSHOT/SN/' | awk '{print $3}'`
result=`./scripts/pegasus_stat_available.sh $cluster $months`
if echo $result | grep '^ERROR'; then
echo "ERROR: process cluster $cluster failed"
continue
fi
minutes=`echo $result | awk '{print $2}'`
available=`echo $result | awk '{print $3}' | sed 's/data/-/'`
app_count=`echo $result | awk '{print $4}'`
data_size=`echo $result | awk '{print $5}'`
if [ "$available" == "1.000000" ]; then
available_str="99.9999%"
elif [ "$available" == "0" ]; then
available_str="00.0000%"
else
available_str="${available:2:2}.${available:4:4}%"
fi
if [ "$format" == "table" ]; then
printf '%-30s%-12s%-12s%-12s%-12s%-12s%-12s\n' $cluster $rs_count $rs_version $minutes $available $app_count $data_size
elif [ "$format" == "csv" ]; then
echo -e "$cluster,$rs_count,$rs_version,$minutes,=\"$available_str\",$app_count,$data_size"
else
echo "ERROR: invalid format: $format"
exit 1
fi
cluster_count=$((cluster_count + 1))
rs_count_sum=$((rs_count_sum + rs_count))
app_count_sum=$((app_count_sum + app_count))
data_size_sum=$((data_size_sum + data_size))
done <$clusters_file
minutes=`cat $all_result | wc -l`
if [ $minutes -eq 0 ]; then
available="0.000000"
else
available=`cat $all_result | grep -o '[0-9]*,[0-9]*,[0-9]*' | awk -F, '{a+=$1;b+=$2}END{printf("%f\n",(double)b/a);}'`
fi
if [ "$available" == "1.000000" ]; then
available_str="99.9999%"
elif [ "$available" == "0" ]; then
available_str="00.0000%"
else
available_str="${available:2:2}.${available:4:4}%"
fi
if [ "$format" == "table" ]; then
printf '%-30s%-12s%-12s%-12s%-12s%-12s%-12s\n' "(total:$cluster_count)" $rs_count_sum "-" $minutes $available $app_count_sum $data_size_sum
echo
elif [ "$format" == "csv" ]; then
echo -e "(total:$cluster_count),$rs_count_sum,,$minutes,=\"$available_str\",$app_count_sum,$data_size_sum"
else
echo "ERROR: invalid format: $format"
exit 1
fi
rm $all_result &>/dev/null