скриптик по созданию графика

Started by wonderboy, September 20, 2016, 12:20:49 PM

Previous topic - Next topic

wonderboy

Может кто поделится скриптиком (python) по созданию графика и сохранению его во вкладку graphs?

Alex Kirhenshtein

Создания графика на основе чего? Что хочется получить?

wonderboy

#2
Александр,
идея следующая: раз в сутки по крону или еще как запускается скрипт, который находит "новые" интерфейсы на маршрутизаторах, создает bps и pps dci и строит на них графики, присваивает имя и сохраняет в дерево graphs: services->ia-> %interface_description%.

wonderboy

Насколько я понял это можно сделать при помощи NXCP путем создания сообщений типа:

msg = org.netxms.base.NXCPMessage(org.netxms.base.NXCPCodes.CMD_SAVE_GRAPH)
... конфиг графика
s.sendMessage(msg)


А перед этим нужно еще dci на создавать. Довольно трудоемкий процесс :)

Alex Kirhenshtein

Такие DCI можно (и нужно) создавать при помощи Instance Discovery, по списку интерфейсов.
График - да, надо будет скриптом.
Альтернативный вариант - включить дял этих DCI опцию Show in performance tab, тогда они автоматом будут появляться в закладке "Performance" на объекте.

wonderboy

Александр,
как используются классы GraphItem, GraphItemStyle, GraphSettings? Полагаю что они используются как вспомогательные средства по построению конфига графика, который потом помещается в NXCPCodes.VID_GRAPH_CONFIG, но как это делается не могу понять. На текущий момент, я просто создаю текстовую переменную в которой содержится конфигурация графика и все.

Victor Kirhenshtein

Ну на уровне сообщений протокола я бы предложил не спускаться :) Собственно конфигурация графика - это XML. Если он подготовлен, то записать график можно так (XML здесь для примера):


from java.util import ArrayList

xml = '<chart><title>Test Graph</title><dciList length="1"><dci nodeId="111" dciId="55"><type>1</type><name>Server thread pool AGENT: normalized load average (1 minute)</name><lineWidth>2</lineWidth><displayType>0</displayType><area>false</area><showThresholds>false</showThresholds><invertValues>false</invertValues><instance></instance><column></column><displayFormat>%s</displayFormat></dci></dciList></chart>'

gs = GraphSettings(0, session.getUserId(), 0, ArrayList(0));
gs.setName("My graph");
gs.setConfig(xml);
session.saveGraph(gs, True);


Примеры XML конфигурации можно посмотреть в базе или в конфигурации дашборда - на любом элементе Line Chart выбрать Edit XML. Верхний уровень будет немного отличаться, но конфигурация данных (внутри тега <dciList>) - нет.

wonderboy

Виктор, мне еще надо добавить accessList.
from java.util import ArrayList

for user in s.getUserDatabaseObjects():
if user.getName() == "Helpdesk":
helpdeskUser = user.getId()
break

acl = AccessListElement(helpdeskUser, UserAccessRights.OBJECT_ACCESS_READ)

gs = GraphSettings(0, s.getUserId(), ArrayList(acl))


Но у меня вылазит ошибка:
TypeError: java.util.ArrayList(): 1st arg can't be coerced to int, java.util.Collection

Кстати, при работе с сообщения вылазит таже проблема в части добавления аксес листа:
acl_id = NXCPCodes.VID_GRAPH_ACL_BASE + 1
msg.setFieldInt32(acl_id, int(2147483650)) <----- вот здесь ругается can't be coerced to int

Victor Kirhenshtein

Access list - это список, надо его сначала создать, а потом добавить элемент:


acl = ArrayList()
acl.add(AccessListElement(helpdeskUser, UserAccessRights.OBJECT_ACCESS_READ))
gs = GraphSettings(0, session.getUserId(), 0, acl)