InfluxDB & Grafana 趟坑过程记录
InfluxDB
子查询查最新版本号的分布情况
select count(*) from (select count(value) from table where app =~ /^abc/ group by "app", "version" order by time desc limit 1) group by "app", "version" order by time desc
在子查询里,已经按照时间拿最新的一条数据,但是在外面再套一层之后,老的数据又出来了,这个问题暂时没解,而是通过新的数据过来之后,删掉老的数据规避掉。
时区问题
默认情况下,InfluxDB
使用UTC来计算时间区块的数据,可以使用tz()
子句来指定时区,比如如下指定了UTC+8
时区
SELECT sum("value") FROM "table" GROUP BY time($__interval) fill(null) tz('Asia/Shanghai')
Grafana
Variables - Include All option
Grafana里可以配置变量,后续变量可以在绘制Dashboard的时候使用,如下图所示
配置界面
使用界面
注意其中的Include All option
,选中这个勾选框之后,下拉界面就能出现All
这个选项,作用是查询语句将会使用(A|B|C)作为查询条件
在下拉选项少的情况下,这样用是一点问题也没有的,但是如果下拉选项很多的话,就会有问题,Grafana
查询数据的时候是用GET
方法查询的,即查询语句会出现在URL里,带来的一个问题是,如果走nginx
的话,会被nginx
拒绝掉,原因是nginx对URL的长度有限制。当然可以调整nginx
配置来规避这个问题,还有一种办法是,通过自定义All的语义来更优雅的解决,如上所示,这边个性化了Custom all value
为.*
,熟悉正则的朋友肯定已经懂了,po个查询语句
SELECT sum("value") FROM "table" WHERE ("level" =~ /^$level$/ AND $timeFilter GROUP BY time($__interval) fill(null)
级连查询
Grafana
支持你做级连查询,想一下省市级连就知道了
定义的方法如下
首先定义一个变量,命名为level
SHOW TAG VALUES FROM "table" WITH KEY = "level"
接着再定义一个变量,命名为title
SHOW TAG VALUES FROM "table" WITH KEY = "level" where "level" =~ /^level$/
Legend Avg
假如查询出来的series包含null值并且在Null value的配置里配置了null as zero
的话,平均值计算出来的就会不对,它会将null值也累加到分母里,所以这里需要将Null value配置成null
,来让前端忽略这个null值,参见Ignore nulls unless 'null as zero' for series.stats.avg
Group By Tags
在列比较稀疏的情况下,比如,第一次写入的数据是A、B、C三列,第二次写入的数据是A、D、E三列,tag为X列,按照X列做group by,如果选择的字段是B列,则第一次数据的tag不会出现,只有选择两个公有的列,这里是A列,两次写入的数据的tag才会出现。
如何隐藏Legend
可以在Display里配置是否展示 Legend,具体配置见下图所示
环比、同比
InfluxDB 提供了derivative()
函数用来计算变化速率
e.x.
raw_data
name: h2o_feet
time water_level
---- -----------
2015-08-18T00:00:00Z 2.064
2015-08-18T00:06:00Z 2.116
2015-08-18T00:12:00Z 2.028
2015-08-18T00:18:00Z 2.126
2015-08-18T00:24:00Z 2.041
2015-08-18T00:30:00Z 2.051
SELECT DERIVATIVE("water_level",6m) FROM "h2o_feet" WHERE "location" = 'santa_monica' AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'
name: h2o_feet
time derivative
---- ----------
2015-08-18T00:06:00Z 0.052000000000000046
2015-08-18T00:12:00Z -0.08800000000000008
2015-08-18T00:18:00Z 0.09799999999999986
2015-08-18T00:24:00Z -0.08499999999999996
2015-08-18T00:30:00Z 0.010000000000000231
计算6分钟的变化速率
(2.116 - 2.064) / (6m / 6m)
-------------- ----------
| |
| the difference between the field values' timestamps / the specified unit
second field value - first field value