#!/usr/bin/env bash # # Simple bash health monitor - polls /health every 30s. # Usage: ./health-check.sh https://q1-deploy-monitor-cad54f6feeb3.hosted.ghaymah.systems/ [interval_seconds] set -euo pipefail BASE_URL="${1:?Usage: $0 [interval_seconds]}" INTERVAL="${2:-30}" HEALTH_URL="${BASE_URL%/}/health" LOG_FILE="monitor.log" FAILURE_THRESHOLD=3 failures=0 log() { echo "$(date -u +"%Y-%m-%dT%H:%M:%SZ") [$1] $2" | tee -a "$LOG_FILE" } log "INFO" "Starting monitor for $HEALTH_URL every ${INTERVAL}s" while true; do start_ns=$(date +%s%N) http_code=$(curl -o /tmp/health_resp.json -s -w "%{http_code}" --max-time 5 "$HEALTH_URL" || echo "000") end_ns=$(date +%s%N) elapsed_ms=$(( (end_ns - start_ns) / 1000000 )) if [ "$http_code" == "200" ]; then if [ "$failures" -gt 0 ]; then log "INFO" "Service RECOVERED after $failures failed check(s)." fi failures=0 log "INFO" "OK status=$http_code response_time=${elapsed_ms}ms" else failures=$((failures + 1)) log "WARN" "FAIL attempt=$failures status=$http_code" if [ "$failures" -ge "$FAILURE_THRESHOLD" ]; then log "ERROR" "ALERT: $BASE_URL has failed $failures consecutive health checks!" fi fi sleep "$INTERVAL" done