我在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%。
对于我的生活,我无法弄清楚如何做到这一点,我开始怀疑它无法做到,这对我来说是令人难以置信的。有人可以告诉我,我错了,告诉我该怎么做?
答案 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 QUERY
到END
的所有内容都可能需要在一行上以避免语法错误。我只是为了提高可读性而设置换行符。
方括号[ ]
表示可选参数。括号本身不包含在字面上。
在这种情况下,您可以使用额外的标签键来选择哪些键是重要的,并且应该在新的测量中。
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_5m
,invoked_sum_5m
和error_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,你必须在外部层实现它并将数据反馈到涌入。