소스 검색

Refactor version representation and add client version to heartbeat

Signed-off-by: Eric Zhao <sczyh16@gmail.com>
master
Eric Zhao 6 년 전
부모
커밋
9e012d2e20
10개의 변경된 파일77개의 추가작업 그리고 41개의 파일을 삭제
  1. +9
    -5
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/Constants.java
  2. +1
    -1
      sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/datasource/entity/MachineEntity.java
  3. +20
    -4
      sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/discovery/MachineInfo.java
  4. +1
    -1
      sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/metric/MetricFetcher.java
  5. +12
    -8
      sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/view/MachineRegistryController.java
  6. +17
    -4
      sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/view/vo/MachineInfoVo.java
  7. +9
    -17
      sentinel-dashboard/src/main/webapp/resources/app/views/machine.html
  8. +2
    -1
      sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/command/handler/VersionCommandHandler.java
  9. +2
    -0
      sentinel-transport/sentinel-transport-netty-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/HttpHeartbeatSender.java
  10. +4
    -0
      sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/HeartbeatMessage.java

+ 9
- 5
sentinel-core/src/main/java/com/alibaba/csp/sentinel/Constants.java 파일 보기

@@ -26,10 +26,13 @@ import com.alibaba.csp.sentinel.slots.system.SystemRule;
* @author youji.zj * @author youji.zj
* @author jialiang.linjl * @author jialiang.linjl
*/ */
public class Constants {
public final class Constants {

public static final String SENTINEL_VERSION = "0.2.0";


public final static int MAX_CONTEXT_NAME_SIZE = 2000; public final static int MAX_CONTEXT_NAME_SIZE = 2000;
public final static int MAX_SLOT_CHAIN_SIZE = 6000; public final static int MAX_SLOT_CHAIN_SIZE = 6000;

public final static String ROOT_ID = "machine-root"; public final static String ROOT_ID = "machine-root";
public final static String CONTEXT_DEFAULT_NAME = "sentinel_default_context"; public final static String CONTEXT_DEFAULT_NAME = "sentinel_default_context";


@@ -37,16 +40,17 @@ public class Constants {
Env.nodeBuilder.buildClusterNode()); Env.nodeBuilder.buildClusterNode());


/** /**
* statistics for {@link SystemRule} checking.
* Statistics for {@link SystemRule} checking.
*/ */
public final static ClusterNode ENTRY_NODE = new ClusterNode(); public final static ClusterNode ENTRY_NODE = new ClusterNode();


/** /**
* 超过这个时间的请求不作为平均时间计算
* Response time that exceeds TIME_DROP_VALVE will be calculated as TIME_DROP_VALVE.
*/ */
public final static int TIME_DROP_VALVE = 4900; public final static int TIME_DROP_VALVE = 4900;


/*** 框架功能打开或者关闭的开关 ***/
/**
* The global switch for Sentinel.
*/
public static volatile boolean ON = true; public static volatile boolean ON = true;

} }

+ 1
- 1
sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/datasource/entity/MachineEntity.java 파일 보기

@@ -103,7 +103,7 @@ public class MachineEntity {
machineInfo.setHostname(hostname); machineInfo.setHostname(hostname);
machineInfo.setIp(ip); machineInfo.setIp(ip);
machineInfo.setPort(port); machineInfo.setPort(port);
machineInfo.setVersion(timestamp);
machineInfo.setTimestamp(timestamp);


return machineInfo; return machineInfo;
} }


+ 20
- 4
sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/discovery/MachineInfo.java 파일 보기

@@ -20,11 +20,17 @@ import java.util.Date;
import com.alibaba.csp.sentinel.util.StringUtil; import com.alibaba.csp.sentinel.util.StringUtil;


public class MachineInfo implements Comparable<MachineInfo> { public class MachineInfo implements Comparable<MachineInfo> {

private String app = ""; private String app = "";
private String hostname = ""; private String hostname = "";
private String ip = ""; private String ip = "";
private Integer port = -1; private Integer port = -1;
private Date version;
private Date timestamp;

/**
* Indicates the version of Sentinel client (since 0.2.0).
*/
private String version;


public static MachineInfo of(String app, String ip, Integer port) { public static MachineInfo of(String app, String ip, Integer port) {
MachineInfo machineInfo = new MachineInfo(); MachineInfo machineInfo = new MachineInfo();
@@ -66,12 +72,21 @@ public class MachineInfo implements Comparable<MachineInfo> {
this.ip = ip; this.ip = ip;
} }


public Date getVersion() {
public Date getTimestamp() {
return timestamp;
}

public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}

public String getVersion() {
return version; return version;
} }


public void setVersion(Date version) {
public MachineInfo setVersion(String version) {
this.version = version; this.version = version;
return this;
} }


@Override @Override
@@ -95,7 +110,8 @@ public class MachineInfo implements Comparable<MachineInfo> {
", hostname='" + hostname + '\'' + ", hostname='" + hostname + '\'' +
", ip='" + ip + '\'' + ", ip='" + ip + '\'' +
", port=" + port + ", port=" + port +
", version=" + version +
", timestamp=" + timestamp +
", version='" + version + '\'' +
'}'; '}';
} }




+ 1
- 1
sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/metric/MetricFetcher.java 파일 보기

@@ -184,7 +184,7 @@ public class MetricFetcher {
final CountDownLatch latch = new CountDownLatch(machines.size()); final CountDownLatch latch = new CountDownLatch(machines.size());
for (final MachineInfo machine : machines) { for (final MachineInfo machine : machines) {
// dead // dead
if (System.currentTimeMillis() - machine.getVersion().getTime() > MAX_CLIENT_LIVE_TIME_MS) {
if (System.currentTimeMillis() - machine.getTimestamp().getTime() > MAX_CLIENT_LIVE_TIME_MS) {
latch.countDown(); latch.countDown();
dead.incrementAndGet(); dead.incrementAndGet();
continue; continue;


+ 12
- 8
sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/view/MachineRegistryController.java 파일 보기

@@ -17,6 +17,8 @@ package com.taobao.csp.sentinel.dashboard.view;


import java.util.Date; import java.util.Date;


import com.alibaba.csp.sentinel.util.StringUtil;

import com.taobao.csp.sentinel.dashboard.discovery.AppManagement; import com.taobao.csp.sentinel.dashboard.discovery.AppManagement;
import com.taobao.csp.sentinel.dashboard.discovery.MachineDiscovery; import com.taobao.csp.sentinel.dashboard.discovery.MachineDiscovery;
import com.taobao.csp.sentinel.dashboard.discovery.MachineInfo; import com.taobao.csp.sentinel.dashboard.discovery.MachineInfo;
@@ -31,13 +33,15 @@ import org.springframework.web.bind.annotation.ResponseBody;
@Controller @Controller
@RequestMapping(value = "/registry", produces = MediaType.APPLICATION_JSON_VALUE) @RequestMapping(value = "/registry", produces = MediaType.APPLICATION_JSON_VALUE)
public class MachineRegistryController { public class MachineRegistryController {
Logger logger = LoggerFactory.getLogger(MachineRegistryController.class);

private final Logger logger = LoggerFactory.getLogger(MachineRegistryController.class);

@Autowired @Autowired
private AppManagement appManagement; private AppManagement appManagement;


@ResponseBody @ResponseBody
@RequestMapping("/machine") @RequestMapping("/machine")
public Result<?> receiveHeartBeat(String app, Long version, String hostname, String ip, Integer port) {
public Result<?> receiveHeartBeat(String app, Long version, String v, String hostname, String ip, Integer port) {
if (app == null) { if (app == null) {
app = MachineDiscovery.UNKNOWN_APP_NAME; app = MachineDiscovery.UNKNOWN_APP_NAME;
} }
@@ -48,23 +52,23 @@ public class MachineRegistryController {
return Result.ofFail(-1, "port can't be null"); return Result.ofFail(-1, "port can't be null");
} }
if (port == -1) { if (port == -1) {
logger.info("receive heartbeat from " + ip + " but port not set yet");
logger.info("Receive heartbeat from " + ip + " but port not set yet");
return Result.ofFail(-1, "your port not set yet"); return Result.ofFail(-1, "your port not set yet");
} }
if (version == null) {
version = System.currentTimeMillis();
}
String sentinelVersion = StringUtil.isEmpty(v) ? "unknown" : v;
long timestamp = version == null ? System.currentTimeMillis() : version;
try { try {
MachineInfo machineInfo = new MachineInfo(); MachineInfo machineInfo = new MachineInfo();
machineInfo.setApp(app); machineInfo.setApp(app);
machineInfo.setHostname(hostname); machineInfo.setHostname(hostname);
machineInfo.setIp(ip); machineInfo.setIp(ip);
machineInfo.setPort(port); machineInfo.setPort(port);
machineInfo.setVersion(new Date(version));
machineInfo.setTimestamp(new Date(timestamp));
machineInfo.setVersion(sentinelVersion);
appManagement.addMachine(machineInfo); appManagement.addMachine(machineInfo);
return Result.ofSuccessMsg("success"); return Result.ofSuccessMsg("success");
} catch (Exception e) { } catch (Exception e) {
logger.error("receive heartbeat error:", e);
logger.error("Receive heartbeat error", e);
return Result.ofFail(-1, e.getMessage()); return Result.ofFail(-1, e.getMessage());
} }
} }


+ 17
- 4
sentinel-dashboard/src/main/java/com/taobao/csp/sentinel/dashboard/view/vo/MachineInfoVo.java 파일 보기

@@ -26,13 +26,16 @@ import com.taobao.csp.sentinel.dashboard.discovery.MachineInfo;
* @author leyou * @author leyou
*/ */
public class MachineInfoVo { public class MachineInfoVo {

private String app; private String app;
private String hostname; private String hostname;
private String ip; private String ip;
private Integer port; private Integer port;
private Date version;
private Date timestamp;
private boolean health; private boolean health;


private String version;

public static List<MachineInfoVo> fromMachineInfoList(List<MachineInfo> machines) { public static List<MachineInfoVo> fromMachineInfoList(List<MachineInfo> machines) {
List<MachineInfoVo> list = new ArrayList<>(); List<MachineInfoVo> list = new ArrayList<>();
for (MachineInfo machine : machines) { for (MachineInfo machine : machines) {
@@ -47,8 +50,9 @@ public class MachineInfoVo {
vo.setHostname(machine.getHostname()); vo.setHostname(machine.getHostname());
vo.setIp(machine.getIp()); vo.setIp(machine.getIp());
vo.setPort(machine.getPort()); vo.setPort(machine.getPort());
vo.setTimestamp(machine.getTimestamp());
vo.setVersion(machine.getVersion()); vo.setVersion(machine.getVersion());
if (System.currentTimeMillis() - machine.getVersion().getTime() < MachineDiscovery.MAX_CLIENT_LIVE_TIME_MS) {
if (System.currentTimeMillis() - machine.getTimestamp().getTime() < MachineDiscovery.MAX_CLIENT_LIVE_TIME_MS) {
vo.setHealth(true); vo.setHealth(true);
} }
return vo; return vo;
@@ -86,12 +90,21 @@ public class MachineInfoVo {
this.port = port; this.port = port;
} }


public Date getVersion() {
public Date getTimestamp() {
return timestamp;
}

public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}

public String getVersion() {
return version; return version;
} }


public void setVersion(Date version) {
public MachineInfoVo setVersion(String version) {
this.version = version; this.version = version;
return this;
} }


public boolean isHealth() { public boolean isHealth() {


+ 9
- 17
sentinel-dashboard/src/main/webapp/resources/app/views/machine.html 파일 보기

@@ -37,21 +37,12 @@
<table class="table" style="border-left: none; border-right:none;margin-top: 10px;"> <table class="table" style="border-left: none; border-right:none;margin-top: 10px;">
<thead> <thead>
<tr style="background: #F3F5F7;"> <tr style="background: #F3F5F7;">
<td>
机器名
</td>
<td>
IP地址
</td>
<td>
端口号
</td>
<td>
健康状态
</td>
<td>
心跳时间
</td>
<td>机器名</td>
<td>IP 地址</td>
<td>端口号</td>
<td>Sentinel 客户端版本</td>
<td>健康状态</td>
<td>心跳时间</td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -60,10 +51,11 @@
<td style="word-wrap:break-word;word-break:break-all;">{{entry.hostname}}</td> <td style="word-wrap:break-word;word-break:break-all;">{{entry.hostname}}</td>
<td style="word-wrap:break-word;word-break:break-all;">{{entry.ip}}</td> <td style="word-wrap:break-word;word-break:break-all;">{{entry.ip}}</td>
<td> {{entry.port}} </td> <td> {{entry.port}} </td>
<td> {{entry.version}} </td>
<td ng-if="entry.health">健康</td> <td ng-if="entry.health">健康</td>
<td ng-if="!entry.health" style="color: red">失联</td> <td ng-if="!entry.health" style="color: red">失联</td>
<td>{{entry.version | date: 'yyyy/MM/dd HH:mm:ss'}}</td>
<!--<td ng-if="!entry.health" style="color: grey">{{entry.version | date: 'yyyy/MM/dd HH:mm:ss'}}</td>-->
<td>{{entry.timestamp | date: 'yyyy/MM/dd HH:mm:ss'}}</td>
<!--<td ng-if="!entry.health" style="color: grey">{{entry.timestamp | date: 'yyyy/MM/dd HH:mm:ss'}}</td>-->
</tr> </tr>
</tbody> </tbody>
</table> </table>


+ 2
- 1
sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/command/handler/VersionCommandHandler.java 파일 보기

@@ -15,6 +15,7 @@
*/ */
package com.alibaba.csp.sentinel.command.handler; package com.alibaba.csp.sentinel.command.handler;


import com.alibaba.csp.sentinel.Constants;
import com.alibaba.csp.sentinel.command.CommandHandler; import com.alibaba.csp.sentinel.command.CommandHandler;
import com.alibaba.csp.sentinel.command.CommandRequest; import com.alibaba.csp.sentinel.command.CommandRequest;
import com.alibaba.csp.sentinel.command.CommandResponse; import com.alibaba.csp.sentinel.command.CommandResponse;
@@ -29,6 +30,6 @@ public class VersionCommandHandler implements CommandHandler<String> {


@Override @Override
public CommandResponse<String> handle(CommandRequest request) { public CommandResponse<String> handle(CommandRequest request) {
return CommandResponse.ofSuccess("0.2.0");
return CommandResponse.ofSuccess(Constants.SENTINEL_VERSION);
} }
} }

+ 2
- 0
sentinel-transport/sentinel-transport-netty-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/HttpHeartbeatSender.java 파일 보기

@@ -15,6 +15,7 @@
*/ */
package com.alibaba.csp.sentinel.transport.heartbeat; package com.alibaba.csp.sentinel.transport.heartbeat;


import com.alibaba.csp.sentinel.Constants;
import com.alibaba.csp.sentinel.transport.config.TransportConfig; import com.alibaba.csp.sentinel.transport.config.TransportConfig;
import com.alibaba.csp.sentinel.log.RecordLog; import com.alibaba.csp.sentinel.log.RecordLog;
import com.alibaba.csp.sentinel.util.AppNameUtil; import com.alibaba.csp.sentinel.util.AppNameUtil;
@@ -81,6 +82,7 @@ public class HttpHeartbeatSender implements HeartbeatSender {
uriBuilder.setScheme("http").setHost(consoleHost).setPort(consolePort) uriBuilder.setScheme("http").setHost(consoleHost).setPort(consolePort)
.setPath("/registry/machine") .setPath("/registry/machine")
.setParameter("app", AppNameUtil.getAppName()) .setParameter("app", AppNameUtil.getAppName())
.setParameter("v", Constants.SENTINEL_VERSION)
.setParameter("version", String.valueOf(System.currentTimeMillis())) .setParameter("version", String.valueOf(System.currentTimeMillis()))
.setParameter("hostname", HostNameUtil.getHostName()) .setParameter("hostname", HostNameUtil.getHostName())
.setParameter("ip", HostNameUtil.getIp()) .setParameter("ip", HostNameUtil.getIp())


+ 4
- 0
sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/heartbeat/HeartbeatMessage.java 파일 보기

@@ -18,6 +18,7 @@ package com.alibaba.csp.sentinel.transport.heartbeat;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;


import com.alibaba.csp.sentinel.Constants;
import com.alibaba.csp.sentinel.transport.config.TransportConfig; import com.alibaba.csp.sentinel.transport.config.TransportConfig;
import com.alibaba.csp.sentinel.util.AppNameUtil; import com.alibaba.csp.sentinel.util.AppNameUtil;
import com.alibaba.csp.sentinel.util.HostNameUtil; import com.alibaba.csp.sentinel.util.HostNameUtil;
@@ -46,6 +47,9 @@ public class HeartbeatMessage {
} }


public Map<String, String> generateCurrentMessage() { public Map<String, String> generateCurrentMessage() {
// Version of Sentinel.
message.put("v", Constants.SENTINEL_VERSION);
// Actually timestamp.
message.put("version", String.valueOf(TimeUtil.currentTimeMillis())); message.put("version", String.valueOf(TimeUtil.currentTimeMillis()));
message.put("port", String.valueOf(TransportConfig.getPort())); message.put("port", String.valueOf(TransportConfig.getPort()));
return message; return message;


Loading…
취소
저장