89 lines
3.3 KiB
C#
89 lines
3.3 KiB
C#
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
|
using ServerCore;
|
|
|
|
|
|
namespace ServerBase;
|
|
|
|
public class Monitor : Singleton<Monitor>
|
|
{
|
|
// 접속중인 유저수 카운터
|
|
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<DateTime, Counter>();
|
|
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));
|
|
}
|
|
}
|