#!/bin/bash # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # 🏥 Nocr Services Health Check Script # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ # Checks health endpoints and pod status for all Nocr services # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ NAMESPACE="nocr" FAILED_CHECKS=0 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "🏥 Running health checks for Nocr services" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # Check if kubectl is available if ! command -v kubectl &> /dev/null; then echo "❌ kubectl not found. Please install kubectl." exit 1 fi # Function to check pod health check_pod_health() { local deployment=$1 local service_name=$2 echo "" echo "🔍 Checking $service_name..." # Get pod status PODS=$(kubectl get pods -n "$NAMESPACE" -l app="$deployment" -o json) # Check if any pods exist POD_COUNT=$(echo "$PODS" | jq -r '.items | length') if [ "$POD_COUNT" -eq 0 ]; then echo "❌ No pods found for $service_name" FAILED_CHECKS=$((FAILED_CHECKS + 1)) return 1 fi # Check pod status RUNNING_PODS=$(echo "$PODS" | jq -r '.items[] | select(.status.phase=="Running") | .metadata.name' | wc -l) READY_PODS=$(echo "$PODS" | jq -r '.items[] | select(.status.conditions[] | select(.type=="Ready" and .status=="True")) | .metadata.name' | wc -l) echo " 📊 Pods: $RUNNING_PODS running, $READY_PODS ready (total: $POD_COUNT)" if [ "$RUNNING_PODS" -eq 0 ]; then echo " ❌ No running pods for $service_name" kubectl get pods -n "$NAMESPACE" -l app="$deployment" FAILED_CHECKS=$((FAILED_CHECKS + 1)) return 1 fi if [ "$READY_PODS" -eq 0 ]; then echo " ❌ No ready pods for $service_name" kubectl get pods -n "$NAMESPACE" -l app="$deployment" echo " 🔍 Pod details:" kubectl describe pods -n "$NAMESPACE" -l app="$deployment" | grep -A 20 "Conditions:" FAILED_CHECKS=$((FAILED_CHECKS + 1)) return 1 fi # Try to check health endpoint if service has one case "$deployment" in "telegram-listener"|"text-matcher"|"users"|"telegram-client") POD_NAME=$(echo "$PODS" | jq -r '.items[0].metadata.name') if [ -n "$POD_NAME" ]; then echo " 🌐 Checking /health endpoint..." if kubectl exec -n "$NAMESPACE" "$POD_NAME" -- curl -f -s http://localhost:8080/health > /dev/null 2>&1; then echo " ✅ Health endpoint responding" else echo " ⚠️ Health endpoint not responding (might be warming up)" fi fi ;; esac echo " ✅ $service_name is healthy" return 0 } # Check each service SERVICES=( "telegram-listener:Telegram Listener" "text-matcher:Text Matcher" "users:Users Service" "telegram-client:Telegram Client" ) for service_info in "${SERVICES[@]}"; do IFS=':' read -r deployment service_name <<< "$service_info" check_pod_health "$deployment" "$service_name" done echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "📊 Summary:" kubectl get pods -n "$NAMESPACE" -o wide echo "" if [ $FAILED_CHECKS -eq 0 ]; then echo "✅ All health checks passed!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" exit 0 else echo "❌ $FAILED_CHECKS health check(s) failed" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" exit 1 fi