116 lines
3.9 KiB
Bash
116 lines
3.9 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# Monitor RPC Endpoint - Basic monitoring script
|
||
|
|
# Usage: ./scripts/monitor-rpc-endpoint.sh [interval_seconds]
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
RPC_URL="${RPC_URL:-https://rpc.public-0138.defi-oracle.io}"
|
||
|
|
INTERVAL="${1:-60}" # Default 60 seconds
|
||
|
|
LOG_FILE="${LOG_FILE:-/tmp/rpc-monitor.log}"
|
||
|
|
|
||
|
|
# Colors for output
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
# Statistics
|
||
|
|
TOTAL_REQUESTS=0
|
||
|
|
SUCCESSFUL_REQUESTS=0
|
||
|
|
FAILED_REQUESTS=0
|
||
|
|
TOTAL_RESPONSE_TIME=0
|
||
|
|
MIN_RESPONSE_TIME=999999
|
||
|
|
MAX_RESPONSE_TIME=0
|
||
|
|
|
||
|
|
# Function to make RPC request
|
||
|
|
make_request() {
|
||
|
|
local start_time=$(date +%s.%N)
|
||
|
|
local response=$(curl -s --max-time 10 -w "\nHTTP_CODE:%{http_code}\nTIME:%{time_total}" \
|
||
|
|
-X POST "$RPC_URL" \
|
||
|
|
-H 'Content-Type: application/json' \
|
||
|
|
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' 2>&1)
|
||
|
|
local end_time=$(date +%s.%N)
|
||
|
|
local response_time=$(echo "$end_time - $start_time" | bc)
|
||
|
|
|
||
|
|
echo "$response|$response_time"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Function to check endpoint
|
||
|
|
check_endpoint() {
|
||
|
|
local result=$(make_request)
|
||
|
|
local response=$(echo "$result" | grep -v "HTTP_CODE\|TIME" | head -1)
|
||
|
|
local http_code=$(echo "$result" | grep "HTTP_CODE" | cut -d: -f2)
|
||
|
|
local curl_time=$(echo "$result" | grep "TIME" | cut -d: -f2)
|
||
|
|
|
||
|
|
TOTAL_REQUESTS=$((TOTAL_REQUESTS + 1))
|
||
|
|
|
||
|
|
if [ "$http_code" = "200" ] && echo "$response" | grep -q '"result":"0x8a"'; then
|
||
|
|
SUCCESSFUL_REQUESTS=$((SUCCESSFUL_REQUESTS + 1))
|
||
|
|
local success_rate=$(echo "scale=2; $SUCCESSFUL_REQUESTS * 100 / $TOTAL_REQUESTS" | bc)
|
||
|
|
echo -e "${GREEN}✅ Success${NC} (HTTP $http_code, ${curl_time}s, Success rate: ${success_rate}%)"
|
||
|
|
echo "$(date -u +"%Y-%m-%d %H:%M:%S UTC"),SUCCESS,$http_code,$curl_time" >> "$LOG_FILE"
|
||
|
|
else
|
||
|
|
FAILED_REQUESTS=$((FAILED_REQUESTS + 1))
|
||
|
|
local success_rate=$(echo "scale=2; $SUCCESSFUL_REQUESTS * 100 / $TOTAL_REQUESTS" | bc)
|
||
|
|
echo -e "${RED}❌ Failed${NC} (HTTP ${http_code:-N/A}, ${curl_time}s, Success rate: ${success_rate}%)"
|
||
|
|
echo "$(date -u +"%Y-%m-%d %H:%M:%S UTC"),FAILED,${http_code:-N/A},$curl_time" >> "$LOG_FILE"
|
||
|
|
|
||
|
|
# Alert if success rate drops below 70%
|
||
|
|
if (( $(echo "$success_rate < 70" | bc -l) )); then
|
||
|
|
echo -e "${YELLOW}⚠️ WARNING: Success rate below 70%!${NC}"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Update response time stats
|
||
|
|
local time_ms=$(echo "$curl_time * 1000" | bc | cut -d. -f1)
|
||
|
|
TOTAL_RESPONSE_TIME=$(echo "$TOTAL_RESPONSE_TIME + $time_ms" | bc)
|
||
|
|
if [ "$time_ms" -lt "$MIN_RESPONSE_TIME" ]; then
|
||
|
|
MIN_RESPONSE_TIME=$time_ms
|
||
|
|
fi
|
||
|
|
if [ "$time_ms" -gt "$MAX_RESPONSE_TIME" ]; then
|
||
|
|
MAX_RESPONSE_TIME=$time_ms
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Function to print statistics
|
||
|
|
print_stats() {
|
||
|
|
if [ $TOTAL_REQUESTS -eq 0 ]; then
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
|
||
|
|
local success_rate=$(echo "scale=2; $SUCCESSFUL_REQUESTS * 100 / $TOTAL_REQUESTS" | bc)
|
||
|
|
local avg_time=$(echo "scale=2; $TOTAL_RESPONSE_TIME / $TOTAL_REQUESTS" | bc)
|
||
|
|
local avg_time_sec=$(echo "scale=3; $avg_time / 1000" | bc)
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
echo "=== Statistics ==="
|
||
|
|
echo "Total Requests: $TOTAL_REQUESTS"
|
||
|
|
echo "Successful: $SUCCESSFUL_REQUESTS"
|
||
|
|
echo "Failed: $FAILED_REQUESTS"
|
||
|
|
echo "Success Rate: ${success_rate}%"
|
||
|
|
echo "Avg Response Time: ${avg_time_sec}s (${avg_time}ms)"
|
||
|
|
echo "Min Response Time: $(echo "scale=3; $MIN_RESPONSE_TIME / 1000" | bc)s ($MIN_RESPONSE_TIME ms)"
|
||
|
|
echo "Max Response Time: $(echo "scale=3; $MAX_RESPONSE_TIME / 1000" | bc)s ($MAX_RESPONSE_TIME ms)"
|
||
|
|
echo "=================="
|
||
|
|
echo ""
|
||
|
|
}
|
||
|
|
|
||
|
|
# Trap to print stats on exit
|
||
|
|
trap print_stats EXIT INT TERM
|
||
|
|
|
||
|
|
# Initialize log file
|
||
|
|
echo "timestamp,status,http_code,response_time_seconds" > "$LOG_FILE"
|
||
|
|
|
||
|
|
echo "Starting RPC Endpoint Monitor"
|
||
|
|
echo "RPC URL: $RPC_URL"
|
||
|
|
echo "Interval: $INTERVAL seconds"
|
||
|
|
echo "Log File: $LOG_FILE"
|
||
|
|
echo "Press Ctrl+C to stop"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Main monitoring loop
|
||
|
|
while true; do
|
||
|
|
check_endpoint
|
||
|
|
sleep "$INTERVAL"
|
||
|
|
done
|