influxQL查询
tag过滤:
select * from "rp_one_month"."rp_video_blocked" where event_type='4'
field过滤:
select * from "rp_one_month"."rp_video_blocked" where blocked_duration>30
select * from "rp_one_month"."rp_video_blocked" where session_id='1625450606237307159_914'
注:
- 单引号表示字符串,双引号是要报错的!
- 如果设置了retention policy,查询时要带上,否则,返回空
关于retention policy
支持针对不同的measurement数据,使用定制rp
创建rp:
create database stat_rp_one_month with duration 30d replication 1
flux写入数据时,bucket加入rp信息
bucket:"stat/rp_one_month"
flux读取数据时,bucket也加入rp信息
from(bucket:"stat/rp_one_month")
|> range(start: 1631946180, stop: 1631957400)
|> filter(fn: (r) => r._measurement == "rp_rtt_and_packets_lost")
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> filter(fn: (r) => r.session_id=="1625450606237307159_914")
flux读取数据
from(bucket:"stat/rp_one_month")
|> range(start: 1629697950, stop: 1632289950)
|> filter(fn: (r) => r._measurement == "rp_session_infos")
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> filter(fn: (r) => r.user_id==2)
|> sort(columns: ["_time"], desc: true)
|> group(columns: ["event_type","state"])
|> unique(column: "session_id")
|> limit(n:20, offset: 0)
pivot能将measurement根据tag field 分成的一条条数据,组装成以时间为维度的类似数据库的一条条数据。
- 随后的很关键的|>每一个都是把前面命令的输出作为下一条命令的输入。
- 默认的数据会根据不同的tag值进行分组成表。如果想放在一个表里,要自己选择column进行分组。
- 每个函数是单独作用在每个表里的,而不是全部数据的。像limit是取前面数据生成的N个表里,每个数据做多n个,而不是全部数据。
标准时区陷阱
|> aggregateWindow(every: 1d, fn: count)
如果按照天为单位或周为单位,进行数据统计的话,默认取值范围是按照标准时区的一天来取值统计的,而不是我们本地时区的时间范围(北京时间)。fluxQL可以指定时区,flux暂时无解。
记录覆盖
同一个measurement中,当时间戳一致,tag的值一致时,后一条记录会覆盖前一条记录。
如果我们输入的时间戳精确到秒的话,那么,同一秒内的相同tag取值、不同field取值的数据很可能被覆盖丢失。所以,在设计的时候,tag的设计很重要,时间戳精确到纳秒能减小类似丢失的概率。
tag选取
每个tag相当于一个索引,不同的tag取值会对应一个索引文件,那么如果tag的不同取值很多很多,对应的索引文件就会很多很多,默认上限10万条,超过了,数据就会被丢弃,引起下面的告警日志。
2021/08/27 23:47:51 influxdb2client E! Write error: 400 Bad Request: partial write: max-values-per-tag limit exceeded (100000/100000): measurement="experiences" tag="session_id" value="1630079269427228172_17182" dropped=1
所以,tag的选取尽量取值范围可控,不要随业务无限增长,像用户ID、会话ID这种跟业务耦合的就不太适合选做tag,如果不得不选做tag的话,一方面要面临爆仓的风险,一方面就要考虑扩大服务器资源、设置合理RP,尽量减少爆仓的可能性。
uint64数据写不进
filed数据类型写uint64会导致数据写不进