`

Influxdb之springboot记录数据

阅读更多

最近用到了Influxdb数据库,这是一个优秀的时间序列数据库,我们主要用来记录了些监控日志,然后要做些统计查询。这里做个简单的总结。

 项目基于 springboot2.*,整合 influxdb相当简单,引进依赖,1.7为当前最新版:

<dependency>
    <groupId>com.github.miwurster</groupId>
    <artifactId>spring-data-influxdb</artifactId>
    <version>1.7</version>
</dependency>

 

添加配置:

spring:
  influxdb:
     url: http://localhost:8086
     username: test
     password: test
     database: test
     retention-policy: autogen
     connect-timeout: 10
     read-timeout: 30
     write-timeout: 10

表在写入数据时自动创建,measurement相当于表。代码示例:

public void writeData(LoginLogDO loginLogDO) {
    final Point.Builder builder = Point.measurement("loginLogDO")
            .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
builder.tag("loginUser", loginLogDO.getLoginUser())
            .tag("ip", loginLogDO.getIp())
            .tag("result", loginLogDO.getResult())
            .tag("brower", loginLogDO.getBrower())
            .tag("os", loginLogDO.getOs())
            .addField("count", loginLogDO.getCount());
    final Point point = builder.build();
influxDBTemplate.write(point);
}
如上,就可将数据写入数据库。

分页查询 sql示例:
select * from loginLogDO where time>now()-3d and  time<now()
order by time desc limit 10 offset 20
记住:limit后面是pageSize,offset后面是偏移量,就是起始记录数。是(当前页-1)*pageSize.
 limit {pageSize} offset {offset}
下面也可以, 直接用时间纳秒数,秒后面9个0。
select * from loginLogDO where time>1568172960000000000 and  time<1568179960000000000
order by time desc limit 10 offset 20
下面说统计查询。influxdb这方面比较强大。简单好用。
select count(*) from monitorDO where module='spdemo' and time>now()-10m 
 group by time(1m),resultType limit 10

这样会查出一个列表,以resultType 分组的数据。按时间排序显示。查最近10分钟内,以1分钟为
节点单位的10条统计结果。
后面的limit 10 表示是取最靠近time>now()-10m这个时间的10条统计数据, 
不加,则取所有。
结果如下:
name: monitorDO tags: resultType=success time count_count ---- ----------- 1568182080000000000 0 1568182140000000000 0 1568182200000000000 0 1568182260000000000 0 1568182320000000000 0 1568182380000000000 0 1568182440000000000 0 1568182500000000000 0 1568182560000000000 3 1568182620000000000 0 1568182680000000000 2

时间函数也很灵活强大。 d代表天,h代表小时,m代表分, s代表秒。
now()-1d就表示当前时间的减一天的时间点。
group by time(1m) 表示以一分钟为单位进行数据统计。

最后是分页的示例部分代码:
Query countquery=new Query(countsql,influxDBTemplate.getDatabase());
QueryResult countresult = influxDBTemplate.query(countquery);
int total = 0;
if (countresult.getResults().get(0).getSeries() != null) {
    Object totalObj = countresult.getResults().get(0).getSeries().get(0).getValues().get(0).get(1);
total = totalObj == null ? 0 : ((Double) totalObj).intValue();
}
if (total > 0){
    Query query = new Query(selectsql, influxDBTemplate.getDatabase());
QueryResult result = influxDBTemplate.query(query);
log.debug("result==>" + result);
List<List<Object>> mylist = result.getResults().get(0).getSeries().get(0).getValues();
loginColumns = loginColumns == null ? result.getResults().get(0).getSeries().get(0).getColumns() : loginColumns;
    return new CommonPager<>(
            new PageParameter(pageParameter.getCurrentPage(), pageParameter.getPageSize(), total),
mylist.stream().map(this::toMap).collect(Collectors.toList()));
下面是统计的java主要代码:
Query query = new Query(sql.replace(",resultType", ""), influxDBTemplate.getDatabase());
QueryResult result = influxDBTemplate.query(query);if (result.getResults().get(0).getSeries() == null) {
    return null;
}
List<List<Object>> mylist = result.getResults().get(0).getSeries().get(0).getValues();
List<Map<String, Object>> allList= mylist.stream().map(this::toMonitorMinuteMap).collect(Collectors.toList());
Query rstquery = new Query(sql, influxDBTemplate.getDatabase());
QueryResult opresult = influxDBTemplate.query(rstquery);
List<QueryResult.Series> seriesList=opresult.getResults().get(0).getSeries();
List<Map<String, Object>> errorList=null;
List<Map<String, Object>> successList=null;
for(QueryResult.Series series: seriesList){
    if( series.getTags().get("resultType").equals("success")){
        successList=series.getValues().stream().map(this::toMonitorMinuteMap).collect(Collectors.toList());
}else{
        errorList=series.getValues().stream().map(this::toMonitorMinuteMap).collect(Collectors.toList());
}
}



private  Map<String, Object> toMonitorMinuteMap( List<Object> list) {
    Map<String, Object>  map = new HashMap<>();
map.put("time", ((String)list.get(0)).replace("T", " ").replace("Z", ""));
map.put("value",list.get(1));
    return map;
}
好吧,就先介绍这么多哈。希望对大家有所帮助.

补充配置类:

@Configuration
@EnableConfigurationProperties(InfluxDBProperties.class)
@ConditionalOnProperty(prefix = "spring.influxdb", name = "url")
public class InfluxDbConfiguration {

    @Bean
public InfluxDBConnectionFactory connectionFactory(final InfluxDBProperties influxDBProperties) {
        return new InfluxDBConnectionFactory(influxDBProperties);
}

    @Bean
public InfluxDBTemplate<Point> influxDBTemplate(final InfluxDBConnectionFactory connectionFactory) {
        return new InfluxDBTemplate<>(connectionFactory, new PointConverter());
}

    @Bean
public DefaultInfluxDBTemplate defaultTemplate(final InfluxDBConnectionFactory connectionFactory) {
        return new DefaultInfluxDBTemplate(connectionFactory);
}
}
服务类示例: 
@Service("myInfluxDbService")
public class MyInfluxDbServiceImpl implements MyInfluxDbService {

    private InfluxDBTemplate<Point> influxDBTemplate;

    public InfluxDbServiceImpl (InfluxDBTemplate<Point> influxDBTemplate) {
        this.influxDBTemplate=influxDBTemplate;
}
分享到:
评论

相关推荐

    SpringBoot + Kafka + Redis + InfluxDB + HBase + Grafana 风控系统.zip

    在风控系统中,HBase可以用于存储非结构化的海量历史数据,如用户的交易记录、信用评分等,支持高效的大数据查询和分析。 6. **Grafana**: Grafana是一个开源的数据可视化平台,支持多种数据源,包括InfluxDB和...

    基于SpringBoot框架搭建的物联网数据采集系统服务器端.zip

    3. **数据存储**:数据采集后需要存储,这可能涉及关系型数据库(如MySQL、PostgreSQL)或者非关系型数据库(如MongoDB、Cassandra),也可能用到时间序列数据库如InfluxDB。开发者需要掌握JPA(Java Persistence ...

    基于SpringBoot的Hadoop-Yarn资源监控系统源码.zip

    7. **监控系统设计**:系统可能包括数据采集(通过YARN API或metrics系统)、数据存储(如使用Elasticsearch或InfluxDB)、数据处理(如使用Logstash或Grafana)和前端展示(如使用React或Vue.js)等组件。...

    springboot269反欺诈平台的建设.zip

    根据业务需求,可能需要关系型数据库(如MySQL、PostgreSQL)存储结构化数据,NoSQL数据库(如MongoDB、Cassandra)处理非结构化或半结构化数据,以及时间序列数据库(如InfluxDB)记录事件时间序列数据。...

    springboot106大学城水电管理系统.zip

    - **数据模型**:系统可能包含用户、房屋、水电表、计量记录等实体,需要设计相应的数据库表结构来存储这些信息。 - **关系型数据库**:如MySQL或PostgreSQL,用于存储用户信息、水电表读数等静态数据。 - **时间...

    Java+海康SDK DEMO

    Java SpringBoot框架+海康SDK Linux版本代码,集成了所需的告警DEMO(存储在influxDB)。有获取该NVR下所有设备的接口,以及获取该NVR下某个时间段的视频文件下载,并转成MP4文件。

    SpringBoot-Metricas

    SpringBoot-Metricas 是一个基于Java的项目,它利用了Spring Boot框架的强大力量来实现应用程序的度量收集和监控。Spring Boot以其快速启动、简化配置和开箱即用的特性深受开发者喜爱,而Spring Boot Metricas则...

    spring-boot-demo:Spring Boot和Spring Cloud和Spring Security演示案例(Spring学习示例实战项目)

    SpringBoot + SpringCloud + SpringSecurity学习过程中的二进制汇总,沉淀记录下学习历程 1.知识点图谱 所有博文集中发布在个人博客网站: 大致规划的内容包括以下章节,希望能用半年到一年(严重超期)的时间完成....

    spring-boot-jvm-monitoring-demo:使用Dropwizard指标库在Spring Boot应用程序中公开JVM指标的演示

    Dropwizard Metrics是一个强大的库,它提供了一套丰富的工具,用于测量、记录和报告各种应用程序的运行时数据。 首先,我们需要了解Spring Boot集成Dropwizard Metrics的基本步骤。在Spring Boot项目中,可以通过...

Global site tag (gtag.js) - Google Analytics