- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환 - sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자 - t_vessel_latest_position → t_ais_position 테이블 전환 - 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등) - AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼) - CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가 - VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승 - SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류 - WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳) - 모니터링/성능 최적화 코드 mmsi 기반 전환 - DataSource 설정 통합 (snpdb 단일 DB) - AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원) - ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
155 lines
4.9 KiB
Bash
155 lines
4.9 KiB
Bash
#!/bin/bash
|
|
|
|
# 실시간 시스템 모니터링 스크립트
|
|
# 부하 테스트 중 시스템 상태를 실시간으로 모니터링
|
|
|
|
# 색상 정의
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 애플리케이션 정보
|
|
APP_HOST="10.26.252.48"
|
|
APP_PORT="8090"
|
|
DB_HOST_COLLECT="10.26.252.39"
|
|
DB_HOST_QUERY="10.26.252.48"
|
|
DB_PORT="5432"
|
|
DB_NAME="mdadb"
|
|
DB_USER="mdauser"
|
|
|
|
# 화면 지우기
|
|
clear_screen() {
|
|
clear
|
|
}
|
|
|
|
# 헤더 출력
|
|
print_header() {
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo -e "${BLUE} 선박 궤적 시스템 실시간 모니터링 ${NC}"
|
|
echo -e "${BLUE}========================================${NC}"
|
|
echo -e "시간: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo ""
|
|
}
|
|
|
|
# 애플리케이션 상태 확인
|
|
check_app_status() {
|
|
echo -e "${GREEN}[애플리케이션 상태]${NC}"
|
|
|
|
# Health check
|
|
health=$(curl -s "http://$APP_HOST:$APP_PORT/actuator/health" | jq -r '.status' 2>/dev/null || echo "UNKNOWN")
|
|
if [ "$health" == "UP" ]; then
|
|
echo -e "상태: ${GREEN}$health${NC}"
|
|
else
|
|
echo -e "상태: ${RED}$health${NC}"
|
|
fi
|
|
|
|
# 실행 중인 Job
|
|
running_jobs=$(curl -s "http://$APP_HOST:$APP_PORT/admin/batch/job/running" | jq -r '.[]' 2>/dev/null || echo "N/A")
|
|
echo -e "실행 중인 Job: $running_jobs"
|
|
|
|
# 메트릭 요약
|
|
metrics=$(curl -s "http://$APP_HOST:$APP_PORT/admin/metrics/summary" 2>/dev/null)
|
|
if [ ! -z "$metrics" ]; then
|
|
echo -e "처리된 레코드: $(echo $metrics | jq -r '.processedRecords // "N/A"')"
|
|
echo -e "평균 처리 시간: $(echo $metrics | jq -r '.avgProcessingTime // "N/A"')ms"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# 시스템 리소스 모니터링
|
|
check_system_resources() {
|
|
echo -e "${GREEN}[시스템 리소스]${NC}"
|
|
|
|
# CPU 사용률
|
|
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
|
|
echo -e "CPU 사용률: ${cpu_usage}%"
|
|
|
|
# 메모리 사용률
|
|
mem_info=$(free -g | grep "Mem:")
|
|
mem_total=$(echo $mem_info | awk '{print $2}')
|
|
mem_used=$(echo $mem_info | awk '{print $3}')
|
|
mem_percent=$(awk "BEGIN {printf \"%.1f\", ($mem_used/$mem_total)*100}")
|
|
echo -e "메모리: ${mem_used}GB / ${mem_total}GB (${mem_percent}%)"
|
|
|
|
# 디스크 사용률
|
|
disk_usage=$(df -h / | tail -1 | awk '{print $5}')
|
|
echo -e "디스크 사용률: $disk_usage"
|
|
echo ""
|
|
}
|
|
|
|
# 데이터베이스 연결 모니터링
|
|
check_db_connections() {
|
|
echo -e "${GREEN}[데이터베이스 연결]${NC}"
|
|
|
|
# CollectDB 연결
|
|
collect_conn=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST_COLLECT -U $DB_USER -d $DB_NAME -t -c "SELECT count(*) FROM pg_stat_activity WHERE datname='$DB_NAME';" 2>/dev/null || echo "N/A")
|
|
echo -e "CollectDB 연결: $collect_conn"
|
|
|
|
# QueryDB 연결
|
|
query_conn=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST_QUERY -U $DB_USER -d $DB_NAME -t -c "SELECT count(*) FROM pg_stat_activity WHERE datname='$DB_NAME';" 2>/dev/null || echo "N/A")
|
|
echo -e "QueryDB 연결: $query_conn"
|
|
echo ""
|
|
}
|
|
|
|
# WebSocket 연결 모니터링
|
|
check_websocket_status() {
|
|
echo -e "${GREEN}[WebSocket 상태]${NC}"
|
|
|
|
ws_status=$(curl -s "http://$APP_HOST:$APP_PORT/api/websocket/status" 2>/dev/null)
|
|
if [ ! -z "$ws_status" ]; then
|
|
echo -e "활성 세션: $(echo $ws_status | jq -r '.activeSessions // "N/A"')"
|
|
echo -e "활성 쿼리: $(echo $ws_status | jq -r '.activeQueries // "N/A"')"
|
|
echo -e "처리된 메시지: $(echo $ws_status | jq -r '.totalMessagesProcessed // "N/A"')"
|
|
else
|
|
echo -e "WebSocket 상태를 가져올 수 없습니다."
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# 성능 최적화 상태
|
|
check_performance_status() {
|
|
echo -e "${GREEN}[성능 최적화 상태]${NC}"
|
|
|
|
perf_status=$(curl -s "http://$APP_HOST:$APP_PORT/api/v1/performance/status" 2>/dev/null)
|
|
if [ ! -z "$perf_status" ]; then
|
|
echo -e "동적 청크 크기: $(echo $perf_status | jq -r '.currentChunkSize // "N/A"')"
|
|
echo -e "캐시 히트율: $(echo $perf_status | jq -r '.cacheHitRate // "N/A"')%"
|
|
echo -e "메모리 사용률: $(echo $perf_status | jq -r '.memoryUsage.usedPercentage // "N/A"')%"
|
|
else
|
|
echo -e "성능 상태를 가져올 수 없습니다."
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# 실시간 로그 tail (별도 터미널에서 실행)
|
|
tail_logs() {
|
|
echo -e "${GREEN}[최근 로그]${NC}"
|
|
echo "애플리케이션 로그는 별도 터미널에서 확인하세요:"
|
|
echo "tail -f /path/to/application.log"
|
|
echo ""
|
|
}
|
|
|
|
# 메인 루프
|
|
main() {
|
|
while true; do
|
|
clear_screen
|
|
print_header
|
|
check_app_status
|
|
check_system_resources
|
|
check_db_connections
|
|
check_websocket_status
|
|
check_performance_status
|
|
|
|
echo -e "${YELLOW}5초 후 갱신... (Ctrl+C로 종료)${NC}"
|
|
sleep 5
|
|
done
|
|
}
|
|
|
|
# 트랩 설정
|
|
trap 'echo -e "\n${RED}모니터링 종료${NC}"; exit 0' INT TERM
|
|
|
|
# 실행
|
|
main
|