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 函数来执行浮点除法。

引用自text/templates: Pipelines:

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

有关详细信息,请参阅