Signed-off-by: Eric Zhao <sczyh16@gmail.com>master
@@ -26,10 +26,13 @@ import com.alibaba.csp.sentinel.slots.system.SystemRule; | |||
* @author youji.zj | |||
* @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_SLOT_CHAIN_SIZE = 6000; | |||
public final static String ROOT_ID = "machine-root"; | |||
public final static String CONTEXT_DEFAULT_NAME = "sentinel_default_context"; | |||
@@ -37,16 +40,17 @@ public class Constants { | |||
Env.nodeBuilder.buildClusterNode()); | |||
/** | |||
* statistics for {@link SystemRule} checking. | |||
* Statistics for {@link SystemRule} checking. | |||
*/ | |||
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; | |||
/*** 框架功能打开或者关闭的开关 ***/ | |||
/** | |||
* The global switch for Sentinel. | |||
*/ | |||
public static volatile boolean ON = true; | |||
} |
@@ -103,7 +103,7 @@ public class MachineEntity { | |||
machineInfo.setHostname(hostname); | |||
machineInfo.setIp(ip); | |||
machineInfo.setPort(port); | |||
machineInfo.setVersion(timestamp); | |||
machineInfo.setTimestamp(timestamp); | |||
return machineInfo; | |||
} | |||
@@ -20,11 +20,17 @@ import java.util.Date; | |||
import com.alibaba.csp.sentinel.util.StringUtil; | |||
public class MachineInfo implements Comparable<MachineInfo> { | |||
private String app = ""; | |||
private String hostname = ""; | |||
private String ip = ""; | |||
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) { | |||
MachineInfo machineInfo = new MachineInfo(); | |||
@@ -66,12 +72,21 @@ public class MachineInfo implements Comparable<MachineInfo> { | |||
this.ip = ip; | |||
} | |||
public Date getVersion() { | |||
public Date getTimestamp() { | |||
return timestamp; | |||
} | |||
public void setTimestamp(Date timestamp) { | |||
this.timestamp = timestamp; | |||
} | |||
public String getVersion() { | |||
return version; | |||
} | |||
public void setVersion(Date version) { | |||
public MachineInfo setVersion(String version) { | |||
this.version = version; | |||
return this; | |||
} | |||
@Override | |||
@@ -95,7 +110,8 @@ public class MachineInfo implements Comparable<MachineInfo> { | |||
", hostname='" + hostname + '\'' + | |||
", ip='" + ip + '\'' + | |||
", port=" + port + | |||
", version=" + version + | |||
", timestamp=" + timestamp + | |||
", version='" + version + '\'' + | |||
'}'; | |||
} | |||
@@ -184,7 +184,7 @@ public class MetricFetcher { | |||
final CountDownLatch latch = new CountDownLatch(machines.size()); | |||
for (final MachineInfo machine : machines) { | |||
// 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(); | |||
dead.incrementAndGet(); | |||
continue; | |||
@@ -17,6 +17,8 @@ package com.taobao.csp.sentinel.dashboard.view; | |||
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.MachineDiscovery; | |||
import com.taobao.csp.sentinel.dashboard.discovery.MachineInfo; | |||
@@ -31,13 +33,15 @@ import org.springframework.web.bind.annotation.ResponseBody; | |||
@Controller | |||
@RequestMapping(value = "/registry", produces = MediaType.APPLICATION_JSON_VALUE) | |||
public class MachineRegistryController { | |||
Logger logger = LoggerFactory.getLogger(MachineRegistryController.class); | |||
private final Logger logger = LoggerFactory.getLogger(MachineRegistryController.class); | |||
@Autowired | |||
private AppManagement appManagement; | |||
@ResponseBody | |||
@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) { | |||
app = MachineDiscovery.UNKNOWN_APP_NAME; | |||
} | |||
@@ -48,23 +52,23 @@ public class MachineRegistryController { | |||
return Result.ofFail(-1, "port can't be null"); | |||
} | |||
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"); | |||
} | |||
if (version == null) { | |||
version = System.currentTimeMillis(); | |||
} | |||
String sentinelVersion = StringUtil.isEmpty(v) ? "unknown" : v; | |||
long timestamp = version == null ? System.currentTimeMillis() : version; | |||
try { | |||
MachineInfo machineInfo = new MachineInfo(); | |||
machineInfo.setApp(app); | |||
machineInfo.setHostname(hostname); | |||
machineInfo.setIp(ip); | |||
machineInfo.setPort(port); | |||
machineInfo.setVersion(new Date(version)); | |||
machineInfo.setTimestamp(new Date(timestamp)); | |||
machineInfo.setVersion(sentinelVersion); | |||
appManagement.addMachine(machineInfo); | |||
return Result.ofSuccessMsg("success"); | |||
} catch (Exception e) { | |||
logger.error("receive heartbeat error:", e); | |||
logger.error("Receive heartbeat error", e); | |||
return Result.ofFail(-1, e.getMessage()); | |||
} | |||
} | |||
@@ -26,13 +26,16 @@ import com.taobao.csp.sentinel.dashboard.discovery.MachineInfo; | |||
* @author leyou | |||
*/ | |||
public class MachineInfoVo { | |||
private String app; | |||
private String hostname; | |||
private String ip; | |||
private Integer port; | |||
private Date version; | |||
private Date timestamp; | |||
private boolean health; | |||
private String version; | |||
public static List<MachineInfoVo> fromMachineInfoList(List<MachineInfo> machines) { | |||
List<MachineInfoVo> list = new ArrayList<>(); | |||
for (MachineInfo machine : machines) { | |||
@@ -47,8 +50,9 @@ public class MachineInfoVo { | |||
vo.setHostname(machine.getHostname()); | |||
vo.setIp(machine.getIp()); | |||
vo.setPort(machine.getPort()); | |||
vo.setTimestamp(machine.getTimestamp()); | |||
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); | |||
} | |||
return vo; | |||
@@ -86,12 +90,21 @@ public class MachineInfoVo { | |||
this.port = port; | |||
} | |||
public Date getVersion() { | |||
public Date getTimestamp() { | |||
return timestamp; | |||
} | |||
public void setTimestamp(Date timestamp) { | |||
this.timestamp = timestamp; | |||
} | |||
public String getVersion() { | |||
return version; | |||
} | |||
public void setVersion(Date version) { | |||
public MachineInfoVo setVersion(String version) { | |||
this.version = version; | |||
return this; | |||
} | |||
public boolean isHealth() { | |||
@@ -37,21 +37,12 @@ | |||
<table class="table" style="border-left: none; border-right:none;margin-top: 10px;"> | |||
<thead> | |||
<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> | |||
</thead> | |||
<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.ip}}</td> | |||
<td> {{entry.port}} </td> | |||
<td> {{entry.version}} </td> | |||
<td ng-if="entry.health">健康</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> | |||
</tbody> | |||
</table> | |||
@@ -15,6 +15,7 @@ | |||
*/ | |||
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.CommandRequest; | |||
import com.alibaba.csp.sentinel.command.CommandResponse; | |||
@@ -29,6 +30,6 @@ public class VersionCommandHandler implements CommandHandler<String> { | |||
@Override | |||
public CommandResponse<String> handle(CommandRequest request) { | |||
return CommandResponse.ofSuccess("0.2.0"); | |||
return CommandResponse.ofSuccess(Constants.SENTINEL_VERSION); | |||
} | |||
} |
@@ -15,6 +15,7 @@ | |||
*/ | |||
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.log.RecordLog; | |||
import com.alibaba.csp.sentinel.util.AppNameUtil; | |||
@@ -81,6 +82,7 @@ public class HttpHeartbeatSender implements HeartbeatSender { | |||
uriBuilder.setScheme("http").setHost(consoleHost).setPort(consolePort) | |||
.setPath("/registry/machine") | |||
.setParameter("app", AppNameUtil.getAppName()) | |||
.setParameter("v", Constants.SENTINEL_VERSION) | |||
.setParameter("version", String.valueOf(System.currentTimeMillis())) | |||
.setParameter("hostname", HostNameUtil.getHostName()) | |||
.setParameter("ip", HostNameUtil.getIp()) | |||
@@ -18,6 +18,7 @@ package com.alibaba.csp.sentinel.transport.heartbeat; | |||
import java.util.HashMap; | |||
import java.util.Map; | |||
import com.alibaba.csp.sentinel.Constants; | |||
import com.alibaba.csp.sentinel.transport.config.TransportConfig; | |||
import com.alibaba.csp.sentinel.util.AppNameUtil; | |||
import com.alibaba.csp.sentinel.util.HostNameUtil; | |||
@@ -46,6 +47,9 @@ public class HeartbeatMessage { | |||
} | |||
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("port", String.valueOf(TransportConfig.getPort())); | |||
return message; | |||