Добрый день, подскажите пожалуйста два момента
1 настроил отправку сообщений по разным событиям, но не нашёл какой надо макрос использовать чтобы в отчете присылалось ещё и имя пользователя под которым произошла беда. Кто-нибудь может подсказать?
2 Не работают отчёты, выдает ошибку (в приложении)
netXMS 4.0.227, на виндовом сервере 2012
1) А о каких, например, событиях идет речь? Просто большинство событий никак не связано с тем, залогинен ли кто-нибудь в NetXMS. Может быть, что в данный момент вообще никто не залогинен, может быть что залогинено несколько юзеров.
2) В Services в Windows должен быть сервис NetXMS Reporting Server. Как он себя чувствует, стартует ли? Ему для работы нужна Java, 11 версии или старше.
1 о любых, мне нужен логин не пользователя нетхмс, а пользака компа. То есть идет перенагрузка на цп, мне приходит письмо мол на таком компе в такое время такая беда. И вот надо ещё чтобы было имя пользователя того компьютера приходило. Агент же передаёт эту инфу, значит и в отчёт это как-то закинуть можно, да?
2нет такой службы, она как-то отдельно ставится? я чет не нашел под винду, видел что под убунту ставится отдельная какая-то штука.
1) Для начала нужно как-то собирать это значение. Например, сделаем DCI, Origin "Internal", Parameter "Dummy". А в трансформационном скрипте этого DCI сделаем все что нужно (то же самое можно было сделать с помощью DCI c origin "script"):
list = $node->readAgentList("System.ActiveUserSessions");
currentlyLoggedUser = SplitString(list[0], "\"")[1];
$node->setCustomAttribute("currentlyLoggedUser", currentlyLoggedUser);
return currentlyLoggedUser;
Для простоты скрипт сохраняет имя юзера в custom attribute на ноде - поэтому историю этого DCI можно даже не хранить.
И теперь можно пользоваться макросом %{currentlyLoggedUser} - там будет имя юзера.
Альтернативный путь - макрос %[script_name] и в этом скрипте можно находить нужный DCI и брать его последнее значение.
2) Репортинг на windows ставится инсталлятором сервера, там есть отдельная галочка.
1 так система же уже сама имя пользака забирает, в user session
Неужто чтобы оттуда вытащить инфу в отчёт надо скрипт использовать? (Я просто половину слов не понял что было в вашем ответе, поэтому ищу лёгкие пути)
2 видимо проглядел, завтра попробую сверху накатить, спасибо)
поставил репорт сервер, в конфигураторе он включен, в службах работает, но при переходе в отчёты - ничего(
Все так и должно быть. Механизм репортинга - это лишь интеграция с Jasper Reports. А для Jasper Reports нужны .jar файлы с описанием отчетов, там есть какая-то Jasper Studio в которой можно эти .jar файлы создавать.
хорошо, это посмотрю, так а пользователя из user sessions без использования скриптов и вот этого всего можно как-то по простому вытащить?
Не, простых путей нет :)
тогда видимо последний вопрос по вашему ответу в теме #3
есть где-то это в картинках и более подробно? Я из всего что там написано нашёл только DCI Summary Tables и это мало что мне дало :(
Для России тема с JasperStudio можно сказать закрыта - они не работают больше здесь и нас блочат
Access Denied
You don't have permission to access "http://www.jaspersoft.com/" on this server.
Reference #18.df8e655f.1650666488.118285b4
Грузил и пробовал его в октябре-ноябре прошлого года когда вопрос вставал. Пробная версия на 30 дней. Результат не получился ни вразумительным ни вообще каким бы то ни было. Плюнул и забыл про него.
В итоге под себя и своих боссов писал на связке Python + Matplot + WeasyPrint + Pandas
Можно забирать данные из webapi но я предпочел напрямую из базы. Сложностей никаких нет. Ну кроме случаев когда хочется запрос в базу сделать с хитрыми группировками и прочими плюшками. Работает на той же машине что и сервер. Меня устраивает. Если потрудиться то можно сделать все достаточно быстро и добротно. Можно еще и отдельный веб интерфейс прикрутить .... дальше полет фантазии безграничен.
даф иг с ними с отчётами, в целом и каспер в отчёты умеет) но спасибо за инфу)
мне бы понять таки как в письмо воткнуть имя пользователя)
Quote from: semi-liquid on April 25, 2022, 09:11:58 AM
мне бы понять таки как в письмо воткнуть имя пользователя)
Там выше предлагался вариант со скриптом. Его можно даже еще упростить и просто вставлять результат в сообщение, без дополнительных атрибутов:
list = $node->readAgentList("System.ActiveUserSessions");
return SplitString(list[0], "\"")[1];
и в сообщении использовать макрос %{script}, где script - это имя скрипта в библиотеке.
проблема в том что я в этом предложении понимаю отдельные буквы) а куда лезть и что делать так и не понял.
Можете пожалуйста мне разжевать что здесь сказано? Дальше обещаю что разберусь сам)
"Например, сделаем DCI, Origin "Internal", Parameter "Dummy". " - где делать DCI (куда заходить, что нажимать) и все эти параметры и ориджины, сам скрипт всё в одном месте делается?
То есть я понимаю что дальше реагирование прописывается отдельно. Но всё что я нашёл с подписью DCI не похоже на то что надо.
Давайте начнем потихнечку. Судя по скриншотам ноды в системе у вас уже заведены (ну там SRV003 и все остальные).
На ноде нажимаем правую кнопку мыши, там есть Data Collection Configuration. Заходим. Это место, где конфигурируется сбор данных с ноды. Там список, каждая строка в этом списке это Data Collection Item - элемент сбора данных.
На списке правую кнопку мыши - New parameter. Там-то и ставим Origin "Internal", Parameter "Dummy". Dummy - это просто штука, которая всегда возвращает 0 - здесь значение нам не нужно, потому что мы его будет в transformation script добывать.
Слева в этом диалоге выбираем Transformation (третий пункт сверху). Там пишем код:
list = $node->readAgentList("System.ActiveUserSessions");
currentlyLoggedUser = SplitString(list[0], "\"")[1];
$node->setCustomAttribute("currentlyLoggedUser", currentlyLoggedUser);
Код получает с агента на ноде список залогиненных юзеров. Из этого списка мы просто берем первого. И сохраняем в custom attribute на ноде.
Нажимаем Apply and Close. Ждем пока данные соберутся.
На ноде нажимаем правую кнопку мыши, Properties, там слева Custom attributes. Если все хорошо, то там в списке должен быть currentlyLoggedUser с именем юзера.
Пишите, что получилось, что нет.
возможно я мало ждал и потому готов повторить проверку завтра утром, но ничего не изменилось. dummy выбирал верхний.
На скрипт система не ругалась, но либо я не дождался, либо что-то не так сделал(
если что отключенный вариант на скрине - сделал то же самое, но скрипт добавил тот что предлагали выше, результат одинаковый.
И он стоит верхним не потому что я вам не доверяю, а потому что до этого я с другим нодом экспериментировал, там ваш первый))
А custom attribute "currentlyLoggedUser" вы добавили вручную, или он автоматически добавился?
Если автоматически, то выглядит, что скрипт возвращает пустое значение. Если на ноде сделать Execute server script и там запустить вот это, то что оно напечатает?:
list = $node->readAgentList("System.ActiveUserSessions");
println("=" . list . "=");
currentlyLoggedUser = SplitString(list[0], "\"")[1];
println("=" . currentlyLoggedUser . "=");
автоматом добавилось.
Сделал что вы сказали вот результат, admind - то что надо вытащить.
vor-admin комп с которого я к серваку нетхмс подключен по рдп.
Да, получается что в этом списке может быть еще тот юзер, что залогинен на Console и он может быть пустой. И список может быть в любом порядке. Тогда такой скрипт, он соберет всех юзеров через запятую, если имя юзера не пустое:
list = $node->readAgentList("System.ActiveUserSessions");
loggedUsers = %();
for (l : list)
{
username = SplitString(l, "\"")[1];
if (username != "") loggedUsers->append(username);
}
loggedUsersStr = ArrayToString(loggedUsers, ",");
$node->setCustomAttribute("currentlyLoggedUser", loggedUsersStr);
что-то всё равно идёт не так(
понял, не хватало строчки возвращающей значение)
return loggedUsersStr;
работает)) :) :) :) :) :)
а теперь это надо вручную по всем компам или где-то ещё можно отдельно запустить по всем?
я не против первого варианта, круто что оно вообще работает) спасибо за это вам огромное :) :)
по идее же это как-то можно как раз в DC Summary Table впихнуть и заставить работать по всем компам?
Не, вручную не стоит, у нас есть шаблоны (Templates) и лучше все делать через них.
В дереве объектов правый клик на Templates, Create, Template, дать ему какое-нибудь имя. Он появится под Templates. На нем правой кнопкой, Data Collection Configuration. Там опять-таки нужно создать DCI со всеми свойствами (или можно на том DCI что был создан на ноде сделать Copy to another node и указать имя шаблона).
Дальше нужно шаблон назначить на ноды. Правой кнопкой по шаблону, Apply. Там можно выбирать несколько нод сразу (с помощью shift или ctrl), или можно выбрать сразу контейнер.
Еще шаблоны умеют накладываться автоматом - там может быть скрипт, который решает, нужен ли этот шаблон на этой ноде. Примеры можно посмотреть в шаблонах, которые идут "из коробки" - Templates->Operating systems например.
круто) всё работает как надо)
спасибо вам огроменное, что разжевали всё)