Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - hsvt

#61
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;
#62
Quote from: 2c2i on June 24, 2016, 02:22:50 PM
получилось добиться вышеописанного таким скриптом фильтрации:

sub main() {
key="IF_UNEXP_UP_".$event->parameters[1]."_".d2x($event->id);
trace(1, "Checking key ".key);
if (FindAlarmByKey(key) == null) {
trace(1, "key" .key." Not found. disable event rule");
return false;
}
return true;
}


Это к какому правилу применять нужно ?
#63
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;


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


#64
UP... проблема актуальна, один единственный роутер на котором как раз хотелось бы снимать загрузку интерфейсов и такие значения все графики портят, заметил так же что сильно высокие значения чаще всего проскакивают на Out интерфейсе. Если убирать Average delta per second - реальные значения одинаковые.
#65
Нашёл похожий тред - https://www.netxms.org/forum/oe-oo/eee-to-transformation-script/5/ неизвестно чем дело кончилось?

#66
Добрый день. Использую для снятия загрузки интерфейсов вот такие 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)

#67
Общие вопросы / Re: POLLERS is too high
July 26, 2016, 04:14:48 PM
Quote from: Tatjana Dubrovica on July 05, 2016, 07:07:09 PM
Аллерт выскакивает потому что у нас баг в "NetXMS Server"->"Thread pools" Template. Там в пороговом значение(threshold) должно быть значение сильно больше 1. Мы это поправим к следующему релизу(2.0.5) и если Вы обновитесь когда мы его выпустим, то всё должно будет решиться само сабой или Вы можете сами поправить value. Оно должно быть PollerThreadPoolMaxSize(250). Это пороговое значение нужно, чтобы оповестить администратора о том, что есть запросы которые стоят в очереди на обработку, но не обрабатываться, потому что количество запросов превышает максимальное количество доступных потоков.

Импортировал новый 2.0.5 netxms_server.xml Server thread pool MAIN: normalized load average (1 minute) в Threshold осталось так же > 1

UPD: Вопрос решён, теперь изменился параметр который мониторится - normalized load average (= load average / thread count).
#68
Quote from: Hospital on July 18, 2016, 11:01:08 AM
Спасибо Алекс - вроде разобрался. Если через Walk выбрать OID(ы) и щёлкнуть "Create Data Collection Item" - то всё работает. А если копи-пейстить OID(ы) в шаблон или ноду - то вылазит ошибка "unsupported". Завелось, в общем ))

Смотрите чтобы всегда в начале точка была "." .1.3.6.
#69
Вообще не хватает подобного топика, все полезные скрипты или пользовательские функции разбросаны по форуму или чату в телеграмм, предлагаю публиковать и собирать всё в одной теме.

В Script Library можно добавить скрипты (либо они будут уже созданы при свежей уставноке):

Hook::StatusPoll
Hook::ConfigurationPoll
Hook::TopologyPoll
Hook::AcceptNewNode
Hook::CreateInterface
Hook::CreateSubnet
Hook::UpdateInterface
Hook::EventProcessor
Hook::InstancePoll
Hook::PostObjectCreate
Hook::DiscoveryPoll
Hook::AlarmStateChange
Hook::UnboundTunnelOpened
Hook::BoundTunnelOpened


Hook Scripts:

Hook::CreateInterface:

if ($1->name imatch "802.1Q Encapsulation Tag *|Management port|Aux*|Console*|InLoopBack0|MEeth0*|null0*|meth0*|enet0*|oob|M-Ethernet")
{
return false
}

if (($node->sysDescription ~= "^Linux ") &&
(($1->ifType == "1" ||
  $1->ifType == "22" ||
  $1->ifType == "24" ||
  $1->ifType == "124"))
)
{
return false;
}
return true;


###########======---

if ($node->driver == "CISCO-SB"){
  snmp = CreateSNMPTransport($node);
  state = SNMPGetValue(snmp, ".1.3.6.1.2.1.2.2.1.8." . $1->ifIndex);
  if (state == 6)
    return false;
}
return true;


###########======---

if ($1->name ~= "(?i).*Teredo.*|.*isatap.*|.*Bluetooth.*|sit0")
   return false;
snmp = CreateSNMPTransport($node);
state = SNMPGetValue(snmp, ".1.3.6.1.2.1.2.2.1.8." . $1->index);
if (state == 5)
   return false;

return true;


###########======---

Если логическое утверждение истинно, вы получаете первую часть, а если оно ложно, вы получаете вторую.

sysDescription = ($node->sysDescription == "") ? $node->readAgentParameter("System.Uname") : $node->sysDescription;
if (sysDescription ~= "^Linux [A-z]+[0-9]+.")


Hook::AcceptNewNode:

Can be used as additional filter for network discovery to avoid unnecessary communications.
Этот хук срабатывает только на добавление новых нод - если нода уже добавлена то с ней ничего не случится.
Более того, он не срабатывает при ручном добавлении - это только дополнительный фильтр для discovery.

// macs = %(01:E8:EE:94:91:C8, 01:E8:EE:91:DD:21, 01:E8:EE:92:71:FD, 01:E8:EE:93:72:F9, 01:E8:EE:92:66:DD, 01:E8:EE:94:91:7E, 01:E8:EE:9C:32:D4);

node1 = "01:E8:EE:94:91:C8";
node2 = "01:E8:EE:91:DD:21";
node3 = "01:E8:EE:92:71:FD";


if (AddrInSubnet($ipAddr, "10.10.0.0", "255.254.0.0")
|| AddrInSubnet($ipAddr, "10.20.0.0", "255.255.254.0"))
return true;

return false;

return not ($macAddr in %(node1, node2, node3));


P.S. здесь дополнительно ещё проверка по MAC.

Конвертивание эпохи Unix в человекопонятную дату(human readable date)

return strftime("%d.%m.%Y %H:%M:%S", $1);


###########======---

Скрипт для HP ILO на примере instance discovery .1.3.6.1.4.1.232.3.2.3.1.1.4.0.{instance} и Log Drive status {instance} {instance-name} для подмены значений в более информативный вид

switch ($1)
{
case 2:
return "ok";
break;
case 3:
return "failed";
break;
case 4:
return "unconfigured";
break;
case 5:
return "recovering";
break;
case 6:
return "readyForRebuild";
break;
case 7:
return "rebuilding";
break;
case 8:
return "wrongDevice";
break;
case 9:
return "badConnect";
break;
case 10:
return "overheating";
break;
case 11:
return "shutdown";
break;
case 12:
return "expanding";
break;
case 13:
return "notAvailable";
break;
case 14:
return "queuedForExpansion";
break;
case 15:
return "multipathAccessDegraded";
break;
case 16:
return "earsing";
break;
default:
return "other";
break;
}

Instance discovery script's:

Для Net.Interface.BytesIn({instance}), благодаря которому на выходе в графиках получаем DCI по нужным нам интерфейсам, в данном случае eth|bond для Linux сервера.
name=substr($1,rindex($1, " ")+1);
if (name ~= "eth|bond")
{
return %(true, name);
}
return false;


Для снятия ошибок с Linux интерфейсов.

ExternalParameterShellExec = Interface.errors(*):ethtool -S $1 | grep $2 | awk '{print $$2}'

В библиотеке скриптов создаём скрипт ethtool_errors_instance:

ifaces = AgentReadList($node, "Net.InterfaceNames");
instances = %();
c = 0;
for(i : ifaces)
{
if (i ~= "eth|em|p55p|p1p|eno|ens|enp") {

   instances[c++] = i . ",rx_crc_errors";
       instances[c++] = i . ",rx_missed_errors";
   instances[c++] = i . ",rx_no_buffer_count";
}    
}
return instances;


Создаём DCI Interface.errors({instance}), в Instance discovery method ставим Script и указываем имя созданного скрипта, ethtool_errors_instance.

Общее:

Скрипт с рекурсивной функцией и поиском по нужным\необходимым параметрам, в данном случае по snmp sysDescription коммутатора
sub GetTree (nodeID)
{
Tree = FindObject(nodeID);
children = GetObjectChildren(Tree);

foreach (n : children)
{
//println ("Name: " . n->name);
if (n->name != null && classof(n) == "Node")
{
if (n->sysDescription ~= "^D-Link DES-3028" && n->comments == "")
{
println ("Name: " . n->name . ", sysDescription: " . n->sysDescription . ", IP: " . n->ipAddr);
}
}
GetTree(n->id);
  }
}

GetTree(2);


Примерно аналогичный скрипт, но выведет custom атрибуты по интерфейсам, все кроме .dlink.slotSize и uptime
sub GetTree (nodeID)
{
Tree = FindObject(nodeID);
children = GetObjectChildren(Tree);

foreach (i : children)
{
{
attributes = i->customAttributes;
foreach(a : attributes->keys)
{
{
if ((a != ".dlink.slotSize") &&  (a != "uptime"))
{
println (a . " = " . attributes[a] . "," . " Port: " . i->port . "," . " Interface name: " . i->name . "," . " Node name: " . Tree->name);
}
  }
}
}

GetTree(i->id);
  }
}

GetTree(2);


EPP:

Скрипт для и фильтрации по интерфейсам, например для SYS_IF_UP.
ignoreInterfaceRegEx = "^ppp([0-9]+)|802.1Q";

if ($2 ~= ignoreInterfaceRegEx)
  return false;

return true;
#70
Quote from: Victor Kirhenshtein on July 07, 2016, 12:36:51 PM
Для всех опросов есть hook скрипты: Hook::ConfigurationPoll, Hook::sStatusPoll, и т.д. В данном случае похоже подойдет hook на configuration poll. Еще рекомендую отключить CheckTrustedNodes, иначе могут быть проблемы с поиском объектов.
Не совсем понял как ноды оказались в Infrastructure Services - сам по себе сервер их туда не помещает. В любом случае можно использовать UnbindObject в хуке чтобы убрать ноду оттуда.

Спасибо за ответ, в принципе пока уже прошло время - решил проблему вроде бы. При discovery сервер именует ноды в IP, для таких создан специальный контейнер который туда их автоматически биндит. Дальше если у ноды настроено snmp sysName, то Hook::ConfigurationPoll переименовывает эту ноду в sysName и далее сервер кладёт их в конечный контейнер в котором уже правила такого вида: return $node->name ~= "^Name 33 ";

Если у ноды не указан sysName - ничего не делаем с ними.

На сколько костыльно или возможно не правильно я это всё сделал ? :) Может есть какие то замечания? Конечная цель получить полностью автоматическое распределение нод по контейнерам (улицам).

Получается какой то особенный network discovery скрипт мне не нужен?
#71
Общие вопросы / Re: POLLERS is too high
July 07, 2016, 12:47:50 PM
Quote from: Victor Kirhenshtein on July 07, 2016, 12:19:02 PM
Стандартные шаблоны лежат в <prefix>/share/netxms/templates (/usr/share/netxms/templates для deb пакетов, <path>\share\templates на Windows). Сервер при старте импортирует все из этого каталога, если параметр ImportConfigurationOnStartup выставлен в ненулевое значение.

Спасибо Виктор! По умолчанию видимо этот параметр в 0. Нужно сейчас выставить в 1 и перезапустить сервер? Ничего лишнего он не импортирует или не поломаются текущие шаблоны?
#72
Общие вопросы / Re: POLLERS is too high
July 06, 2016, 06:45:15 PM
А где можно взять дефолтный шаблон для self мониторинга? БД, пуллеры, очередь и т.д.
#73
Quote from: Tatjana Dubrovica on June 27, 2016, 03:09:30 PM
There was no changes connected with beacon between this versions.

What is result of resolving DNS google.com from NetXMS server computer? Host may be not accepted if its IP is a wildcard address or a loopback address or a multicast address or a broadcast address or a link local address or if NetXMS server failed to resolve DNS.

Events that are generated: SYS_NETWORK_CONN_LOST and SYS_NETWORK_CONN_RESTORED.

nslookup google.com
Server:         x.x.x.x
Address:        x.x.x.x#53

Non-authoritative answer:
Name:   google.com
Address: 212.1.249.39
Name:   google.com
Address: 212.1.249.34
Name:   google.com
Address: 212.1.249.30
Name:   google.com
Address: 212.1.249.40
Name:   google.com
Address: 212.1.249.54
Name:   google.com
Address: 212.1.249.29
Name:   google.com
Address: 212.1.249.35
Name:   google.com
Address: 212.1.249.20
Name:   google.com
Address: 212.1.249.25
Name:   google.com
Address: 212.1.249.59
Name:   google.com
Address: 212.1.249.50
Name:   google.com
Address: 212.1.249.55
Name:   google.com
Address: 212.1.249.44
Name:   google.com
Address: 212.1.249.49
Name:   google.com
Address: 212.1.249.24
Name:   google.com
Address: 212.1.249.45
#74
I unfortunately can not be so.

http://prntscr.com/blmr2t

Maybe in the new version 2.1 will work.

And what a special event should be generated when triggered?
#75
Quote from: Tatjana Dubrovica on June 25, 2016, 05:41:21 PM
Everything works for me with latest server(from development branch):
[25-Jun-2016 17:37:04.267] [DEBUG] Beacon host 195.13.231.157 added
[25-Jun-2016 17:37:04.267] [DEBUG] Beacon host 8.8.8.8 added
[25-Jun-2016 17:37:04.267] [DEBUG] Beacon poller thread started

Host configuration: "google.com,8.8.8.8"

What version do you use? May it happen that there were some DNS problems?

Can you send a screenshot of the example of his record?

Last version 2.0.4, No, the DNS is all right, there are two servers.