Ahmedik95316's picture
Update health_check.sh
b696561
#!/bin/bash
# Health check script for Docker container with dynamic path support
set -e
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[HEALTH]${NC} $1"
}
error() {
echo -e "${RED}[HEALTH ERROR]${NC} $1" >&2
}
warning() {
echo -e "${YELLOW}[HEALTH WARNING]${NC} $1"
}
# Function to check service health
check_service() {
local service_name=$1
local url=$2
local timeout=${3:-10}
if curl -s -f --max-time "$timeout" "$url" > /dev/null 2>&1; then
log "$service_name is responding"
return 0
else
error "$service_name health check failed"
return 1
fi
}
# Function to check file using Python path manager
check_files_with_python() {
python3 -c "
import sys
import os
sys.path.append('/app')
try:
from path_config import path_manager
# Check critical files using the path manager
critical_files = [
(path_manager.get_combined_dataset_path(), 'Combined Dataset'),
(path_manager.get_model_file_path(), 'Model File'),
(path_manager.get_vectorizer_path(), 'Vectorizer File'),
(path_manager.get_metadata_path(), 'Metadata File')
]
missing_files = []
for file_path, description in critical_files:
if file_path.exists():
print(f'βœ… {description}: {file_path}')
else:
print(f'❌ {description}: {file_path}')
missing_files.append(description)
if missing_files:
print(f'Missing files: {missing_files}')
sys.exit(1)
else:
print('βœ… All critical files present')
except ImportError as e:
print(f'❌ Failed to import path_config: {e}')
sys.exit(1)
except Exception as e:
print(f'❌ Health check failed: {e}')
sys.exit(1)
"
return $?
}
# Function to check process
check_process() {
local process_name=$1
if pgrep -f "$process_name" > /dev/null 2>&1; then
log "$process_name process is running"
return 0
else
warning "$process_name process not found"
return 1
fi
}
# Main health check
main() {
log "Starting comprehensive health check..."
local exit_code=0
# Check FastAPI service
if ! check_service "FastAPI" "http://127.0.0.1:8000/health" 10; then
exit_code=1
fi
# Check Streamlit service
if ! check_service "Streamlit" "http://127.0.0.1:7860/_stcore/health" 10; then
# Streamlit health endpoint might not always be available, try alternative
if ! curl -s -f --max-time 10 "http://127.0.0.1:7860" > /dev/null 2>&1; then
error "Streamlit health check failed"
exit_code=1
else
log "Streamlit is responding (alternative check)"
fi
fi
# Check required files using Python path manager
log "Checking required files..."
if ! check_files_with_python; then
exit_code=1
fi
# Check critical processes (optional in some environments)
log "Checking processes..."
# Always check if Python processes are running
if ! pgrep -f "streamlit" > /dev/null 2>&1; then
warning "Streamlit process not found"
# Don't fail on this as the service might still be responding
fi
if ! pgrep -f "uvicorn" > /dev/null 2>&1; then
warning "FastAPI/Uvicorn process not found"
# Don't fail on this as the service might still be responding
fi
# Check if scheduler is running (optional for some environments)
if ! check_process "schedule_tasks.py"; then
warning "Scheduler process not running (may be normal in some environments)"
# Don't fail the health check for this
fi
# Check Python environment
log "Checking Python environment..."
if ! python3 -c "
import sys
sys.path.append('/app')
# Test critical imports
try:
import pandas
import sklearn
import streamlit
import fastapi
from path_config import path_manager
print(f'βœ… Python environment OK (Environment: {path_manager.environment})')
except ImportError as e:
print(f'❌ Python import failed: {e}')
sys.exit(1)
"; then
error "Python environment check failed"
exit_code=1
fi
# Final status
if [ $exit_code -eq 0 ]; then
log "All health checks passed βœ…"
else
error "Health check failed ❌"
fi
return $exit_code
}
# Execute main function
main "$@"