Woj*_*Zet 5 retention influxdb grafana
我正在设置从 telegraf 收集指标到 influxdb 中。然后grafana使用influxdb作为数据源来显示图表。
我的问题是减少磁盘使用量,所以我想对旧数据(超过 3 天)进行下采样,并保留新数据(少于 3 天)原样(原始)
我尝试了 influxdb 的保留策略(RP)和连续查询(CQ),如指南中所述: https ://docs.influxdata.com/influxdb/v1.2/guides/downsampling_and_retention
influxdb ("telegraf")
+----------------------------+
| |
| +-----------------------+ |
| | table disk_raw | |
| | CURRENT RP (RAW) +---------+
| | (deleted after 3d) | | |
| +-----------------------+ | |CQ (average 30 min of datapoints into 1)
| +-----------------------+ | |
| | table_disk_ds | | |
| | LONGTERM RP +<--------+
| |(downsampled, kept 90d)| |
| +-----------------------+ |
| +<----+
+----------------------------+ |
|
|
grafana | grafana query
+----------------------------+ |
| | |
| +----------------------+ | |
| | data graph | +-----+
| +----------------------+ |
| |
+----------------------------+
Run Code Online (Sandbox Code Playgroud)
问题是 - 该解决方案为您提供了 2 张表,一张用于原始数据,一张用于下采样数据。CQ 不断地写入下采样数据。这对我来说不太好:
有什么方法可以对同一个表中的旧记录进行下采样吗?
配置示例: https://docs.influxdata.com/influxdb/v1.2/guides/downsampling_and_retention
格拉法纳查询
SELECT mean("used_percent") FROM "disk" WHERE ("device" = 'dm-0') AND $timeFilter GROUP BY time(10s) fill(none)
EDIT2:这是在 Grafana 中使用模板变量实现的解决方法
https://github.com/grafana/grafana/issues/4262#issuecomment-475570324
这似乎是一个非常好的解决方案。
原始答案 从您链接的 influxb 页面查看示例
CREATE CONTINUOUS QUERY "cq_30m" ON "food_data" BEGIN
SELECT mean("website") AS "mean_website",mean("phone") AS "mean_phone"
INTO "a_year"."orders"
FROM "orders"
GROUP BY time(30m)
END
Run Code Online (Sandbox Code Playgroud)
如果orders在 andINTO子句中指定相同的源表和目标表,即FROM,则数据将写入同一个表。
但是,这并不能解决你的问题。
您仍然需要两个查询才能从两个保留策略获取数据。如果您执行通用select * from disk_raw ...Influx 将使用默认保留策略并从那里返回数据。
通常执行此操作的方法是运行两个查询并连接结果。在单个请求中类似
select * from rp_short.diskraw; select * from rp_long.diskraw
编辑:这里讨论了为什么不可能做你(和很多其他人)想要的事情https://github.com/influxdata/influxdb/issues/2625
还有一些解决方法。
简而言之,一种方法是手动处理下采样和高分辨率数据(即不使用 CQ)并将其保留在相同的保留策略中。另一种方法是使用代理,根据查询的时间范围来增强查询,以获得正确的数据。