import React, { useState, useEffect } from 'react'; import { Box, Typography, Grid, Card, CardContent, Chip, Alert } from '@mui/material'; import GaugeComponent from 'react-gauge-component'; import { Cable, CheckCircle, Error as ErrorIcon } from '@mui/icons-material'; import { useRealtimeWebSocketMetrics } from '../../hooks/useRealtimeWebSocketMetrics'; interface RealtimeWebSocketGaugesProps { websocketStats: { totalConnections: number; activeConnections: number; serviceStats: Record; }; } const RealtimeWebSocketGauges: React.FC = ({ websocketStats }) => { // 실시간 WebSocket 메트릭 Hook 사용 const { metrics, isConnected } = useRealtimeWebSocketMetrics(); const [animatedValues, setAnimatedValues] = useState({ frontend: 0, backend: 0, dataService: 0, }); // 실시간 메트릭으로 값 업데이트 useEffect(() => { setAnimatedValues({ frontend: metrics.frontend.messagesPerSecond, backend: metrics.backend.messagesPerSecond, dataService: metrics.dataService.messagesPerSecond, }); }, [metrics]); return ( 실시간 WebSocket 데이터 수신 현황 : } label={isConnected ? 'WebSocket 연결됨' : 'WebSocket 연결 끊김'} color={isConnected ? 'success' : 'error'} size="small" sx={{ boxShadow: isConnected ? '0 0 10px rgba(74, 222, 128, 0.4)' : '0 0 10px rgba(248, 113, 113, 0.4)', }} /> {!isConnected && ( WebSocket 연결이 끊어졌습니다. 재연결을 시도 중입니다... )} {/* 상단 통계 - 실시간 메트릭 사용 */} 총 메시지 (Frontend) {metrics.frontend.totalMessages.toLocaleString()} 총 메시지 (Backend) {metrics.backend.totalMessages.toLocaleString()} {/* 게이지 차트들 */} {/* Frontend WebSocket */} Frontend `${value.toFixed(1)} msg/s`, style: { fontSize: '28px', fill: '#fff', textShadow: '0 0 10px rgba(74, 222, 128, 0.8)', }, }, tickLabels: { type: 'outer', ticks: [ { value: 0 }, { value: 20 }, { value: 40 }, { value: 60 }, { value: 80 }, { value: 100 }, ], defaultTickValueConfig: { formatTextValue: (value) => `${value}`, style: { fontSize: '10px', fill: 'rgba(255,255,255,0.6)', }, }, }, }} value={Math.min(animatedValues.frontend * 10, 100)} minValue={0} maxValue={100} /> {/* Backend WebSocket */} Backend (Upbit) `${value.toFixed(1)} msg/s`, style: { fontSize: '28px', fill: '#fff', textShadow: '0 0 10px rgba(251, 191, 36, 0.8)', }, }, tickLabels: { type: 'outer', ticks: [ { value: 0 }, { value: 20 }, { value: 40 }, { value: 60 }, { value: 80 }, { value: 100 }, ], defaultTickValueConfig: { formatTextValue: (value) => `${value}`, style: { fontSize: '10px', fill: 'rgba(255,255,255,0.6)', }, }, }, }} value={Math.min(animatedValues.backend * 10, 100)} minValue={0} maxValue={100} /> {/* Data Service WebSocket */} Data Service `${value.toFixed(1)} msg/s`, style: { fontSize: '28px', fill: '#fff', textShadow: '0 0 10px rgba(100, 149, 237, 0.8)', }, }, tickLabels: { type: 'outer', ticks: [ { value: 0 }, { value: 20 }, { value: 40 }, { value: 60 }, { value: 80 }, { value: 100 }, ], defaultTickValueConfig: { formatTextValue: (value) => `${value}`, style: { fontSize: '10px', fill: 'rgba(255,255,255,0.6)', }, }, }, }} value={Math.min(animatedValues.dataService * 10, 100)} minValue={0} maxValue={100} /> {/* 하단 상세 정보 */} 💡 게이지는 실제 WebSocket 메시지 수신을 실시간으로 모니터링합니다. 100ms마다 업데이트되며, 1초 슬라이딩 윈도우로 초당 메시지 수를 계산합니다. ); }; export default RealtimeWebSocketGauges;