Files
proxmox/rpc-translator-138/scripts/monitor-rpc-endpoint.sh

116 lines
3.9 KiB
Bash
Raw Normal View History

#!/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