InfluxDB2入门
InfluxDB2的安装、Web UI的基本使用,以及整个SpringBoot
·
InfluxDB2 入门
InfluxDB 介绍
定义
InfluxDB 是一个开源的、高性能的时序型数据库,专门用于收集、存储、处理和可视化时间序列数据。它被设计用于高效地存储和检索时间序列数据,广泛应用于监控系统、传感器数据收集、实时分析等多种应用场景
概念
在 InfluxDB 中,有以下几个关键概念:【以下解释概念以电脑内存监控举例】
- Measurement :数据的名称,表示存储的数据类型,类似于关系数据库中的表,每个 measurement 存储特定类型的数据。可以存储像cpu、memery等类型数据。
- Tag : 键值对,用于存储元数据,支持高效查询。可以存储像memery1、memery2类型数据。
- Fields : Fields 存储实际的数据值,可以是数字、字符串或布尔值。与 tags 不同,fields 不可索引。如:cpu的温度、cpu的占用率等数据。
- Timestamp :每个数据点都有一个时间戳,表示记录的具体时间。通常以 Unix 时间戳格式存储,精确到纳秒,例如
1633046400
。
数据示例
上述记录为:内存点1在 1727145044242 时的内存使用大小和空闲大小。
Docker 安装 InfluxDB2
下载镜像
- docker search influxdb 查询可用镜像
- docker pull influxdb:laster 下载最新版镜像
- docker images 查看镜像
- docker run 运行镜像
docker run -d --name influxdb -p 8086:8086 influxdb
# -d 以守护进程模式运行容器
# --name influxdb 指定influxdb的镜像名称
# -p 8086:8086 指定端口映射
# influxdb 指定以哪一个镜像创建容器
- docker ps 查询容器是否启动
下图表述influxdb容器正常启动
- docker exec 进入容器
docker exec -it influxdb bash
# -i:表示以交互模式运行,让你可以与容器中的进程进行交互。
# -t:分配一个伪终端,允许你进行命令行操作并获得输出。
# influxdb 容器名称,与创建容器时的名称一致
InfluxDB Web UI的使用
在InfluxDB2版本中,取消了类似于SQL的语句,使用的是Flux,且使用InfluxDB CLI较为麻烦,不如Web UI。
Web UI 基本配置
完成安装后,在浏览器打开 IP:8086 后,进入Web UI配置界面
注册完成后,会生成Token,只会展示一次,注意保存下来。
页面介绍
首页
数据上传页面
数据查询页面
基本使用
数据导入
- CSV导入
- 脚本写入
再写入数据时,不指定时间,会取当前时间
memery,site=memery1 use=23.5,free=66.5
memery,site=memery1 use=23.4,free=66.6
memery,site=memery1 use=23.3,free=66.7
memery,site=memery1 use=23.2,free=66.8
memery,site=memery1 use=23.1,free=66.9
memery,site=memery1 use=23.0,free=67.0
memery,site=memery2 use=23.5,free=66.5
memery,site=memery2 use=23.4,free=66.6
memery,site=memery2 use=23.3,free=66.7
memery,site=memery2 use=23.2,free=66.8
memery,site=memery2 use=23.1,free=66.9
memery,site=memery2 use=23.0,free=67.0
数据查询
该页面在左侧菜单栏第三个
- 查询数据时,若没有measurement,尝试修改查询时间
- 点击右面的 SCRIPT EDITOR 可以将左下角的查询条件,转为FLUX查询语句,方便后续整合客户端。
SpringBoot 集成 InfluxDB2
- 创建 SpringBoot 项目,引入Maven依赖
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>6.6.0</version>
</dependency>
- 数据插入
void testAddInfluxDB() {
// token 可以是创建是生成的token,也能够使用web ui重新生成token
String token = "Yp9PiF5dpJIKL5f1c7zhx-1Ju7-4B4aXYTPbPRJNUzUFKwObuG69nI5Xsrp6wrFanrKkDSNBTyMTqx0BKVz9wA==";
// bucket名称
String bucket = "test";
// 组织名称
String org = "admin";
// 创建链接
InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8086", token.toCharArray());
WriteApiBlocking writeApi = client.getWriteApiBlocking();
/**
* 数据写入
* 1. 按照数据格式,直接拼接字符串写入
* 2. 使用Point对象写入
* 3. 使用注解方式写入
*/
// 方式一
String data = "memery,site=memery1 use=23.0,free=67.0";
writeApi.writeRecord(bucket, org, WritePrecision.NS, data);
// 方式二
Point point = Point
.measurement("memery")
.addTag("site", "memery2")
.addField("use", 23.43)
.addField("free", 45.43)
.time(Instant.now(), WritePrecision.NS);
writeApi.writePoint(bucket, org, point);
// 方式三 创建对象,使用注解写入
// 官方有示例
client.close();
}
- 数据查询
void testQueryInfluxDB() {
// token 可以是创建是生成的token,也能够使用web ui重新生成token
String token = "Yp9PiF5dpJIKL5f1c7zhx-1Ju7-4B4aXYTPbPRJNUzUFKwObuG69nI5Xsrp6wrFanrKkDSNBTyMTqx0BKVz9wA==";
// 组织名称
String org = "admin";
// 创建链接
InfluxDBClient client = InfluxDBClientFactory.create("http://localhost:8086", token.toCharArray());
// 查询语句,根据Web UI生成的查询条件,转为Flux语句,稍加修改可以直接使用
String query = "from(bucket: \"test\")\n" +
// 查询时间段,需要修改为需要查询的时间段
" |> range(start: -3h)\n" +
" |> filter(fn: (r) => r[\"_measurement\"] == \"memery\")\n" +
" |> filter(fn: (r) => r[\"site\"] == \"memery1\")\n" +
" |> filter(fn: (r) => r[\"_field\"] == \"free\")\n" +
/**
* every: 1h: 表示时间窗口的长度为 1 小时。数据将被分成每小时一个窗口。
* fn: mean: 指定了聚合函数。在这里,mean 表示计算每个时间窗口内的平均值。
* createEmpty: 控制是否在没有数据的时间窗口内创建空结果。
*/
// 该字段需要根据需要修改
" |> aggregateWindow(every: 1h, fn: mean, createEmpty: false)\n" +
" |> yield(name: \"mean\")";
List<FluxTable> tables = client.getQueryApi().query(query, org);
for (FluxTable table : tables) {
for (FluxRecord record : table.getRecords()) {
System.out.println(record);
}
}
client.close();
}
上述示例在 Web UI 中均有介绍。
从 Web UI 中复制的FLUX语句需要修改的地方
- range() :用于根据时间过滤数据,定义查询数据的时间范围
# 语法
range(start: <start_time>, stop: <end_time>)
# start: 查询的开始时间,可以是绝对时间(例如 2023-01-01T00:00:00Z)或相对时间(例如 -1h 表示过去一小时)。
# stop: 查询的结束时间,格式与 start 相同。如果省略,则默认到当前时间。
示例1:
查询过去一小时数据
range(start: -1h)
# s: 秒(seconds)
# m: 分钟(minutes)
# h: 小时(hours)
# d: 天(days)
# w: 周(weeks)
# mo: 月(months)
# y: 年(years)
示例2:
查询指定时间的数据
range(start: 2024-01-01T00:00:00Z, stop: 2024-01-31T23:59:59Z)
- aggregateWindow() :指定的时间窗口内对数据进行汇总操作,比如计算平均值、总和、最大值等。
# 语法
aggregateWindow(every: <duration>, fn: <function>, createEmpty: <boolean>)
# every: 指定窗口的时间间隔(例如 1m 表示每分钟)。
# fn: 聚合函数,如 mean、sum、max、min 等。
# createEmpty: 可选参数,布尔值,决定是否在没有数据的时间窗口中创建空结果,默认为 false。
示例1:
计算每小时的平均值:
aggregateWindow(every: 1h, fn: mean)
示例2:
计算每5分钟的总和,并在没有数据的窗口中创建空结果:
aggregateWindow(every: 5m, fn: sum, createEmpty: true)
示例3:
计算每10分钟的最大值:
aggregateWindow(every: 10m, fn: max)
方便数据拼接的查询函数
- pivot() : 主要用于将行数据转换为列数据。通过使用 pivot,用户可以将某个字段的值转化为列标题
# 语法
pivot(rowKey: [<column>], columnKey: [<column>], valueColumn: <column>)
# rowKey: 指定用作行索引的列,可以是一个或多个列的组合。
# columnKey: 指定用作列标题的列,通常是需要转换为列名的字段。
# valueColumn: 指定包含要填充到新表格中的值的列。
更多推荐
已为社区贡献1条内容
所有评论(0)