跨 InfluxDb 指标查询?
Query across InfluxDb metrics?
我在 InfluxDb 数据库中有 3 个时间序列指标,类似于:
myservice_processed
myservice_invoked
myservice_error
所以为了获得一组时间序列值,我有一个映射的 grafana 图:
select sum(value) from myservice_processed where $timeFilter GROUP BY time($interval) fill(null)
...对于三个值中的每一个。这给出了每分钟发生多少次调用、成功和失败的想法。一般来说,processed
和error
之和应该等于invoked
.
的值
现在我想根据上述指标获得一个时间序列值,它给出了失败百分比。例如,在任何给定的时间间隔内,我可能有 1000 次调用,处理了 900 次,出现了 100 次错误;我希望该指标在该时间间隔内为 10%。
我这辈子都想不通怎么办,我已经开始怀疑这做不到了,这让我感到难以置信。有人可以告诉我我错了并告诉我该怎么做吗?
目前这是不可能的,因为 Influxdb 现在不支持多个系列的聚合功能 (influxdb 1.0)
到目前为止,Grafana 不支持时间序列计算,但我们确实有问题的票证 https://github.com/grafana/grafana/issues/3677
InfluxDB 缺乏执行此类操作的分析结构。如果你想坚持使用 influxdb,你必须在外部层实现它,并将数据反馈回 influx。
这可以通过一组连续查询在 InfluxDB 中完成。
InfluxDB 的工作原理似乎是存储很便宜,而计划外的处理器时间很昂贵。设置存储结果的后台连续计算很容易,它可以让计算在后台安静地搅动。在 InfluxDB 中进行 on-the-fly 计算很快就会变得笨拙(或者不可能,如果它们跨越测量)。
策略
每五分钟,对每个指标进行求和,按时间分组,然后将求和插入第四次测量,称为 myservice_summary
.
不再有一个名为 value
的字段,myservice_summary
将有多个字段;一种用于已调用的调用,一种用于已处理的调用,一种用于有错误的调用。我们没有使用默认名称 value
,而是将字段命名为对阅读数据的人有意义的名称。
请注意,使用 GROUP BY time(x)
压缩数据(在此示例中,每五分钟一次)还可以减少存储开销和客户端查询时间(在客户端上检索、传输和显示的点更少) .它还降低了存储要求。在 InfluxDB 中使用至少两种保留策略是很常见的:原始数据在短时间内(例如 30 天)被修剪,压缩和处理的数据可以保留更长的时间(例如月,年,...)
当然,选择太大的 GROUP BY time()
间隔意味着粗糙的分辨率可能对 fault-finding 不利。例如当您需要知道在哪个小时开始寻找特定更改时,GROUP BY time(1d)
没有多大用处。
最佳时间分组 window 可以平衡有意义的问题开始/停止时间检测与客户端响应速度和存储负载。找到这个最优值留作练习。 :)
例子
请注意,在使用 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
在另一个 CQ 中使用存储在 myservice_summary
中的结果是可能的,但我不能 100% 确定避免竞争条件,即如果依赖于 myservice_summary
的 CQ 在填充该测量值的查询?
希望对您有所帮助。
我在 InfluxDb 数据库中有 3 个时间序列指标,类似于:
myservice_processed
myservice_invoked
myservice_error
所以为了获得一组时间序列值,我有一个映射的 grafana 图:
select sum(value) from myservice_processed where $timeFilter GROUP BY time($interval) fill(null)
...对于三个值中的每一个。这给出了每分钟发生多少次调用、成功和失败的想法。一般来说,processed
和error
之和应该等于invoked
.
现在我想根据上述指标获得一个时间序列值,它给出了失败百分比。例如,在任何给定的时间间隔内,我可能有 1000 次调用,处理了 900 次,出现了 100 次错误;我希望该指标在该时间间隔内为 10%。
我这辈子都想不通怎么办,我已经开始怀疑这做不到了,这让我感到难以置信。有人可以告诉我我错了并告诉我该怎么做吗?
目前这是不可能的,因为 Influxdb 现在不支持多个系列的聚合功能 (influxdb 1.0)
到目前为止,Grafana 不支持时间序列计算,但我们确实有问题的票证 https://github.com/grafana/grafana/issues/3677
InfluxDB 缺乏执行此类操作的分析结构。如果你想坚持使用 influxdb,你必须在外部层实现它,并将数据反馈回 influx。
这可以通过一组连续查询在 InfluxDB 中完成。
InfluxDB 的工作原理似乎是存储很便宜,而计划外的处理器时间很昂贵。设置存储结果的后台连续计算很容易,它可以让计算在后台安静地搅动。在 InfluxDB 中进行 on-the-fly 计算很快就会变得笨拙(或者不可能,如果它们跨越测量)。
策略
每五分钟,对每个指标进行求和,按时间分组,然后将求和插入第四次测量,称为 myservice_summary
.
不再有一个名为 value
的字段,myservice_summary
将有多个字段;一种用于已调用的调用,一种用于已处理的调用,一种用于有错误的调用。我们没有使用默认名称 value
,而是将字段命名为对阅读数据的人有意义的名称。
请注意,使用 GROUP BY time(x)
压缩数据(在此示例中,每五分钟一次)还可以减少存储开销和客户端查询时间(在客户端上检索、传输和显示的点更少) .它还降低了存储要求。在 InfluxDB 中使用至少两种保留策略是很常见的:原始数据在短时间内(例如 30 天)被修剪,压缩和处理的数据可以保留更长的时间(例如月,年,...)
当然,选择太大的 GROUP BY time()
间隔意味着粗糙的分辨率可能对 fault-finding 不利。例如当您需要知道在哪个小时开始寻找特定更改时,GROUP BY time(1d)
没有多大用处。
最佳时间分组 window 可以平衡有意义的问题开始/停止时间检测与客户端响应速度和存储负载。找到这个最优值留作练习。 :)
例子
请注意,在使用 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
在另一个 CQ 中使用存储在 myservice_summary
中的结果是可能的,但我不能 100% 确定避免竞争条件,即如果依赖于 myservice_summary
的 CQ 在填充该测量值的查询?
希望对您有所帮助。