废话少说,直接配置给出,~~~
pom.xml
...
<!--============================ jackson =========================== -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-base</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<!-- cxf rest -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-policy</artifactId>
<version>2.3.5</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-wsdl</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.cloudera.api</groupId>
<artifactId>cloudera-manager-api</artifactId>
<version>5.15.1</version>
</dependency>
...
Java代码
package com.xxxxxx
import com.alibaba.fastjson.JSON;
import com.cloudera.api.ClouderaManagerClientBuilder;
import com.cloudera.api.model.ApiTimeSeries;
import com.cloudera.api.model.ApiTimeSeriesData;
import com.cloudera.api.model.ApiTimeSeriesResponse;
import com.cloudera.api.model.ApiTimeSeriesResponseList;
import com.cloudera.api.v11.TimeSeriesResourceV11;
import com.cloudera.api.v18.RootResourceV18;
import com.xx.xxx.xxx.xx.DateTimeUtils;
import java.util.ArrayList;
import java.util.List;
public class ClouderaManagerServiceMetrics {
private RootResourceV18 apiRoot;
public ClouderaManagerServiceMetrics(){
apiRoot = new ClouderaManagerClientBuilder()
// .withHost("111.111.111.111")
// .withPort(2222)
.withHost("cm.xxx.xxx")
.withUsernamePassword("metrica", "cdd57977915014")
.build()
.getRootV18();
}
public 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;
}
public List<Metric> getServiceMetrics(String query,String startTime , String endTime){
TimeSeriesResourceV11 timeSeriesResourceV6 = apiRoot.getTimeSeriesResource();
String[] params = new String []{query,startTime,endTime};
log.info("query sql is {} ,startTime is {} ,endTime is now",params);
log.info("开始测试的时间为{},**************开始查询某个服务点位状态**************", DateTimeUtils.calendar().getTime());
ApiTimeSeriesResponseList response = timeSeriesResourceV6.queryTimeSeries(query,startTime,endTime);
List<ApiTimeSeriesResponse> apiTimeSeriesResponseList = response.getResponses();
List<Metric> metrics = formatApiTimeSeriesResponse(apiTimeSeriesResponseList);
log.info("查询时间序列点位:{}", JSON.toJSON(metrics));
log.info("结束测试的时间为{},**************结束查询某个服务点位状态**************",DateTimeUtils.calendar().getTime());
return metrics;
}
}
class Metric {
private String metricName;
private String entityName;
private String startTime;
private String endTime;
List<Data> data = new ArrayList<>();
public void setMetricName(String metricName) {
this.metricName = metricName;
}
public void setEntityName(String entityName) {
this.entityName = entityName;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public void setData(List<Data> data) {
this.data = data;
}
public String getMetricName() {
return metricName;
}
public String getEntityName() {
return entityName;
}
public String getStartTime() {
return startTime;
}
public String getEndTime() {
return endTime;
}
public List<Data> getData() {
return data;
}
}
class Data {
private String timestamp;
private Double value;
private String type;
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public void setValue(Double value) {
this.value = value;
}
public void setType(String type) {
this.type = type;
}
public String getTimestamp() {
return timestamp;
}
public Double getValue() {
return value;
}
public String getType() {
return type;
}
}
然后在main方法里校验
package com.xxxx;
import com.xxxx.xxx.xxx.ClouderaManagerServiceMetrics;
/**
* Description
*
* @author liaozhanggen on 2018/3/15.
*/
public class TestMain {
public static void main(String[] args) throws Exception {
new ClouderaManagerServiceMetrics().getServiceMetrics("SELECT health_good_rate * 100 AS 'good health' WHERE entityName = 'hbase' AND category = SERVICE" ,"2018-11-13","2018-11-14");
}
}
运行的异常如下!
....
Exception in thread "main" com.google.common.util.concurrent.UncheckedExecutionException: java.util.regex.PatternSyntaxException: Illegal repetition near index 12
/configFiles/{configFileName : \.*}(/.*)?
^
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2203)
at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4830)
at com.cloudera.api.ClouderaManagerClientBuilder.build(ClouderaManagerClientBuilder.java:273)
at com.cloudera.api.ClouderaManagerClientBuilder.build(ClouderaManagerClientBuilder.java:254)
at com.xx.xxx.x.xxx.ClouderaManagerServiceMetrics.<init>(ClouderaManagerServiceMetrics.java:28)
at com.xxx.xxxx.TestMain.main(TestMain.java:16)
Caused by: java.util.regex.PatternSyntaxException: Illegal repetition near index 12
/configFiles/{configFileName : \.*}(/.*)?
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.closure(Pattern.java:3157)
at java.util.regex.Pattern.sequence(Pattern.java:2134)
at java.util.regex.Pattern.expr(Pattern.java:1996)
at java.util.regex.Pattern.compile(Pattern.java:1696)
at java.util.regex.Pattern.<init>(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at org.apache.cxf.jaxrs.model.URITemplate.<init>(URITemplate.java:96)
at org.apache.cxf.jaxrs.model.URITemplate.createTemplate(URITemplate.java:289)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createOperationInfo(ResourceUtils.java:92)
at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:68)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
at org.apache.cxf.jaxrs.utils.ResourceUtils.evaluateResourceClass(ResourceUtils.java:75)
at org.apache.cxf.jaxrs.utils.ResourceUtils.createClassResourceInfo(ResourceUtils.java:54)
at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.createResourceInfo(JAXRSServiceFactoryBean.java:129)
at org.apache.cxf.jaxrs.JAXRSServiceFactoryBean.setResourceClass(JAXRSServiceFactoryBean.java:119)
at org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean.setServiceClass(JAXRSClientFactoryBean.java:83)
at org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean.setResourceClass(JAXRSClientFactoryBean.java:79)
at com.cloudera.api.ClouderaManagerClientBuilder$1.load(ClouderaManagerClientBuilder.java:103)
at com.cloudera.api.ClouderaManagerClientBuilder$1.load(ClouderaManagerClientBuilder.java:99)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2319)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2282)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2197)
... 8 more
....
引起的原因如下
建议解方式如下
1. 重写上面工具类的正则校验方式;(比较靠谱,反编译,再编译)
2. 修改cloudera manager的服务器包;(似乎不可能,不可能随便修改生产环境的cdh)
3. 再试下其他Jar版本(社区问下其他调用成功的同事)
应网友留言-需要调用方式;(各人使用方式);
private CDHListResult requestCdhRestApi(String query, String from , String to, String desiredRollup) throws ServiceException {
StringBuffer bufferUrl = new StringBuffer(cdhProxyProperty.getUrl());
bufferUrl.append(cdhProxyProperty.getTimeSeries());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setAcceptCharset(Arrays.asList(Charset.forName(APIConstant.CHARSET_UTF8)));
try {
//username:password--->访问的用户名,密码,并使用base64进行加密,将加密的字节信息转化为string类型,encoding--->token
String encoding = DatatypeConverter.printBase64Binary(String.format("%s:%s",cdhProxyProperty.getUserName(),cdhProxyProperty.getPwd()).getBytes("UTF-8"));
headers.set("Authorization", "Basic " + encoding);
}catch (Exception e){
throw new ServiceException(e.getMessage());
}
// parameter
Map<String, Object> params = new HashMap<>();
params.put("query",query);
params.put("from",from);
if (!StringUtils.isEmpty(to)){
params.put("to",to);
}
params.put("desiredRollup",desiredRollup);
// query类型的属性以url拼接方式传,requestbody直接原样进行转发
org.springframework.http.HttpEntity<Object> requestEntity = new org.springframework.http.HttpEntity<>(params, headers);
// String url = getRedirectUrl(request);
String url = HttpUtils.urlFormat(bufferUrl.toString(), params);
// url中包含中文参数的处理 ,可能会影响部分请求.如果发现需要特殊处理
ResponseEntity<CDHListResult> resultMap = null;
CDHListResult<ApiCdhTimeSeries> result = new CDHListResult<ApiCdhTimeSeries>(Boolean.TRUE);
try {
resultMap = customRestTemplate.exchange(URLDecoder.decode(url, APIConstant.CHARSET_UTF8), HttpMethod.GET, requestEntity, CDHListResult.class);
result = resultMap.getBody();
} catch (UnsupportedEncodingException e) {
log.error("url地址请求出现错误,{},url:{},param:{}", e.getMessage(), url, JsonUtils.toJson(params));
e.printStackTrace();
result.setMessage(e.getMessage());
throw new ServiceException(e.getMessage());
}
if (resultMap.getStatusCode().value() == HttpStatus.OK.value()) {
result.setItems(JsonUtils.toList(JsonUtils.toJson(result.getItems()),ApiCdhTimeSeries.class));
return result;
}
result.setNCode(BaseResultCodeEnum.INTERFACE_SYSTEM_ERROR.getNCode());
result.setCode(BaseResultCodeEnum.INTERFACE_SYSTEM_ERROR.getCode());
result.setSuccess(Boolean.FALSE);
return result;
}