From 753fc22d6b3854054847492719c346361bf1d06d Mon Sep 17 00:00:00 2001 From: 王彬 Date: Fri, 25 Jun 2021 13:04:18 +0800 Subject: [PATCH] 1.optimized monitor --- src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java | 66 +++++++++++++++++++++++++++++++++++++++++------------------------- src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java | 5 +++++ src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java | 8 +++++--- src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java | 8 ++++---- test/main/java/com/taover/bazhuayun/analysis/test/SemilarClient.java | 2 +- test/main/java/com/taover/bazhuayun/analysis/test/WbTest.java | 7 +++++++ 6 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 test/main/java/com/taover/bazhuayun/analysis/test/WbTest.java diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java index 85aac75..578affd 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java @@ -5,9 +5,10 @@ import com.taover.util.UtilLog; public class ClientInstance implements Instance{ private AnalysisHeartbeatInstanceEntity instance; - private ClientRequest lastestClientRequest; - private long lastestServerUnixtime = System.currentTimeMillis()/1000; + private ClientRequest latestClientRequest; private long currFlushServerUnixtimeBaseline = 0L; + private long latestClientServerUnixtime = System.currentTimeMillis()/1000; + private long latestDetectServerUnixtime = this.latestClientServerUnixtime; private int lostClientRequestCount = 0; private boolean detectNewLost = false; @@ -18,45 +19,51 @@ public class ClientInstance implements Instance{ @Override public void flush() { //还未收到请求,则无需刷新失败次数 - if(lastestClientRequest == null) { + if(latestClientRequest == null) { return; } - this.detectNewLost = false; - this.currFlushServerUnixtimeBaseline = System.currentTimeMillis()/1000; - //通过服务器时间,判断是否超时未收到客户端请求 - if(isNewLoopForFixRateSec()) { - ++this.lostClientRequestCount; - this.detectNewLost = true; - - UtilLog.infoForMessage("检测到超时未收到请求,code["+this.getIdentity()+"],丢包统计["+this.lostClientRequestCount+"]", ServerInstance.class); + synchronized (this) { + this.detectNewLost = false; + this.currFlushServerUnixtimeBaseline = System.currentTimeMillis()/1000; + //通过服务器时间,判断是否超时未收到客户端请求 + if(isNewLoopForFixRateSec()) { + this.latestDetectServerUnixtime = this.currFlushServerUnixtimeBaseline; + if(isOverdueFixAndMaxWaitTime()) { + ++this.lostClientRequestCount; + this.detectNewLost = true; + UtilLog.infoForMessage("检测到超时未收到请求,code["+this.getIdentity()+"],丢包统计["+this.lostClientRequestCount+"]", ServerInstance.class); + } + } } } + private boolean isOverdueFixAndMaxWaitTime() { + //System.out.println("isOverdueFixAndMaxWaitTime:"+(this.currFlushServerUnixtimeBaseline-this.latestClientServerUnixtime)+" > "+(this.instance.getFixRateSec()+this.instance.getMaxWaitSec())); + return (this.currFlushServerUnixtimeBaseline-this.latestClientServerUnixtime) > (this.instance.getFixRateSec()+this.instance.getMaxWaitSec()); + } + private boolean isNewLoopForFixRateSec() { - return ((this.currFlushServerUnixtimeBaseline-this.lastestServerUnixtime) / this.instance.getFixRateSec()) > this.lostClientRequestCount; + //System.out.println("isNewLoopForFixRateSec:"+(this.currFlushServerUnixtimeBaseline-this.latestDetectServerUnixtime)+" > "+this.instance.getFixRateSec()); + return ((this.currFlushServerUnixtimeBaseline-this.latestDetectServerUnixtime) / this.instance.getFixRateSec()) > 0; } @Override - public boolean needReform() { + public boolean needReform() { return this.detectNewLost && this.lostClientRequestCount>=1 && this.lostClientRequestCount<=this.instance.getReformMaxTime(); } @Override - public boolean needDeploy() { + public boolean needDeploy() { return this.detectNewLost && this.lostClientRequestCount == this.instance.getDeployAtLostNum(); } - public long getLastestServerUnixtime() { - return lastestServerUnixtime; - } - public int getLostClientRequestCount() { return lostClientRequestCount; } public ClientRequest getLastestClientRequest() { - return lastestClientRequest; + return latestClientRequest; } public AnalysisHeartbeatInstanceEntity getInstance() { @@ -64,15 +71,20 @@ public class ClientInstance implements Instance{ } public void dealClientRequest(ClientRequest clientRequest) { + //System.out.println("dealClientRequest:"+clientRequest.toString()); + if(this.instance.getFixRateSec() == null) { this.instance.setFixRateSec(Instance.DEFAULT_FIX_RATE_SEC); } if(this.instance.getMaxWaitSec() == null) { this.instance.setMaxWaitSec(Instance.DEFAULT_MAX_WAIT_SEC); } - this.lastestClientRequest = clientRequest; - this.lastestServerUnixtime = System.currentTimeMillis()/1000; - this.lostClientRequestCount = 0; + + synchronized (this) { + this.latestClientRequest = clientRequest; + this.latestClientServerUnixtime = System.currentTimeMillis()/1000; + this.lostClientRequestCount = 0; + } } @Override @@ -80,11 +92,15 @@ public class ClientInstance implements Instance{ return this.instance.getCode(); } + public long getLatestClientServerUnixtime() { + return this.latestClientServerUnixtime; + } + public long getUnixtime() { - if(this.lastestClientRequest == null) { - return this.lastestServerUnixtime; + if(this.latestClientRequest == null) { + return this.latestClientServerUnixtime; }else { - return this.lastestClientRequest.getUnixtime(); + return this.latestClientRequest.getUnixtime(); } } } diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java index 748c27f..7d3b3a6 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java @@ -60,4 +60,9 @@ public class ClientRequest { public String getIdentity() { return this.code; } + + @Override + public String toString() { + return "ClientRequest [code=" + code + ", ip=" + ip + ", unixtime=" + unixtime + ", seckey=" + seckey + "]"; + } } diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java index 6f88952..6340cf4 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java @@ -39,8 +39,9 @@ public class ServerInstance implements Instance { return; } - this.latestRequestUnixtime = this.serverUnixtimeBaseline; + //发送数据包,并更新结构数据 try { + this.latestRequestUnixtime = this.serverUnixtimeBaseline; this.isSendNewHeartbeat = true; this.latestUrlWithParam = this.instance.getUrl() + this.getUrlParams(); UtilLog.infoForMessage("向code["+this.getIdentity()+"],url["+this.latestUrlWithParam+"]发送心跳请求", ServerInstance.class); @@ -52,7 +53,7 @@ public class ServerInstance implements Instance { } catch(SocketTimeoutException timeError) { this.latestServerResponse = ServerResponse.createOverdue(); } catch (Exception e) { - this.latestServerResponse = ServerResponse.createException(e); + this.latestServerResponse = ServerResponse.createException(e); } //判断响应是否正常 @@ -69,7 +70,8 @@ public class ServerInstance implements Instance { } private boolean isNewLoopForFixRateSec() { - return ((this.serverUnixtimeBaseline-this.latestRequestUnixtime)/this.instance.getFixRateSec()) > this.errorServerResponseCount; + System.out.println("isNewLoopForFixRateSec:"+(this.serverUnixtimeBaseline-this.latestRequestUnixtime)+" > "+this.instance.getFixRateSec()); + return (this.serverUnixtimeBaseline-this.latestRequestUnixtime) > this.instance.getFixRateSec(); } public AnalysisHeartbeatInstanceEntity getInstance() { diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java index 0c99485..8112f1d 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java @@ -60,11 +60,11 @@ public class HeartbeatReformServiceImpl implements HeartbeatReformService { htmlContent += " 未收到服务器响应\n"; }else { if(instance.getLatestServerResponse().isOverdue()) { - htmlContent += " 向接口["+entity.getUrl()+"]发送请求,响应超时["+entity.getMaxWaitSec()+"s],请及时确认服务是否正常运行\n"; + htmlContent += " CODE["+instance.getIdentity()+"]监控异常,向接口["+entity.getUrl()+"]发送请求,响应超时["+entity.getMaxWaitSec()+"s],请及时确认服务是否正常运行\n"; }else if(!instance.getLatestServerResponse().isCodeOk()) { - htmlContent += " 向接口["+entity.getUrl()+"]发送请求,响应数据不正常(详细请查看邮件),请及时确认服务是否正常运行\n"; + htmlContent += " CODE["+instance.getIdentity()+"]监控异常,向接口["+entity.getUrl()+"]发送请求,响应数据不正常(详细请查看邮件),请及时确认服务是否正常运行\n"; }else { - htmlContent += " 向接口["+entity.getUrl()+"]发送请求,未知异常,请及时确认服务是否正常运行\n"; + htmlContent += " CODE["+instance.getIdentity()+"]监控异常, 向接口["+entity.getUrl()+"]发送请求,未知异常,请及时确认服务是否正常运行\n"; } } htmlContent += " 最后一次请求时间: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(instance.getLatestRequestUnixtime()*1000)); @@ -148,7 +148,7 @@ public class HeartbeatReformServiceImpl implements HeartbeatReformService { htmlContent += "
  • 请求频率: "+entity.getFixRateSec()+"秒/次
  • "; htmlContent += "
  • 请求最大等待时间: "+entity.getMaxWaitSec()+"秒
  • "; htmlContent += "
  • 客户端请求时间戳: "+sdf.format(new Date(instance.getUnixtime()*1000))+"
  • "; - htmlContent += "
  • 服务器接收时间: "+sdf.format(new Date(instance.getLastestServerUnixtime()*1000))+"
  • "; + htmlContent += "
  • 服务器接收时间: "+sdf.format(new Date(instance.getLatestClientServerUnixtime()*1000))+"
  • "; htmlContent += "
  • 最后一次收到的请求包: "+JSON.toJSONString(instance.getLastestClientRequest())+"
  • "; htmlContent += "
  • 累计次数("+entity.getReformMaxTime()+"次后不再报警):"+instance.getLostClientRequestCount()+"
  • "; htmlContent += ""; diff --git a/test/main/java/com/taover/bazhuayun/analysis/test/SemilarClient.java b/test/main/java/com/taover/bazhuayun/analysis/test/SemilarClient.java index ac5bcf1..8789dda 100644 --- a/test/main/java/com/taover/bazhuayun/analysis/test/SemilarClient.java +++ b/test/main/java/com/taover/bazhuayun/analysis/test/SemilarClient.java @@ -14,7 +14,7 @@ public class SemilarClient { String token = ""; try { System.out.println("=======send heartbeat["+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"]======="); - System.out.println("response:"+UtilHttpByOkHttp.sendGet("http://localhost/api/heartbeat?code="+code+"&unixtime="+time+"&seckey="+UtilEncrypt.MD5Lower32(code+time+token), null)); + System.out.println("response:"+UtilHttpByOkHttp.sendGet("http://localhost/api/heartbeat/demon?code="+code+"&unixtime="+time+"&seckey="+UtilEncrypt.MD5Lower32(code+time+token), null)); Thread.sleep(1000*60); } catch (Exception e) { diff --git a/test/main/java/com/taover/bazhuayun/analysis/test/WbTest.java b/test/main/java/com/taover/bazhuayun/analysis/test/WbTest.java new file mode 100644 index 0000000..98396fb --- /dev/null +++ b/test/main/java/com/taover/bazhuayun/analysis/test/WbTest.java @@ -0,0 +1,7 @@ +package com.taover.bazhuayun.analysis.test; + +public class WbTest { + public static void main(String args[]) { + System.out.println("equals:"+((-121L)/1000)); + } +} -- libgit2 0.21.2