Files
2026-10-27 14:29:43 +03:00

37 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
# Здоровье инстансов на кубе DST: под, ping с проверкой БД и файлов, ошибки в логах за 10 минут.
# loopctl check loop5b9df1ba7220 loop00c13bf5471f
# loopctl check --db 135.106.201.42 все инстансы, у которых в DSN этот хост (после сбоя базы)
# loopctl check --all
# Вывод: id, домен, ready/рестарты, ping, ошибок, строк про БД, самая частая ошибка. Проблемные — в конце.
set -euo pipefail
. "$(dirname "$0")/lib/common.sh"
if [ "${1:-}" = --db ] || [ "${1:-}" = --all ]; then
F=$([ "$1" = --db ] && echo "${2:?хост БД}" || echo "")
IDS=$(kubectl --context "$DST" -n loop get mattermost -o json | jq -r --arg f "$F" \
'.items[]|select(.spec.replicas>0)|select($f=="" or any(.spec.mattermostEnv[]?; .name=="MM_SQLSETTINGS_DATASOURCE" and (.value|contains($f))))|.metadata.name')
else
IDS=$*
fi
[ -n "$IDS" ] || { echo "укажи loop id, --db <хост> или --all"; exit 1; }
one() {
local id=$1 h p c L e d top
h=$(kubectl --context "$DST" -n loop get mattermost "$id" -o jsonpath='{.spec.ingress.host}')
p=$(kubectl --context "$DST" -n loop get pods -l installation.mattermost.com/installation="$id" -o json | jq -r '[.items[]|"\(.status.containerStatuses[0].ready)/\(.status.containerStatuses[0].restartCount)"]|join(",")')
c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 "https://$h/api/v4/system/ping?get_server_status=true")
L=$(kubectl --context "$DST" -n loop logs "deploy/$id" --since=10m 2>/dev/null || true)
e=$(grep -cE '"level":"(error|fatal|critical)"' <<<"$L" || true)
d=$(grep -ciE 'too many clients|connection slots|i/o timeout|failed to grab connection|bad connection' <<<"$L" || true)
top=$(grep -E '"level":"(error|fatal|critical)"' <<<"$L" | jq -r .msg 2>/dev/null | sort | uniq -c | sort -rn | head -1 | sed 's/^ *//' | cut -c1-80)
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$id" "$h" "${p:--}" "$c" "$e" "$d" "$top"
}
export -f one; export DST KUBECONFIG
OUT=$(printf '%s\n' $IDS | xargs -P 12 -I{} bash -c 'one {}')
printf 'id\tdomain\tready/restarts\tping\terrors\tdb\ttop error\n'
# сначала здоровые, проблемные (не ready, ping не 200, ошибки БД) — внизу
awk -F'\t' '$3 ~ /^true/ && $4==200 && $6==0' <<<"$OUT" | sort -t$'\t' -k2
echo "--- проблемные:"
awk -F'\t' '!($3 ~ /^true/ && $4==200 && $6==0)' <<<"$OUT" | sort -t$'\t' -k2