#!/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