integ/tools/engtools/parsers/common/parse-postgres.sh
Martin Chen dba551a518 Fix linters error and enable linters zuul gate
Fix below linters errors
E010 The "do" should be on same line as for
E010 The "do" should be on same line as while
E011 Then keyword is not on same line as if or elif keyword
E020 Function declaration not in format ^function name {$

Ignore:
E041 Arithmetic expansion using $[ is deprecated for $((
E042 local declaration hides errors
E043 Arithmetic compound has inconsistent return semantics
E044 Use [[ for non-POSIX comparisions

Story: 2003366
Task: 24423

Change-Id: I8b6b72e702d3e89d1813772d6bf16819e28e818c
Signed-off-by: Martin Chen <haochuan.z.chen@intel.com>
2018-09-07 01:50:28 +08:00

206 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
#Copyright (c) 2016 Wind River Systems, Inc.
#
#SPDX-License-Identifier: Apache-2.0
#
# This script is used to parse postgres bz2 files for postgres connection stats.
# It is called by parse-controllers.sh script for either large office or CPE.
source ../lab.conf
PARSERDIR=$(dirname $0)
. ${PARSERDIR}/parse-util.sh
if [ -z "${DATABASE_LIST}" ]; then
WARNLOG "DATABASE_LIST is not set in the lab.conf file. Use default setting"
DATABASE_LIST="cinder glance keystone nova neutron ceilometer heat sysinv aodh postgres nova_api"
fi
# Do all files if no files specified
if [ -z "${1}" ]; then
FILES=$(ls controller*postgres.bz2)
else
FILES=$(ls $@)
fi
LOG "Parsing postgres files ${FILES}"
function generate_header {
local header="Date/Time,Total"
for DB in ${DATABASE_LIST}; do
if [ ${DB} == "nova_api" ]; then
header="${header},Nova API"
else
header="${header},${DB^}"
fi
done
for DB in ${DATABASE_LIST}; do
if [ ${DB} == "nova_api" ]; then
header="${header},Nova API Active"
else
header="${header},${DB^} Active"
fi
done
for DB in ${DATABASE_LIST}; do
if [ ${DB} == "nova_api" ]; then
header="${header},Nova API Idle"
else
header="${header},${DB^} Idle"
fi
done
for DB in ${DATABASE_LIST}; do
if [ ${DB} == "nova_api" ]; then
header="${header},Nova API Other"
else
header="${header},${DB^} Other"
fi
done
echo $header
}
function generate_grep_str {
local grepstr="time:"
for DB in ${DATABASE_LIST}; do
grepstr="${grepstr}|${DB}"
done
grepstr="${grepstr}|breakdown|connections total|rows"
echo $grepstr
}
function init_variables {
CONN_TOTAL="0"
CONN_ACTIVE_TOTAL="0"
CONN_IDLE_TOTAL="0"
CONN_OTHER_TOTAL="0"
FIRST_TIME="no"
INIT_VAL="0"
for DB in ${DATABASE_LIST}; do
eval "CONN_${DB^^}=${INIT_VAL}"
eval "CONN_ACTIVE_${DB^^}=${INIT_VAL}"
eval "CONN_IDLE_${DB^^}=${INIT_VAL}"
eval "CONN_OTHER_${DB^^}=${INIT_VAL}"
done
}
function output_values {
local result="${DATEVAL} ${TIMEVAL},${CONN_TOTAL}"
for DB in ${DATABASE_LIST}; do
val=$(eval echo \${CONN_${DB^^}})
result=$result,$val
done
for DB in ${DATABASE_LIST}; do
val=$(eval echo \${CONN_ACTIVE_${DB^^}})
result=$result,$val
done
for DB in ${DATABASE_LIST}; do
val=$(eval echo \${CONN_IDLE_${DB^^}})
result=$result,$val
done
for DB in ${DATABASE_LIST}; do
val=$(eval echo \${CONN_OTHER_${DB^^}})
result=$result,$val
done
echo $result >> postgres-conns.csv
}
HEADER=$(generate_header)
echo ${HEADER} > postgres-conns.csv
GREPSTR=$(generate_grep_str)
[ -e postgres-tmp2.txt ] && rm postgres-tmp2.txt
for FILE in ${FILES}; do
TEST=`echo ${FILE} | grep bz2`
if [ ! -z "${TEST}" ]; then
bzcat ${FILE} | grep -E "time:|active|idle|breakdown|total|rows" >> postgres-tmp2.txt
fi
cat postgres-tmp2.txt | grep -E "${GREPSTR}" > postgres-tmp.txt
done
# Start parsing
FIRST_TIME="yes"
PARSING_TABLE="no"
while IFS='' read -r LINE || [[ -n "${LINE}" ]]; do
TEST=`echo ${LINE} | grep "time:" | awk '{print $4}'`
if [ ! -z "${TEST}" ]; then
DATEVAL=`echo ${LINE} | awk '{print $3}'`
TIMEVAL=`echo ${LINE} | awk '{print $4}'`
if [ "z${FIRST_TIME}" != "zyes" ]; then
init_variables
FIRST_TIME="no"
fi
fi
TEST=`echo ${LINE} | grep "connections total =" | awk '{print $4}'`
if [ ! -z "${TEST}" ]; then
CONN_TOTAL=${TEST}
fi
TEST=`echo ${LINE} | grep "connections breakdown (query)"`
if [ ! -z "${TEST}" ]; then
PARSING_TABLE="yes"
fi
if [ "x${PARSING_TABLE}" == "xyes" ]; then
TESTNAME=`echo ${LINE} | grep "|" | awk '{print $1}'`
TESTVAL=`echo ${LINE} | grep "|" | awk '{print $5}'`
CONNSTATE=`echo ${LINE} | grep "|" | awk '{print $3}'`
# This gets last field regardless of number of preceding spaces
FIELDS=(${LINE// / })
for I in ${!FIELDS[@]}; do
TESTVAL=${FIELDS[${I}]}
done
for DB in ${DATABASE_LIST}; do
if [ "x${TESTNAME}" == "x${DB}" ]; then
eval "CONN_${DB^^}=$((CONN_${DB^^} + ${TESTVAL}))"
break
fi
done
if [ "x${CONNSTATE}" == "xidle" ]; then
for DB in ${DATABASE_LIST}; do
if [ "x${TESTNAME}" == "x${DB}" ]; then
eval "CONN_IDLE_${DB^^}=$((CONN_IDLE_${DB^^} + ${TESTVAL}))"
break
fi
done
elif [ "x${CONNSTATE}" == "xactive" ]; then
for DB in ${DATABASE_LIST}; do
if [ "x${TESTNAME}" == "x${DB}" ]; then
eval "CONN_ACTIVE_${DB^^}=$((CONN_ACTIVE_${DB^^} + ${TESTVAL}))"
break
fi
done
else
for DB in ${DATABASE_LIST}; do
if [ "x${TESTNAME}" == "x${DB}" ]; then
eval "CONN_OTHER_${DB^^}=$((CONN_OTHER_${DB^^} + ${TESTVAL}))"
break
fi
done
fi
TEST=`echo ${LINE} | grep "rows"`
if [ ! -z "${TEST}" ]; then
PARSING_TABLE="no"
output_values
init_variables
else
TEST=`echo ${LINE} | grep "age:"`
if [ ! -z "${TEST}" ]; then
PARSING_TABLE="no"
echo "${DATEVAL} ${TIMEVAL} - no data"
init_variables
fi
fi
fi
done < postgres-tmp.txt
rm postgres-tmp.txt postgres-tmp2.txt
LOG "Parsing postgres connection stats data completed!"