InfluxdbUtil 工具类

@Component
@Slf4j
public class InfluxdbUtil<T> {

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

    private InfluxDB influxdb;

    @PostConstruct
    public void init() {
        influxdb = InfluxDBFactory.connect(url);
        if (!influxdb.isBatchEnabled()) {
            influxdb.enableBatch(2000, 3000, TimeUnit.MILLISECONDS, Executors.defaultThreadFactory(),
                    (points, throwable) -> log.error("【初始化influxdb失败】 原因: " + throwable.getMessage()));
        }
    }

    //创建数据库
    public void createDatabase(String dbName) {
        QueryResult result = influxdb.query(new Query("show databases"));
        List<List<Object>> databases = result.getResults().get(0).getSeries().get(0).getValues();
        List<String> nameList = databases.stream().map(e -> e.get(0).toString()).collect(Collectors.toList());
        if (!nameList.contains(dbName)) {
            influxdb.query(new Query("create database " + dbName));
            influxdb.setDatabase(dbName);
            log.info("创建influxdb 数据库{}成功", dbName);
        }
    }

    public QueryResult query(String database, String command, TimeUnit unit) {
        try {
            return influxdb.query(new Query(command, database), unit);
        } catch (Exception e) {
            return null;
        }
    }

    public List<Map<String, Object>> queryGetList(String dbName, String command) {
        try {
            QueryResult result = influxdb.setDatabase(dbName).query(new Query(command));
            List<QueryResult.Series> series = result.getResults().get(0).getSeries();
            if (CollectionUtils.isNotEmpty(series)) {
                QueryResult.Series data = series.get(0);
                return composeValues(data);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }


    public List<Map<String, Object>> composeValues(QueryResult.Series series) {
        List<Map<String, Object>> list = new ArrayList<>();
        for (List<Object> value : series.getValues()) {
            Map<String, Object> map = new HashMap<>();
            List<String> key = series.getColumns();
            for (int i = 0; i < key.size(); i++) {
                map.put(key.get(i), value.get(i));
            }
            list.add(map);
        }
        return list;
    }

    public List<T> query(String dbName, String command, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        try {
            QueryResult result = influxdb.setDatabase(dbName).query(new Query(command));
            List<QueryResult.Series> series = result.getResults().get(0).getSeries();
            if (CollectionUtils.isNotEmpty(series)) {
                QueryResult.Series data = series.get(0);
                for (List<Object> value : data.getValues()) {
                    T instance = clazz.newInstance();
                    List<String> key = data.getColumns();
                    for (int i = 0; i < key.size(); i++) {
                        Field field = ReflectUtil.getField(clazz, key.get(i));
                        if (field != null) {
                            Method setMethod = ReflectUtil.getMethodByNameIgnoreCase(clazz, "set" + field.getName());
                            //time类型特殊处理
                            if ("time".equals(field.getName())) {
                                ReflectUtil.invoke(instance, setMethod, handleTimeType(value.get(i).toString()));
                            } else {
                                ReflectUtil.invoke(instance, setMethod, value.get(i));

                            }
                        }
                    }
                    list.add(instance);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    /**
     * influxdb 默认返回rfc3339格式的时间
     * 这里可以进行处理转换成LocalDateTime
     *
     * @param time
     */
    private LocalDateTime handleTimeType(String time) {
        Date date = new DateTime(time);
        Instant instant = date.toInstant();
        return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
    }


    public void insertBatch(String database, BatchPoints points) {
        influxdb.setDatabase(database).write(points);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值