查询InfluxDb指标?

时间:2016-12-05 19:14:25

标签: time-series influxdb grafana

我在InfluxDb数据库中有3个时间序列指标,类似于:

Fs=1./(S-1)

所以为了得到一组时间序列的值,我有一张grafana图来映射:

myservice_processed
myservice_invoked
myservice_error

...对于三个值中的每一个。这样可以了解每分钟发生多少次调用,成功和失败。通常,select sum(value) from myservice_processed where $timeFilter GROUP BY time($interval) fill(null) processed的总和应该等于error的值。

现在,我希望根据上述指标获得时间序列值,从而为我提供失败的百分比。例如,在任何给定的时间间隔内,我可能有1000次调用,900次处理和100次错误;我希望该指标在该时间间隔内为10%。

对于我的生活,我无法弄清楚如何做到这一点,我开始怀疑它无法做到,这对我来说是令人难以置信的。有人可以告诉我,我错了,告诉我该怎么做?

3 个答案:

答案 0 :(得分:2)

这是目前无法实现的,因为Influxdb现在不支持多个系列的聚合功能(Influxdb 1.0)

到目前为止,Grafana不支持时间系列计算,但我们确实有一个问题的门票https://github.com/grafana/grafana/issues/3677

答案 1 :(得分:1)

这可以通过一组连续查询在InfluxDB中完成。

InfluxDB似乎是基于存储便宜且计划外处理器时间昂贵的原则。设置存储结果的背景连续计算很容易,它可以让计算在后台悄然流失。在InfluxDB中进行实时计算很快就会变得很笨拙(或者如果它们跨越测量结果,则不可能)。

策略

每个例如五分钟,执行每个度量的总和,按时间分组,并将总和插入第四个度量,称为myservice_summary

value不是只有一个名为myservice_summary的字段,而是有几个字段;一个用于调用的调用,一个用于已处理的调用,另一个用于有错误的调用。我们将字段命名为对读取数据的人有意义的字段,而不是默认名称value

请注意,使用GROUP BY time(x)(在此示例中,每五分钟)压缩数据还可以减少存储开销和客户端查询时间(在客户端上检索,传输和显示的点数更少)。它还降低了存储要求。在InfluxDB中使用至少两个保留策略是很常见的:原始数据在短时间内(例如30天)被修剪,压缩和处理的数据可以保留更长时间(例如,几个月,几年......)

当然,选择过大的GROUP BY time()间隔意味着粗略的分辨率可能对于故障查找不利。例如当你需要知道在哪个小时开始寻找特定的变化时,使用GROUP BY time(1d)并没什么用处。

最佳时间分组窗口可平衡有效检测问题何时开始/停止,以及客户端响应速度和存储负载。找到这个最佳值是一个练习。 :)

实施例

请注意,在使用CLI时,对于以下三个连续查询中的每一个,从CREATE CONTINUOUS QUERYEND的所有内容都可能需要在一行上以避免语法错误。我只是为了提高可读性而设置换行符。

方括号[ ]表示可选参数。括号本身不包含在字面上。

在这种情况下,您可以使用额外的标签键来选择哪些键是重要的,并且应该在新的测量中。

CREATE CONTINUOUS QUERY myservice_processed_sum_5m ON your_db_name
BEGIN
    SELECT sum(value) AS processed_sum_5m 
    INTO myservice_summary 
    FROM myservice_processed GROUP BY time(5m)[, other_tag_keys e.g. vendor_id]
END 

CREATE CONTINUOUS QUERY myservice_invoked_sum_5m ON your_db_name
BEGIN
    SELECT sum(value) AS invoked_sum_5m 
    INTO myservice_summary 
    FROM myservice_invoked GROUP BY time(5m)[, other_tag_keys e.g. vendor_id]
END 

CREATE CONTINUOUS QUERY myservice_error_sum ON your_db_name
BEGIN
    SELECT sum(value) AS error_sum_5m 
    INTO myservice_summary 
    FROM myservice_error GROUP BY time(5m)[, other_tag_keys e.g. vendor_id]
END

现在我们有了一个名为myservice_summary的新测量,其中有三个字段:processed_sum_5minvoked_sum_5merror_sum_5m(假设5分钟的摘要是你的要)。

从那里,过去24小时失败百分比的查询将是:

SELECT (error_sum_5m / invoked_sum_5m) * 100.0 
    AS error_pct_5m
    FROM myservice_summary
    WHERE time > now() - 1d
    [GROUP BY other_tags e.g. vendor_id]

或者采用更为表格的格式:

SELECT [vendor_id, etc, ](error_sum_5m / invoked_sum_5m) * 100.0 
    AS error_pct_5m
    FROM myservice_summary
    WHERE time > now() - 1d

使用myservice_summary中存储在另一个CQ中的结果是可能的,但我不是100%确定避免竞争条件,即如果依赖于myservice_summary的CQ在查询之前执行该怎么办?填充测量?

希望有所帮助。

答案 2 :(得分:0)

InfluxDB缺乏分析结构来完成这类工作。如果你想坚持使用Influxdb,你必须在外部层实现它并将数据反馈到涌入。