如何在电报中舍入输出值?

Posted

技术标签:

【中文标题】如何在电报中舍入输出值?【英文标题】:How to round output values in telegraf? 【发布时间】:2021-03-31 01:12:23 【问题描述】:

我正在寻找一种方法来舍入telergaf 输出的值。温度、usage_idle、memory_usage 等等……到小数点后 14 位是非常巨大的。这对我来说太多了。它可以使我的一些测量值翻倍。

我还没有找到一种简单的方法。

现在我有这个输出:

cpu,host=nuc usage_system=1.4107433532279232,usage_idle=95.06239826368747,usage_iowait=0.37981551817639264,usage_user=2.007596310360536

我想要这样:

cpu,host=nuc usage_system=1.4,usage_idle=95.0,usage_iowait=0.4,usage_user=2.0

我猜你必须使用处理器,但你如何以简单的方式做到这一点? starlark 只是为了舍入一个值?

【问题讨论】:

【参考方案1】:

抱歉,这有点老线程,但我有同样的需求,并且没有找到任何内置的方法来做到这一点,因为即使 Starlarks 数学模块的舍入函数也只会舍入到整数。

我的方法非常相似。

我希望我的大部分气象站数据都具有小数点后一位数的精度,因为传感器没有比这更准确的方法了。

所以我选择了(在 Starlark 例程中): v = 浮点数(int(v*10))/10

它似乎可以满足我的需要,并且应该能够在 0 的情况下存活下来。

【讨论】:

【参考方案2】:

你能说出你的局限在哪里吗?是消息大小还是 InfluxDB 上的存储?还是更倾向于展示数据?

即使你在 telegraf 中减少小数,我相信 InfluxDB 仍然会存储一个 8 字节的浮点字段。所以在那种情况下你不会有任何优势。

https://medium.com/dataseries/analysis-of-the-storage-mechanism-in-influxdb-b84d686f3697#4e6e

【讨论】:

我真的没有任何限制。我的主要需要是减少我的有效载荷。将这些措施限制在我只使用的那个已经大大减少了我的网络负载和我的 MQTT 的 CPU 负载。我想为什么不通过四舍五入来进一步。【参考方案3】:

我不太相信我的解决方案,但我确实喜欢这个……使用 starlak 处理器。

我还没有找到实现真正圆形函数的方法。

[[processors.starlark]]
  source = '''
def apply(metric):
  for k, v in metric.fields.items():
    if type(v) == 'float':
      f = metric.fields[k]
      if (int(f) != 0):
        metric.fields[k] = float(int(f) + float(int((f % int(f)) * 10) / 10))
      else:
        metric.fields[k] = float(int(f * 10) / 10)
  return metric
'''

【讨论】:

以上是关于如何在电报中舍入输出值?的主要内容,如果未能解决你的问题,请参考以下文章

如何停止在 MySQL 中舍入 int 值

如何在包含浮点数和 Nan 或 None 值的同一列中舍入浮点值?

如何在 Datagridview 中舍入 double 类型的值

如何在水晶报表中舍入小数值

如何在PHP中舍入浮点数?

如何在 MySQL 中舍入 DateTime?