package com.alibaba.doris.admin.web.monitor.module.screen;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutionException;
import com.alibaba.citrus.turbine.Context;
import com.alibaba.citrus.turbine.dataresolver.Param;
import com.alibaba.doris.admin.core.AdminServiceLocator;
import com.alibaba.doris.admin.dataobject.PhysicalNodeDO;
import com.alibaba.doris.admin.service.AdminNodeService;
import com.alibaba.doris.admin.web.monitor.support.NodeViewForMonitor;
import com.alibaba.doris.client.net.Connection;
import com.alibaba.doris.client.net.ConnectionFactory;
import com.alibaba.doris.common.RealtimeInfo;
import com.alibaba.fastjson.JSON;
public class Realtime {
private AdminNodeService adminNodeService = AdminServiceLocator.getAdminNodeService();
public void execute(Context context, @Param("physicalId") String physicalId) {
PhysicalNodeDO physicalNodeDO = adminNodeService.queryPhysicalNodeByPhysicalId(physicalId);
if (physicalNodeDO != null) {
NodeViewForMonitor view = getInfo(physicalNodeDO);
context.put("view", view);
} else {
NodeViewForMonitor view = new NodeViewForMonitor(new PhysicalNodeDO());
view.setErrorInfo("node not found");
context.put("view", view);
}
context.put("physicalId", physicalId);
}
private synchronized NodeViewForMonitor getInfo(PhysicalNodeDO physicalNodeDO) {
NodeViewForMonitor view = new NodeViewForMonitor(physicalNodeDO);
String ip = physicalNodeDO.getIp();
int port = physicalNodeDO.getPort();
InetSocketAddress remoteAddress = new InetSocketAddress(ip, port);
try {
String infoString = doStat(remoteAddress);
RealtimeInfo realtimeInfo = JSON.parseObject(infoString, RealtimeInfo.class);
view.setRealtimeInfo(realtimeInfo);
} catch (Exception e) {
view.setErrorInfo(e.getMessage());
}
return view;
}
private String doStat(InetSocketAddress remoteAddress) throws InterruptedException,
ExecutionException {
Connection connection = ConnectionFactory.getInstance().getConnection(remoteAddress);
String info = "";
try {
connection.open();
info = connection.stats(null, -1).get();
} finally {
try {
connection.close();
} catch (Exception e) {
//do nothing
}
}
return info;
}
}