com.teradata.benchto.driver.presto.PrestoClient.java Source code

Java tutorial

Introduction

Here is the source code for com.teradata.benchto.driver.presto.PrestoClient.java

Source

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.teradata.benchto.driver.presto;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.google.common.collect.ImmutableMap;
import com.teradata.benchto.driver.service.Measurement;
import com.teradata.benchto.driver.utils.UnitConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import javax.measure.unit.Unit;

import java.net.URI;
import java.util.List;
import java.util.Map;

import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY;
import static com.google.common.base.Preconditions.checkState;
import static com.teradata.benchto.driver.service.Measurement.measurement;
import static java.util.stream.Collectors.toList;
import static javax.measure.unit.NonSI.BYTE;
import static javax.measure.unit.SI.MILLI;
import static javax.measure.unit.SI.SECOND;

@Component
@ConditionalOnProperty(prefix = "presto", value = "url")
public class PrestoClient {
    private static final Map<String, Unit> DEFAULT_METRICS = ImmutableMap.<String, Unit>builder()
            .put("totalPlanningTime", MILLI(SECOND)).put("totalScheduledTime", MILLI(SECOND))
            .put("totalCpuTime", MILLI(SECOND)).put("totalUserTime", MILLI(SECOND))
            .put("totalBlockedTime", MILLI(SECOND)).put("processedInputDataSize", BYTE).put("outputDataSize", BYTE)
            .put("peakMemoryReservation", BYTE).build();

    @Value("${presto.url}")
    private String prestoURL;

    @Autowired
    private RestTemplate restTemplate;

    @Retryable(value = RestClientException.class, backoff = @Backoff(1000))
    public List<Measurement> loadMetrics(String queryId) {
        return loadMetrics(queryId, DEFAULT_METRICS);
    }

    private List<Measurement> loadMetrics(String queryId, Map<String, Unit> requiredStatistics) {
        URI uri = buildQueryInfoURI(queryId);
        ResponseEntity<QueryInfoResponseItem> response = restTemplate.getForEntity(uri,
                QueryInfoResponseItem.class);

        Map<String, Object> queryStats = response.getBody().getQueryStats();
        return queryStats.keySet().stream().filter(requiredStatistics::containsKey)
                .map(name -> parseQueryStatistic(name, queryStats.get(name), requiredStatistics.get(name)))
                .collect(toList());
    }

    private URI buildQueryInfoURI(String queryId) {
        checkState(!prestoURL.isEmpty());

        UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString(prestoURL).pathSegment("v1", "query",
                queryId);

        return URI.create(uriBuilder.toUriString());
    }

    private Measurement parseQueryStatistic(String name, Object statistic, Unit requiredUnit) {
        double value = UnitConverter.parseValueAsUnit(statistic.toString(), requiredUnit);
        return measurement("prestoQuery-" + name, UnitConverter.format(requiredUnit), value);
    }

    @SuppressWarnings("unused")
    @JsonAutoDetect(fieldVisibility = ANY)
    public static class QueryInfoResponseItem {
        private Map<String, Object> queryStats;

        Map<String, Object> getQueryStats() {
            return queryStats;
        }
    }
}