package com.sf.monitor.druid;
import com.google.common.collect.Maps;
import com.sf.monitor.Resources;
import com.sf.monitor.utils.HttpRequest;
import com.sf.monitor.utils.JsonValues;
import com.sf.monitor.utils.DCMZkUtils;
import org.apache.commons.lang.StringUtils;
import retrofit.http.GET;
import java.util.List;
import java.util.Map;
public class DruidService<T> {
private final String leaderElectionPath;
private final Class<T> serviceClass;
private String leaderHost;
private T leaderService;
public DruidService(String leaderElectionPath, Class<T> serviceClass) {
this.leaderElectionPath = leaderElectionPath;
this.serviceClass = serviceClass;
}
public T getService() {
String host = DCMZkUtils.getLeaderContent(leaderElectionPath);
if (StringUtils.isEmpty(host)) {
return null;
}
if (!host.equals(leaderHost) || leaderService == null) {
leaderHost = host;
String url = String.format("http://%s", leaderHost);
leaderService = HttpRequest.create(url, serviceClass);
}
return leaderService;
}
public interface OverlordService {
@GET("/druid/indexer/v1/workers")
public List<MiddleManager> getWorkers();
}
public interface CoordinatorService {
@GET("/druid/coordinator/v1/servers?simple")
public List<Map<String, Object>> getDataServers();
}
public static class MiddleManager {
public WorkerHost worker;
public String lastCompletedTaskTime;
public int currCapacityUsed;
public List<String> availabilityGroups;
public List<String> runningTasks;
public JsonValues toJsonValues() {
Map<String, Object> map = Maps.newLinkedHashMap();
map.put("name", Resources.druidInfos.middleManagerName);
map.put("host", worker.host);
map.put("capacity", worker.capacity);
map.put("used", currCapacityUsed);
map.put("version", worker.version);
return new JsonValues(map);
}
public static class WorkerHost {
public String host;
public String ip;
public int capacity;
public String version;
}
}
}