package com.guodi.api.util;
import com.alibaba.fastjson.JSON;
import com.cloudera.api.ClouderaManagerClientBuilder;
import com.cloudera.api.DataView;
import com.cloudera.api.model.;
import com.cloudera.api.v10.HostsResourceV10;
import com.cloudera.api.v10.ServicesResourceV10;
import com.cloudera.api.v11.RolesResourceV11;
import com.cloudera.api.v18.RootResourceV18;
import com.cloudera.api.v18.ServicesResourceV18;
import com.cloudera.api.v6.TimeSeriesResourceV6;
import com.guodi.api.model.;
import com.guodi.api.model.CDH.*;
import com.guodi.api.service.IClusterRoleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class CDHUtil {
static RootResourceV18 apiRoot;
@Autowired
IClusterRoleService clusterRoleService;
static {
apiRoot = new ClouderaManagerClientBuilder().withHost("10.0.1.133").
withPort(Integer.valueOf(7180))
.withUsernamePassword("admin", "admin").build().getRootV18();
}
private final static Logger LOGGER = LoggerFactory.getLogger(CDHUtil.class);
/*获取cloudera-manager中所有集群的信息*/
public static void getAllCluster(){
LOGGER.info("开始测试的时间为{},**************开始测试获取ClouderaManager集群信息**************",new Date());
ApiClusterList apiClusterList = apiRoot.getClustersResource().readClusters(DataView.FULL);
LOGGER.info("ClouderaManager 共管理了{}个集群",apiClusterList.getClusters().size());
for(ApiCluster apiCluster : apiClusterList){
ApiCluster apiCluster1 = apiRoot.getClustersResource().readCluster(apiCluster.getName());
LOGGER.info("集群名称 {}",apiCluster1.getName());
LOGGER.info("集群显示名称 {}",apiCluster1.getDisplayName());
LOGGER.info("CDH 版本:{}-{}",apiCluster1.getVersion(),apiCluster.getFullVersion());
LOGGER.info("ClusterUrl {}",apiCluster1.getClusterUrl());
LOGGER.info("HostUrl {}",apiCluster1.getHostsUrl());
LOGGER.info("Cluster Uuid {}",apiCluster1.getUuid());
LOGGER.info("集群运行状态 {}",apiCluster1.getEntityStatus());
}
LOGGER.info("结束测试的时间为{},**************结束测试获取ClouderaManager集群信息**************",new Date());
}
/*获取cloudera-manager中每个集群的每个主机的详细信息
* */
public static void getAllHost(){
LOGGER.info("开始测试的时间为{},**************开始测试集群主机运行状态**************",DateUtils.getTime());
HostsResourceV10 hostsResourceV10 = apiRoot.getHostsResource();
List<ApiHost> hostList = hostsResourceV10.readHosts(DataView.SUMMARY).getHosts();
LOGGER.info("总共有 {} 台主机组成集群",hostList.size());
for(ApiHost apiHost:hostList){
LOGGER.info("---------------------------------------------");
Host host = formatHost(hostsResourceV10.readHost(apiHost.getHostId()));
LOGGER.info("主机Id : {}",host.getHostId());
LOGGER.info("主机名: {}",host.getHostName());
LOGGER.info("主机IP: {}",host.getIpAddress());
LOGGER.info("主机线程数:{}",host.getNumCores());
LOGGER.info("上次上报心跳时间 :{}",host.getLastHeart());
LOGGER.info("核心数:{}",host.getNumPhysicalCores());
LOGGER.info("机架:{}",host.getRack());
LOGGER.info("内存(G):{}",host.getTotalPhysMemBytes());
LOGGER.info("进程:{}", JSON.toJSON(host.getServices()));
LOGGER.info("---------------------------------------------");
}
LOGGER.info("结束测试的时间为{},**************结束测试集群主机运行状态**************",DateUtils.getTime());
}
public static Host formatHost(ApiHost apiHost){
Host host = new Host();
List<String> services = new ArrayList<>();
host.setHostId(apiHost.getHostId());
host.setHostName(apiHost.getHostname());
host.setIpAddress(apiHost.getIpAddress());
host.setNumCores(apiHost.getNumCores());
host.setNumPhysicalCores(apiHost.getNumPhysicalCores());
host.setLastHeart(apiHost.getLastHeartbeat().toString());
host.setRack(apiHost.getRackId());
host.setTotalPhysMemBytes(apiHost.getTotalPhysMemBytes()/1073741824);
for(ApiRoleRef apiRoleRef:apiHost.getRoleRefs()){
services.add(apiRoleRef.getRoleName());
}
host.setServices(services);
return host;
}
/*获取cloudera-manager上所有集群的所有服务的状态(这里只是粗略的,不涉及时间点位的)*/
public static void getAllService(){
LOGGER.info("开始测试的时间为{},**************开始测试集群服务运行状态**************",DateUtils.getTime());
ApiClusterList apiClusterList = apiRoot.getClustersResource().readClusters(DataView.SUMMARY);
for(ApiCluster apiCluster:apiClusterList){
LOGGER.info("集群名称:{}",apiCluster.getDisplayName());
LOGGER.info("CDH 版本:{}-{}",apiCluster.getVersion(),apiCluster.getFullVersion());
ServicesResourceV10 servicesResourceV10 = apiRoot.getClustersResource().getServicesResource(apiCluster.getName());
List<ApiService> apiServices = servicesResourceV10.readServices(DataView.FULL).getServices();
LOGGER.info("集群总共有:{} 个service 在运行",apiServices.size());
for(ApiService apiService:apiServices){
Service service = formatService(apiService);
LOGGER.info("***********************************");
LOGGER.info("service 名称 {}",service.getName());
LOGGER.info("service 类型 {}",service.getType());
for(Agent agent:service.getAgentList()) {
LOGGER.info("节点名称 {}", agent.getName());
LOGGER.info("节点状态 {}", agent.getStatus());
}
LOGGER.info("***********************************");
}
}
LOGGER.info("结束测试的时间为{},**************结束测试集群服务运行状态**************",DateUtils.getTime());
}
public static Service formatService(ApiService apiService){
Service service = new Service();
List<Agent> agents = new ArrayList<>();
service.setName(apiService.getName());
service.setType(apiService.getType());
for(ApiHealthCheck apiHealthCheck:apiService.getHealthChecks()){
Agent agent =new Agent();
agent.setName(apiHealthCheck.getName());
agent.setStatus(apiHealthCheck.getSummary());
agents.add(agent);
}
service.setAgentList(agents);
return service;
}
/获取cloudera-manager上所有集群的所有服务的状态(这里只是粗略的,不涉及时间点位的)/
public static void getAllServiceRoles(){
LOGGER.info(“开始测试的时间为{},开始测试集群各个服务的roles运行状态”,DateUtils.getTime());
ApiClusterList apiClusterList = apiRoot.getClustersResource().readClusters(DataView.SUMMARY);
for(ApiCluster apiCluster:apiClusterList){
LOGGER.info("集群名称:{}",apiCluster.getDisplayName());
LOGGER.info("CDH 版本:{}-{}",apiCluster.getVersion(),apiCluster.getFullVersion());
ServicesResourceV18 servicesResourceV18 = apiRoot.getClustersResource().getServicesResource(apiCluster.getName());
//用于打印日志
List<ApiService> apiServices = servicesResourceV18.readServices(DataView.FULL).getServices();
LOGGER.info("集群总共有:{} 个service 在运行",apiServices.size());
for(ApiService apiService:apiServices){
RolesResourceV11 rolesResourceV11 = servicesResourceV18.getRolesResource(apiService.getName());
LOGGER.info("---------------------服务名称是{}---------------------",apiService.getName());
for(ApiRole apiRole :rolesResourceV11.readRoles()){
ClusterRole clusterRole = new ClusterRole();
LOGGER.info("***************************",apiRole.getName());
LOGGER.info("role名称 {}",apiRole.getName());
LOGGER.info("role类型 {}",apiRole.getType());
LOGGER.info("所属集群 {}",apiRole.getServiceRef().getClusterName());
LOGGER.info("所属服务 {}",apiRole.getServiceRef().getServiceName());
LOGGER.info("主机ID {}",apiRole.getHostRef().getHostId());
LOGGER.info("roleUrl {}",apiRole.getRoleUrl());
LOGGER.info("role状态 {}",apiRole.getRoleState());
LOGGER.info("运行状态总结 {}",apiRole.getHealthSummary());
LOGGER.info("entityStatus {}",apiRole.getEntityStatus());
LOGGER.info("roleConfigGroupName {}",apiRole.getRoleConfigGroupRef().getRoleConfigGroupName());
LOGGER.info("configStalenessStatus {}",apiRole.getConfigStalenessStatus());
LOGGER.info("haStatus {}",apiRole.getHaStatus());
for(ApiHealthCheck apiHealthCheck:apiRole.getHealthChecks()){
LOGGER.info("health check name {}",apiHealthCheck.getName());
LOGGER.info("health check summary {}",apiHealthCheck.getSummary());
LOGGER.info("health check suppressed {}",apiHealthCheck.getSuppressed());
}
LOGGER.info("***************************");
}
LOGGER.info("--------------------------------------------------------",apiService.getName());
}
}
LOGGER.info("结束测试的时间为{},**************结束测试集群各个服务的roles运行状态**************",DateUtils.getTime());
}
/*
获取cloudera-manager中某个服务的时间序列点位
* */
public static List<Metric> formatApiTimeSeriesResponse(List<ApiTimeSeriesResponse> apiTimeSeriesResponseList){
List<Metric> metrics = new ArrayList<>();
for(ApiTimeSeriesResponse apiTimeSeriesResponse:apiTimeSeriesResponseList) {
List<Data> dataList = new ArrayList<>();
List<ApiTimeSeries> apiTimeSeriesList = apiTimeSeriesResponse.getTimeSeries();
for (ApiTimeSeries apiTimeSeries : apiTimeSeriesList) {
Metric metric = new Metric();
metric.setMetricName(apiTimeSeries.getMetadata().getMetricName());
metric.setEntityName(apiTimeSeries.getMetadata().getEntityName());
metric.setStartTime(apiTimeSeries.getMetadata().getStartTime().toString());
metric.setEndTime(apiTimeSeries.getMetadata().getEndTime().toString());
for (ApiTimeSeriesData apiTimeSeriesData : apiTimeSeries.getData()) {
Data data = new Data();
data.setTimestamp(apiTimeSeriesData.getTimestamp().toString());
data.setType(apiTimeSeriesData.getType());
data.setValue(apiTimeSeriesData.getValue());
dataList.add(data);
}
metric.setData(dataList);
metrics.add(metric);
}
}
return metrics;
}
/*
获取cloudera-manager中某个服务的时间序列点位
* */
public static List<Metric> getServiceMetrics(String query, String startTime , String endTime){
TimeSeriesResourceV6 timeSeriesResourceV6 = apiRoot.getTimeSeriesResource();
String[] params = new String []{query,startTime,endTime};
LOGGER.info("query sql is {} ,startTime is {} ,endTime is now",params);
LOGGER.info("开始测试的时间为{},**************开始查询某个服务点位状态**************",DateUtils.getTime());
ApiTimeSeriesResponseList response = timeSeriesResourceV6.queryTimeSeries(query,startTime,endTime);
List<ApiTimeSeriesResponse> apiTimeSeriesResponseList = response.getResponses();
List<Metric> metrics = formatApiTimeSeriesResponse(apiTimeSeriesResponseList);
LOGGER.info("查询时间序列点位:{}", JSON.toJSON(metrics));
LOGGER.info("结束测试的时间为{},**************结束查询某个服务点位状态**************",DateUtils.getTime());
return metrics;
}
public static void main(String[] args) {
// 获取cloudera-manager中所有集群的信息
// getAllCluster();
// 获取cloudera-manager中每个集群的每个主机的详细信息
// getAllHost();
// getAllService();
getAllServiceRoles();
// getServiceMetrics(“SELECT health_good_rate * 100 AS “good health” WHERE entityName = “hdfs” AND category = SERVICE”
// ,“2019-12-19”,“now”);
}
}