首先,对数据有一些了解。
我有一个带有InfluxDB数据库,autobandwidth
每分钟都有从snmp收集的接口统计信息填充,但是这里感兴趣的是标签host
,snmp_id
和值ifInOctets
和ifOutOctets
。
然后,我有一个连续查询,该查询使用non_negative_derivative
填充导数以更改字节/秒的字节,并填充autobandwidth_deriv
。
我使用Grafana来显示数据,并使用以下查询:
SELECT
mean("non_negative_derivative_ifInOctets") *8 AS "in",
mean("non_negative_derivative_ifOutOctets") *8 AS "out"
FROM "autobandwidth_deriv"
WHERE ("host" =~ /^$host$/ AND "snmp_id" =~ /^$snmp_id$/) AND $timeFilter
GROUP BY time($__interval), "host", "snmp_id"
它精美地显示了数据。
现在,我还有另一个查询来获取95%的值:
SELECT
percentile("non_negative_derivative_ifInOctets", 95) *8 AS "in 95%",
percentile("non_negative_derivative_ifOutOctets", 95) *8 AS "out 95%"
FROM "autobandwidth_deriv"
WHERE ("host" =~ /^$host$/ AND "snmp_id" =~ /^$snmp_id$/) AND $timeFilter
GROUP "host", "snmp_id"
这使我获得了图例中95%的值。
现在,我想要的是获得95%处的直线,具有视觉辅助功能,并能够看到交通何时到达上方。
由于influxdb查询仅返回一个时间值,因此不会显示在图形上。
另外,由于我只有一个时间值,因此使用fill()
的任何值都无济于事,所以没有什么可填充的。出于相同的原因,在grafana的图形设置中也不会为连接设置空值。
经过几天的阅读,我发现所有关于百分位数和图形的信息,最终我要做的就是使用这样的子选择:
SELECT
MEAN("in 95%") as "in 95%", MEAN("out 95%") as "out 95%"
FROM (
SELECT
percentile("non_negative_derivative_ifInOctets", 95) *8 AS "in 95%",
percentile("non_negative_derivative_ifOutOctets", 95) *8 AS "out 95%"
FROM "autobandwidth_deriv"
WHERE ("host" =~ /^$host$/ AND "snmp_id" =~ /^$snmp_id$/) AND $timeFilter
GROUP BY time(600d), "host", "snmp_id"
)
GROUP BY time($__interval), "host", "snmp_id" fill(previous)
我现在有了我想要的行...除了当我的时间序列越过time(600d)
边界时,我有两个值。
我需要在子选择中使用GROUP BY time(600d)
,否则influxdb变得很聪明,并且我希望所有时间值都出自子选择,而最终我得到的数据中没有进行百分位数计算...
所以,这不是解决方案,我不知道下一步该怎么做。
也许我需要在Grafana中做点什么,但我不知道该怎么办...