#influxdb #telegraf #influxdb-2 #telegraf-plugins #starlark
#influxdb #telegraf #influxdb-2 #telegraf-плагины #starlark
Вопрос:
Я ищу способ округлить значения, выводимые из telergaf. Temperature, 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 = float(int(v * 10)) / 10
Казалось, что он делает то, что мне нужно, и должен выдержать случай 0.
Ответ №2:
Можете ли вы сказать, в чем заключается ваше ограничение? Это размер сообщения или, скорее, хранилище в InfluxDB? Или это скорее при представлении данных?
Даже если вы уменьшите десятичные дроби в telegraf, я полагаю, что InfluxDB все равно сохранит поле с плавающей запятой размером 8 байт. Так что в этом случае у вас не будет никаких преимуществ.
https://medium.com/dataseries/analysis-of-the-storage-mechanism-in-influxdb-b84d686f3697#4e6e
Комментарии:
1. На самом деле у меня нет никаких ограничений. Моя главная потребность — уменьшить полезную нагрузку. Ограничение мер только теми, которые я использую, уже значительно снизило нагрузку на мою сеть и загрузку процессора моих MQTTs. Я подумал, почему бы не пойти дальше, округляя значения.
Ответ №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
'''