flux - InfluxDB 2.0 Flux - 如何处理除以零
问题描述
您好我正在尝试在指标之间进行简单的成功率计算。通过将成功请求的数量除以尝试的数量。问题是一些间隔是空的,其中两个指标都是 0。当我编写查询时,我得到下面的“不能被零除”的运行时错误。在 SQL 中有一个NULLIF
函数可以避免这种情况。是否有类似的变化,或者是否有替代方法可以避免被零除?
错误:runtime error @7:6-7:90: map: failed to evaluate map function: cannot divide by zero
我的示例查询:
from(bucket: "my_db")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "HTTPRequests")
|> filter(fn: (r) => r["_field"] == "RequestAttempt" or r["_field"] == "RequestSuccess_E")
|> filter(fn: (r) => r["host"] == "host-a")
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(fn: (r) => ({ r with Request_SR: r.RequestSuccess_E/r.RequestAttempt }))
提前致谢。
解决方案
Influx 团队回答了我的问题。这对我的情况有效。
您可以使用一些简单的条件逻辑来检查 ReqeustSuccess 和 RequestAttempt 的值。您可以检查它们是 null 还是 0。您确实需要为操作数何时为 null 或 0 提供默认值,因为您无法映射 null 值。
from(bucket: "my_db")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "HTTPRequests")
|> filter(fn: (r) => r["_field"] == "RequestAttempt" or r["_field"] == "RequestSuccess_E")
|> filter(fn: (r) => r["host"] == "host-a")
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(fn: (r) => ({ r with
Request_SR:
if not exists r.RequestSuccess_E or r.RequestSuccess_E == 0.0 then 0.0
else if not exists r.RequestAttempt or r.RequestAttempt == 0.0 then 0.0
else r.RequestSuccess_E / r.RequestAttempt
}))
推荐阅读
- sql - 如何使用结果集作为输入从日历表中获取所有行
- jackson - Jackson TreeModel vs 数据绑定
- jquery - 为什么 $.get 在执行此代码时会延迟?
- javascript - 在窗口调整大小时更改元素的大小
- php - Wordpress 在帖子内容中错误地显示 HTML 实体和十六进制实体
- typescript - 打字稿可以缩小泛型类型中的联合类型吗?
- django - 变量未显示在 Django 模板上
- r - R:本地主机上的 H2O 初始化问题(.h2o.startJar 中的错误:返回代码 = 1)
- c# - jQuery 发布到控制器并重定向到 ASP.NET MVC 视图
- c# - 从 Asp.net Web 应用程序执行 Windows 服务 (*.exe)