INFLUXDB-influxDB在Java中的簡單操作

SENTINEL-sentinel實時監控持久化到InfluxDB中中已經有了用Java實現基本的操作,今天我們再來補充一下。主要是熟悉InfluxDB的語法和操作。



@Component
public class InfluxDBMetricExeRepository implements MetricsExeRepository {
    private static Logger logger = LoggerFactory.getLogger(InfluxDBMetricExeRepository.class);
    @Autowired
    public InfluxDB influxDB;
    /**
     * @param app       應用的名稱
     * @param searchKey 查詢關鍵字的名稱
     * @param pageIndex 查詢第幾頁
     * @param pageSize  查詢第幾條數據
     * @return
     */
    @Override
    public List<String> listResourcesOfApp(String app, String searchKey, Integer pageIndex, Integer pageSize, long minTimeMs) {
        List<String> returnList = new ArrayList<>();
        if (StringUtil.isBlank(app)) {
            return returnList;
        }

        StringBuilder command = new StringBuilder();
        command.append("select * from ( ");
        command.append("select distinct(resourceName) from sentinelInfo where app=  ");
        command.append("'");
        command.append(app);
        command.append("'");
        command.append(" and");
        command.append(" gmtCreate > ");
        command.append(minTimeMs);
        if (!StringUtil.isBlank(searchKey)) {
            command.append(" and resource =~/");
            command.append(searchKey);
            command.append("/");
        }
        command.append(" )");
        command.append(" limit ");
        command.append(pageSize);
        command.append(" offset ");
        command.append((pageIndex - 1) * pageSize);
        logger.info("firstPage---"+command.toString());
        Query query = new Query(command.toString());

        QueryResult queryResult = influxDB.query(query);
        if (queryResult.getResults()!=null&&queryResult.getResults().get(0)!=null&&queryResult.getResults().get(0).getSeries()!=null){
            List<List<Object>> result = queryResult.getResults().get(0).getSeries().get(0).getValues();
            for (List<Object> objects : result) {
                if (objects != null && objects.size() > 1) {
                    objects.get(1);
                    returnList.add(String.valueOf(objects.get(1)));
                }
            }
        }
        return returnList;
    }

    /**
     * @param app       應用的名稱
     * @param searchKey 查詢關鍵字的名稱
     * @param minTimeMs
     * @return
     */
    @Override
    public Integer countListResourcesOfApp(String app, String searchKey, long minTimeMs) {
        StringBuilder command = new StringBuilder();
        command.append("select count(distinct(resourceName)) from sentinelInfo where app= ");
        command.append("'");
        command.append(app);
        command.append("'");
        command.append(" and ");
        command.append(" gmtCreate > ");
        command.append(minTimeMs);
        if (!StringUtil.isBlank(searchKey)) {
            command.append(" and resource =~/");
            command.append(searchKey);
            command.append("/");
        }
        logger.info("count---"+command.toString());
        Query query = new Query(command.toString());
        QueryResult queryResult = influxDB.query(query);
        if (queryResult.getResults()!=null&&queryResult.getResults().get(0)!=null&&queryResult.getResults().get(0).getSeries()!=null){
            List<List<Object>> result = queryResult.getResults().get(0).getSeries().get(0).getValues();
            for (List<Object> objects : result) {
                if (objects != null && objects.size() > 1) {
                   return new Double(String.valueOf(objects.get(1))).intValue();
                }
            }
        }
        return 1;
    }

    /**
     * 查詢一段時間內的數據
     * influxDB不支持in的語法,所以直接用的or
     * @param app       應用的名稱
     * @param resources 資源的名稱
     * @param startTime 查詢的開始時間
     * @param endTime   查詢的結束時間
     * @return
     */
    @Override
    public List<MetricEntity> queryInfoBetween(String app, List<String> resources, long startTime, long endTime) {
        List<MetricEntity> results = new ArrayList<>();
        if (StringUtil.isBlank(app)) {
            return results;
        }
        StringBuilder command = new StringBuilder();
        command.append("select * from sentinelInfo where app= ");
        command.append("'");
        command.append(app);
        command.append("'");
        command.append("and ");

        command.append("( ");
        int size=0;
        for (String resource:resources){
            command.append(" resource=");
            command.append("'");
            command.append(resource);
            command.append("'");
            size=size+1;
            if (size<resources.size()){
                command.append(" or ");
            }
        }
        command.append(") ");

        command.append(" AND gmtCreate>"+startTime+" AND gmtCreate<"+endTime);

        Query query = new Query(command.toString());

        logger.info("entity---"+command.toString());
        QueryResult queryResult = influxDB.query(query);
        InfluxDBResultMapper resultMapper = new InfluxDBResultMapper();
        List<InfluxDBMetricEntity> influxResults = resultMapper.toPOJO(queryResult, InfluxDBMetricEntity.class);
        try {
            influxResults.forEach(entity->{
                MetricEntity metric = new MetricEntity();
                BeanUtils.copyProperties(entity,metric);
                results.add(metric);
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return results;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章