using Google.Protobuf.WellKnownTypes; using ServerCore; namespace ServerBase; public class Monitor : Singleton { // 접속중인 유저수 카운터 public Counter UserCurrentCount { get; set; } = new Counter(); // 1분 동안 최대 로그인 처리 횟수 private long MaxLoginCounterForMin { get; set; } = 0; private void checkMaxLoginCounter(long loginCounter) { MaxLoginCounterForMin = Math.Max(MaxLoginCounterForMin, loginCounter); NamedPipeMonitor.setContentDetail("분당 최대 로그인 처리 수", Value.ForNumber(MaxLoginCounterForMin)); } // 1분당 로그인 처리 수 private (DateTime setTime, Counter counter) LoginCounter { get; set; } = new ValueTuple(); public void incLoginCounter() { var current = DateTimeHelper.Current; if (current - LoginCounter.setTime > TimeSpan.FromSeconds(60)) { LoginCounter = new(current, new Counter()); } LoginCounter.counter.incCount(); checkMaxLoginCounter(LoginCounter.counter.getCount()); } // DB 최대 응답 지연 시간 private long MaxDelayTimeForDBResponse { get; set; } public void setDelayTimeForDBResponse(long delayTimeMs) { MaxDelayTimeForDBResponse = Math.Max(MaxDelayTimeForDBResponse, delayTimeMs); NamedPipeMonitor.setContentDetail("DB 응답 최대 딜레이 시간", Value.ForNumber(MaxDelayTimeForDBResponse)); if(delayTimeMs >= 1000) incDelayTimeForDBResponseOverSec(); } // 1초 이상 DB 응답 지연 횟수 private Counter DelayTimeForDBResponseOverSec { get; set; } = new Counter(); private void incDelayTimeForDBResponseOverSec() { DelayTimeForDBResponseOverSec.incCount(); NamedPipeMonitor.setContentDetail("1초 이상 DB 응답 딜레이 수", Value.ForNumber(DelayTimeForDBResponseOverSec.getCount())); } // Current Room 갯수 private Counter CurrentRoomCounter { get; set; } = new Counter(); public void incRoomCounter() { CurrentRoomCounter.incCount(); var room_counter = CurrentRoomCounter.getCount(); NamedPipeMonitor.setContentDetail("현재 룸 갯수", Value.ForNumber(room_counter)); setMaxRoomCounterForRunningTime(room_counter); } public void decRoomCounter() { CurrentRoomCounter.decCount(); NamedPipeMonitor.setContentDetail("현재 룸 갯수", Value.ForNumber(CurrentRoomCounter.getCount())); } private long MaxRoomCounterForRunningTime { get; set; } private void setMaxRoomCounterForRunningTime(long roomCounter) { if (MaxRoomCounterForRunningTime < roomCounter ) { MaxRoomCounterForRunningTime = roomCounter; } NamedPipeMonitor.setContentDetail("러닝 타임 중 최대 룸 갯수", Value.ForNumber(MaxRoomCounterForRunningTime)); } public void setReceivedP2PDataInfo(long packetDataSize = 0, long packetCount = 0, int receivedUserCount = 0) { NamedPipeMonitor.setContentDetail("P2P 수신 데이터 양", Value.ForNumber(packetDataSize)); NamedPipeMonitor.setContentDetail("P2P 수신 패킷 수", Value.ForNumber(packetCount)); NamedPipeMonitor.setContentDetail("P2P 수신 유저수", Value.ForNumber(receivedUserCount)); } }