monitor-deployment.sh•7.38 kB
#!/bin/bash
# Deployment monitoring script for Radius MCP Server
# Monitors deployment status and health checks
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default values
ENVIRONMENT="dev"
NAMESPACE="radius-mcp-server"
TIMEOUT=300 # 5 minutes
INTERVAL=10 # 10 seconds
# Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to show usage
show_usage() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -e, --environment ENV Target environment (dev|testing|prod20) [default: dev]"
echo " -n, --namespace NS Kubernetes namespace [default: auto-detect]"
echo " -t, --timeout SECONDS Timeout in seconds [default: 300]"
echo " -i, --interval SECONDS Check interval in seconds [default: 10]"
echo " -h, --help Show this help message"
echo ""
echo "Examples:"
echo " $0 -e dev # Monitor development deployment"
echo " $0 -e testing -t 600 # Monitor testing with 10min timeout"
}
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-e|--environment)
ENVIRONMENT="$2"
shift 2
;;
-n|--namespace)
NAMESPACE="$2"
shift 2
;;
-t|--timeout)
TIMEOUT="$2"
shift 2
;;
-i|--interval)
INTERVAL="$2"
shift 2
;;
-h|--help)
show_usage
exit 0
;;
*)
print_error "Unknown option: $1"
show_usage
exit 1
;;
esac
done
# Set namespace based on environment if not specified
if [[ "$NAMESPACE" == "radius-mcp-server" ]]; then
case $ENVIRONMENT in
dev)
NAMESPACE="radius-mcp-server-dev"
;;
testing)
NAMESPACE="radius-mcp-server-testing"
;;
prod20)
NAMESPACE="radius-mcp-server-prod"
;;
esac
fi
print_status "Monitoring deployment in environment: $ENVIRONMENT"
print_status "Namespace: $NAMESPACE"
print_status "Timeout: ${TIMEOUT}s, Interval: ${INTERVAL}s"
# Check if kubectl is available
if ! command -v kubectl &> /dev/null; then
print_error "kubectl is not installed or not in PATH"
exit 1
fi
# Check if namespace exists
if ! kubectl get namespace "$NAMESPACE" &> /dev/null; then
print_error "Namespace '$NAMESPACE' does not exist"
exit 1
fi
# Function to check pod status
check_pods() {
local ready_pods=$(kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server --no-headers | grep -c "Running" || echo "0")
local total_pods=$(kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server --no-headers | wc -l)
echo "$ready_pods/$total_pods"
}
# Function to check deployment status
check_deployment() {
kubectl get deployment -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server -o jsonpath='{.items[0].status.conditions[?(@.type=="Available")].status}' 2>/dev/null || echo "Unknown"
}
# Function to check service status
check_service() {
kubectl get service -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server --no-headers | wc -l
}
# Function to check ingress status
check_ingress() {
kubectl get ingress -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server --no-headers | wc -l
}
# Function to get pod logs
get_pod_logs() {
local pod_name=$(kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server --no-headers | head -1 | awk '{print $1}')
if [[ -n "$pod_name" ]]; then
kubectl logs -n "$NAMESPACE" "$pod_name" --tail=10 2>/dev/null || echo "No logs available"
else
echo "No pods found"
fi
}
# Function to check health endpoint
check_health() {
local service_name=$(kubectl get service -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server --no-headers | head -1 | awk '{print $1}')
if [[ -n "$service_name" ]]; then
# Try to port-forward and check health
local port=$(kubectl get service -n "$NAMESPACE" "$service_name" -o jsonpath='{.spec.ports[0].port}')
if kubectl port-forward -n "$NAMESPACE" "service/$service_name" 8080:$port &> /dev/null &
then
local pf_pid=$!
sleep 2
if curl -s -f http://localhost:8080/mcp &> /dev/null; then
kill $pf_pid 2>/dev/null || true
echo "Healthy"
else
kill $pf_pid 2>/dev/null || true
echo "Unhealthy"
fi
else
echo "Cannot check health"
fi
else
echo "No service found"
fi
}
# Main monitoring loop
start_time=$(date +%s)
end_time=$((start_time + TIMEOUT))
print_status "Starting deployment monitoring..."
while [[ $(date +%s) -lt $end_time ]]; do
echo ""
print_status "=== Deployment Status Check ==="
# Check pods
pod_status=$(check_pods)
print_status "Pods: $pod_status ready"
# Check deployment
deployment_status=$(check_deployment)
if [[ "$deployment_status" == "True" ]]; then
print_success "Deployment: Available"
else
print_warning "Deployment: $deployment_status"
fi
# Check service
service_count=$(check_service)
print_status "Services: $service_count"
# Check ingress
ingress_count=$(check_ingress)
print_status "Ingress: $ingress_count"
# Check health
health_status=$(check_health)
if [[ "$health_status" == "Healthy" ]]; then
print_success "Health: $health_status"
else
print_warning "Health: $health_status"
fi
# Check if deployment is complete
if [[ "$pod_status" =~ ^[1-9][0-9]*/[1-9][0-9]*$ ]] && [[ "$deployment_status" == "True" ]] && [[ "$health_status" == "Healthy" ]]; then
print_success "Deployment is healthy and ready!"
# Show final status
echo ""
print_status "=== Final Status ==="
kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server
echo ""
kubectl get service -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server
echo ""
kubectl get ingress -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server
exit 0
fi
# Show recent logs if deployment is not ready
if [[ "$pod_status" != "1/1" ]]; then
echo ""
print_status "=== Recent Pod Logs ==="
get_pod_logs
fi
print_status "Waiting ${INTERVAL}s before next check..."
sleep $INTERVAL
done
print_error "Deployment monitoring timed out after ${TIMEOUT}s"
print_error "Deployment may not be ready or there may be issues"
# Show final status
echo ""
print_status "=== Final Status ==="
kubectl get pods -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server
echo ""
kubectl get service -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server
echo ""
kubectl get ingress -n "$NAMESPACE" -l app.kubernetes.io/name=radius-mcp-server
exit 1