package rocks.inspectit.server.service; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.influxdb.dto.QueryResult; import org.influxdb.dto.QueryResult.Result; import org.influxdb.dto.QueryResult.Series; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import rocks.inspectit.server.influx.dao.InfluxDBDao; import rocks.inspectit.shared.all.spring.logger.Log; import rocks.inspectit.shared.cs.cmr.service.IInfluxDBService; /** * Service to query details from the CMR's InfluxDB. * * @author Marius Oehler * */ @Service public class InfluxDBService implements IInfluxDBService { /** * The logger of this class. */ @Log Logger log; /** * {@link IInfluxDBDao} to read from. */ @Autowired InfluxDBDao influxDbDao; /** * {@inheritDoc} */ @Override public List<String> getMeasurements() { QueryResult queryResult = influxDbDao.query("SHOW MEASUREMENTS;"); return extractStringList(queryResult, 0); } /** * {@inheritDoc} */ @Override public List<String> getTags(String measurement) { String query = "SHOW TAG KEYS FROM \"" + measurement + "\";"; QueryResult queryResult = influxDbDao.query(query); return extractStringList(queryResult, 0); } /** * {@inheritDoc} */ @Override public List<String> getTagValues(String measurement, String tagKey) { String query = "SHOW TAG VALUES FROM \"" + measurement + "\" WITH KEY = \"" + tagKey + "\";"; QueryResult queryResult = influxDbDao.query(query); return extractStringList(queryResult, 1); } /** * {@inheritDoc} */ @Override public List<String> getFields(String measurement) { String query = "SHOW FIELD KEYS FROM \"" + measurement + "\";"; try { QueryResult queryResult = influxDbDao.query(query); return extractStringList(queryResult, 0); } catch (Exception e) { log.info("Exception while execution query: " + query); return null; } } /** * Extracts the queried values of the given {@link QueryResult} and creates a list comprising * them. * * @param queryResult * the {@link QueryResult} containing the data * @param columnIndex * the index of the column to return * @return list containing the values */ private List<String> extractStringList(QueryResult queryResult, int columnIndex) { if (queryResult == null) { return Collections.emptyList(); } if (queryResult.getResults().isEmpty()) { return Collections.emptyList(); } Result result = queryResult.getResults().get(0); if (result.getSeries() == null) { return Collections.emptyList(); } if (result.getSeries().isEmpty()) { return Collections.emptyList(); } Series series = result.getSeries().get(0); if (series.getValues() == null) { return Collections.emptyList(); } List<String> list = new ArrayList<>(); for (List<Object> valueList : series.getValues()) { list.add((String) valueList.get(columnIndex)); } return list; } }