时间序列 – 计算InfluxDB中的费率

我有3列的测量表(时间,值,结果).时间和价值是时间序列数据库所需要的基础.结果列标记可以具有以下值之一(success / hard-fail / soft-fail / unknown).

我想在给定的时间窗口内跟踪成功率(成功/总计)(因为我将在grafana上使用它,时间窗口可能会改变并且应该支持动态时间范围查询)

我试过关于Influx 0.9的事情:

1: Using Grafana: 

Grafana有一个百分比堆栈选项来显示计数值.不幸的是,它没有显示百分比值.它只显示带有分布的图形.我有兴趣产生一个百分比数字,我不认为格拉法纳有这种能力.

2: Continuous queries - single table:

我尝试设置一个连续查询来聚合新测量表中的成功次数和总计数.

CREATE CONTINUOUS QUERY count_total ON metrics BEGIN SELECT SUM(value)as total INTO“metric_agg”FROM“original_metric”WHERE time> now() – 1h GROUP BY时间(5m)结束

创建连续查询count_success ON metrics BEGIN SELECT SUM(value)as success INTO“metric_agg”FROM“original_metric”WHERE result =’success’and time> now() – 1h GROUP BY时间(5m)结束

鉴于这些是两个不同的CQ写入相同的表,一些值在新的metric_agg表上不完全匹配,导致grafana查询失败.我觉得我可能会在这里做错事.如果你看到错误,Pelase让我知道

更新:不确定以下是否会起作用,但是在看了beckettsean的回复之后想把它放在这里.我很快就会尝试一下.

在单独的字段下创建2个CQ转储聚合值并运行除法:

CREATE CQ count_total ON metrics BEGIN SELECT SUM(value)as total INTO“metric_agg”FROM“original_metric”WHERE time> now() – 1h GROUP BY时间(5m)结束

CREATE CQ count_success ON metrics BEGIN SELECT SUM(value)as success INTO“metric_agg”FROM“original_metric”WHERE result =’success’and time> now() – 1h GROUP BY时间(5m)结束

Grafana:从metric_agg中选择成功/总计,其中$timeFilter

3: Continuous queries - single table - overwrites:

我尝试在上面的每个CQ上插入“dummy”0值,以确保每列的每行都有一个值.在大多数情况下,这实际上会用0覆盖原始值,并生成不正确的值,从而导致错误的速率.

4: Continuous queries - multiple tables:

我现在正在尝试在自己的表中编写每个CQ,并希望在Grafana查询中合并聚合表.然而,涌入的“合并”似乎并没有产生一个单一的系列.

SELECT sum(“success”)为success,sum(“total”)为total FROM merge / metric_result _ * / WHERE time> now() – 2h GROUP BY时间(5m)填充(0)

生成2个系列(metric_result_success和metric_result_total ..与CQ编写数据的位置相同).

我想我想问的是:
计算流入0.9的最佳方法是什么?如果可能的话,CQ似乎非常脆弱,我很乐意避免它们.

最佳答案

2: Continuous queries – single table:

不推荐这种方法,因为CQ都写入同一系列.没有用于区分结果的标签,因此一个CQ覆盖来自另一个CQ的点.点由其测量名称,标记集和时间戳唯一标识.这些字段不是唯一性的一部分.每个CQ写入相同的测量metric_agg.由于没有GROUP BY< tag>或GROUP BY *为两个CQ设置的标记为空.这只留下时间戳来区分两者,并且由于它们具有相同的GROUP BY time()子句,因此它们将写入具有相同时间戳的点.

4: Continuous queries – multiple tables:

没有办法计算测量值(你称之为“表”).测量中的系列可以合并,但不能跨测量.

这是一个很长的路要说,仅在InfluxDB查询语言中,您所要求的内容尚不可能.要计算在特定状态下花费的时间,您需要在InfluxDB之外处理查询结果.

点赞