monasca-api/java/src/main/java/monasca/api/infrastructure/persistence/influxdb/InfluxV9StatisticRepo.java

133 lines
4.2 KiB
Java

/*
* Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
*
* 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 monasca.api.infrastructure.persistence.influxdb;
import com.google.inject.Inject;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
import monasca.api.ApiConfig;
import monasca.api.domain.model.statistic.StatisticRepo;
import monasca.api.domain.model.statistic.Statistics;
import static monasca.api.infrastructure.persistence.influxdb.InfluxV9Utils.dimPart;
import static monasca.api.infrastructure.persistence.influxdb.InfluxV9Utils.endTimePart;
import static monasca.api.infrastructure.persistence.influxdb.InfluxV9Utils.namePart;
import static monasca.api.infrastructure.persistence.influxdb.InfluxV9Utils.regionPart;
import static monasca.api.infrastructure.persistence.influxdb.InfluxV9Utils.startTimePart;
import static monasca.api.infrastructure.persistence.influxdb.InfluxV9Utils.tenantIdPart;
public class InfluxV9StatisticRepo implements StatisticRepo{
private static final Logger logger = LoggerFactory.getLogger(InfluxV9StatisticRepo.class);
private final ApiConfig config;
private final String region;
private final InfluxV9RepoReader influxV9RepoReader;
private final ObjectMapper objectMapper = new ObjectMapper();
@Inject
public InfluxV9StatisticRepo(ApiConfig config,
InfluxV9RepoReader influxV9RepoReader) {
this.config = config;
this.region = config.region;
this.influxV9RepoReader = influxV9RepoReader;
}
@Override
public List<Statistics> find(String tenantId, String name, Map<String, String> dimensions,
DateTime startTime, @Nullable DateTime endTime,
List<String> statistics, int period) throws Exception {
String q = String.format("select %1$s %2$s where %3$s %4$s %5$s %6$s %7$s %8$s",
funcPart(statistics), namePart(name),
tenantIdPart(tenantId), regionPart(this.region),
startTimePart(startTime), dimPart(dimensions),
endTimePart(endTime), periodPart(period));
logger.debug("Measurements query: {}", q);
String r = this.influxV9RepoReader.read(q);
Series series = this.objectMapper.readValue(r, Series.class);
List<Statistics> statisticsList = statisticslist(series);
logger.debug("Found {} metric definitions matching query", statisticsList.size());
return statisticsList;
}
private List<Statistics> statisticslist(Series series) {
List<Statistics> statisticsList = new LinkedList<>();
if (!series.isEmpty()) {
for (Row row : series.getRows()) {
Statistics statistics = new Statistics(row.getName(), new HashMap<String, String>(),
Arrays.asList(row.getColumns()));
for (Object[] values : row.getValues()) {
statistics.addStatistics(Arrays.asList(values));
}
statisticsList.add(statistics);
}
}
return statisticsList;
}
private String funcPart(List<String> statistics) {
StringBuilder sb = new StringBuilder();
for (String stat : statistics) {
if (sb.length() != 0) {
sb.append(",");
}
sb.append(String.format("%1$s(value)", stat));
}
return sb.toString();
}
private String periodPart(int period) {
return period >= 1 ? String.format("group by time(%1$ds)", period) : "";
}
}