Туплю.
Надо сделать график, в котором будет сумма DCI с 30 серверов (активные сессии).
Т.е. нудо получить одно значение, которое покажет сколько всего сессий.
Как это сделать?
			
			
			
				Я бы предложил на какой-нибудь ноде сделать 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, тогда будет универсальный скрипт.
			
			
			
				А можно чуть подробнее, в привязке к моим нуждам.
1. Где этот скрип прописывать?
    Создать в какой-нибудь ноде DCI и в Tranformation?
    Или в Script Library?
2. Вот у меня есть дерево SERVERS/TERMINALS
    Как суммировать во всех нодах в этом дереве, которые начинаются на TER00, параметр с именем "Terminal - Active Sessions"?
			
			
			
				Скрипт создавать в 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;
}
			
			
			
				Сделал в ноде DCI, режим Script, выбрал скрипт (пробовал оба варианта в этой теме)
Вот эта строка почему-то мешала
return CalculateTotal(FindObject("SERVERS/TERMINALS"));
Сделал
return CalculateTotal(FindObject(12945));
			
			
			
				В FindObject передается имя объекта или его идентификатор. Я не сообразил что SERVERS/TERMINALS скорее всего имелось ввиду контейнер TERMINALS в контейнере SERVERS. Если это так, то надо как параметр передавать строку "TERMINALS".