@Michael-Desa 给出了很好的解释。
我想通过针对我们公司感兴趣的一个非常常见的指标的解决方案来扩充这个答案:“特定测量字段上的最大“每秒操作”值是多少? .
我将使用我们公司的真实示例。
场景背景
我们将大量数据从 RDBMS 发送到 redis。在传输该数据时,我们会跟踪 5 个计数器:
-
TipTrgUp -> 由业务触发器更新(存储过程)
-
TipTrgRm -> 由业务触发器删除(存储过程)
-
TipRprUp -> 通过无人值守的自动修复批处理更新
-
TipRprRm -> 通过无人值守的自动修复批处理删除
-
TipDmpUp -> 由批量转储进程更新
我们制作了一个指标收集器,将这些计数器的当前状态发送到 InfluxDB,间隔为 1 秒(可配置)。
Grafana 图 1:低分辨率,没有真正的最大操作数
这是有用的 grafana 查询,但在缩小时不显示真正的最大操作数(我们知道在正常工作日,当没有特殊转储或维护发生时,它会达到大约 500 个操作数 - 否则它进入数千个):
SELECT
non_negative_derivative(max(TipTrgUp),1s) AS "update/TipTrgUp"
,non_negative_derivative(max(TipTrgRm),1s) AS "remove/TipTrgRm"
,non_negative_derivative(max(TipRprUp),1s) AS "autorepair-up/TipRprUp"
,non_negative_derivative(max(TipRprRm),1s) AS "autorepair-rm/TipRprRm"
,non_negative_derivative(max(TipDmpUp),1s) AS "dump/TipDmpUp"
FROM "$rp"."redis_flux_-transid-d-s"
WHERE
host =~ /$server$/
AND $timeFilter
GROUP BY time($interval),* fill(null)
旁注:$rp 是保留策略的名称,以 grafana 为模板。我们使用 CQ 对具有更长持续时间的保留策略进行下采样。另请注意1s 作为派生参数:它是必需的,因为使用 GROUP BY 时默认值不同。这在 InfluxDB 文档中很容易被忽略。
24 小时查看的图表如下所示:
如果我们简单地使用 1s 的分辨率(正如@Michael-Desa 所建议的那样),大量数据将从 influxdb 传输到客户端。它运行得相当好(大约 10 秒),但对我们来说太慢了。
Grafana 图 2:低分辨率和高分辨率,真正的最大操作数,性能缓慢
但是,我们可以使用 子查询 将真正的 maxops 添加到该图中,这是一个轻微的改进。传输到客户端的数据要少得多,但 InfluxDB 服务器必须进行大量的数字运算。系列 B(在别名前加上maxops):
SELECT
max(subTipTrgUp) AS maxopsTipTrgUp
,max(subTipTrgRm) AS maxopsTipTrgRm
,max(subTipRprUp) AS maxopsRprUp
,max(subTipRprRm) AS maxopsTipRprRm
,max(subTipDmpUp) AS maxopsTipDmpUp
FROM (
SELECT
non_negative_derivative(max(TipTrgUp),1s) AS subTipTrgUp
,non_negative_derivative(max(TipTrgRm),1s) AS subTipTrgRm
,non_negative_derivative(max(TipRprUp),1s) AS subTipRprUp
,non_negative_derivative(max(TipRprRm),1s) AS subTipRprRm
,non_negative_derivative(max(TipDmpUp),1s) AS subTipDmpUp
FROM "$rp"."redis_flux_-transid-d-s"
WHERE
host =~ /$server$/
AND $timeFilter
GROUP BY time(1s),* fill(null)
)
WHERE $timeFilter
GROUP BY time($interval),* fill(null)
提供:
Grafana 图 3:低分辨率和高分辨率、真正的最大操作数、高性能、由 CQ 预先计算
我们对这类指标的最终解决方案(但仅当我们需要实时视图时,子查询方法才适用于 ad-hoc 图)是:使用连续查询来预先计算真正的 maxops。我们像这样生成 CQ:
CREATE CONTINUOUS QUERY "redis_flux_-transid-d-s.maxops.1s"
ON telegraf
BEGIN
SELECT
non_negative_derivative(max(TipTrgUp),1s) AS TipTrgUp
,non_negative_derivative(max(TipTrgRm),1s) AS TipTrgRm
,non_negative_derivative(max(TipRprUp),1s) AS TipRprUp
,non_negative_derivative(max(TipRprRm),1s) AS TipRprRm
,non_negative_derivative(max(TipDmpUp),1s) AS TipDmpUp
INTO telegraf.A."redis_flux_-transid-d-s.maxops"
FROM telegraf.A."redis_flux_-transid-d-s"
GROUP BY time(1s),*
END
从这里开始,在 grafana 中使用这些 maxops 测量是微不足道的。当下采样到保留时间更长的 RP 时,我们再次使用 max() 作为选择器函数。
B 系列(别名中附加.maxops)
SELECT
max(TipTrgUp) AS "update/TipTrgUp.maxops"
,max(TipTrgRm) AS "remove/TipTrgRm.maxops"
,max(TipRprUp) as "autorepair-up/TipRprUp.maxops"
,max(TipRprRm) as "autorepair-rm/TipRprRm.maxops"
,max(TipDmpUp) as "dump/TipDmpUp.maxops"
FROM "$rp"."redis_flux_-transid-d-s.maxops"
WHERE
host =~ /$server$/
AND $timeFilter
GROUP BY time($interval),* fill(null)
提供:
当放大到 1s 精度时,您可以看到图形变得相同:
希望这有帮助,TW