Высокие или низкие значения в history

Started by hsvt, August 01, 2016, 12:41:21 PM

Previous topic - Next topic

hsvt

Добрый день. Использую для снятия загрузки интерфейсов вот такие OID:

ifHCInOctets 1.3.6.1.2.1.31.1.1.1.6
ifHCOutOctets 1.3.6.1.2.1.31.1.1.1.10

.1.3.6.1.2.1.31.1.1.1.6.{instance}
.1.3.6.1.2.1.31.1.1.1.10.{instance}

return int64($1) * 8;

Data type: Unsigned Int64, пробовал так же просто Int64.

На выходе периодически получаю странные значения (мега высокие если Unsigned Int64, или минусовые если Int64)


hsvt

Нашёл похожий тред - https://www.netxms.org/forum/oe-oo/eee-to-transformation-script/5/ неизвестно чем дело кончилось?


hsvt

UP... проблема актуальна, один единственный роутер на котором как раз хотелось бы снимать загрузку интерфейсов и такие значения все графики портят, заметил так же что сильно высокие значения чаще всего проскакивают на Out интерфейсе. Если убирать Average delta per second - реальные значения одинаковые.

kozlov_ao

Сделайте по 2 DCI для каждого вида изерений. В одном - с дельтой, а во втором - без (просто данные).
При возникновении косяка в дельте - посмотрите, что указано в простом.

А в принципе - я быфильтровал мега высокие и низкие значения.

hsvt

Quote from: kozlov_ao on August 12, 2016, 04:43:35 PM
Сделайте по 2 DCI для каждого вида изерений. В одном - с дельтой, а во втором - без (просто данные).
При возникновении косяка в дельте - посмотрите, что указано в простом.

А в принципе - я быфильтровал мега высокие и низкие значения.

Делал первым делом же, в простом всё в порядке, скриншот приложил.


Как фильтровать? Alex предлагал такой скрипт:

if ($1 < 0 || $1 > 100000) abort;

В итоге у меня получилось так:

return int64($1) * 8;
if ($1 < 0 || $1 > 100000) abort;


Как правильно нужно это вписать чтобы работало?



kozlov_ao

Как вариант, можно так:

val = int64($1) * 8;
if (val < 0 || val > 10000000) abort;
return val;

hsvt

Quote from: kozlov_ao on August 13, 2016, 03:06:08 AM
Как вариант, можно так:

val = int64($1) * 8;
if (val < 0 || val > 10000000) abort;
return val;


Спасибо. Рабочий вариант для 10G.

val = int64($1) * 8;
if (val < 0 || val > 100000000000)
{
abort;
}
return val;

kozlov_ao

Ну уж на кол-во нудей я внимания необращал..

Harun

Я использую такой transformation script, спасает также от всплесков при перезагрузке устройств и обнулении счетчиков:

value = $1 * 8;
p = rindex ($dci->name,".") + 1;
id = substr($dci->name, p);
i = GetInterfaceObject($node, id);
if (i != null && i->speed>0 && i->speed < value ) return null;
return value;

или для интерфейсов 10G
value = int64($1) * 8L;
p = rindex ($dci->name,".") + 1;
id = substr($dci->name, p);
i = GetInterfaceObject($node, id);
if (i != null && i->speed>0 && i->speed < value ) return null;
return value;


Но очень нехватает шаблонов для создания DCI, есть стандартные шаблоны для интерфейсов bytes, bits, packets, error, нужен функционал добавления в шаблоны своих transformation script, иначе при создании dci приходится вручную лезть в data collection conf и добавлять код. Это очень сильно раздражает при необходимости быстро создать счетчик.

Вот подобная тема:
https://www.netxms.org/forum/e-eoe-o-koaot-netxms/dci-maximum-value/

hsvt

Quote from: Harun on August 15, 2016, 09:48:10 PM
Я использую такой transformation script, спасает также от всплесков при перезагрузке устройств и обнулении счетчиков:

value = $1 * 8;
p = rindex ($dci->name,".") + 1;
id = substr($dci->name, p);
i = GetInterfaceObject($node, id);
if (i != null && i->speed>0 && i->speed < value ) return null;
return value;

или для интерфейсов 10G
value = int64($1) * 8L;
p = rindex ($dci->name,".") + 1;
id = substr($dci->name, p);
i = GetInterfaceObject($node, id);
if (i != null && i->speed>0 && i->speed < value ) return null;
return value;


Но очень нехватает шаблонов для создания DCI, есть стандартные шаблоны для интерфейсов bytes, bits, packets, error, нужен функционал добавления в шаблоны своих transformation script, иначе при создании dci приходится вручную лезть в data collection conf и добавлять код. Это очень сильно раздражает при необходимости быстро создать счетчик.

Вот подобная тема:
https://www.netxms.org/forum/e-eoe-o-koaot-netxms/dci-maximum-value/

Больше спасибо! Только вот вчера когда общался с Виктором он написал следующее:

Quote[15.08.2016 11:20:42] Victor Kirhenshtein: return null только для скриптов сбора данных уимеет смысл, не для трансформаций
[15.08.2016 11:20:49] Victor Kirhenshtein: надо использовать abort
[15.08.2016 11:21:28] Victor Kirhenshtein: при реальной трансформации все будет как надо
[15.08.2016 11:21:42] Victor Kirhenshtein: скрипт прервется, событие ошибки скрипта не будет создаваться
[15.08.2016 11:22:01] Victor Kirhenshtein: и сбор данных не пройдет, значения не будет

То есть лучше всё таки abort видимо?

kozlov_ao


hsvt

При таком скрипте часто бывает значение в DCI << ERROR >> и фиксируется на одном времени, ни Force ни Clear не помогает, хотя при этом если сделать snmpwalk - счётчики с данными есть. :(

Похоже нормально снимать показания с роутера всё таки не удастся...

hsvt

Если использовать заместо abort; -> return null;

То есть получается при abort << ERROR >> и мин 40 он не пуллит данные, при null провалы.


kozlov_ao

Все логично.. abort прерывает операцию, а null - обнуляет показатель.
Ради спортивного интереса - попробуй return false;

hsvt

Quote from: kozlov_ao on September 01, 2016, 11:16:13 AM
Все логично.. abort прерывает операцию, а null - обнуляет показатель.
Ради спортивного интереса - попробуй return false;

Логично то логично, но только у меня чтоли такая проблема или никто показания с роутеров не снимает в NetXMS? Простая задача вылилась в геморрой какой то.