Cloudera Manager API通过Springboot进行访问配置如下,遇到了解析问题及结果处理方式;如下!

废话少说,直接配置给出,~~~

  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;
    }

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值