NetXMS Support Forum

Russian Support => Общие вопросы => Topic started by: Akira on August 23, 2017, 08:25:28 AM

Title: как сделать суммирующий график?
Post by: Akira on August 23, 2017, 08:25:28 AM
Туплю.
Надо сделать график, в котором будет сумма DCI с 30 серверов (активные сессии).
Т.е. нудо получить одно значение, которое покажет сколько всего сессий.
Как это сделать?
Title: Re: 2.1 как сделать суммирующий график?
Post by: Victor Kirhenshtein on August 31, 2017, 03:51:07 PM
Я бы предложил на какой-нибудь ноде сделать script DCI. Скрипт пройдется по всем нодам, просуммирует значения, и вернет сумму. Типа такого:


// Hash map to avoid duplicates
global processedNodes = %{};

// Find "Entire Network" object and start enumeration from it
return CalculateTotal(FindObject(1));

// This function walks object tree recursively starting from given root
sub CalculateTotal(rootObject)
{
sum = 0.0;

// Walk all child objects
foreach(o : GetObjectChildren(rootObject))
{
if (classof(o) == "Node")
{
if (processedNodes[o->id] == null)
{
v = GetDCIValueByName(o, "System.CPU.Usage");
if (v != null)
sum += real(v);
processedNodes[o->id] = 1; // actual value is irrelevant, it's just a flag
}
}
else if (classof(o) == "NetObj")
{
// For all other objects, go down the tree
// There can be additional checks for object class, like
// if (o->type == 5)
sum += CalculateTotal(o);
}
}
return sum;
}


Конечно надо поставить корректное имя параметра в GetDCIValueByName. Можно его также передавать как параметр DCI, тогда будет универсальный скрипт.
Title: Re: 2.1 как сделать суммирующий график?
Post by: Akira on September 13, 2017, 10:54:04 AM
А можно чуть подробнее, в привязке к моим нуждам.

1. Где этот скрип прописывать?
    Создать в какой-нибудь ноде DCI и в Tranformation?
    Или в Script Library?
2. Вот у меня есть дерево SERVERS/TERMINALS
    Как суммировать во всех нодах в этом дереве, которые начинаются на TER00, параметр с именем "Terminal - Active Sessions"?
Title: Re: 2.1 как сделать суммирующий график?
Post by: Victor Kirhenshtein on November 02, 2017, 11:12:34 AM
Скрипт создавать в ScriptLibrary. Конкретный скрипт будет такой (я так понял что название верхнего контейнера "SERVERS/TERMINALS"):


// Hash map to avoid duplicates
global processedNodes = %{};

// Find "Entire Network" object and start enumeration from it
return CalculateTotal(FindObject("SERVERS/TERMINALS"));

// This function walks object tree recursively starting from given root
sub CalculateTotal(rootObject)
{
sum = 0.0;

// Walk all child objects
foreach(o : GetObjectChildren(rootObject))
{
if (classof(o) == "Node")
{
if ((processedNodes[o->id] == null) && (o->name ilike "TER00*"))
{
v = GetDCIValueByDescription(o, "Terminal - Active Sessions");
if (v != null)
sum += real(v);
processedNodes[o->id] = 1; // actual value is irrelevant, it's just a flag
}
}
else if (classof(o) == "NetObj")
{
// For all other objects, go down the tree
// There can be additional checks for object class, like
// if (o->type == 5)
sum += CalculateTotal(o);
}
}
return sum;
}

Title: Re: 2.1 как сделать суммирующий график?
Post by: Akira on August 21, 2018, 09:38:15 AM
Сделал в ноде DCI, режим Script, выбрал скрипт (пробовал оба варианта в этой теме)

Вот эта строка почему-то мешала
return CalculateTotal(FindObject("SERVERS/TERMINALS"));

Сделал
return CalculateTotal(FindObject(12945));
Title: Re: как сделать суммирующий график?
Post by: Victor Kirhenshtein on August 22, 2018, 01:39:46 PM
В FindObject передается имя объекта или его идентификатор. Я не сообразил что SERVERS/TERMINALS скорее всего имелось ввиду контейнер TERMINALS в контейнере SERVERS. Если это так, то надо как параметр передавать строку "TERMINALS".