как сделать суммирующий график?

Started by Akira, August 23, 2017, 08:25:28 AM

Previous topic - Next topic

Akira

Туплю.
Надо сделать график, в котором будет сумма DCI с 30 серверов (активные сессии).
Т.е. нудо получить одно значение, которое покажет сколько всего сессий.
Как это сделать?

Victor Kirhenshtein

Я бы предложил на какой-нибудь ноде сделать 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, тогда будет универсальный скрипт.

Akira

А можно чуть подробнее, в привязке к моим нуждам.

1. Где этот скрип прописывать?
    Создать в какой-нибудь ноде DCI и в Tranformation?
    Или в Script Library?
2. Вот у меня есть дерево SERVERS/TERMINALS
    Как суммировать во всех нодах в этом дереве, которые начинаются на TER00, параметр с именем "Terminal - Active Sessions"?

Victor Kirhenshtein

Скрипт создавать в 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;
}


Akira

Сделал в ноде DCI, режим Script, выбрал скрипт (пробовал оба варианта в этой теме)

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

Сделал
return CalculateTotal(FindObject(12945));

Victor Kirhenshtein

В FindObject передается имя объекта или его идентификатор. Я не сообразил что SERVERS/TERMINALS скорее всего имелось ввиду контейнер TERMINALS в контейнере SERVERS. Если это так, то надо как параметр передавать строку "TERMINALS".