Go模板中的浮动除法
float division in Go template
在grafana中(使用go模板做Loki行模板),我想划分一个字段(毫秒)并得到一个float结果。
这是我想做的事情:
| logfmt | line_format "{{ .microsec | float64 | div 1000 | printf \"%6.3f\" }}ms"
但是,这显然行不通,因为div
是整数除法函数
以下确实有效(但不除数):
| logfmt | line_format "{{ .microsec | float64 | printf \"%8.0f\" }}μs"
如何获得毫秒格式的输出?
编辑:
还有一个 divf
函数,但文档说“执行整数除法”。我得到了非常奇怪的结果(所以我不确定如何使用它):
{{ .microsec | float64 | printf \"%8.0f\" }}μs {{ .microsec | float64 | divf 1000 | printf \"%6.3f\" }}ms?divf
6332μs 0.158ms?divf
22959μs 0.044ms?divf
7034μs 0.142ms?divf
感谢@icza 的帮助,我围绕“divf”功能再次尝试,并取得了以下效果:
{{ divf .microsec 1000 | printf \"%6.3f\" }}ms
此时我仍然不明白为什么以下似乎 return 不正确的结果:
{{ .microsec | float64 | divf 1000 | float64 | printf \"%6.3f\" }}ms
我也不知道哪里可以找到关于divf
的文档。
Grafana docs 说明:
All sprig functions have been added to the template stage in Loki 2.3(along with function described below).
并且 Float Math Functions 包含一个 divf
函数来执行浮点除法。
A pipeline may be "chained" by separating a sequence of commands with pipeline characters '|'. In a chained pipeline, the result of each command is passed as the last argument of the following command. The output of the final command in the pipeline is the value of the pipeline.
所以当你这样做时:
{{ .microsec | float64 | divf 1000 | float64 | printf "%6.3f" }}ms
您实际上是将 1000 除以微秒值。显然你想要相反的东西,所以简单地做:
{{ divf .microsec 1000 | printf "%6.3f" }}ms
另请注意,在不支持浮点除法的情况下(意味着没有 divf
函数),您仍然可以使用整数运算来完成。
{{ printf "%d.%03d" (div .microsec 1000) (mod .microsec 1000) | float64 }}ms
有关详细信息,请参阅
在grafana中(使用go模板做Loki行模板),我想划分一个字段(毫秒)并得到一个float结果。
这是我想做的事情:
| logfmt | line_format "{{ .microsec | float64 | div 1000 | printf \"%6.3f\" }}ms"
但是,这显然行不通,因为div
是整数除法函数
以下确实有效(但不除数):
| logfmt | line_format "{{ .microsec | float64 | printf \"%8.0f\" }}μs"
如何获得毫秒格式的输出?
编辑:
还有一个 divf
函数,但文档说“执行整数除法”。我得到了非常奇怪的结果(所以我不确定如何使用它):
{{ .microsec | float64 | printf \"%8.0f\" }}μs {{ .microsec | float64 | divf 1000 | printf \"%6.3f\" }}ms?divf
6332μs 0.158ms?divf
22959μs 0.044ms?divf
7034μs 0.142ms?divf
感谢@icza 的帮助,我围绕“divf”功能再次尝试,并取得了以下效果:
{{ divf .microsec 1000 | printf \"%6.3f\" }}ms
此时我仍然不明白为什么以下似乎 return 不正确的结果:
{{ .microsec | float64 | divf 1000 | float64 | printf \"%6.3f\" }}ms
我也不知道哪里可以找到关于divf
的文档。
Grafana docs 说明:
All sprig functions have been added to the template stage in Loki 2.3(along with function described below).
并且 Float Math Functions 包含一个 divf
函数来执行浮点除法。
A pipeline may be "chained" by separating a sequence of commands with pipeline characters '|'. In a chained pipeline, the result of each command is passed as the last argument of the following command. The output of the final command in the pipeline is the value of the pipeline.
所以当你这样做时:
{{ .microsec | float64 | divf 1000 | float64 | printf "%6.3f" }}ms
您实际上是将 1000 除以微秒值。显然你想要相反的东西,所以简单地做:
{{ divf .microsec 1000 | printf "%6.3f" }}ms
另请注意,在不支持浮点除法的情况下(意味着没有 divf
函数),您仍然可以使用整数运算来完成。
{{ printf "%d.%03d" (div .microsec 1000) (mod .microsec 1000) | float64 }}ms
有关详细信息,请参阅