我有3列的测量表(时间,值,结果) . time
和 value
是时间序列数据库所需的基础 . result
列标记可能具有以下值之一(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 time(5m) END
CREATE CONTINUOUS QUERY 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 time(5m) END
鉴于这两个不同的CQ 's writing to the same tables, some values don' t在新的 metric_agg
表上完全匹配,导致grafana查询失败 . 我觉得我可能会在这里做错事 . 如果你看到错误,Pelase让我知道
UPDATE :不确定以下内容是否有效,但是想看看beckettsean之后想把它放在这里's response. I' ll很快就会尝试这个 .
在单独的字段下创建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 time(5m) END
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 time(5m) END
格拉法娜: select success / total from metric_agg where $timeFilter
3: Continuous queries - single table - overwrites:
我尝试在上面的每个CQ上插入“dummy”0值,以确保每列的每行都有一个值 . 在大多数情况下,这实际上会用0覆盖原始值,并生成不正确的值,从而导致错误的速率 .
4: Continuous queries - multiple tables:
我现在正在尝试在自己的表中编写每个CQ,并希望在Grafana查询中合并聚合表 . 然而,涌入的“合并”似乎并没有产生一个系列 .
SELECT sum("success") as success, sum("total") as total FROM merge /metric_result_*/ WHERE time > now() - 2h GROUP BY time(5m) fill(0)
生成2个系列( metric_result_success
和 metric_result_total
..与CQ编写数据的位置相同) .
我想我想问的是:什么是计算上涨流量0.9的最佳方法?如果可能的话,CQ似乎非常脆弱,我很乐意避免它们 .
2 回答
不推荐这种方法,因为CQ都写入同一系列 . 没有用于区分结果的标签,因此一个CQ覆盖来自另一个CQ的点 . 点由其测量名称,标记集和时间戳唯一标识 . 这些字段不是唯一性的一部分 . 每个CQ都写入相同的测量
metric_agg
. 由于没有GROUP BY <tag>
或GROUP BY *
,因此两个CQ的标记集都是空的 . 这只留下时间戳来区分两者,并且因为它们具有相同的GROUP BY time()
子句,所以它们将写入具有相同时间戳的点 .没有办法计算测量值(你称之为“表”) . 测量中的系列可以合并,但不能跨测量 .
这是一个很长的路要说,仅在InfluxDB查询语言中,您所要求的内容尚不可能 . 要计算在特定状态下花费的时间,您需要在InfluxDB之外处理查询结果 .
对于现在阅读此内容的任何人(最近推出了Influx 1.0 beta) .
Influx团队通过他们的0.10版本修复了一个问题**,使得“2:持续查询 - 单表:”方法对我起作用 . 注意:我在不同的标签中写入值,因此没有覆盖 . 只需继续将聚合值写入这个新表,并在grafana中我可以使用一个查询来划分我感兴趣的列/标记 .
或者,你也可以使用Kapacitor来做同样的事情 .
**对于任何好奇的人来说,在0.10中修复的Influx问题是在0.10之前在现有时间戳添加新标记值,将删除旧标记/字段并仅写入此新信息(导致我们删除信息) .