问题描述
嗨,我正在尝试在指标之间进行简单的成功率计算。通过将成功请求的次数除以尝试次数。问题是两个指标均为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
}))